Mercurial > hg
comparison mercurial/repair.py @ 23898:b21c2e0ee8a3
repair: add experimental option to write bundle2 files
This adds an experimental option 'strip-bundle2-version' which causes backup
bundles to use bundle2 formatting. Especially for generaldelta repositories,
this should provide significant performance gains for any operation that needs
to write a backup.
author | Eric Sumner <ericsumner@fb.com> |
---|---|
date | Thu, 15 Jan 2015 16:51:13 -0800 |
parents | cda18ded2c48 |
children | 33d1b81c6ef0 |
comparison
equal
deleted
inserted
replaced
23897:f99a6e1865e5 | 23898:b21c2e0ee8a3 |
---|---|
4 # Copyright 2007 Matt Mackall | 4 # Copyright 2007 Matt Mackall |
5 # | 5 # |
6 # This software may be used and distributed according to the terms of the | 6 # This software may be used and distributed according to the terms of the |
7 # GNU General Public License version 2 or any later version. | 7 # GNU General Public License version 2 or any later version. |
8 | 8 |
9 from mercurial import changegroup, exchange, util | 9 from mercurial import changegroup, exchange, util, bundle2 |
10 from mercurial.node import short, hex | 10 from mercurial.node import short, hex |
11 from mercurial.i18n import _ | 11 from mercurial.i18n import _ |
12 import errno | 12 import errno |
13 | 13 |
14 def _bundle(repo, bases, heads, node, suffix, compress=True): | 14 def _bundle(repo, bases, heads, 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 = changegroup.changegroupsubset(repo, bases, heads, 'strip') | 16 usebundle2 = (repo.ui.config('experimental', 'bundle2-exp') and |
17 repo.ui.config('experimental', 'strip-bundle2-version')) | |
18 if usebundle2: | |
19 cgversion = repo.ui.config('experimental', 'strip-bundle2-version') | |
20 else: | |
21 cgversion = '01' | |
22 | |
23 cg = changegroup.changegroupsubset(repo, bases, heads, 'strip', | |
24 version=cgversion) | |
17 backupdir = "strip-backup" | 25 backupdir = "strip-backup" |
18 vfs = repo.vfs | 26 vfs = repo.vfs |
19 if not vfs.isdir(backupdir): | 27 if not vfs.isdir(backupdir): |
20 vfs.mkdir(backupdir) | 28 vfs.mkdir(backupdir) |
21 | 29 |
25 allcommits = repo.set('%ls::%ls', hexbases, hexheads) | 33 allcommits = repo.set('%ls::%ls', hexbases, hexheads) |
26 allhashes = sorted(c.hex() for c in allcommits) | 34 allhashes = sorted(c.hex() for c in allcommits) |
27 totalhash = util.sha1(''.join(allhashes)).hexdigest() | 35 totalhash = util.sha1(''.join(allhashes)).hexdigest() |
28 name = "%s/%s-%s-%s.hg" % (backupdir, short(node), totalhash[:8], suffix) | 36 name = "%s/%s-%s-%s.hg" % (backupdir, short(node), totalhash[:8], suffix) |
29 | 37 |
30 if compress: | 38 if usebundle2: |
39 bundletype = "HG2Y" | |
40 elif compress: | |
31 bundletype = "HG10BZ" | 41 bundletype = "HG10BZ" |
32 else: | 42 else: |
33 bundletype = "HG10UN" | 43 bundletype = "HG10UN" |
34 return changegroup.writebundle(repo.ui, cg, name, bundletype, vfs) | 44 return changegroup.writebundle(repo.ui, cg, name, bundletype, vfs) |
35 | 45 |
161 f = vfs.open(chgrpfile, "rb") | 171 f = vfs.open(chgrpfile, "rb") |
162 gen = exchange.readbundle(ui, f, chgrpfile, vfs) | 172 gen = exchange.readbundle(ui, f, chgrpfile, vfs) |
163 if not repo.ui.verbose: | 173 if not repo.ui.verbose: |
164 # silence internal shuffling chatter | 174 # silence internal shuffling chatter |
165 repo.ui.pushbuffer() | 175 repo.ui.pushbuffer() |
166 changegroup.addchangegroup(repo, gen, 'strip', | 176 if isinstance(gen, bundle2.unbundle20): |
167 'bundle:' + vfs.join(chgrpfile), True) | 177 tr = repo.transaction('strip') |
178 try: | |
179 bundle2.processbundle(repo, gen, lambda: tr) | |
180 tr.close() | |
181 finally: | |
182 tr.release() | |
183 else: | |
184 changegroup.addchangegroup(repo, gen, 'strip', | |
185 'bundle:' + vfs.join(chgrpfile), | |
186 True) | |
168 if not repo.ui.verbose: | 187 if not repo.ui.verbose: |
169 repo.ui.popbuffer() | 188 repo.ui.popbuffer() |
170 f.close() | 189 f.close() |
171 | 190 |
172 # remove undo files | 191 # remove undo files |