mercurial/commands.py
changeset 2886 9826af4841ef
parent 2882 c2932ad5476a
child 2892 8b02af865990
equal deleted inserted replaced
2885:26c37ebda1bb 2886:9826af4841ef
   181             matches = filter(matchfn, changefiles)
   181             matches = filter(matchfn, changefiles)
   182             if matches:
   182             if matches:
   183                 fncache[rev] = matches
   183                 fncache[rev] = matches
   184                 wanted[rev] = 1
   184                 wanted[rev] = 1
   185 
   185 
       
   186     class followfilter:
       
   187         def __init__(self, onlyfirst=False):
       
   188             self.startrev = -1
       
   189             self.roots = []
       
   190             self.onlyfirst = onlyfirst
       
   191 
       
   192         def match(self, rev):
       
   193             def realparents(rev):
       
   194                 if self.onlyfirst:
       
   195                     return repo.changelog.parentrevs(rev)[0:1]
       
   196                 else:
       
   197                     return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
       
   198 
       
   199             if self.startrev == -1:
       
   200                 self.startrev = rev
       
   201                 return True
       
   202 
       
   203             if rev > self.startrev:
       
   204                 # forward: all descendants
       
   205                 if not self.roots:
       
   206                     self.roots.append(self.startrev)
       
   207                 for parent in realparents(rev):
       
   208                     if parent in self.roots:
       
   209                         self.roots.append(rev)
       
   210                         return True
       
   211             else:
       
   212                 # backwards: all parents
       
   213                 if not self.roots:
       
   214                     self.roots.extend(realparents(self.startrev))
       
   215                 if rev in self.roots:
       
   216                     self.roots.remove(rev)
       
   217                     self.roots.extend(realparents(rev))
       
   218                     return True
       
   219 
       
   220             return False
       
   221 
       
   222     # it might be worthwhile to do this in the iterator if the rev range
       
   223     # is descending and the prune args are all within that range
       
   224     for rev in opts.get('prune'):
       
   225         rev = repo.changelog.rev(repo.lookup(rev))
       
   226         ff = followfilter()
       
   227         stop = min(revs[0], revs[-1])
       
   228         for x in range(rev, stop-1, -1):
       
   229             if ff.match(x) and wanted.has_key(x):
       
   230                 del wanted[x]
       
   231 
   186     def iterate():
   232     def iterate():
   187         class followfilter:
       
   188             def __init__(self, onlyfirst=False):
       
   189                 self.startrev = -1
       
   190                 self.roots = []
       
   191                 self.onlyfirst = onlyfirst
       
   192 
       
   193             def match(self, rev):
       
   194                 def realparents(rev):
       
   195                     if self.onlyfirst:
       
   196                         return repo.changelog.parentrevs(rev)[0:1]
       
   197                     else:
       
   198                         return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
       
   199 
       
   200                 if self.startrev == -1:
       
   201                     self.startrev = rev
       
   202                     return True
       
   203 
       
   204                 if rev > self.startrev:
       
   205                     # forward: all descendants
       
   206                     if not self.roots:
       
   207                         self.roots.append(self.startrev)
       
   208                     for parent in realparents(rev):
       
   209                         if parent in self.roots:
       
   210                             self.roots.append(rev)
       
   211                             return True
       
   212                 else:
       
   213                     # backwards: all parents
       
   214                     if not self.roots:
       
   215                         self.roots.extend(realparents(self.startrev))
       
   216                     if rev in self.roots:
       
   217                         self.roots.remove(rev)
       
   218                         self.roots.extend(realparents(rev))
       
   219                         return True
       
   220 
       
   221                 return False
       
   222 
       
   223         if follow and not files:
   233         if follow and not files:
   224             ff = followfilter(onlyfirst=opts.get('follow_first'))
   234             ff = followfilter(onlyfirst=opts.get('follow_first'))
   225             def want(rev):
   235             def want(rev):
   226                 if rev not in wanted:
   236                 if ff.match(rev) and rev in wanted:
   227                     return False
   237                     return True
   228                 return ff.match(rev)
   238                 return False
   229         else:
   239         else:
   230             def want(rev):
   240             def want(rev):
   231                 return rev in wanted
   241                 return rev in wanted
   232 
   242 
   233         for i, window in increasing_windows(0, len(revs)):
   243         for i, window in increasing_windows(0, len(revs)):
  2964           ('r', 'rev', [], _('show the specified revision or range')),
  2974           ('r', 'rev', [], _('show the specified revision or range')),
  2965           ('M', 'no-merges', None, _('do not show merges')),
  2975           ('M', 'no-merges', None, _('do not show merges')),
  2966           ('', 'style', '', _('display using template map file')),
  2976           ('', 'style', '', _('display using template map file')),
  2967           ('m', 'only-merges', None, _('show only merges')),
  2977           ('m', 'only-merges', None, _('show only merges')),
  2968           ('p', 'patch', None, _('show patch')),
  2978           ('p', 'patch', None, _('show patch')),
       
  2979           ('P', 'prune', [], _('do not display revision or any of its ancestors')),
  2969           ('', 'template', '', _('display with template')),
  2980           ('', 'template', '', _('display with template')),
  2970           ('I', 'include', [], _('include names matching the given patterns')),
  2981           ('I', 'include', [], _('include names matching the given patterns')),
  2971           ('X', 'exclude', [], _('exclude names matching the given patterns'))],
  2982           ('X', 'exclude', [], _('exclude names matching the given patterns'))],
  2972          _('hg log [OPTION]... [FILE]')),
  2983          _('hg log [OPTION]... [FILE]')),
  2973     "manifest": (manifest, [], _('hg manifest [REV]')),
  2984     "manifest": (manifest, [], _('hg manifest [REV]')),