##// END OF EJS Templates
remotenames: abort if literal revset pattern matches nothing...
Yuya Nishihara -
r40105:fd4d59cf default
parent child Browse files
Show More
@@ -1,398 +1,403
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 (EXPERIMENTAL)
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 35 bookmarks,
36 error,
36 37 extensions,
37 38 logexchange,
38 39 namespaces,
39 40 pycompat,
40 41 registrar,
41 42 revsetlang,
42 43 smartset,
43 44 templateutil,
44 45 util,
45 46 )
46 47
47 48 from mercurial.utils import (
48 49 stringutil,
49 50 )
50 51
51 52 if pycompat.ispy3:
52 53 import collections.abc
53 54 mutablemapping = collections.abc.MutableMapping
54 55 else:
55 56 import collections
56 57 mutablemapping = collections.MutableMapping
57 58
58 59 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
59 60 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
60 61 # be specifying the version(s) of Mercurial they are tested with, or
61 62 # leave the attribute unspecified.
62 63 testedwith = 'ships-with-hg-core'
63 64
64 65 configtable = {}
65 66 configitem = registrar.configitem(configtable)
66 67 templatekeyword = registrar.templatekeyword()
67 68 revsetpredicate = registrar.revsetpredicate()
68 69
69 70 configitem('remotenames', 'bookmarks',
70 71 default=True,
71 72 )
72 73 configitem('remotenames', 'branches',
73 74 default=True,
74 75 )
75 76 configitem('remotenames', 'hoistedpeer',
76 77 default='default',
77 78 )
78 79
79 80 class lazyremotenamedict(mutablemapping):
80 81 """
81 82 Read-only dict-like Class to lazily resolve remotename entries
82 83
83 84 We are doing that because remotenames startup was slow.
84 85 We lazily read the remotenames file once to figure out the potential entries
85 86 and store them in self.potentialentries. Then when asked to resolve an
86 87 entry, if it is not in self.potentialentries, then it isn't there, if it
87 88 is in self.potentialentries we resolve it and store the result in
88 89 self.cache. We cannot be lazy is when asked all the entries (keys).
89 90 """
90 91 def __init__(self, kind, repo):
91 92 self.cache = {}
92 93 self.potentialentries = {}
93 94 self._kind = kind # bookmarks or branches
94 95 self._repo = repo
95 96 self.loaded = False
96 97
97 98 def _load(self):
98 99 """ Read the remotenames file, store entries matching selected kind """
99 100 self.loaded = True
100 101 repo = self._repo
101 102 for node, rpath, rname in logexchange.readremotenamefile(repo,
102 103 self._kind):
103 104 name = rpath + '/' + rname
104 105 self.potentialentries[name] = (node, rpath, name)
105 106
106 107 def _resolvedata(self, potentialentry):
107 108 """ Check that the node for potentialentry exists and return it """
108 109 if not potentialentry in self.potentialentries:
109 110 return None
110 111 node, remote, name = self.potentialentries[potentialentry]
111 112 repo = self._repo
112 113 binnode = bin(node)
113 114 # if the node doesn't exist, skip it
114 115 try:
115 116 repo.changelog.rev(binnode)
116 117 except LookupError:
117 118 return None
118 119 # Skip closed branches
119 120 if (self._kind == 'branches' and repo[binnode].closesbranch()):
120 121 return None
121 122 return [binnode]
122 123
123 124 def __getitem__(self, key):
124 125 if not self.loaded:
125 126 self._load()
126 127 val = self._fetchandcache(key)
127 128 if val is not None:
128 129 return val
129 130 else:
130 131 raise KeyError()
131 132
132 133 def __iter__(self):
133 134 return iter(self.potentialentries)
134 135
135 136 def __len__(self):
136 137 return len(self.potentialentries)
137 138
138 139 def __setitem__(self):
139 140 raise NotImplementedError
140 141
141 142 def __delitem__(self):
142 143 raise NotImplementedError
143 144
144 145 def _fetchandcache(self, key):
145 146 if key in self.cache:
146 147 return self.cache[key]
147 148 val = self._resolvedata(key)
148 149 if val is not None:
149 150 self.cache[key] = val
150 151 return val
151 152 else:
152 153 return None
153 154
154 155 def keys(self):
155 156 """ Get a list of bookmark or branch names """
156 157 if not self.loaded:
157 158 self._load()
158 159 return self.potentialentries.keys()
159 160
160 161 def iteritems(self):
161 162 """ Iterate over (name, node) tuples """
162 163
163 164 if not self.loaded:
164 165 self._load()
165 166
166 167 for k, vtup in self.potentialentries.iteritems():
167 168 yield (k, [bin(vtup[0])])
168 169
169 170 class remotenames(object):
170 171 """
171 172 This class encapsulates all the remotenames state. It also contains
172 173 methods to access that state in convenient ways. Remotenames are lazy
173 174 loaded. Whenever client code needs to ensure the freshest copy of
174 175 remotenames, use the `clearnames` method to force an eventual load.
175 176 """
176 177
177 178 def __init__(self, repo, *args):
178 179 self._repo = repo
179 180 self.clearnames()
180 181
181 182 def clearnames(self):
182 183 """ Clear all remote names state """
183 184 self.bookmarks = lazyremotenamedict("bookmarks", self._repo)
184 185 self.branches = lazyremotenamedict("branches", self._repo)
185 186 self._invalidatecache()
186 187
187 188 def _invalidatecache(self):
188 189 self._nodetobmarks = None
189 190 self._nodetobranch = None
190 191 self._hoisttonodes = None
191 192 self._nodetohoists = None
192 193
193 194 def bmarktonodes(self):
194 195 return self.bookmarks
195 196
196 197 def nodetobmarks(self):
197 198 if not self._nodetobmarks:
198 199 bmarktonodes = self.bmarktonodes()
199 200 self._nodetobmarks = {}
200 201 for name, node in bmarktonodes.iteritems():
201 202 self._nodetobmarks.setdefault(node[0], []).append(name)
202 203 return self._nodetobmarks
203 204
204 205 def branchtonodes(self):
205 206 return self.branches
206 207
207 208 def nodetobranch(self):
208 209 if not self._nodetobranch:
209 210 branchtonodes = self.branchtonodes()
210 211 self._nodetobranch = {}
211 212 for name, nodes in branchtonodes.iteritems():
212 213 for node in nodes:
213 214 self._nodetobranch.setdefault(node, []).append(name)
214 215 return self._nodetobranch
215 216
216 217 def hoisttonodes(self, hoist):
217 218 if not self._hoisttonodes:
218 219 marktonodes = self.bmarktonodes()
219 220 self._hoisttonodes = {}
220 221 hoist += '/'
221 222 for name, node in marktonodes.iteritems():
222 223 if name.startswith(hoist):
223 224 name = name[len(hoist):]
224 225 self._hoisttonodes[name] = node
225 226 return self._hoisttonodes
226 227
227 228 def nodetohoists(self, hoist):
228 229 if not self._nodetohoists:
229 230 marktonodes = self.bmarktonodes()
230 231 self._nodetohoists = {}
231 232 hoist += '/'
232 233 for name, node in marktonodes.iteritems():
233 234 if name.startswith(hoist):
234 235 name = name[len(hoist):]
235 236 self._nodetohoists.setdefault(node[0], []).append(name)
236 237 return self._nodetohoists
237 238
238 239 def wrapprintbookmarks(orig, ui, repo, fm, bmarks):
239 240 if 'remotebookmarks' not in repo.names:
240 241 return
241 242 ns = repo.names['remotebookmarks']
242 243
243 244 for name in ns.listnames(repo):
244 245 nodes = ns.nodes(repo, name)
245 246 if not nodes:
246 247 continue
247 248 node = nodes[0]
248 249
249 250 bmarks[name] = (node, ' ', '')
250 251
251 252 return orig(ui, repo, fm, bmarks)
252 253
253 254 def extsetup(ui):
254 255 extensions.wrapfunction(bookmarks, '_printbookmarks', wrapprintbookmarks)
255 256
256 257 def reposetup(ui, repo):
257 258
258 259 # set the config option to store remotenames
259 260 repo.ui.setconfig('experimental', 'remotenames', True, 'remotenames-ext')
260 261
261 262 if not repo.local():
262 263 return
263 264
264 265 repo._remotenames = remotenames(repo)
265 266 ns = namespaces.namespace
266 267
267 268 if ui.configbool('remotenames', 'bookmarks'):
268 269 remotebookmarkns = ns(
269 270 'remotebookmarks',
270 271 templatename='remotebookmarks',
271 272 colorname='remotebookmark',
272 273 logfmt='remote bookmark: %s\n',
273 274 listnames=lambda repo: repo._remotenames.bmarktonodes().keys(),
274 275 namemap=lambda repo, name:
275 276 repo._remotenames.bmarktonodes().get(name, []),
276 277 nodemap=lambda repo, node:
277 278 repo._remotenames.nodetobmarks().get(node, []))
278 279 repo.names.addnamespace(remotebookmarkns)
279 280
280 281 # hoisting only works if there are remote bookmarks
281 282 hoist = ui.config('remotenames', 'hoistedpeer')
282 283 if hoist:
283 284 hoistednamens = ns(
284 285 'hoistednames',
285 286 templatename='hoistednames',
286 287 colorname='hoistedname',
287 288 logfmt='hoisted name: %s\n',
288 289 listnames = lambda repo:
289 290 repo._remotenames.hoisttonodes(hoist).keys(),
290 291 namemap = lambda repo, name:
291 292 repo._remotenames.hoisttonodes(hoist).get(name, []),
292 293 nodemap = lambda repo, node:
293 294 repo._remotenames.nodetohoists(hoist).get(node, []))
294 295 repo.names.addnamespace(hoistednamens)
295 296
296 297 if ui.configbool('remotenames', 'branches'):
297 298 remotebranchns = ns(
298 299 'remotebranches',
299 300 templatename='remotebranches',
300 301 colorname='remotebranch',
301 302 logfmt='remote branch: %s\n',
302 303 listnames = lambda repo: repo._remotenames.branchtonodes().keys(),
303 304 namemap = lambda repo, name:
304 305 repo._remotenames.branchtonodes().get(name, []),
305 306 nodemap = lambda repo, node:
306 307 repo._remotenames.nodetobranch().get(node, []))
307 308 repo.names.addnamespace(remotebranchns)
308 309
309 310 @templatekeyword('remotenames', requires={'repo', 'ctx'})
310 311 def remotenameskw(context, mapping):
311 312 """List of strings. Remote names associated with the changeset."""
312 313 repo = context.resource(mapping, 'repo')
313 314 ctx = context.resource(mapping, 'ctx')
314 315
315 316 remotenames = []
316 317 if 'remotebookmarks' in repo.names:
317 318 remotenames = repo.names['remotebookmarks'].names(repo, ctx.node())
318 319
319 320 if 'remotebranches' in repo.names:
320 321 remotenames += repo.names['remotebranches'].names(repo, ctx.node())
321 322
322 323 return templateutil.compatlist(context, mapping, 'remotename', remotenames,
323 324 plural='remotenames')
324 325
325 326 @templatekeyword('remotebookmarks', requires={'repo', 'ctx'})
326 327 def remotebookmarkskw(context, mapping):
327 328 """List of strings. Remote bookmarks associated with the changeset."""
328 329 repo = context.resource(mapping, 'repo')
329 330 ctx = context.resource(mapping, 'ctx')
330 331
331 332 remotebmarks = []
332 333 if 'remotebookmarks' in repo.names:
333 334 remotebmarks = repo.names['remotebookmarks'].names(repo, ctx.node())
334 335
335 336 return templateutil.compatlist(context, mapping, 'remotebookmark',
336 337 remotebmarks, plural='remotebookmarks')
337 338
338 339 @templatekeyword('remotebranches', requires={'repo', 'ctx'})
339 340 def remotebrancheskw(context, mapping):
340 341 """List of strings. Remote branches associated with the changeset."""
341 342 repo = context.resource(mapping, 'repo')
342 343 ctx = context.resource(mapping, 'ctx')
343 344
344 345 remotebranches = []
345 346 if 'remotebranches' in repo.names:
346 347 remotebranches = repo.names['remotebranches'].names(repo, ctx.node())
347 348
348 349 return templateutil.compatlist(context, mapping, 'remotebranch',
349 350 remotebranches, plural='remotebranches')
350 351
351 352 def _revsetutil(repo, subset, x, rtypes):
352 353 """utility function to return a set of revs based on the rtypes"""
353 354 args = revsetlang.getargs(x, 0, 1, _('only one argument accepted'))
354 355 if args:
355 356 kind, pattern, matcher = stringutil.stringmatcher(
356 357 revsetlang.getstring(args[0], _('argument must be a string')))
357 358 else:
359 kind = pattern = None
358 360 matcher = util.always
359 361
360 362 nodes = set()
361 363 cl = repo.changelog
362 364 for rtype in rtypes:
363 365 if rtype in repo.names:
364 366 ns = repo.names[rtype]
365 367 for name in ns.listnames(repo):
366 368 if not matcher(name):
367 369 continue
368 370 nodes.update(ns.nodes(repo, name))
371 if kind == 'literal' and not nodes:
372 raise error.RepoLookupError(_("remote name '%s' does not exist")
373 % pattern)
369 374
370 375 revs = (cl.rev(n) for n in nodes if cl.hasnode(n))
371 376 return subset & smartset.baseset(revs)
372 377
373 378 @revsetpredicate('remotenames([name])')
374 379 def remotenamesrevset(repo, subset, x):
375 380 """All changesets which have a remotename on them. If `name` is
376 381 specified, only remotenames of matching remote paths are considered.
377 382
378 383 Pattern matching is supported for `name`. See :hg:`help revisions.patterns`.
379 384 """
380 385 return _revsetutil(repo, subset, x, ('remotebookmarks', 'remotebranches'))
381 386
382 387 @revsetpredicate('remotebranches([name])')
383 388 def remotebranchesrevset(repo, subset, x):
384 389 """All changesets which are branch heads on remotes. If `name` is
385 390 specified, only remotenames of matching remote paths are considered.
386 391
387 392 Pattern matching is supported for `name`. See :hg:`help revisions.patterns`.
388 393 """
389 394 return _revsetutil(repo, subset, x, ('remotebranches',))
390 395
391 396 @revsetpredicate('remotebookmarks([name])')
392 397 def remotebmarksrevset(repo, subset, x):
393 398 """All changesets which have bookmarks on remotes. If `name` is
394 399 specified, only remotenames of matching remote paths are considered.
395 400
396 401 Pattern matching is supported for `name`. See :hg:`help revisions.patterns`.
397 402 """
398 403 return _revsetutil(repo, subset, x, ('remotebookmarks',))
@@ -1,523 +1,533
1 1 Testing the functionality to pull remotenames
2 2 =============================================
3 3
4 4 $ cat >> $HGRCPATH << EOF
5 5 > [ui]
6 6 > ssh = "$PYTHON" "$TESTDIR/dummyssh"
7 7 > [alias]
8 8 > glog = log -G -T '{rev}:{node|short} {desc}'
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 ssh://user@dummy/server client
56 56 requesting all changes
57 57 adding changesets
58 58 adding manifests
59 59 adding file changes
60 60 added 9 changesets with 9 changes to 9 files (+1 heads)
61 61 new changesets 18d04c59bb5d:3e1487808078
62 62 updating to branch default
63 63 8 files updated, 0 files merged, 0 files removed, 0 files unresolved
64 64
65 65 $ cd client
66 66 $ cat .hg/logexchange/bookmarks
67 67 0
68 68
69 69 87d6d66763085b629e6d7ed56778c79827273022\x00default\x00bar (esc)
70 70 62615734edd52f06b6fb9c2beb429e4fe30d57b8\x00default\x00foo (esc)
71 71
72 72 $ cat .hg/logexchange/branches
73 73 0
74 74
75 75 ec2426147f0e39dbc9cef599b066be6035ce691d\x00default\x00default (esc)
76 76 3e1487808078543b0af6d10dadf5d46943578db0\x00default\x00wat (esc)
77 77
78 78 $ hg show work
79 79 o 3e14 (wat) (default/wat) added bar
80 80 ~
81 81 @ ec24 (default/default) Added h
82 82 ~
83 83
84 84 $ hg update "default/wat"
85 85 1 files updated, 0 files merged, 3 files removed, 0 files unresolved
86 86 $ hg identify
87 87 3e1487808078 (wat) tip
88 88
89 89 Making a new server
90 90 -------------------
91 91
92 92 $ cd ..
93 93 $ hg init server2
94 94 $ cd server2
95 95 $ hg pull ../server/
96 96 pulling from ../server/
97 97 requesting all changes
98 98 adding changesets
99 99 adding manifests
100 100 adding file changes
101 101 added 9 changesets with 9 changes to 9 files (+1 heads)
102 102 adding remote bookmark bar
103 103 adding remote bookmark foo
104 104 new changesets 18d04c59bb5d:3e1487808078
105 105 (run 'hg heads' to see heads)
106 106
107 107 Pulling form the new server
108 108 ---------------------------
109 109 $ cd ../client/
110 110 $ hg pull ../server2/
111 111 pulling from ../server2/
112 112 searching for changes
113 113 no changes found
114 114 $ cat .hg/logexchange/bookmarks
115 115 0
116 116
117 117 62615734edd52f06b6fb9c2beb429e4fe30d57b8\x00default\x00foo (esc)
118 118 87d6d66763085b629e6d7ed56778c79827273022\x00default\x00bar (esc)
119 119 87d6d66763085b629e6d7ed56778c79827273022\x00$TESTTMP/server2\x00bar (esc)
120 120 62615734edd52f06b6fb9c2beb429e4fe30d57b8\x00$TESTTMP/server2\x00foo (esc)
121 121
122 122 $ cat .hg/logexchange/branches
123 123 0
124 124
125 125 3e1487808078543b0af6d10dadf5d46943578db0\x00default\x00wat (esc)
126 126 ec2426147f0e39dbc9cef599b066be6035ce691d\x00default\x00default (esc)
127 127 ec2426147f0e39dbc9cef599b066be6035ce691d\x00$TESTTMP/server2\x00default (esc)
128 128 3e1487808078543b0af6d10dadf5d46943578db0\x00$TESTTMP/server2\x00wat (esc)
129 129
130 130 $ hg log -G
131 131 @ changeset: 8:3e1487808078
132 132 | branch: wat
133 133 | tag: tip
134 134 | remote branch: $TESTTMP/server2/wat
135 135 | remote branch: default/wat
136 136 | parent: 4:aa98ab95a928
137 137 | user: test
138 138 | date: Thu Jan 01 00:00:00 1970 +0000
139 139 | summary: added bar
140 140 |
141 141 | o changeset: 7:ec2426147f0e
142 142 | | remote branch: $TESTTMP/server2/default
143 143 | | remote branch: default/default
144 144 | | user: test
145 145 | | date: Thu Jan 01 00:00:00 1970 +0000
146 146 | | summary: Added h
147 147 | |
148 148 | o changeset: 6:87d6d6676308
149 149 | | bookmark: bar
150 150 | | remote bookmark: $TESTTMP/server2/bar
151 151 | | remote bookmark: default/bar
152 152 | | hoisted name: bar
153 153 | | user: test
154 154 | | date: Thu Jan 01 00:00:00 1970 +0000
155 155 | | summary: Added g
156 156 | |
157 157 | o changeset: 5:825660c69f0c
158 158 |/ user: test
159 159 | date: Thu Jan 01 00:00:00 1970 +0000
160 160 | summary: Added f
161 161 |
162 162 o changeset: 4:aa98ab95a928
163 163 | user: test
164 164 | date: Thu Jan 01 00:00:00 1970 +0000
165 165 | summary: Added e
166 166 |
167 167 o changeset: 3:62615734edd5
168 168 | bookmark: foo
169 169 | remote bookmark: $TESTTMP/server2/foo
170 170 | remote bookmark: default/foo
171 171 | hoisted name: foo
172 172 | user: test
173 173 | date: Thu Jan 01 00:00:00 1970 +0000
174 174 | summary: Added d
175 175 |
176 176 o changeset: 2:28ad74487de9
177 177 | user: test
178 178 | date: Thu Jan 01 00:00:00 1970 +0000
179 179 | summary: Added c
180 180 |
181 181 o changeset: 1:29becc82797a
182 182 | user: test
183 183 | date: Thu Jan 01 00:00:00 1970 +0000
184 184 | summary: Added b
185 185 |
186 186 o changeset: 0:18d04c59bb5d
187 187 user: test
188 188 date: Thu Jan 01 00:00:00 1970 +0000
189 189 summary: Added a
190 190
191 191 Testing the templates provided by remotenames extension
192 192
193 193 `remotenames` keyword
194 194
195 195 $ hg log -G -T "{rev}:{node|short} {remotenames}\n"
196 196 @ 8:3e1487808078 $TESTTMP/server2/wat default/wat
197 197 |
198 198 | o 7:ec2426147f0e $TESTTMP/server2/default default/default
199 199 | |
200 200 | o 6:87d6d6676308 $TESTTMP/server2/bar default/bar
201 201 | |
202 202 | o 5:825660c69f0c
203 203 |/
204 204 o 4:aa98ab95a928
205 205 |
206 206 o 3:62615734edd5 $TESTTMP/server2/foo default/foo
207 207 |
208 208 o 2:28ad74487de9
209 209 |
210 210 o 1:29becc82797a
211 211 |
212 212 o 0:18d04c59bb5d
213 213
214 214 `remotebookmarks` and `remotebranches` keywords
215 215
216 216 $ hg log -G -T "{rev}:{node|short} [{remotebookmarks}] ({remotebranches})"
217 217 @ 8:3e1487808078 [] ($TESTTMP/server2/wat default/wat)
218 218 |
219 219 | o 7:ec2426147f0e [] ($TESTTMP/server2/default default/default)
220 220 | |
221 221 | o 6:87d6d6676308 [$TESTTMP/server2/bar default/bar] ()
222 222 | |
223 223 | o 5:825660c69f0c [] ()
224 224 |/
225 225 o 4:aa98ab95a928 [] ()
226 226 |
227 227 o 3:62615734edd5 [$TESTTMP/server2/foo default/foo] ()
228 228 |
229 229 o 2:28ad74487de9 [] ()
230 230 |
231 231 o 1:29becc82797a [] ()
232 232 |
233 233 o 0:18d04c59bb5d [] ()
234 234
235 235 The `hoistednames` template keyword
236 236
237 237 $ hg log -GT "{rev}:{node|short} ({hoistednames})"
238 238 @ 8:3e1487808078 ()
239 239 |
240 240 | o 7:ec2426147f0e ()
241 241 | |
242 242 | o 6:87d6d6676308 (bar)
243 243 | |
244 244 | o 5:825660c69f0c ()
245 245 |/
246 246 o 4:aa98ab95a928 ()
247 247 |
248 248 o 3:62615734edd5 (foo)
249 249 |
250 250 o 2:28ad74487de9 ()
251 251 |
252 252 o 1:29becc82797a ()
253 253 |
254 254 o 0:18d04c59bb5d ()
255 255
256 256
257 257 Testing the revsets provided by remotenames extension
258 258
259 259 `remotenames` revset
260 260
261 261 $ hg log -r "remotenames()" -GT "{rev}:{node|short} {remotenames}\n"
262 262 @ 8:3e1487808078 $TESTTMP/server2/wat default/wat
263 263 :
264 264 : o 7:ec2426147f0e $TESTTMP/server2/default default/default
265 265 : |
266 266 : o 6:87d6d6676308 $TESTTMP/server2/bar default/bar
267 267 :/
268 268 o 3:62615734edd5 $TESTTMP/server2/foo default/foo
269 269 |
270 270 ~
271 271
272 272 `remotebranches` revset
273 273
274 274 $ hg log -r "remotebranches()" -GT "{rev}:{node|short} {remotenames}\n"
275 275 @ 8:3e1487808078 $TESTTMP/server2/wat default/wat
276 276 |
277 277 ~
278 278 o 7:ec2426147f0e $TESTTMP/server2/default default/default
279 279 |
280 280 ~
281 281
282 282 `remotebookmarks` revset
283 283
284 284 $ hg log -r "remotebookmarks()" -GT "{rev}:{node|short} {remotenames}\n"
285 285 o 6:87d6d6676308 $TESTTMP/server2/bar default/bar
286 286 :
287 287 o 3:62615734edd5 $TESTTMP/server2/foo default/foo
288 288 |
289 289 ~
290 290
291 291 Updating to revision using hoisted name
292 292 ---------------------------------------
293 293
294 294 Deleting local bookmark to make sure we update to hoisted name only
295 295
296 296 $ hg bookmark -d bar
297 297
298 298 $ hg up bar
299 299 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
300 300
301 301 $ hg log -r .
302 302 changeset: 6:87d6d6676308
303 303 remote bookmark: $TESTTMP/server2/bar
304 304 remote bookmark: default/bar
305 305 hoisted name: bar
306 306 user: test
307 307 date: Thu Jan 01 00:00:00 1970 +0000
308 308 summary: Added g
309 309
310 310 When both local bookmark and hoisted name exists but on different revs
311 311
312 312 $ hg up 8
313 313 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
314 314
315 315 $ hg bookmark foo
316 316 moving bookmark 'foo' forward from 62615734edd5
317 317
318 318 Local bookmark should take precedence over hoisted name
319 319
320 320 $ hg up foo
321 321 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
322 322
323 323 $ hg log -r .
324 324 changeset: 8:3e1487808078
325 325 branch: wat
326 326 bookmark: foo
327 327 tag: tip
328 328 remote branch: $TESTTMP/server2/wat
329 329 remote branch: default/wat
330 330 parent: 4:aa98ab95a928
331 331 user: test
332 332 date: Thu Jan 01 00:00:00 1970 +0000
333 333 summary: added bar
334 334
335 335 $ hg bookmarks
336 336 $TESTTMP/server2/bar 6:87d6d6676308
337 337 $TESTTMP/server2/foo 3:62615734edd5
338 338 default/bar 6:87d6d6676308
339 339 default/foo 3:62615734edd5
340 340 * foo 8:3e1487808078
341 341
342 342 Testing the remotenames sychronization during `hg push`
343 343 -------------------------------------------------------
344 344
345 345 $ cd ../server/
346 346 $ hg bookmark foo
347 347 moving bookmark 'foo' forward from 62615734edd5
348 348
349 349 After the push, default/foo should move to rev 8
350 350 $ cd ../client/
351 351 $ hg push
352 352 pushing to ssh://user@dummy/server
353 353 searching for changes
354 354 no changes found
355 355 [1]
356 356 $ hg log -Gr 'remotenames()'
357 357 @ changeset: 8:3e1487808078
358 358 : branch: wat
359 359 : bookmark: foo
360 360 : tag: tip
361 361 : remote bookmark: default/foo
362 362 : hoisted name: foo
363 363 : remote branch: $TESTTMP/server2/wat
364 364 : remote branch: default/wat
365 365 : parent: 4:aa98ab95a928
366 366 : user: test
367 367 : date: Thu Jan 01 00:00:00 1970 +0000
368 368 : summary: added bar
369 369 :
370 370 : o changeset: 7:ec2426147f0e
371 371 : | remote branch: $TESTTMP/server2/default
372 372 : | remote branch: default/default
373 373 : | user: test
374 374 : | date: Thu Jan 01 00:00:00 1970 +0000
375 375 : | summary: Added h
376 376 : |
377 377 : o changeset: 6:87d6d6676308
378 378 :/ remote bookmark: $TESTTMP/server2/bar
379 379 : remote bookmark: default/bar
380 380 : hoisted name: bar
381 381 : user: test
382 382 : date: Thu Jan 01 00:00:00 1970 +0000
383 383 : summary: Added g
384 384 :
385 385 o changeset: 3:62615734edd5
386 386 | remote bookmark: $TESTTMP/server2/foo
387 387 ~ user: test
388 388 date: Thu Jan 01 00:00:00 1970 +0000
389 389 summary: Added d
390 390
391 391 $ hg bookmarks
392 392 $TESTTMP/server2/bar 6:87d6d6676308
393 393 $TESTTMP/server2/foo 3:62615734edd5
394 394 default/bar 6:87d6d6676308
395 395 default/foo 8:3e1487808078
396 396 * foo 8:3e1487808078
397 397
398 398 Testing the names argument to remotenames, remotebranches and remotebookmarks revsets
399 399 --------------------------------------------------------------------------------------
400 400
401 401 $ cd ..
402 402 $ hg clone ssh://user@dummy/server client2
403 403 requesting all changes
404 404 adding changesets
405 405 adding manifests
406 406 adding file changes
407 407 added 9 changesets with 9 changes to 9 files (+1 heads)
408 408 new changesets 18d04c59bb5d:3e1487808078
409 409 updating to branch default
410 410 8 files updated, 0 files merged, 0 files removed, 0 files unresolved
411 411 $ cd server2
412 412 $ hg up wat
413 413 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
414 414 $ echo foo > watwat
415 415 $ hg ci -Aqm "added watwat"
416 416 $ hg bookmark bar
417 417 abort: bookmark 'bar' already exists (use -f to force)
418 418 [255]
419 419 $ hg up ec24
420 420 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
421 421 $ echo i > i
422 422 $ hg ci -Aqm "added i"
423 423
424 424 $ cd ../client2
425 425 $ echo "[paths]" >> .hg/hgrc
426 426 $ echo "server2 = $TESTTMP/server2" >> .hg/hgrc
427 427 $ hg pull server2
428 428 pulling from $TESTTMP/server2
429 429 searching for changes
430 430 adding changesets
431 431 adding manifests
432 432 adding file changes
433 433 added 2 changesets with 2 changes to 2 files
434 434 new changesets f34adec73c21:bf433e48adea
435 435 (run 'hg update' to get a working copy)
436 436
437 437 $ hg log -Gr 'remotenames()' -T '{rev}:{node|short} {desc}\n({remotebranches}) [{remotebookmarks}]\n\n'
438 438 o 10:bf433e48adea added i
439 439 | (server2/default) []
440 440 |
441 441 | o 9:f34adec73c21 added watwat
442 442 | | (server2/wat) []
443 443 | |
444 444 | o 8:3e1487808078 added bar
445 445 | : (default/wat) [default/foo]
446 446 | :
447 447 @ : 7:ec2426147f0e Added h
448 448 | : (default/default) []
449 449 | :
450 450 o : 6:87d6d6676308 Added g
451 451 :/ () [default/bar server2/bar]
452 452 :
453 453 o 3:62615734edd5 Added d
454 454 | () [server2/foo]
455 455 ~
456 456
457 457 Testing for a single remote name which exists
458 458
459 459 $ hg log -r 'remotebranches("default/wat")' -GT "{rev}:{node|short} {remotebranches}\n"
460 460 o 8:3e1487808078 default/wat
461 461 |
462 462 ~
463 463
464 464 $ hg log -r 'remotebookmarks("server2/foo")' -GT "{rev}:{node|short} {remotebookmarks}\n"
465 465 o 3:62615734edd5 server2/foo
466 466 |
467 467 ~
468 468
469 469 $ hg log -r 'remotenames("re:default")' -GT "{rev}:{node|short} {remotenames}\n"
470 470 o 10:bf433e48adea server2/default
471 471 |
472 472 | o 8:3e1487808078 default/foo default/wat
473 473 | |
474 474 | ~
475 475 @ 7:ec2426147f0e default/default
476 476 |
477 477 o 6:87d6d6676308 default/bar server2/bar
478 478 |
479 479 ~
480 480
481 Testing for a single name which does not exists
481 Testing for a literal name which does not exists, which should fail.
482 482
483 483 $ hg log -r 'remotebranches(def)' -GT "{rev}:{node|short} {remotenames}\n"
484 abort: remote name 'def' does not exist!
485 [255]
484 486
485 487 $ hg log -r 'remotebookmarks("server3")' -GT "{rev}:{node|short} {remotenames}\n"
488 abort: remote name 'server3' does not exist!
489 [255]
486 490
487 491 $ hg log -r 'remotenames("server3")' -GT "{rev}:{node|short} {remotenames}\n"
492 abort: remote name 'server3' does not exist!
493 [255]
494
495 Testing for a pattern which does not match anything, which shouldn't fail.
496
497 $ hg log -r 'remotenames("re:^server3$")'
488 498
489 499 Testing for multiple names, which is not supported.
490 500
491 501 $ hg log -r 'remotenames("re:default", "re:server2")' -GT "{rev}:{node|short} {remotenames}\n"
492 502 hg: parse error: only one argument accepted
493 503 [255]
494 504
495 505 $ hg log -r 'remotebranches("default/wat", "server2/wat")' -GT "{rev}:{node|short} {remotebranches}\n"
496 506 hg: parse error: only one argument accepted
497 507 [255]
498 508
499 509 $ hg log -r 'remotebookmarks("default/foo", "server2/foo")' -GT "{rev}:{node|short} {remotebookmarks}\n"
500 510 hg: parse error: only one argument accepted
501 511 [255]
502 512
503 513 Testing pattern matching
504 514
505 515 $ hg log -r 'remotenames("re:def")' -GT "{rev}:{node|short} {remotenames}\n"
506 516 o 10:bf433e48adea server2/default
507 517 |
508 518 | o 8:3e1487808078 default/foo default/wat
509 519 | |
510 520 | ~
511 521 @ 7:ec2426147f0e default/default
512 522 |
513 523 o 6:87d6d6676308 default/bar server2/bar
514 524 |
515 525 ~
516 526
517 527 $ hg log -r 'remotebranches("re:ser.*2")' -GT "{rev}:{node|short} {remotebranches}\n"
518 528 o 10:bf433e48adea server2/default
519 529 |
520 530 ~
521 531 o 9:f34adec73c21 server2/wat
522 532 |
523 533 ~
General Comments 0
You need to be logged in to leave comments. Login now