##// END OF EJS Templates
ancestor: rewrite to deal with crossed linkrevs (issue2682)...
Matt Mackall -
r13552:7ab85fec stable
parent child Browse files
Show More
@@ -466,39 +466,40 b' class filectx(object):'
466 else:
466 else:
467 base = self
467 base = self
468
468
469 # find all ancestors
469 # This algorithm would prefer to be recursive, but Python is a
470 # bit recursion-hostile. Instead we do an iterative
471 # depth-first search.
472
473 visit = [base]
474 hist = {}
475 pcache = {}
470 needed = {base: 1}
476 needed = {base: 1}
471 visit = [base]
472 files = [base._path]
473 while visit:
477 while visit:
474 f = visit.pop(0)
478 f = visit[-1]
475 for p in parents(f):
479 if f not in pcache:
476 if p not in needed:
480 pcache[f] = parents(f)
477 needed[p] = 1
478 visit.append(p)
479 if p._path not in files:
480 files.append(p._path)
481 else:
482 # count how many times we'll use this
483 needed[p] += 1
484
481
485 # sort by revision (per file) which is a topological order
482 ready = True
486 visit = []
483 pl = pcache[f]
487 for f in files:
484 for p in pl:
488 visit.extend(n for n in needed if n._path == f)
485 if p not in hist:
486 ready = False
487 visit.append(p)
488 needed[p] = needed.get(p, 0) + 1
489 if ready:
490 visit.pop()
491 curr = decorate(f.data(), f)
492 for p in pl:
493 curr = pair(hist[p], curr)
494 if needed[p] == 1:
495 del hist[p]
496 else:
497 needed[p] -= 1
489
498
490 hist = {}
499 hist[f] = curr
491 for f in sorted(visit, key=lambda x: x.rev()):
500 pcache[f] = []
492 curr = decorate(f.data(), f)
493 for p in parents(f):
494 curr = pair(hist[p], curr)
495 # trim the history of unneeded revs
496 needed[p] -= 1
497 if not needed[p]:
498 del hist[p]
499 hist[f] = curr
500
501
501 return zip(hist[f][0], hist[f][1].splitlines(True))
502 return zip(hist[base][0], hist[base][1].splitlines(True))
502
503
503 def ancestor(self, fc2, actx=None):
504 def ancestor(self, fc2, actx=None):
504 """
505 """
General Comments 0
You need to be logged in to leave comments. Login now