##// END OF EJS Templates
hgweb: add a "web/logoimg" setting to customize the web logo image...
hgweb: add a "web/logoimg" setting to customize the web logo image This change complements the existing web/logourl setting, and lets the user customize the logo image that is shown on many of the hg server pages. If this setting is not set, hglogo.png is used.

File last commit:

r14064:e4bfb9c3 default
r14913:44382887 default
Show More
repair.py
158 lines | 5.1 KiB | text/x-python | PythonLexer
Matt Mackall
strip: move strip code to a new repair module
r4702 # repair.py - functions for repository repair for mercurial
#
# Copyright 2005, 2006 Chris Mason <mason@suse.com>
# Copyright 2007 Matt Mackall
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Matt Mackall
strip: move strip code to a new repair module
r4702
Alexander Solovyov
remove unused imports and variables
r14064 from mercurial import changegroup, bookmarks
from mercurial.node import short
from mercurial.i18n import _
Simon Heimberg
separate import lines from mercurial and general python modules
r8312 import os
Matt Mackall
strip: move strip code to a new repair module
r4702
Benoit Boissinot
strip: remove usage of extranodes...
r13702 def _bundle(repo, bases, heads, node, suffix, compress=True):
Alexis S. L. Carvalho
repair.py: don't use nested functions.
r5905 """create a bundle with the specified revisions as a backup"""
Benoit Boissinot
strip: remove usage of extranodes...
r13702 cg = repo.changegroupsubset(bases, heads, 'strip')
Alexis S. L. Carvalho
repair.py: don't use nested functions.
r5905 backupdir = repo.join("strip-backup")
if not os.path.isdir(backupdir):
os.mkdir(backupdir)
Matt Mackall
strip: backup bundles should use the .hg extension
r11333 name = os.path.join(backupdir, "%s-%s.hg" % (short(node), suffix))
Nicolas Dumazet
repair: do not compress partial bundle if we do not keep it on disk...
r11791 if compress:
bundletype = "HG10BZ"
else:
bundletype = "HG10UN"
return changegroup.writebundle(cg, name, bundletype)
Matt Mackall
strip: move strip code to a new repair module
r4702
Alexis S. L. Carvalho
simplify revlog.strip interface and callers; add docstring...
r5910 def _collectfiles(repo, striprev):
"""find out the filelogs affected by the strip"""
Benoit Boissinot
repair: use set instead of dict
r8462 files = set()
Matt Mackall
strip: move strip code to a new repair module
r4702
Matt Mackall
add __len__ and __iter__ methods to repo and revlog
r6750 for x in xrange(striprev, len(repo)):
Martin Geisler
repair: bulk update sets...
r8479 files.update(repo[x].files())
Alexis S. L. Carvalho
repair.py: split stripall into two functions; clean it up a bit
r5902
Benoit Boissinot
repair: use set instead of dict
r8462 return sorted(files)
Alexis S. L. Carvalho
repair.py: split stripall into two functions; clean it up a bit
r5902
Benoit Boissinot
strip: remove usage of extranodes...
r13702 def _collectbrokencsets(repo, files, striprev):
"""return the changesets which will be broken by the truncation"""
Matt Mackall
strip: simplify collectone
r13705 s = set()
Benoit Boissinot
strip: remove usage of extranodes...
r13702 def collectone(revlog):
Matt Mackall
repair: revlog has an iterator
r13715 links = (revlog.linkrev(i) for i in revlog)
Alexis S. L. Carvalho
strip: calculate list of extra nodes to save and pass it to changegroupsubset...
r5909 # find the truncation point of the revlog
Matt Mackall
strip: simplify collectone
r13705 for lrev in links:
Benoit Boissinot
strip: remove usage of extranodes...
r13702 if lrev >= striprev:
Alexis S. L. Carvalho
strip: calculate list of extra nodes to save and pass it to changegroupsubset...
r5909 break
Matt Mackall
strip: simplify collectone
r13705 # see if any revision after this point has a linkrev
# less than striprev (those will be broken by strip)
for lrev in links:
if lrev < striprev:
Patrick Mezard
code indentation fixes
r13747 s.add(lrev)
Alexis S. L. Carvalho
strip: calculate list of extra nodes to save and pass it to changegroupsubset...
r5909
Matt Mackall
strip: simplify collectone
r13705 collectone(repo.manifest)
for fname in files:
collectone(repo.file(fname))
Alexis S. L. Carvalho
strip: calculate list of extra nodes to save and pass it to changegroupsubset...
r5909
Matt Mackall
strip: simplify collectone
r13705 return s
Alexis S. L. Carvalho
strip: calculate list of extra nodes to save and pass it to changegroupsubset...
r5909
Alexis S. L. Carvalho
repair.py: don't use nested functions.
r5905 def strip(ui, repo, node, backup="all"):
Alexis S. L. Carvalho
repair.py: rename chlog to cl
r5901 cl = repo.changelog
Matt Mackall
strip: move strip code to a new repair module
r4702 # TODO delete the undo files, and handle undo of merge sets
Alexis S. L. Carvalho
repair.py: rename chlog to cl
r5901 striprev = cl.rev(node)
Matt Mackall
strip: move strip code to a new repair module
r4702
Nicolas Dumazet
repair: do not compress partial bundle if we do not keep it on disk...
r11791 keeppartialbundle = backup == 'strip'
Alexis S. L. Carvalho
repair.py: rewrite a loop, making it cleaner and faster
r6147 # Some revisions with rev > striprev may not be descendants of striprev.
# We have to find these revisions and put them in a bundle, so that
# we can restore them after the truncations.
# To create the bundle we use repo.changegroupsubset which requires
# the list of heads and bases of the set of interesting revisions.
# (head = revision in the set that has no descendant in the set;
# base = revision in the set that has no ancestor in the set)
Benoit Boissinot
strip: remove usage of extranodes...
r13702 tostrip = set(cl.descendants(striprev))
tostrip.add(striprev)
files = _collectfiles(repo, striprev)
Matt Mackall
strip: simplify collectone
r13705 saverevs = _collectbrokencsets(repo, files, striprev)
Benoit Boissinot
strip: remove usage of extranodes...
r13702
# compute heads
saveheads = set(saverevs)
Matt Mackall
add __len__ and __iter__ methods to repo and revlog
r6750 for r in xrange(striprev + 1, len(cl)):
Benoit Boissinot
strip: remove usage of extranodes...
r13702 if r not in tostrip:
saverevs.add(r)
saveheads.difference_update(cl.parentrevs(r))
saveheads.add(r)
saveheads = [cl.node(r) for r in saveheads]
Matt Mackall
strip: move strip code to a new repair module
r4702
Benoit Boissinot
strip: remove usage of extranodes...
r13702 # compute base nodes
if saverevs:
descendants = set(cl.descendants(*saverevs))
saverevs.difference_update(descendants)
savebases = [cl.node(r) for r in saverevs]
Matt Mackall
strip: move strip code to a new repair module
r4702
Matt Mackall
bookmarks: move strip support to repair
r13362 bm = repo._bookmarks
updatebm = []
for m in bm:
rev = repo[bm[m]].rev()
if rev in tostrip:
updatebm.append(m)
Matt Mackall
strip: move strip code to a new repair module
r4702 # create a changegroup for all the branches we need to keep
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 backupfile = None
Matt Mackall
strip: move strip code to a new repair module
r4702 if backup == "all":
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 backupfile = _bundle(repo, [node], cl.heads(), node, 'backup')
Matt Mackall
strip: improve full backup message
r11200 repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
Benoit Boissinot
strip: remove usage of extranodes...
r13702 if saveheads or savebases:
Nicolas Dumazet
repair: do not compress partial bundle if we do not keep it on disk...
r11791 # do not compress partial bundle if we remove it from disk later
Alexis S. L. Carvalho
repair.py: rewrite a loop, making it cleaner and faster
r6147 chgrpfile = _bundle(repo, savebases, saveheads, node, 'temp',
Benoit Boissinot
strip: remove usage of extranodes...
r13702 compress=keeppartialbundle)
Matt Mackall
strip: move strip code to a new repair module
r4702
Henrik Stuart
strip: make repair.strip transactional to avoid repository corruption...
r8073 mfst = repo.manifest
Steve Borho
localrepo: add desc parameter to transaction...
r10881 tr = repo.transaction("strip")
Henrik Stuart
strip: make repair.strip transactional to avoid repository corruption...
r8073 offset = len(tr.entries)
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 try:
tr.startgroup()
cl.strip(striprev, tr)
mfst.strip(striprev, tr)
for fn in files:
repo.file(fn).strip(striprev, tr)
tr.endgroup()
Henrik Stuart
strip: make repair.strip transactional to avoid repository corruption...
r8073
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 try:
for i in xrange(offset, len(tr.entries)):
file, troffset, ignore = tr.entries[i]
repo.sopener(file, 'a').truncate(troffset)
tr.close()
except:
tr.abort()
raise
Benoit Boissinot
strip: remove usage of extranodes...
r13702 if saveheads or savebases:
Matt Mackall
strip: hide unbundle messages by default...
r11202 ui.note(_("adding branch\n"))
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 f = open(chgrpfile, "rb")
gen = changegroup.readbundle(f, chgrpfile)
Matt Mackall
strip: hide unbundle messages by default...
r11202 if not repo.ui.verbose:
# silence internal shuffling chatter
repo.ui.pushbuffer()
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 repo.addchangegroup(gen, 'strip', 'bundle:' + chgrpfile, True)
Matt Mackall
strip: hide unbundle messages by default...
r11202 if not repo.ui.verbose:
repo.ui.popbuffer()
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 f.close()
Nicolas Dumazet
repair: do not compress partial bundle if we do not keep it on disk...
r11791 if not keeppartialbundle:
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 os.unlink(chgrpfile)
Matt Mackall
bookmarks: move strip support to repair
r13362
for m in updatebm:
bm[m] = repo['.'].node()
bookmarks.write(repo)
Henrik Stuart
strip: make repair.strip transactional to avoid repository corruption...
r8073 except:
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 if backupfile:
Martin Geisler
mark ui.warn strings for translation
r11600 ui.warn(_("strip failed, full bundle stored in '%s'\n")
% backupfile)
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 elif saveheads:
Martin Geisler
mark ui.warn strings for translation
r11600 ui.warn(_("strip failed, partial bundle stored in '%s'\n")
Matt Mackall
strip: be quiet about temporary internal bundle
r11197 % chgrpfile)
Henrik Stuart
strip: make repair.strip transactional to avoid repository corruption...
r8073 raise
Matt Mackall
strip: move strip code to a new repair module
r4702
Greg Ward
localrepo: add destroyed() method for strip/rollback to use (issue548).
r9150 repo.destroyed()