comparison mercurial/cmdutil.py @ 3556:cf0f8d9256c7

simplify revrange and revpair
author Matt Mackall <mpm@selenic.com>
date Thu, 26 Oct 2006 17:15:55 -0500
parents a33a9af1ec03
children 68341c06bc61
comparison
equal deleted inserted replaced
3555:a33a9af1ec03 3556:cf0f8d9256c7
11 demandload(globals(), 'mdiff util') 11 demandload(globals(), 'mdiff util')
12 demandload(globals(), 'os sys') 12 demandload(globals(), 'os sys')
13 13
14 revrangesep = ':' 14 revrangesep = ':'
15 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): 16 def revpair(ui, repo, revs):
40 '''return pair of nodes, given list of revisions. second item can 17 '''return pair of nodes, given list of revisions. second item can
41 be None, meaning use working dir.''' 18 be None, meaning use working dir.'''
19
20 def revfix(repo, val, defval):
21 if not val and val != 0:
22 val = defval
23 return repo.lookup(val)
24
42 if not revs: 25 if not revs:
43 return repo.dirstate.parents()[0], None 26 return repo.dirstate.parents()[0], None
44 end = None 27 end = None
45 if len(revs) == 1: 28 if len(revs) == 1:
46 start = revs[0] 29 if revrangesep in revs[0]:
47 if revrangesep in start: 30 start, end = revs[0].split(revrangesep, 1)
48 start, end = start.split(revrangesep, 1)
49 start = revfix(repo, start, 0) 31 start = revfix(repo, start, 0)
50 end = revfix(repo, end, repo.changelog.count() - 1) 32 end = revfix(repo, end, repo.changelog.count() - 1)
51 else: 33 else:
52 start = revfix(repo, start, None) 34 start = revfix(repo, revs[0], None)
53 elif len(revs) == 2: 35 elif len(revs) == 2:
54 if revrangesep in revs[0] or revrangesep in revs[1]: 36 if revrangesep in revs[0] or revrangesep in revs[1]:
55 raise util.Abort(_('too many revisions specified')) 37 raise util.Abort(_('too many revisions specified'))
56 start = revfix(repo, revs[0], None) 38 start = revfix(repo, revs[0], None)
57 end = revfix(repo, revs[1], None) 39 end = revfix(repo, revs[1], None)
58 else: 40 else:
59 raise util.Abort(_('too many revisions specified')) 41 raise util.Abort(_('too many revisions specified'))
60 if end is not None: end = repo.lookup(end) 42 return start, end
61 return repo.lookup(start), end
62 43
63 def revrange(ui, repo, revs): 44 def revrange(ui, repo, revs):
64 """Yield revision as strings from a list of revision specifications.""" 45 """Yield revision as strings from a list of revision specifications."""
46
47 def revfix(repo, val, defval):
48 if not val and val != 0:
49 return defval
50 return repo.changelog.rev(repo.lookup(val))
51
65 seen = {} 52 seen = {}
66 for spec in revs: 53 for spec in revs:
67 if revrangesep in spec: 54 if revrangesep in spec:
68 start, end = spec.split(revrangesep, 1) 55 start, end = spec.split(revrangesep, 1)
69 start = revfix(repo, start, 0) 56 start = revfix(repo, start, 0)
71 step = start > end and -1 or 1 58 step = start > end and -1 or 1
72 for rev in xrange(start, end+step, step): 59 for rev in xrange(start, end+step, step):
73 if rev in seen: 60 if rev in seen:
74 continue 61 continue
75 seen[rev] = 1 62 seen[rev] = 1
76 yield str(rev) 63 yield rev
77 else: 64 else:
78 rev = revfix(repo, spec, None) 65 rev = revfix(repo, spec, None)
79 if rev in seen: 66 if rev in seen:
80 continue 67 continue
81 seen[rev] = 1 68 seen[rev] = 1
82 yield str(rev) 69 yield rev
83 70
84 def make_filename(repo, pat, node, 71 def make_filename(repo, pat, node,
85 total=None, seqno=None, revwidth=None, pathname=None): 72 total=None, seqno=None, revwidth=None, pathname=None):
86 node_expander = { 73 node_expander = {
87 'H': lambda: hex(node), 74 'H': lambda: hex(node),