mercurial/repair.py
changeset 13705 73cfb7a5aa56
parent 13702 ffd370aa050b
child 13715 2edf41a90b9d
equal deleted inserted replaced
13704:a464763e99f1 13705:73cfb7a5aa56
    33 
    33 
    34     return sorted(files)
    34     return sorted(files)
    35 
    35 
    36 def _collectbrokencsets(repo, files, striprev):
    36 def _collectbrokencsets(repo, files, striprev):
    37     """return the changesets which will be broken by the truncation"""
    37     """return the changesets which will be broken by the truncation"""
       
    38     s = set()
    38     def collectone(revlog):
    39     def collectone(revlog):
    39         startrev = count = len(revlog)
    40         links = (revlog.linkrev(i) for i in xrange(len(revlog)))
    40         # find the truncation point of the revlog
    41         # find the truncation point of the revlog
    41         for i in xrange(count):
    42         for lrev in links:
    42             lrev = revlog.linkrev(i)
       
    43             if lrev >= striprev:
    43             if lrev >= striprev:
    44                 startrev = i + 1
       
    45                 break
    44                 break
       
    45         # see if any revision after this point has a linkrev
       
    46         # less than striprev (those will be broken by strip)
       
    47         for lrev in links:
       
    48             if lrev < striprev:
       
    49                         s.add(lrev)
    46 
    50 
    47         # see if any revision after that point has a linkrev less than striprev
    51     collectone(repo.manifest)
    48         # (those will be broken by strip)
    52     for fname in files:
    49         for i in xrange(startrev, count):
    53         collectone(repo.file(fname))
    50             lrev = revlog.linkrev(i)
       
    51             if lrev < striprev:
       
    52                 yield lrev
       
    53 
    54 
    54     for rev in collectone(repo.manifest):
    55     return s
    55         yield rev
       
    56     for fname in files:
       
    57         f = repo.file(fname)
       
    58         for rev in collectone(f):
       
    59             yield rev
       
    60 
    56 
    61 def strip(ui, repo, node, backup="all"):
    57 def strip(ui, repo, node, backup="all"):
    62     cl = repo.changelog
    58     cl = repo.changelog
    63     # TODO delete the undo files, and handle undo of merge sets
    59     # TODO delete the undo files, and handle undo of merge sets
    64     striprev = cl.rev(node)
    60     striprev = cl.rev(node)
    74     #  base = revision in the set that has no ancestor in the set)
    70     #  base = revision in the set that has no ancestor in the set)
    75     tostrip = set(cl.descendants(striprev))
    71     tostrip = set(cl.descendants(striprev))
    76     tostrip.add(striprev)
    72     tostrip.add(striprev)
    77 
    73 
    78     files = _collectfiles(repo, striprev)
    74     files = _collectfiles(repo, striprev)
    79     saverevs = set(_collectbrokencsets(repo, files, striprev))
    75     saverevs = _collectbrokencsets(repo, files, striprev)
    80 
    76 
    81     # compute heads
    77     # compute heads
    82     saveheads = set(saverevs)
    78     saveheads = set(saverevs)
    83     for r in xrange(striprev + 1, len(cl)):
    79     for r in xrange(striprev + 1, len(cl)):
    84         if r not in tostrip:
    80         if r not in tostrip: