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: |