mercurial/filelog.py
changeset 2948 b2138d846b27
parent 2918 db397c38005d
child 3131 4ea58eb3f0c9
equal deleted inserted replaced
2947:2d865068f72e 2948:b2138d846b27
    94             for a1, a2, b1, b2 in bdiff.blocks(parent[1], child[1]):
    94             for a1, a2, b1, b2 in bdiff.blocks(parent[1], child[1]):
    95                 child[0][b1:b2] = parent[0][a1:a2]
    95                 child[0][b1:b2] = parent[0][a1:a2]
    96             return child
    96             return child
    97 
    97 
    98         # find all ancestors
    98         # find all ancestors
    99         needed = {node:1}
    99         needed = {(self, node):1}
   100         visit = [node]
   100         files = [self]
       
   101         visit = [(self, node)]
   101         while visit:
   102         while visit:
   102             n = visit.pop(0)
   103             f, n = visit.pop(0)
   103             for p in self.parents(n):
   104             rn = f.renamed(n)
   104                 if p not in needed:
   105             if rn:
   105                     needed[p] = 1
   106                 f, n = rn
   106                     visit.append(p)
   107                 f = filelog(self.opener, f, self.defversion)
       
   108                 files.insert(0, f)
       
   109                 if (f, n) not in needed:
       
   110                     needed[(f, n)] = 1
       
   111                 else:
       
   112                     needed[(f, n)] += 1
       
   113             for p in f.parents(n):
       
   114                 if p == nullid:
       
   115                     continue
       
   116                 if (f, p) not in needed:
       
   117                     needed[(f, p)] = 1
       
   118                     visit.append((f, p))
   107                 else:
   119                 else:
   108                     # count how many times we'll use this
   120                     # count how many times we'll use this
   109                     needed[p] += 1
   121                     needed[(f, p)] += 1
   110 
   122 
   111         # sort by revision which is a topological order
   123         # sort by revision (per file) which is a topological order
   112         visit = [ (self.rev(n), n) for n in needed.keys() ]
   124         visit = []
   113         visit.sort()
   125         for f in files:
       
   126             fn = [(f.rev(n[1]), f, n[1]) for n in needed.keys() if n[0] == f]
       
   127             fn.sort()
       
   128             visit.extend(fn)
   114         hist = {}
   129         hist = {}
   115 
   130 
   116         for r,n in visit:
   131         for i in range(len(visit)):
   117             curr = decorate(self.read(n), self.linkrev(n))
   132             r, f, n = visit[i]
   118             for p in self.parents(n):
   133             curr = decorate(f.read(n), f.linkrev(n))
       
   134             if r == -1:
       
   135                 continue
       
   136             parents = f.parents(n)
       
   137             # follow parents across renames
       
   138             if r < 1 and i > 0:
       
   139                 j = i
       
   140                 while j > 0 and visit[j][1] == f:
       
   141                     j -= 1
       
   142                 parents = (visit[j][2],)
       
   143                 f = visit[j][1]
       
   144             else:
       
   145                 parents = f.parents(n)
       
   146             for p in parents:
   119                 if p != nullid:
   147                 if p != nullid:
   120                     curr = pair(hist[p], curr)
   148                     curr = pair(hist[p], curr)
   121                     # trim the history of unneeded revs
   149                     # trim the history of unneeded revs
   122                     needed[p] -= 1
   150                     needed[(f, p)] -= 1
   123                     if not needed[p]:
   151                     if not needed[(f, p)]:
   124                         del hist[p]
   152                         del hist[p]
   125             hist[n] = curr
   153             hist[n] = curr
   126 
   154 
   127         return zip(hist[n][0], hist[n][1].splitlines(1))
   155         return zip(hist[n][0], hist[n][1].splitlines(1))