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