mercurial/repair.py
changeset 15068 73307643a09f
parent 14064 e4bfb9c337f3
child 15386 6051d8e7e133
equal deleted inserted replaced
15067:cc16323e748d 15068:73307643a09f
     9 from mercurial import changegroup, bookmarks
     9 from mercurial import changegroup, bookmarks
    10 from mercurial.node import short
    10 from mercurial.node import short
    11 from mercurial.i18n import _
    11 from mercurial.i18n import _
    12 import os
    12 import os
    13 
    13 
    14 def _bundle(repo, bases, heads, node, suffix, compress=True):
    14 def _bundle(repo, cg, node, suffix, compress=True):
    15     """create a bundle with the specified revisions as a backup"""
    15     """create a bundle with the specified revisions as a backup"""
    16     cg = repo.changegroupsubset(bases, heads, 'strip')
       
    17     backupdir = repo.join("strip-backup")
    16     backupdir = repo.join("strip-backup")
    18     if not os.path.isdir(backupdir):
    17     if not os.path.isdir(backupdir):
    19         os.mkdir(backupdir)
    18         os.mkdir(backupdir)
    20     name = os.path.join(backupdir, "%s-%s.hg" % (short(node), suffix))
    19     name = os.path.join(backupdir, "%s-%s.hg" % (short(node), suffix))
    21     if compress:
    20     if compress:
    81             saverevs.add(r)
    80             saverevs.add(r)
    82             saveheads.difference_update(cl.parentrevs(r))
    81             saveheads.difference_update(cl.parentrevs(r))
    83             saveheads.add(r)
    82             saveheads.add(r)
    84     saveheads = [cl.node(r) for r in saveheads]
    83     saveheads = [cl.node(r) for r in saveheads]
    85 
    84 
    86     # compute base nodes
    85     # compute common nodes
    87     if saverevs:
    86     savecommon = set(cl.node(p) for r in saverevs for p in cl.parentrevs(r)
    88         descendants = set(cl.descendants(*saverevs))
    87                      if p not in saverevs and p not in tostrip)
    89         saverevs.difference_update(descendants)
       
    90     savebases = [cl.node(r) for r in saverevs]
       
    91 
    88 
    92     bm = repo._bookmarks
    89     bm = repo._bookmarks
    93     updatebm = []
    90     updatebm = []
    94     for m in bm:
    91     for m in bm:
    95         rev = repo[bm[m]].rev()
    92         rev = repo[bm[m]].rev()
    97             updatebm.append(m)
    94             updatebm.append(m)
    98 
    95 
    99     # create a changegroup for all the branches we need to keep
    96     # create a changegroup for all the branches we need to keep
   100     backupfile = None
    97     backupfile = None
   101     if backup == "all":
    98     if backup == "all":
   102         backupfile = _bundle(repo, [node], cl.heads(), node, 'backup')
    99         allnodes=[cl.node(r) for r in xrange(striprev, len(cl))]
       
   100         cg = repo._changegroup(allnodes, 'strip')
       
   101         backupfile = _bundle(repo, cg, node, 'backup')
   103         repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
   102         repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
   104     if saveheads or savebases:
   103     if saveheads or savecommon:
   105         # do not compress partial bundle if we remove it from disk later
   104         # do not compress partial bundle if we remove it from disk later
   106         chgrpfile = _bundle(repo, savebases, saveheads, node, 'temp',
   105         cg = repo.getbundle('strip', common=savecommon, heads=saveheads)
   107                             compress=keeppartialbundle)
   106         chgrpfile = _bundle(repo, cg, node, 'temp', compress=keeppartialbundle)
   108 
   107 
   109     mfst = repo.manifest
   108     mfst = repo.manifest
   110 
   109 
   111     tr = repo.transaction("strip")
   110     tr = repo.transaction("strip")
   112     offset = len(tr.entries)
   111     offset = len(tr.entries)
   126             tr.close()
   125             tr.close()
   127         except:
   126         except:
   128             tr.abort()
   127             tr.abort()
   129             raise
   128             raise
   130 
   129 
   131         if saveheads or savebases:
   130         if saveheads or savecommon:
   132             ui.note(_("adding branch\n"))
   131             ui.note(_("adding branch\n"))
   133             f = open(chgrpfile, "rb")
   132             f = open(chgrpfile, "rb")
   134             gen = changegroup.readbundle(f, chgrpfile)
   133             gen = changegroup.readbundle(f, chgrpfile)
   135             if not repo.ui.verbose:
   134             if not repo.ui.verbose:
   136                 # silence internal shuffling chatter
   135                 # silence internal shuffling chatter