--- a/mercurial/cmdutil.py Wed Sep 13 14:37:51 2006 -0300
+++ b/mercurial/cmdutil.py Thu Sep 14 11:19:35 2006 -0700
@@ -11,6 +11,76 @@
demandload(globals(), 'mdiff util')
demandload(globals(), 'os sys')
+revrangesep = ':'
+
+def revfix(repo, val, defval):
+ '''turn user-level id of changeset into rev number.
+ user-level id can be tag, changeset, rev number, or negative rev
+ number relative to number of revs (-1 is tip, etc).'''
+ if not val:
+ return defval
+ try:
+ num = int(val)
+ if str(num) != val:
+ raise ValueError
+ if num < 0:
+ num += repo.changelog.count()
+ if num < 0:
+ num = 0
+ elif num >= repo.changelog.count():
+ raise ValueError
+ except ValueError:
+ try:
+ num = repo.changelog.rev(repo.lookup(val))
+ except KeyError:
+ raise util.Abort(_('invalid revision identifier %s') % val)
+ return num
+
+def revpair(ui, repo, revs):
+ '''return pair of nodes, given list of revisions. second item can
+ be None, meaning use working dir.'''
+ if not revs:
+ return repo.dirstate.parents()[0], None
+ end = None
+ if len(revs) == 1:
+ start = revs[0]
+ if revrangesep in start:
+ start, end = start.split(revrangesep, 1)
+ start = revfix(repo, start, 0)
+ end = revfix(repo, end, repo.changelog.count() - 1)
+ else:
+ start = revfix(repo, start, None)
+ elif len(revs) == 2:
+ if revrangesep in revs[0] or revrangesep in revs[1]:
+ raise util.Abort(_('too many revisions specified'))
+ start = revfix(repo, revs[0], None)
+ end = revfix(repo, revs[1], None)
+ else:
+ raise util.Abort(_('too many revisions specified'))
+ if end is not None: end = repo.lookup(str(end))
+ return repo.lookup(str(start)), end
+
+def revrange(ui, repo, revs):
+ """Yield revision as strings from a list of revision specifications."""
+ seen = {}
+ for spec in revs:
+ if revrangesep in spec:
+ start, end = spec.split(revrangesep, 1)
+ start = revfix(repo, start, 0)
+ end = revfix(repo, end, repo.changelog.count() - 1)
+ step = start > end and -1 or 1
+ for rev in xrange(start, end+step, step):
+ if rev in seen:
+ continue
+ seen[rev] = 1
+ yield str(rev)
+ else:
+ rev = revfix(repo, spec, None)
+ if rev in seen:
+ continue
+ seen[rev] = 1
+ yield str(rev)
+
def make_filename(repo, pat, node,
total=None, seqno=None, revwidth=None, pathname=None):
node_expander = {