##// END OF EJS Templates
Move revision parsing into cmdutil.
Brendan Cully -
r3090:eeaf9bcd default
parent child Browse files
Show More
@@ -14,7 +14,7 b''
14 from mercurial.demandload import *
14 from mercurial.demandload import *
15 from mercurial.i18n import gettext as _
15 from mercurial.i18n import gettext as _
16 demandload(globals(), 'time sys signal os')
16 demandload(globals(), 'time sys signal os')
17 demandload(globals(), 'mercurial:hg,mdiff,fancyopts,commands,ui,util,templater,node')
17 demandload(globals(), 'mercurial:hg,mdiff,fancyopts,cmdutil,ui,util,templater,node')
18
18
19 def __gather(ui, repo, node1, node2):
19 def __gather(ui, repo, node1, node2):
20 def dirtywork(f, mmap1, mmap2):
20 def dirtywork(f, mmap1, mmap2):
@@ -150,7 +150,7 b' def churn(ui, repo, **opts):'
150 amap = get_aliases(f)
150 amap = get_aliases(f)
151 f.close()
151 f.close()
152
152
153 revs = [int(r) for r in commands.revrange(ui, repo, opts['rev'])]
153 revs = [int(r) for r in cmdutil.revrange(ui, repo, opts['rev'])]
154 revs.sort()
154 revs.sort()
155 stats = gather_stats(ui, repo, amap, revs, opts.get('progress'))
155 stats = gather_stats(ui, repo, amap, revs, opts.get('progress'))
156
156
@@ -45,7 +45,7 b''
45 from mercurial.demandload import demandload
45 from mercurial.demandload import demandload
46 from mercurial.i18n import gettext as _
46 from mercurial.i18n import gettext as _
47 from mercurial.node import *
47 from mercurial.node import *
48 demandload(globals(), 'mercurial:commands,cmdutil,util os shutil tempfile')
48 demandload(globals(), 'mercurial:cmdutil,util os shutil tempfile')
49
49
50 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
50 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
51 def snapshot_node(files, node):
51 def snapshot_node(files, node):
@@ -90,7 +90,7 b' def dodiff(ui, repo, diffcmd, diffopts, '
90 fp.write(chunk)
90 fp.write(chunk)
91 return dirname
91 return dirname
92
92
93 node1, node2 = commands.revpair(ui, repo, opts['rev'])
93 node1, node2 = cmdutil.revpair(ui, repo, opts['rev'])
94 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
94 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
95 modified, added, removed, deleted, unknown = repo.status(
95 modified, added, removed, deleted, unknown = repo.status(
96 node1, node2, files, match=matchfn)[:5]
96 node1, node2, files, match=matchfn)[:5]
@@ -11,6 +11,76 b' from i18n import gettext as _'
11 demandload(globals(), 'mdiff util')
11 demandload(globals(), 'mdiff util')
12 demandload(globals(), 'os sys')
12 demandload(globals(), 'os sys')
13
13
14 revrangesep = ':'
15
16 def revfix(repo, val, defval):
17 '''turn user-level id of changeset into rev number.
18 user-level id can be tag, changeset, rev number, or negative rev
19 number relative to number of revs (-1 is tip, etc).'''
20 if not val:
21 return defval
22 try:
23 num = int(val)
24 if str(num) != val:
25 raise ValueError
26 if num < 0:
27 num += repo.changelog.count()
28 if num < 0:
29 num = 0
30 elif num >= repo.changelog.count():
31 raise ValueError
32 except ValueError:
33 try:
34 num = repo.changelog.rev(repo.lookup(val))
35 except KeyError:
36 raise util.Abort(_('invalid revision identifier %s') % val)
37 return num
38
39 def revpair(ui, repo, revs):
40 '''return pair of nodes, given list of revisions. second item can
41 be None, meaning use working dir.'''
42 if not revs:
43 return repo.dirstate.parents()[0], None
44 end = None
45 if len(revs) == 1:
46 start = revs[0]
47 if revrangesep in start:
48 start, end = start.split(revrangesep, 1)
49 start = revfix(repo, start, 0)
50 end = revfix(repo, end, repo.changelog.count() - 1)
51 else:
52 start = revfix(repo, start, None)
53 elif len(revs) == 2:
54 if revrangesep in revs[0] or revrangesep in revs[1]:
55 raise util.Abort(_('too many revisions specified'))
56 start = revfix(repo, revs[0], None)
57 end = revfix(repo, revs[1], None)
58 else:
59 raise util.Abort(_('too many revisions specified'))
60 if end is not None: end = repo.lookup(str(end))
61 return repo.lookup(str(start)), end
62
63 def revrange(ui, repo, revs):
64 """Yield revision as strings from a list of revision specifications."""
65 seen = {}
66 for spec in revs:
67 if revrangesep in spec:
68 start, end = spec.split(revrangesep, 1)
69 start = revfix(repo, start, 0)
70 end = revfix(repo, end, repo.changelog.count() - 1)
71 step = start > end and -1 or 1
72 for rev in xrange(start, end+step, step):
73 if rev in seen:
74 continue
75 seen[rev] = 1
76 yield str(rev)
77 else:
78 rev = revfix(repo, spec, None)
79 if rev in seen:
80 continue
81 seen[rev] = 1
82 yield str(rev)
83
14 def make_filename(repo, pat, node,
84 def make_filename(repo, pat, node,
15 total=None, seqno=None, revwidth=None, pathname=None):
85 total=None, seqno=None, revwidth=None, pathname=None):
16 node_expander = {
86 node_expander = {
@@ -108,7 +108,7 b' def walkchangerevs(ui, repo, pats, opts)'
108 defrange = '%s:0' % start
108 defrange = '%s:0' % start
109 else:
109 else:
110 defrange = 'tip:0'
110 defrange = 'tip:0'
111 revs = map(int, revrange(ui, repo, opts['rev'] or [defrange]))
111 revs = map(int, cmdutil.revrange(ui, repo, opts['rev'] or [defrange]))
112 wanted = {}
112 wanted = {}
113 slowpath = anypats
113 slowpath = anypats
114 fncache = {}
114 fncache = {}
@@ -252,76 +252,6 b' def walkchangerevs(ui, repo, pats, opts)'
252 yield 'iter', rev, None
252 yield 'iter', rev, None
253 return iterate(), getchange, matchfn
253 return iterate(), getchange, matchfn
254
254
255 revrangesep = ':'
256
257 def revfix(repo, val, defval):
258 '''turn user-level id of changeset into rev number.
259 user-level id can be tag, changeset, rev number, or negative rev
260 number relative to number of revs (-1 is tip, etc).'''
261 if not val:
262 return defval
263 try:
264 num = int(val)
265 if str(num) != val:
266 raise ValueError
267 if num < 0:
268 num += repo.changelog.count()
269 if num < 0:
270 num = 0
271 elif num >= repo.changelog.count():
272 raise ValueError
273 except ValueError:
274 try:
275 num = repo.changelog.rev(repo.lookup(val))
276 except KeyError:
277 raise util.Abort(_('invalid revision identifier %s') % val)
278 return num
279
280 def revpair(ui, repo, revs):
281 '''return pair of nodes, given list of revisions. second item can
282 be None, meaning use working dir.'''
283 if not revs:
284 return repo.dirstate.parents()[0], None
285 end = None
286 if len(revs) == 1:
287 start = revs[0]
288 if revrangesep in start:
289 start, end = start.split(revrangesep, 1)
290 start = revfix(repo, start, 0)
291 end = revfix(repo, end, repo.changelog.count() - 1)
292 else:
293 start = revfix(repo, start, None)
294 elif len(revs) == 2:
295 if revrangesep in revs[0] or revrangesep in revs[1]:
296 raise util.Abort(_('too many revisions specified'))
297 start = revfix(repo, revs[0], None)
298 end = revfix(repo, revs[1], None)
299 else:
300 raise util.Abort(_('too many revisions specified'))
301 if end is not None: end = repo.lookup(str(end))
302 return repo.lookup(str(start)), end
303
304 def revrange(ui, repo, revs):
305 """Yield revision as strings from a list of revision specifications."""
306 seen = {}
307 for spec in revs:
308 if revrangesep in spec:
309 start, end = spec.split(revrangesep, 1)
310 start = revfix(repo, start, 0)
311 end = revfix(repo, end, repo.changelog.count() - 1)
312 step = start > end and -1 or 1
313 for rev in xrange(start, end+step, step):
314 if rev in seen:
315 continue
316 seen[rev] = 1
317 yield str(rev)
318 else:
319 rev = revfix(repo, spec, None)
320 if rev in seen:
321 continue
322 seen[rev] = 1
323 yield str(rev)
324
325 def write_bundle(cg, filename=None, compress=True):
255 def write_bundle(cg, filename=None, compress=True):
326 """Write a bundle file and return its filename.
256 """Write a bundle file and return its filename.
327
257
@@ -1344,7 +1274,7 b' def diff(ui, repo, *pats, **opts):'
1344 it detects as binary. With -a, diff will generate a diff anyway,
1274 it detects as binary. With -a, diff will generate a diff anyway,
1345 probably with undesirable results.
1275 probably with undesirable results.
1346 """
1276 """
1347 node1, node2 = revpair(ui, repo, opts['rev'])
1277 node1, node2 = cmdutil.revpair(ui, repo, opts['rev'])
1348
1278
1349 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
1279 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
1350
1280
@@ -1380,7 +1310,7 b' def export(ui, repo, *changesets, **opts'
1380 """
1310 """
1381 if not changesets:
1311 if not changesets:
1382 raise util.Abort(_("export requires at least one changeset"))
1312 raise util.Abort(_("export requires at least one changeset"))
1383 revs = list(revrange(ui, repo, changesets))
1313 revs = list(cmdutil.revrange(ui, repo, changesets))
1384 if len(revs) > 1:
1314 if len(revs) > 1:
1385 ui.note(_('exporting patches:\n'))
1315 ui.note(_('exporting patches:\n'))
1386 else:
1316 else:
General Comments 0
You need to be logged in to leave comments. Login now