##// END OF EJS Templates
remotenames: show remote bookmarks in `hg bookmarks`...
Pulkit Goyal -
r37108:a61fff49 default
parent child Browse files
Show More
@@ -1,352 +1,372 b''
1 1 # remotenames.py - extension to display remotenames
2 2 #
3 3 # Copyright 2017 Augie Fackler <raf@durin42.com>
4 4 # Copyright 2017 Sean Farley <sean@farley.io>
5 5 #
6 6 # This software may be used and distributed according to the terms of the
7 7 # GNU General Public License version 2 or any later version.
8 8
9 9 """ showing remotebookmarks and remotebranches in UI
10 10
11 11 By default both remotebookmarks and remotebranches are turned on. Config knob to
12 12 control the individually are as follows.
13 13
14 14 Config options to tweak the default behaviour:
15 15
16 16 remotenames.bookmarks
17 17 Boolean value to enable or disable showing of remotebookmarks (default: True)
18 18
19 19 remotenames.branches
20 20 Boolean value to enable or disable showing of remotebranches (default: True)
21 21
22 22 remotenames.hoistedpeer
23 23 Name of the peer whose remotebookmarks should be hoisted into the top-level
24 24 namespace (default: 'default')
25 25 """
26 26
27 27 from __future__ import absolute_import
28 28
29 29 from mercurial.i18n import _
30 30
31 31 from mercurial.node import (
32 32 bin,
33 33 )
34 34 from mercurial import (
35 bookmarks,
36 extensions,
35 37 logexchange,
36 38 namespaces,
37 39 pycompat,
38 40 registrar,
39 41 revsetlang,
40 42 smartset,
41 43 templateutil,
42 44 )
43 45
44 46 if pycompat.ispy3:
45 47 import collections.abc
46 48 mutablemapping = collections.abc.MutableMapping
47 49 else:
48 50 import collections
49 51 mutablemapping = collections.MutableMapping
50 52
51 53 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
52 54 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
53 55 # be specifying the version(s) of Mercurial they are tested with, or
54 56 # leave the attribute unspecified.
55 57 testedwith = 'ships-with-hg-core'
56 58
57 59 configtable = {}
58 60 configitem = registrar.configitem(configtable)
59 61 templatekeyword = registrar.templatekeyword()
60 62 revsetpredicate = registrar.revsetpredicate()
61 63
62 64 configitem('remotenames', 'bookmarks',
63 65 default=True,
64 66 )
65 67 configitem('remotenames', 'branches',
66 68 default=True,
67 69 )
68 70 configitem('remotenames', 'hoistedpeer',
69 71 default='default',
70 72 )
71 73
72 74 class lazyremotenamedict(mutablemapping):
73 75 """
74 76 Read-only dict-like Class to lazily resolve remotename entries
75 77
76 78 We are doing that because remotenames startup was slow.
77 79 We lazily read the remotenames file once to figure out the potential entries
78 80 and store them in self.potentialentries. Then when asked to resolve an
79 81 entry, if it is not in self.potentialentries, then it isn't there, if it
80 82 is in self.potentialentries we resolve it and store the result in
81 83 self.cache. We cannot be lazy is when asked all the entries (keys).
82 84 """
83 85 def __init__(self, kind, repo):
84 86 self.cache = {}
85 87 self.potentialentries = {}
86 88 self._kind = kind # bookmarks or branches
87 89 self._repo = repo
88 90 self.loaded = False
89 91
90 92 def _load(self):
91 93 """ Read the remotenames file, store entries matching selected kind """
92 94 self.loaded = True
93 95 repo = self._repo
94 96 for node, rpath, rname in logexchange.readremotenamefile(repo,
95 97 self._kind):
96 98 name = rpath + '/' + rname
97 99 self.potentialentries[name] = (node, rpath, name)
98 100
99 101 def _resolvedata(self, potentialentry):
100 102 """ Check that the node for potentialentry exists and return it """
101 103 if not potentialentry in self.potentialentries:
102 104 return None
103 105 node, remote, name = self.potentialentries[potentialentry]
104 106 repo = self._repo
105 107 binnode = bin(node)
106 108 # if the node doesn't exist, skip it
107 109 try:
108 110 repo.changelog.rev(binnode)
109 111 except LookupError:
110 112 return None
111 113 # Skip closed branches
112 114 if (self._kind == 'branches' and repo[binnode].closesbranch()):
113 115 return None
114 116 return [binnode]
115 117
116 118 def __getitem__(self, key):
117 119 if not self.loaded:
118 120 self._load()
119 121 val = self._fetchandcache(key)
120 122 if val is not None:
121 123 return val
122 124 else:
123 125 raise KeyError()
124 126
125 127 def __iter__(self):
126 128 return iter(self.potentialentries)
127 129
128 130 def __len__(self):
129 131 return len(self.potentialentries)
130 132
131 133 def __setitem__(self):
132 134 raise NotImplementedError
133 135
134 136 def __delitem__(self):
135 137 raise NotImplementedError
136 138
137 139 def _fetchandcache(self, key):
138 140 if key in self.cache:
139 141 return self.cache[key]
140 142 val = self._resolvedata(key)
141 143 if val is not None:
142 144 self.cache[key] = val
143 145 return val
144 146 else:
145 147 return None
146 148
147 149 def keys(self):
148 150 """ Get a list of bookmark or branch names """
149 151 if not self.loaded:
150 152 self._load()
151 153 return self.potentialentries.keys()
152 154
153 155 def iteritems(self):
154 156 """ Iterate over (name, node) tuples """
155 157
156 158 if not self.loaded:
157 159 self._load()
158 160
159 161 for k, vtup in self.potentialentries.iteritems():
160 162 yield (k, [bin(vtup[0])])
161 163
162 164 class remotenames(object):
163 165 """
164 166 This class encapsulates all the remotenames state. It also contains
165 167 methods to access that state in convenient ways. Remotenames are lazy
166 168 loaded. Whenever client code needs to ensure the freshest copy of
167 169 remotenames, use the `clearnames` method to force an eventual load.
168 170 """
169 171
170 172 def __init__(self, repo, *args):
171 173 self._repo = repo
172 174 self.clearnames()
173 175
174 176 def clearnames(self):
175 177 """ Clear all remote names state """
176 178 self.bookmarks = lazyremotenamedict("bookmarks", self._repo)
177 179 self.branches = lazyremotenamedict("branches", self._repo)
178 180 self._invalidatecache()
179 181
180 182 def _invalidatecache(self):
181 183 self._nodetobmarks = None
182 184 self._nodetobranch = None
183 185 self._hoisttonodes = None
184 186 self._nodetohoists = None
185 187
186 188 def bmarktonodes(self):
187 189 return self.bookmarks
188 190
189 191 def nodetobmarks(self):
190 192 if not self._nodetobmarks:
191 193 bmarktonodes = self.bmarktonodes()
192 194 self._nodetobmarks = {}
193 195 for name, node in bmarktonodes.iteritems():
194 196 self._nodetobmarks.setdefault(node[0], []).append(name)
195 197 return self._nodetobmarks
196 198
197 199 def branchtonodes(self):
198 200 return self.branches
199 201
200 202 def nodetobranch(self):
201 203 if not self._nodetobranch:
202 204 branchtonodes = self.branchtonodes()
203 205 self._nodetobranch = {}
204 206 for name, nodes in branchtonodes.iteritems():
205 207 for node in nodes:
206 208 self._nodetobranch.setdefault(node, []).append(name)
207 209 return self._nodetobranch
208 210
209 211 def hoisttonodes(self, hoist):
210 212 if not self._hoisttonodes:
211 213 marktonodes = self.bmarktonodes()
212 214 self._hoisttonodes = {}
213 215 hoist += '/'
214 216 for name, node in marktonodes.iteritems():
215 217 if name.startswith(hoist):
216 218 name = name[len(hoist):]
217 219 self._hoisttonodes[name] = node
218 220 return self._hoisttonodes
219 221
220 222 def nodetohoists(self, hoist):
221 223 if not self._nodetohoists:
222 224 marktonodes = self.bmarktonodes()
223 225 self._nodetohoists = {}
224 226 hoist += '/'
225 227 for name, node in marktonodes.iteritems():
226 228 if name.startswith(hoist):
227 229 name = name[len(hoist):]
228 230 self._nodetohoists.setdefault(node[0], []).append(name)
229 231 return self._nodetohoists
230 232
233 def wrapprintbookmarks(orig, ui, repo, bmarks, **opts):
234 if 'remotebookmarks' not in repo.names:
235 return
236 ns = repo.names['remotebookmarks']
237
238 for name in ns.listnames(repo):
239 nodes = ns.nodes(repo, name)
240 if not nodes:
241 continue
242 node = nodes[0]
243
244 bmarks[name] = (node, ' ', '')
245
246 return orig(ui, repo, bmarks, **opts)
247
248 def extsetup(ui):
249 extensions.wrapfunction(bookmarks, '_printbookmarks', wrapprintbookmarks)
250
231 251 def reposetup(ui, repo):
232 252 if not repo.local():
233 253 return
234 254
235 255 repo._remotenames = remotenames(repo)
236 256 ns = namespaces.namespace
237 257
238 258 if ui.configbool('remotenames', 'bookmarks'):
239 259 remotebookmarkns = ns(
240 260 'remotebookmarks',
241 261 templatename='remotebookmarks',
242 262 colorname='remotebookmark',
243 263 logfmt='remote bookmark: %s\n',
244 264 listnames=lambda repo: repo._remotenames.bmarktonodes().keys(),
245 265 namemap=lambda repo, name:
246 266 repo._remotenames.bmarktonodes().get(name, []),
247 267 nodemap=lambda repo, node:
248 268 repo._remotenames.nodetobmarks().get(node, []))
249 269 repo.names.addnamespace(remotebookmarkns)
250 270
251 271 # hoisting only works if there are remote bookmarks
252 272 hoist = ui.config('remotenames', 'hoistedpeer')
253 273 if hoist:
254 274 hoistednamens = ns(
255 275 'hoistednames',
256 276 templatename='hoistednames',
257 277 colorname='hoistedname',
258 278 logfmt='hoisted name: %s\n',
259 279 listnames = lambda repo:
260 280 repo._remotenames.hoisttonodes(hoist).keys(),
261 281 namemap = lambda repo, name:
262 282 repo._remotenames.hoisttonodes(hoist).get(name, []),
263 283 nodemap = lambda repo, node:
264 284 repo._remotenames.nodetohoists(hoist).get(node, []))
265 285 repo.names.addnamespace(hoistednamens)
266 286
267 287 if ui.configbool('remotenames', 'branches'):
268 288 remotebranchns = ns(
269 289 'remotebranches',
270 290 templatename='remotebranches',
271 291 colorname='remotebranch',
272 292 logfmt='remote branch: %s\n',
273 293 listnames = lambda repo: repo._remotenames.branchtonodes().keys(),
274 294 namemap = lambda repo, name:
275 295 repo._remotenames.branchtonodes().get(name, []),
276 296 nodemap = lambda repo, node:
277 297 repo._remotenames.nodetobranch().get(node, []))
278 298 repo.names.addnamespace(remotebranchns)
279 299
280 300 @templatekeyword('remotenames', requires={'repo', 'ctx'})
281 301 def remotenameskw(context, mapping):
282 302 """List of strings. Remote names associated with the changeset."""
283 303 repo = context.resource(mapping, 'repo')
284 304 ctx = context.resource(mapping, 'ctx')
285 305
286 306 remotenames = []
287 307 if 'remotebookmarks' in repo.names:
288 308 remotenames = repo.names['remotebookmarks'].names(repo, ctx.node())
289 309
290 310 if 'remotebranches' in repo.names:
291 311 remotenames += repo.names['remotebranches'].names(repo, ctx.node())
292 312
293 313 return templateutil.compatlist(context, mapping, 'remotename', remotenames,
294 314 plural='remotenames')
295 315
296 316 @templatekeyword('remotebookmarks', requires={'repo', 'ctx'})
297 317 def remotebookmarkskw(context, mapping):
298 318 """List of strings. Remote bookmarks associated with the changeset."""
299 319 repo = context.resource(mapping, 'repo')
300 320 ctx = context.resource(mapping, 'ctx')
301 321
302 322 remotebmarks = []
303 323 if 'remotebookmarks' in repo.names:
304 324 remotebmarks = repo.names['remotebookmarks'].names(repo, ctx.node())
305 325
306 326 return templateutil.compatlist(context, mapping, 'remotebookmark',
307 327 remotebmarks, plural='remotebookmarks')
308 328
309 329 @templatekeyword('remotebranches', requires={'repo', 'ctx'})
310 330 def remotebrancheskw(context, mapping):
311 331 """List of strings. Remote branches associated with the changeset."""
312 332 repo = context.resource(mapping, 'repo')
313 333 ctx = context.resource(mapping, 'ctx')
314 334
315 335 remotebranches = []
316 336 if 'remotebranches' in repo.names:
317 337 remotebranches = repo.names['remotebranches'].names(repo, ctx.node())
318 338
319 339 return templateutil.compatlist(context, mapping, 'remotebranch',
320 340 remotebranches, plural='remotebranches')
321 341
322 342 def _revsetutil(repo, subset, x, rtypes):
323 343 """utility function to return a set of revs based on the rtypes"""
324 344
325 345 revs = set()
326 346 cl = repo.changelog
327 347 for rtype in rtypes:
328 348 if rtype in repo.names:
329 349 ns = repo.names[rtype]
330 350 for name in ns.listnames(repo):
331 351 revs.update(ns.nodes(repo, name))
332 352
333 353 results = (cl.rev(n) for n in revs if cl.hasnode(n))
334 354 return subset & smartset.baseset(sorted(results))
335 355
336 356 @revsetpredicate('remotenames()')
337 357 def remotenamesrevset(repo, subset, x):
338 358 """All changesets which have a remotename on them."""
339 359 revsetlang.getargs(x, 0, 0, _("remotenames takes no arguments"))
340 360 return _revsetutil(repo, subset, x, ('remotebookmarks', 'remotebranches'))
341 361
342 362 @revsetpredicate('remotebranches()')
343 363 def remotebranchesrevset(repo, subset, x):
344 364 """All changesets which are branch heads on remotes."""
345 365 revsetlang.getargs(x, 0, 0, _("remotebranches takes no arguments"))
346 366 return _revsetutil(repo, subset, x, ('remotebranches',))
347 367
348 368 @revsetpredicate('remotebookmarks()')
349 369 def remotebmarksrevset(repo, subset, x):
350 370 """All changesets which have bookmarks on remotes."""
351 371 revsetlang.getargs(x, 0, 0, _("remotebookmarks takes no arguments"))
352 372 return _revsetutil(repo, subset, x, ('remotebookmarks',))
@@ -1,329 +1,335 b''
1 1 Testing the functionality to pull remotenames
2 2 =============================================
3 3
4 4 $ cat >> $HGRCPATH << EOF
5 5 > [alias]
6 6 > glog = log -G -T '{rev}:{node|short} {desc}'
7 7 > [experimental]
8 8 > remotenames = True
9 9 > [extensions]
10 10 > remotenames =
11 11 > show =
12 12 > EOF
13 13
14 14 Making a server repo
15 15 --------------------
16 16
17 17 $ hg init server
18 18 $ cd server
19 19 $ for ch in a b c d e f g h; do
20 20 > echo "foo" >> $ch
21 21 > hg ci -Aqm "Added "$ch
22 22 > done
23 23 $ hg glog
24 24 @ 7:ec2426147f0e Added h
25 25 |
26 26 o 6:87d6d6676308 Added g
27 27 |
28 28 o 5:825660c69f0c Added f
29 29 |
30 30 o 4:aa98ab95a928 Added e
31 31 |
32 32 o 3:62615734edd5 Added d
33 33 |
34 34 o 2:28ad74487de9 Added c
35 35 |
36 36 o 1:29becc82797a Added b
37 37 |
38 38 o 0:18d04c59bb5d Added a
39 39
40 40 $ hg bookmark -r 3 foo
41 41 $ hg bookmark -r 6 bar
42 42 $ hg up 4
43 43 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
44 44 $ hg branch wat
45 45 marked working directory as branch wat
46 46 (branches are permanent and global, did you want a bookmark?)
47 47 $ echo foo >> bar
48 48 $ hg ci -Aqm "added bar"
49 49
50 50 Making a client repo
51 51 --------------------
52 52
53 53 $ cd ..
54 54
55 55 $ hg clone server client
56 56 updating to branch default
57 57 8 files updated, 0 files merged, 0 files removed, 0 files unresolved
58 58
59 59 $ cd client
60 60 $ cat .hg/logexchange/bookmarks
61 61 0
62 62
63 63 87d6d66763085b629e6d7ed56778c79827273022\x00default\x00bar (esc)
64 64 62615734edd52f06b6fb9c2beb429e4fe30d57b8\x00default\x00foo (esc)
65 65
66 66 $ cat .hg/logexchange/branches
67 67 0
68 68
69 69 ec2426147f0e39dbc9cef599b066be6035ce691d\x00default\x00default (esc)
70 70 3e1487808078543b0af6d10dadf5d46943578db0\x00default\x00wat (esc)
71 71
72 72 $ hg show work
73 73 o 3e14 (wat) (default/wat) added bar
74 74 |
75 75 ~
76 76 @ ec24 (default/default) Added h
77 77 |
78 78 ~
79 79
80 80 $ hg update "default/wat"
81 81 1 files updated, 0 files merged, 3 files removed, 0 files unresolved
82 82 $ hg identify
83 83 3e1487808078 (wat) tip
84 84
85 85 Making a new server
86 86 -------------------
87 87
88 88 $ cd ..
89 89 $ hg init server2
90 90 $ cd server2
91 91 $ hg pull ../server/
92 92 pulling from ../server/
93 93 requesting all changes
94 94 adding changesets
95 95 adding manifests
96 96 adding file changes
97 97 added 9 changesets with 9 changes to 9 files (+1 heads)
98 98 adding remote bookmark bar
99 99 adding remote bookmark foo
100 100 new changesets 18d04c59bb5d:3e1487808078
101 101 (run 'hg heads' to see heads)
102 102
103 103 Pulling form the new server
104 104 ---------------------------
105 105 $ cd ../client/
106 106 $ hg pull ../server2/
107 107 pulling from ../server2/
108 108 searching for changes
109 109 no changes found
110 110 $ cat .hg/logexchange/bookmarks
111 111 0
112 112
113 113 62615734edd52f06b6fb9c2beb429e4fe30d57b8\x00default\x00foo (esc)
114 114 87d6d66763085b629e6d7ed56778c79827273022\x00default\x00bar (esc)
115 115 87d6d66763085b629e6d7ed56778c79827273022\x00$TESTTMP/server2\x00bar (esc)
116 116 62615734edd52f06b6fb9c2beb429e4fe30d57b8\x00$TESTTMP/server2\x00foo (esc)
117 117
118 118 $ cat .hg/logexchange/branches
119 119 0
120 120
121 121 3e1487808078543b0af6d10dadf5d46943578db0\x00default\x00wat (esc)
122 122 ec2426147f0e39dbc9cef599b066be6035ce691d\x00default\x00default (esc)
123 123 ec2426147f0e39dbc9cef599b066be6035ce691d\x00$TESTTMP/server2\x00default (esc)
124 124 3e1487808078543b0af6d10dadf5d46943578db0\x00$TESTTMP/server2\x00wat (esc)
125 125
126 126 $ hg log -G
127 127 @ changeset: 8:3e1487808078
128 128 | branch: wat
129 129 | tag: tip
130 130 | remote branch: $TESTTMP/server2/wat
131 131 | remote branch: default/wat
132 132 | parent: 4:aa98ab95a928
133 133 | user: test
134 134 | date: Thu Jan 01 00:00:00 1970 +0000
135 135 | summary: added bar
136 136 |
137 137 | o changeset: 7:ec2426147f0e
138 138 | | remote branch: $TESTTMP/server2/default
139 139 | | remote branch: default/default
140 140 | | user: test
141 141 | | date: Thu Jan 01 00:00:00 1970 +0000
142 142 | | summary: Added h
143 143 | |
144 144 | o changeset: 6:87d6d6676308
145 145 | | bookmark: bar
146 146 | | remote bookmark: $TESTTMP/server2/bar
147 147 | | remote bookmark: default/bar
148 148 | | hoisted name: bar
149 149 | | user: test
150 150 | | date: Thu Jan 01 00:00:00 1970 +0000
151 151 | | summary: Added g
152 152 | |
153 153 | o changeset: 5:825660c69f0c
154 154 |/ user: test
155 155 | date: Thu Jan 01 00:00:00 1970 +0000
156 156 | summary: Added f
157 157 |
158 158 o changeset: 4:aa98ab95a928
159 159 | user: test
160 160 | date: Thu Jan 01 00:00:00 1970 +0000
161 161 | summary: Added e
162 162 |
163 163 o changeset: 3:62615734edd5
164 164 | bookmark: foo
165 165 | remote bookmark: $TESTTMP/server2/foo
166 166 | remote bookmark: default/foo
167 167 | hoisted name: foo
168 168 | user: test
169 169 | date: Thu Jan 01 00:00:00 1970 +0000
170 170 | summary: Added d
171 171 |
172 172 o changeset: 2:28ad74487de9
173 173 | user: test
174 174 | date: Thu Jan 01 00:00:00 1970 +0000
175 175 | summary: Added c
176 176 |
177 177 o changeset: 1:29becc82797a
178 178 | user: test
179 179 | date: Thu Jan 01 00:00:00 1970 +0000
180 180 | summary: Added b
181 181 |
182 182 o changeset: 0:18d04c59bb5d
183 183 user: test
184 184 date: Thu Jan 01 00:00:00 1970 +0000
185 185 summary: Added a
186 186
187 187 Testing the templates provided by remotenames extension
188 188
189 189 `remotenames` keyword
190 190
191 191 $ hg log -G -T "{rev}:{node|short} {remotenames}\n"
192 192 @ 8:3e1487808078 $TESTTMP/server2/wat default/wat
193 193 |
194 194 | o 7:ec2426147f0e $TESTTMP/server2/default default/default
195 195 | |
196 196 | o 6:87d6d6676308 $TESTTMP/server2/bar default/bar
197 197 | |
198 198 | o 5:825660c69f0c
199 199 |/
200 200 o 4:aa98ab95a928
201 201 |
202 202 o 3:62615734edd5 $TESTTMP/server2/foo default/foo
203 203 |
204 204 o 2:28ad74487de9
205 205 |
206 206 o 1:29becc82797a
207 207 |
208 208 o 0:18d04c59bb5d
209 209
210 210 `remotebookmarks` and `remotebranches` keywords
211 211
212 212 $ hg log -G -T "{rev}:{node|short} [{remotebookmarks}] ({remotebranches})"
213 213 @ 8:3e1487808078 [] ($TESTTMP/server2/wat default/wat)
214 214 |
215 215 | o 7:ec2426147f0e [] ($TESTTMP/server2/default default/default)
216 216 | |
217 217 | o 6:87d6d6676308 [$TESTTMP/server2/bar default/bar] ()
218 218 | |
219 219 | o 5:825660c69f0c [] ()
220 220 |/
221 221 o 4:aa98ab95a928 [] ()
222 222 |
223 223 o 3:62615734edd5 [$TESTTMP/server2/foo default/foo] ()
224 224 |
225 225 o 2:28ad74487de9 [] ()
226 226 |
227 227 o 1:29becc82797a [] ()
228 228 |
229 229 o 0:18d04c59bb5d [] ()
230 230
231 231 The `hoistednames` template keyword
232 232
233 233 $ hg log -GT "{rev}:{node|short} ({hoistednames})"
234 234 @ 8:3e1487808078 ()
235 235 |
236 236 | o 7:ec2426147f0e ()
237 237 | |
238 238 | o 6:87d6d6676308 (bar)
239 239 | |
240 240 | o 5:825660c69f0c ()
241 241 |/
242 242 o 4:aa98ab95a928 ()
243 243 |
244 244 o 3:62615734edd5 (foo)
245 245 |
246 246 o 2:28ad74487de9 ()
247 247 |
248 248 o 1:29becc82797a ()
249 249 |
250 250 o 0:18d04c59bb5d ()
251 251
252 252
253 253 Testing the revsets provided by remotenames extension
254 254
255 255 `remotenames` revset
256 256
257 257 $ hg log -r "remotenames()" -GT "{rev}:{node|short} {remotenames}\n"
258 258 @ 8:3e1487808078 $TESTTMP/server2/wat default/wat
259 259 :
260 260 : o 7:ec2426147f0e $TESTTMP/server2/default default/default
261 261 : |
262 262 : o 6:87d6d6676308 $TESTTMP/server2/bar default/bar
263 263 :/
264 264 o 3:62615734edd5 $TESTTMP/server2/foo default/foo
265 265 |
266 266 ~
267 267
268 268 `remotebranches` revset
269 269
270 270 $ hg log -r "remotebranches()" -GT "{rev}:{node|short} {remotenames}\n"
271 271 @ 8:3e1487808078 $TESTTMP/server2/wat default/wat
272 272 |
273 273 ~
274 274 o 7:ec2426147f0e $TESTTMP/server2/default default/default
275 275 |
276 276 ~
277 277
278 278 `remotebookmarks` revset
279 279
280 280 $ hg log -r "remotebookmarks()" -GT "{rev}:{node|short} {remotenames}\n"
281 281 o 6:87d6d6676308 $TESTTMP/server2/bar default/bar
282 282 :
283 283 o 3:62615734edd5 $TESTTMP/server2/foo default/foo
284 284 |
285 285 ~
286 286
287 287 Updating to revision using hoisted name
288 288
289 289 Deleting local bookmark to make sure we update to hoisted name only
290 290
291 291 $ hg bookmark -d bar
292 292
293 293 $ hg up bar
294 294 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
295 295
296 296 $ hg log -r .
297 297 changeset: 6:87d6d6676308
298 298 remote bookmark: $TESTTMP/server2/bar
299 299 remote bookmark: default/bar
300 300 hoisted name: bar
301 301 user: test
302 302 date: Thu Jan 01 00:00:00 1970 +0000
303 303 summary: Added g
304 304
305 305 When both local bookmark and hoisted name exists but on different revs
306 306
307 307 $ hg up 8
308 308 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
309 309
310 310 $ hg bookmark foo
311 311 moving bookmark 'foo' forward from 62615734edd5
312 312
313 313 Local bookmark should take precedence over hoisted name
314 314
315 315 $ hg up foo
316 316 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
317 317
318 318 $ hg log -r .
319 319 changeset: 8:3e1487808078
320 320 branch: wat
321 321 bookmark: foo
322 322 tag: tip
323 323 remote branch: $TESTTMP/server2/wat
324 324 remote branch: default/wat
325 325 parent: 4:aa98ab95a928
326 326 user: test
327 327 date: Thu Jan 01 00:00:00 1970 +0000
328 328 summary: added bar
329 329
330 $ hg bookmarks
331 $TESTTMP/server2/bar 6:87d6d6676308
332 $TESTTMP/server2/foo 3:62615734edd5
333 default/bar 6:87d6d6676308
334 default/foo 3:62615734edd5
335 * foo 8:3e1487808078
General Comments 0
You need to be logged in to leave comments. Login now