simplify revlog.strip interface and callers; add docstring

Also, strip files only after the changelog and the manifest.
This commit is contained in:
Alexis S. L. Carvalho 2008-01-19 18:01:16 -02:00
parent 8b35462ec9
commit ba985d288a
2 changed files with 29 additions and 30 deletions

View File

@ -31,18 +31,19 @@ def _bundle(repo, bases, heads, node, suffix, extranodes=None):
repo.ui.warn("saving bundle to %s\n" % name)
return changegroup.writebundle(cg, name, "HG10BZ")
def _collectfilenodes(repo, striprev):
"""find out the first node that should be stripped from each filelog"""
mm = repo.changectx(striprev).manifest()
filenodes = {}
def _collectfiles(repo, striprev):
"""find out the filelogs affected by the strip"""
files = {}
for x in xrange(striprev, repo.changelog.count()):
for name in repo.changectx(x).files():
if name in filenodes:
if name in files:
continue
filenodes[name] = mm.get(name)
files[name] = 1
return filenodes
files = files.keys()
files.sort()
return files
def _collectextranodes(repo, files, link):
"""return the nodes that have to be saved before the strip"""
@ -80,22 +81,6 @@ def _collectextranodes(repo, files, link):
return extranodes
def _stripall(repo, striprev, filenodes):
"""strip the requested nodes from the filelogs"""
# we go in two steps here so the strip loop happens in a
# sensible order. When stripping many files, this helps keep
# our disk access patterns under control.
files = filenodes.keys()
files.sort()
for name in files:
f = repo.file(name)
fnode = filenodes[name]
frev = 0
if fnode is not None and fnode in f.nodemap:
frev = f.rev(fnode)
f.strip(frev, striprev)
def strip(ui, repo, node, backup="all"):
cl = repo.changelog
# TODO delete the undo files, and handle undo of merge sets
@ -138,9 +123,9 @@ def strip(ui, repo, node, backup="all"):
if cl.rev(x) > striprev:
savebases[x] = 1
filenodes = _collectfilenodes(repo, striprev)
files = _collectfiles(repo, striprev)
extranodes = _collectextranodes(repo, filenodes, striprev)
extranodes = _collectextranodes(repo, files, striprev)
# create a changegroup for all the branches we need to keep
if backup == "all":
@ -149,11 +134,12 @@ def strip(ui, repo, node, backup="all"):
chgrpfile = _bundle(repo, savebases.keys(), saveheads, node, 'temp',
extranodes)
_stripall(repo, striprev, filenodes)
cl.strip(striprev)
repo.manifest.strip(striprev)
for name in files:
f = repo.file(name)
f.strip(striprev)
change = cl.read(node)
cl.strip(striprev, striprev)
repo.manifest.strip(repo.manifest.rev(change[0]), striprev)
if saveheads or extranodes:
ui.status("adding branch\n")
f = open(chgrpfile, "rb")

View File

@ -1237,7 +1237,20 @@ class revlog(object):
return node
def strip(self, rev, minlink):
def strip(self, minlink):
"""truncate the revlog on the first revision with a linkrev >= minlink
This function is called when we're stripping revision minlink and
its descendants from the repository.
We have to remove all revisions with linkrev >= minlink, because
the equivalent changelog revisions will be renumbered after the
strip.
So we truncate the revlog on the first of these revisions, and
trust that the caller has saved the revisions that shouldn't be
removed and that it'll readd them after this truncation.
"""
if self.count() == 0:
return