mercurial/cmdutil.py
changeset 3556 cf0f8d9256c7
parent 3555 a33a9af1ec03
child 3557 68341c06bc61
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),