mercurial/repair.py
changeset 5902 98f8dec8f437
parent 5901 16f4129c19ac
child 5903 bf20995f1ac3
equal deleted inserted replaced
5901:16f4129c19ac 5902:98f8dec8f437
    37             os.mkdir(backupdir)
    37             os.mkdir(backupdir)
    38         name = os.path.join(backupdir, "%s-%s" % (short(node), suffix))
    38         name = os.path.join(backupdir, "%s-%s" % (short(node), suffix))
    39         ui.warn("saving bundle to %s\n" % name)
    39         ui.warn("saving bundle to %s\n" % name)
    40         return changegroup.writebundle(cg, name, "HG10BZ")
    40         return changegroup.writebundle(cg, name, "HG10BZ")
    41 
    41 
    42     def stripall(striprev):
    42     def collectfilenodes(repo, striprev):
    43         mm = repo.changectx(node).manifest()
    43         """find out the first node that should be stripped from each filelog"""
    44         seen = {}
    44         mm = repo.changectx(striprev).manifest()
       
    45         filenodes = {}
    45 
    46 
    46         for x in xrange(striprev, repo.changelog.count()):
    47         for x in xrange(striprev, repo.changelog.count()):
    47             for f in repo.changectx(x).files():
    48             for name in repo.changectx(x).files():
    48                 if f in seen:
    49                 if name in filenodes:
    49                     continue
    50                     continue
    50                 seen[f] = 1
    51                 filenodes[name] = mm.get(name)
    51                 if f in mm:
    52 
    52                     filerev = mm[f]
    53         return filenodes
    53                 else:
    54 
    54                     filerev = 0
    55     def stripall(repo, striprev, filenodes):
    55                 seen[f] = filerev
    56         """strip the requested nodes from the filelogs"""
    56         # we go in two steps here so the strip loop happens in a
    57         # we go in two steps here so the strip loop happens in a
    57         # sensible order.  When stripping many files, this helps keep
    58         # sensible order.  When stripping many files, this helps keep
    58         # our disk access patterns under control.
    59         # our disk access patterns under control.
    59         seen_list = seen.keys()
    60 
    60         seen_list.sort()
    61         files = filenodes.keys()
    61         for f in seen_list:
    62         files.sort()
    62             ff = repo.file(f)
    63         for name in files:
    63             filerev = seen[f]
    64             f = repo.file(name)
    64             if filerev != 0:
    65             fnode = filenodes[name]
    65                 if filerev in ff.nodemap:
    66             frev = 0
    66                     filerev = ff.rev(filerev)
    67             if fnode is not None and fnode in f.nodemap:
    67                 else:
    68                 frev = f.rev(fnode)
    68                     filerev = 0
    69             f.strip(frev, striprev)
    69             ff.strip(filerev, striprev)
       
    70 
    70 
    71     cl = repo.changelog
    71     cl = repo.changelog
    72     # TODO delete the undo files, and handle undo of merge sets
    72     # TODO delete the undo files, and handle undo of merge sets
    73     pp = cl.parents(node)
    73     pp = cl.parents(node)
    74     striprev = cl.rev(node)
    74     striprev = cl.rev(node)
   113     if backup == "all":
   113     if backup == "all":
   114         bundle(repo, [node], cl.heads(), node, 'backup')
   114         bundle(repo, [node], cl.heads(), node, 'backup')
   115     if saveheads:
   115     if saveheads:
   116         chgrpfile = bundle(repo, savebases.keys(), saveheads, node, 'temp')
   116         chgrpfile = bundle(repo, savebases.keys(), saveheads, node, 'temp')
   117 
   117 
   118     stripall(striprev)
   118     filenodes = collectfilenodes(repo, striprev)
       
   119     stripall(repo, striprev, filenodes)
   119 
   120 
   120     change = cl.read(node)
   121     change = cl.read(node)
   121     cl.strip(striprev, striprev)
   122     cl.strip(striprev, striprev)
   122     repo.manifest.strip(repo.manifest.rev(change[0]), striprev)
   123     repo.manifest.strip(repo.manifest.rev(change[0]), striprev)
   123     if saveheads:
   124     if saveheads: