mercurial/commands.py
changeset 3578 3b4e00cba57a
parent 3576 00427c4b533b
child 3583 8ee579885d23
equal deleted inserted replaced
3577:7f7425306925 3578:3b4e00cba57a
   114             cl_count = repo.changelog.count()
   114             cl_count = repo.changelog.count()
   115             if node is None:
   115             if node is None:
   116                 last = filelog.count() - 1
   116                 last = filelog.count() - 1
   117             else:
   117             else:
   118                 last = filelog.rev(node)
   118                 last = filelog.rev(node)
   119             for i, window in increasing_windows(last, -1):
   119             for i, window in increasing_windows(last, nullrev):
   120                 revs = []
   120                 revs = []
   121                 for j in xrange(i - window, i + 1):
   121                 for j in xrange(i - window, i + 1):
   122                     n = filelog.node(j)
   122                     n = filelog.node(j)
   123                     revs.append((filelog.linkrev(n),
   123                     revs.append((filelog.linkrev(n),
   124                                  follow and filelog.renamed(n)))
   124                                  follow and filelog.renamed(n)))
   155             raise util.Abort(_('can only follow copies/renames for explicit '
   155             raise util.Abort(_('can only follow copies/renames for explicit '
   156                                'file names'))
   156                                'file names'))
   157 
   157 
   158         # The slow path checks files modified in every changeset.
   158         # The slow path checks files modified in every changeset.
   159         def changerevgen():
   159         def changerevgen():
   160             for i, window in increasing_windows(repo.changelog.count()-1, -1):
   160             for i, window in increasing_windows(repo.changelog.count()-1,
       
   161                                                 nullrev):
   161                 for j in xrange(i - window, i + 1):
   162                 for j in xrange(i - window, i + 1):
   162                     yield j, change(j)[3]
   163                     yield j, change(j)[3]
   163 
   164 
   164         for rev, changefiles in changerevgen():
   165         for rev, changefiles in changerevgen():
   165             matches = filter(matchfn, changefiles)
   166             matches = filter(matchfn, changefiles)
   167                 fncache[rev] = matches
   168                 fncache[rev] = matches
   168                 wanted[rev] = 1
   169                 wanted[rev] = 1
   169 
   170 
   170     class followfilter:
   171     class followfilter:
   171         def __init__(self, onlyfirst=False):
   172         def __init__(self, onlyfirst=False):
   172             self.startrev = -1
   173             self.startrev = nullrev
   173             self.roots = []
   174             self.roots = []
   174             self.onlyfirst = onlyfirst
   175             self.onlyfirst = onlyfirst
   175 
   176 
   176         def match(self, rev):
   177         def match(self, rev):
   177             def realparents(rev):
   178             def realparents(rev):
   178                 if self.onlyfirst:
   179                 if self.onlyfirst:
   179                     return repo.changelog.parentrevs(rev)[0:1]
   180                     return repo.changelog.parentrevs(rev)[0:1]
   180                 else:
   181                 else:
   181                     return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
   182                     return filter(lambda x: x != nullrev,
   182 
   183                                   repo.changelog.parentrevs(rev))
   183             if self.startrev == -1:
   184 
       
   185             if self.startrev == nullrev:
   184                 self.startrev = rev
   186                 self.startrev = rev
   185                 return True
   187                 return True
   186 
   188 
   187             if rev > self.startrev:
   189             if rev > self.startrev:
   188                 # forward: all descendants
   190                 # forward: all descendants
   320 
   322 
   321         hexfunc = self.ui.debugflag and hex or short
   323         hexfunc = self.ui.debugflag and hex or short
   322 
   324 
   323         parents = log.parentrevs(rev)
   325         parents = log.parentrevs(rev)
   324         if not self.ui.debugflag:
   326         if not self.ui.debugflag:
   325             parents = [p for p in parents if p != -1]
   327             parents = [p for p in parents if p != nullrev]
   326             if len(parents) == 1 and parents[0] == rev-1:
   328             if len(parents) == 1 and parents[0] == rev-1:
   327                 parents = []
   329                 parents = []
   328         parents = [(p, hexfunc(log.node(p))) for p in parents]
   330         parents = [(p, hexfunc(log.node(p))) for p in parents]
   329 
   331 
   330 
   332 
  1870                 if lr >= endrev:
  1872                 if lr >= endrev:
  1871                     break
  1873                     break
  1872         if rev in rcache[fn]:
  1874         if rev in rcache[fn]:
  1873             return rcache[fn][rev]
  1875             return rcache[fn][rev]
  1874         mr = repo.manifest.rev(man)
  1876         mr = repo.manifest.rev(man)
  1875         if repo.manifest.parentrevs(mr) != (mr - 1, -1):
  1877         if repo.manifest.parentrevs(mr) != (mr - 1, nullrev):
  1876             return ncache[fn].get(repo.manifest.find(man, fn)[0])
  1878             return ncache[fn].get(repo.manifest.find(man, fn)[0])
  1877         if not dcache or dcache[0] != man:
  1879         if not dcache or dcache[0] != man:
  1878             dcache[:] = [man, repo.manifest.readdelta(man)]
  1880             dcache[:] = [man, repo.manifest.readdelta(man)]
  1879         if fn in dcache[1]:
  1881         if fn in dcache[1]:
  1880             return ncache[fn].get(dcache[1][fn])
  1882             return ncache[fn].get(dcache[1][fn])
  1886             du = dui(ui)
  1888             du = dui(ui)
  1887             displayer.ui = du
  1889             displayer.ui = du
  1888         elif st == 'add':
  1890         elif st == 'add':
  1889             du.bump(rev)
  1891             du.bump(rev)
  1890             changenode = repo.changelog.node(rev)
  1892             changenode = repo.changelog.node(rev)
  1891             parents = [p for p in repo.changelog.parentrevs(rev) if p != -1]
  1893             parents = [p for p in repo.changelog.parentrevs(rev)
       
  1894                        if p != nullrev]
  1892             if opts['no_merges'] and len(parents) == 2:
  1895             if opts['no_merges'] and len(parents) == 2:
  1893                 continue
  1896                 continue
  1894             if opts['only_merges'] and len(parents) != 2:
  1897             if opts['only_merges'] and len(parents) != 2:
  1895                 continue
  1898                 continue
  1896 
  1899 
  1920             displayer.show(rev, changenode, brinfo=br, copies=copies)
  1923             displayer.show(rev, changenode, brinfo=br, copies=copies)
  1921             if opts['patch']:
  1924             if opts['patch']:
  1922                 if parents:
  1925                 if parents:
  1923                     prev = parents[0]
  1926                     prev = parents[0]
  1924                 else:
  1927                 else:
  1925                     prev = -1
  1928                     prev = nullrev
  1926                 prev = repo.changelog.node(prev)
  1929                 prev = repo.changelog.node(prev)
  1927                 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
  1930                 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
  1928                 du.write("\n\n")
  1931                 du.write("\n\n")
  1929         elif st == 'iter':
  1932         elif st == 'iter':
  1930             if count == limit: break
  1933             if count == limit: break