Mercurial > hg-stable
annotate mercurial/repair.py @ 30451:41a8106789ca
util: implement zstd compression engine
Now that zstd is vendored and being built (in some configurations), we
can implement a compression engine for zstd!
The zstd engine is a little different from existing engines. Because
it may not always be present, we have to defer load the module in case
importing it fails. We facilitate this via a cached property that holds
a reference to the module or None. The "available" method is
implemented to reflect reality.
The zstd engine declares its ability to handle bundles using the
"zstd" human name and the "ZS" internal name. The latter was chosen
because internal names are 2 characters (by only convention I think)
and "ZS" seems reasonable.
The engine, like others, supports specifying the compression level.
However, there are no consumers of this API that yet pass in that
argument. I have plans to change that, so stay tuned.
Since all we need to do to support bundle generation with a new
compression engine is implement and register the compression engine,
bundle generation with zstd "just works!" Tests demonstrating this
have been added.
How does performance of zstd for bundle generation compare? On the
mozilla-unified repo, `hg bundle --all -t <engine>-v2` yields the
following on my i7-6700K on Linux:
engine CPU time bundle size vs orig size throughput
none 97.0s 4,054,405,584 100.0% 41.8 MB/s
bzip2 (l=9) 393.6s 975,343,098 24.0% 10.3 MB/s
gzip (l=6) 184.0s 1,140,533,074 28.1% 22.0 MB/s
zstd (l=1) 108.2s 1,119,434,718 27.6% 37.5 MB/s
zstd (l=2) 111.3s 1,078,328,002 26.6% 36.4 MB/s
zstd (l=3) 113.7s 1,011,823,727 25.0% 35.7 MB/s
zstd (l=4) 116.0s 1,008,965,888 24.9% 35.0 MB/s
zstd (l=5) 121.0s 977,203,148 24.1% 33.5 MB/s
zstd (l=6) 131.7s 927,360,198 22.9% 30.8 MB/s
zstd (l=7) 139.0s 912,808,505 22.5% 29.2 MB/s
zstd (l=12) 198.1s 854,527,714 21.1% 20.5 MB/s
zstd (l=18) 681.6s 789,750,690 19.5% 5.9 MB/s
On compression, zstd for bundle generation delivers:
* better compression than gzip with significantly less CPU utilization
* better than bzip2 compression ratios while still being significantly
faster than gzip
* ability to aggressively tune compression level to achieve
significantly smaller bundles
That last point is important. With clone bundles, a server can
pre-generate a bundle file, upload it to a static file server, and
redirect clients to transparently download it during clone. The server
could choose to produce a zstd bundle with the highest compression
settings possible. This would take a very long time - a magnitude
longer than a typical zstd bundle generation - but the result would
be hundreds of megabytes smaller! For the clone volume we do at
Mozilla, this could translate to petabytes of bandwidth savings
per year and faster clones (due to smaller transfer size).
I don't have detailed numbers to report on decompression. However,
zstd decompression is fast: >1 GB/s output throughput on this machine,
even through the Python bindings. And it can do that regardless of the
compression level of the input. By the time you have enough data to
worry about overhead of decompression, you have plenty of other things
to worry about performance wise.
zstd is wins all around. I can't wait to implement support for it
on the wire protocol and in revlogs.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Fri, 11 Nov 2016 01:10:07 -0800 |
parents | 11b8b740d54a |
children | 2e4862646f02 |
rev | line source |
---|---|
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # repair.py - functions for repository repair for mercurial |
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
3 # Copyright 2005, 2006 Chris Mason <mason@suse.com> |
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # Copyright 2007 Matt Mackall |
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
5 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8073
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
8 |
25970
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
9 from __future__ import absolute_import |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
10 |
16440
692bf06bb1af
repair: fix missing import
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
16388
diff
changeset
|
11 import errno |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29196
diff
changeset
|
12 import hashlib |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
13 |
25970
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
14 from .i18n import _ |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
15 from .node import short |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
16 from . import ( |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
17 bundle2, |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
18 changegroup, |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26425
diff
changeset
|
19 error, |
25970
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
20 exchange, |
28868
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
21 obsolete, |
25970
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
22 util, |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
23 ) |
d1419cfbd4f4
repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25874
diff
changeset
|
24 |
15386
6051d8e7e133
strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents:
15068
diff
changeset
|
25 def _bundle(repo, bases, heads, node, suffix, compress=True): |
5905
3afbd82a6c82
repair.py: don't use nested functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5904
diff
changeset
|
26 """create a bundle with the specified revisions as a backup""" |
27930
7cbb3a01fa38
repair: use cg3 for treemanifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
27875
diff
changeset
|
27 cgversion = changegroup.safeversion(repo) |
23898
b21c2e0ee8a3
repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents:
23895
diff
changeset
|
28 |
b21c2e0ee8a3
repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents:
23895
diff
changeset
|
29 cg = changegroup.changegroupsubset(repo, bases, heads, 'strip', |
b21c2e0ee8a3
repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents:
23895
diff
changeset
|
30 version=cgversion) |
20977
a57dcd11be34
repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20975
diff
changeset
|
31 backupdir = "strip-backup" |
a57dcd11be34
repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20975
diff
changeset
|
32 vfs = repo.vfs |
a57dcd11be34
repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20975
diff
changeset
|
33 if not vfs.isdir(backupdir): |
a57dcd11be34
repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20975
diff
changeset
|
34 vfs.mkdir(backupdir) |
23835
aa4a1672583e
bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents:
22818
diff
changeset
|
35 |
aa4a1672583e
bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents:
22818
diff
changeset
|
36 # Include a hash of all the nodes in the filename for uniqueness |
25340
28800ab40395
repair: use _hexlist() to build revset expression from binary nodes
Yuya Nishihara <yuya@tcha.org>
parents:
25300
diff
changeset
|
37 allcommits = repo.set('%ln::%ln', bases, heads) |
23835
aa4a1672583e
bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents:
22818
diff
changeset
|
38 allhashes = sorted(c.hex() for c in allcommits) |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29196
diff
changeset
|
39 totalhash = hashlib.sha1(''.join(allhashes)).hexdigest() |
23835
aa4a1672583e
bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents:
22818
diff
changeset
|
40 name = "%s/%s-%s-%s.hg" % (backupdir, short(node), totalhash[:8], suffix) |
aa4a1672583e
bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents:
22818
diff
changeset
|
41 |
26425
eb21b6679dc6
strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26423
diff
changeset
|
42 comp = None |
26423
c93f91c1db1c
strip: use bundle2 + cg2 by default when repository use general delta
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26014
diff
changeset
|
43 if cgversion != '01': |
24686
e0e28e910fa3
bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24252
diff
changeset
|
44 bundletype = "HG20" |
26425
eb21b6679dc6
strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26423
diff
changeset
|
45 if compress: |
eb21b6679dc6
strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26423
diff
changeset
|
46 comp = 'BZ' |
23898
b21c2e0ee8a3
repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents:
23895
diff
changeset
|
47 elif compress: |
11791
00cde9bddbe4
repair: do not compress partial bundle if we do not keep it on disk
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11600
diff
changeset
|
48 bundletype = "HG10BZ" |
00cde9bddbe4
repair: do not compress partial bundle if we do not keep it on disk
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11600
diff
changeset
|
49 else: |
00cde9bddbe4
repair: do not compress partial bundle if we do not keep it on disk
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11600
diff
changeset
|
50 bundletype = "HG10UN" |
28666
ae53ecc47414
bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
28466
diff
changeset
|
51 return bundle2.writebundle(repo.ui, cg, name, bundletype, vfs, |
26425
eb21b6679dc6
strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26423
diff
changeset
|
52 compression=comp) |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
53 |
5910
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
54 def _collectfiles(repo, striprev): |
b9a830fa10f6
simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5909
diff
changeset
|
55 """find out the filelogs affected by the strip""" |
8462
e7e4e41b3bbc
repair: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8363
diff
changeset
|
56 files = set() |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
57 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
58 for x in xrange(striprev, len(repo)): |
8479
3e16c0fc2241
repair: bulk update sets
Martin Geisler <mg@lazybytes.net>
parents:
8462
diff
changeset
|
59 files.update(repo[x].files()) |
5902
98f8dec8f437
repair.py: split stripall into two functions; clean it up a bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5901
diff
changeset
|
60 |
8462
e7e4e41b3bbc
repair: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8363
diff
changeset
|
61 return sorted(files) |
5902
98f8dec8f437
repair.py: split stripall into two functions; clean it up a bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5901
diff
changeset
|
62 |
13702
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
63 def _collectbrokencsets(repo, files, striprev): |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
64 """return the changesets which will be broken by the truncation""" |
13705
73cfb7a5aa56
strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents:
13702
diff
changeset
|
65 s = set() |
13702
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
66 def collectone(revlog): |
20074
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
18766
diff
changeset
|
67 _, brokenset = revlog.getstrippoint(striprev) |
5fc2ae1c631b
strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents:
18766
diff
changeset
|
68 s.update([revlog.linkrev(r) for r in brokenset]) |
5909
f45f7390c1c5
strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5905
diff
changeset
|
69 |
30385
11b8b740d54a
manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents:
30381
diff
changeset
|
70 collectone(repo.manifestlog._revlog) |
13705
73cfb7a5aa56
strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents:
13702
diff
changeset
|
71 for fname in files: |
73cfb7a5aa56
strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents:
13702
diff
changeset
|
72 collectone(repo.file(fname)) |
5909
f45f7390c1c5
strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5905
diff
changeset
|
73 |
13705
73cfb7a5aa56
strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents:
13702
diff
changeset
|
74 return s |
5909
f45f7390c1c5
strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5905
diff
changeset
|
75 |
22057
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
76 def strip(ui, repo, nodelist, backup=True, topic='backup'): |
27553
56caab876bd8
repair: improves documentation of strip regarding locks
Laurent Charignon <lcharignon@fb.com>
parents:
27157
diff
changeset
|
77 # This function operates within a transaction of its own, but does |
56caab876bd8
repair: improves documentation of strip regarding locks
Laurent Charignon <lcharignon@fb.com>
parents:
27157
diff
changeset
|
78 # not take any lock on the repo. |
22057
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
79 # Simple way to maintain backwards compatibility for this |
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
80 # argument. |
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
81 if backup in ['none', 'strip']: |
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
82 backup = False |
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
83 |
18004
747a2f43d5d9
clfilter: strip logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17922
diff
changeset
|
84 repo = repo.unfiltered() |
18310
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18121
diff
changeset
|
85 repo.destroying() |
17013
c8eda7bbdcab
strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents:
16867
diff
changeset
|
86 |
5901
16f4129c19ac
repair.py: rename chlog to cl
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5900
diff
changeset
|
87 cl = repo.changelog |
16237
b5c0c7d0f83f
repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents:
15901
diff
changeset
|
88 # TODO handle undo of merge sets |
16252
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
89 if isinstance(nodelist, str): |
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
90 nodelist = [nodelist] |
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
91 striplist = [cl.rev(node) for node in nodelist] |
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
92 striprev = min(striplist) |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
93 |
6147
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
94 # Some revisions with rev > striprev may not be descendants of striprev. |
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
95 # We have to find these revisions and put them in a bundle, so that |
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
96 # we can restore them after the truncations. |
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
97 # To create the bundle we use repo.changegroupsubset which requires |
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
98 # the list of heads and bases of the set of interesting revisions. |
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
99 # (head = revision in the set that has no descendant in the set; |
53ae5af55db3
repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5910
diff
changeset
|
100 # base = revision in the set that has no ancestor in the set) |
16252
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
101 tostrip = set(striplist) |
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
102 for rev in striplist: |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16745
diff
changeset
|
103 for desc in cl.descendants([rev]): |
16252
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
104 tostrip.add(desc) |
13702
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
105 |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
106 files = _collectfiles(repo, striprev) |
13705
73cfb7a5aa56
strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents:
13702
diff
changeset
|
107 saverevs = _collectbrokencsets(repo, files, striprev) |
13702
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
108 |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
109 # compute heads |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
110 saveheads = set(saverevs) |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
111 for r in xrange(striprev + 1, len(cl)): |
13702
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
112 if r not in tostrip: |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
113 saverevs.add(r) |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
114 saveheads.difference_update(cl.parentrevs(r)) |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
115 saveheads.add(r) |
ffd370aa050b
strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13362
diff
changeset
|
116 saveheads = [cl.node(r) for r in saveheads] |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
117 |
15386
6051d8e7e133
strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents:
15068
diff
changeset
|
118 # compute base nodes |
6051d8e7e133
strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents:
15068
diff
changeset
|
119 if saverevs: |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16745
diff
changeset
|
120 descendants = set(cl.descendants(saverevs)) |
15386
6051d8e7e133
strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents:
15068
diff
changeset
|
121 saverevs.difference_update(descendants) |
6051d8e7e133
strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents:
15068
diff
changeset
|
122 savebases = [cl.node(r) for r in saverevs] |
16252
cf17e76be4dd
strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15901
diff
changeset
|
123 stripbases = [cl.node(r) for r in tostrip] |
18040
fe8caf28d580
strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents:
18004
diff
changeset
|
124 |
fe8caf28d580
strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents:
18004
diff
changeset
|
125 # For a set s, max(parents(s) - s) is the same as max(heads(::s - s)), but |
fe8caf28d580
strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents:
18004
diff
changeset
|
126 # is much faster |
fe8caf28d580
strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents:
18004
diff
changeset
|
127 newbmtarget = repo.revs('max(parents(%ld) - (%ld))', tostrip, tostrip) |
17264
ec7b9bec19c9
strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents:
17013
diff
changeset
|
128 if newbmtarget: |
22818
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22057
diff
changeset
|
129 newbmtarget = repo[newbmtarget.first()].node() |
17264
ec7b9bec19c9
strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents:
17013
diff
changeset
|
130 else: |
ec7b9bec19c9
strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents:
17013
diff
changeset
|
131 newbmtarget = '.' |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
132 |
13362
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
133 bm = repo._bookmarks |
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
134 updatebm = [] |
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
135 for m in bm: |
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
136 rev = repo[bm[m]].rev() |
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
137 if rev in tostrip: |
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
138 updatebm.append(m) |
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
139 |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
140 # create a changegroup for all the branches we need to keep |
11197
4bb4895e1693
strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents:
10881
diff
changeset
|
141 backupfile = None |
20979
ad5b61370514
repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20977
diff
changeset
|
142 vfs = repo.vfs |
24252
f962692853c0
repair: define explicit local variable, don't reuse a comprehension variable
Mike Edgar <adgar@google.com>
parents:
24170
diff
changeset
|
143 node = nodelist[-1] |
22057
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
144 if backup: |
16388
e03d8a40521f
repair: allow giving strip backup a different name
Idan Kamara <idankk86@gmail.com>
parents:
16253
diff
changeset
|
145 backupfile = _bundle(repo, stripbases, cl.heads(), node, topic) |
20979
ad5b61370514
repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20977
diff
changeset
|
146 repo.ui.status(_("saved backup bundle to %s\n") % |
ad5b61370514
repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20977
diff
changeset
|
147 vfs.join(backupfile)) |
ad5b61370514
repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20977
diff
changeset
|
148 repo.ui.log("backupbundle", "saved backup bundle to %s\n", |
ad5b61370514
repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20977
diff
changeset
|
149 vfs.join(backupfile)) |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
150 tmpbundlefile = None |
29955
e7acbe538baf
strip: simplify some repeated conditions
Martin von Zweigbergk <martinvonz@google.com>
parents:
29721
diff
changeset
|
151 if saveheads: |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
152 # do not compress temporary bundle if we remove it from disk later |
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
153 tmpbundlefile = _bundle(repo, savebases, saveheads, node, 'temp', |
22057
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
154 compress=False) |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
155 |
30385
11b8b740d54a
manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents:
30381
diff
changeset
|
156 mfst = repo.manifestlog._revlog |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
7361
diff
changeset
|
157 |
25300
678d0bfdd31a
repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24863
diff
changeset
|
158 curtr = repo.currenttransaction() |
678d0bfdd31a
repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24863
diff
changeset
|
159 if curtr is not None: |
678d0bfdd31a
repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24863
diff
changeset
|
160 del curtr # avoid carrying reference to transaction for nothing |
678d0bfdd31a
repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24863
diff
changeset
|
161 msg = _('programming error: cannot strip from inside a transaction') |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26425
diff
changeset
|
162 raise error.Abort(msg, hint=_('contact your extension maintainer')) |
25300
678d0bfdd31a
repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24863
diff
changeset
|
163 |
27873
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
164 try: |
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
165 with repo.transaction("strip") as tr: |
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
166 offset = len(tr.entries) |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
7361
diff
changeset
|
167 |
27873
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
168 tr.startgroup() |
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
169 cl.strip(striprev, tr) |
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
170 mfst.strip(striprev, tr) |
29464
87c184c9bfef
treemanifests: actually strip directory manifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
29341
diff
changeset
|
171 if 'treemanifest' in repo.requirements: # safe but unnecessary |
87c184c9bfef
treemanifests: actually strip directory manifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
29341
diff
changeset
|
172 # otherwise |
87c184c9bfef
treemanifests: actually strip directory manifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
29341
diff
changeset
|
173 for unencoded, encoded, size in repo.store.datafiles(): |
87c184c9bfef
treemanifests: actually strip directory manifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
29341
diff
changeset
|
174 if (unencoded.startswith('meta/') and |
87c184c9bfef
treemanifests: actually strip directory manifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
29341
diff
changeset
|
175 unencoded.endswith('00manifest.i')): |
87c184c9bfef
treemanifests: actually strip directory manifests
Martin von Zweigbergk <martinvonz@google.com>
parents:
29341
diff
changeset
|
176 dir = unencoded[5:-12] |
30381
fccc3eea2ddb
manifest: delete unused dirlog and _newmanifest functions
Durham Goode <durham@fb.com>
parents:
30288
diff
changeset
|
177 repo.manifestlog._revlog.dirlog(dir).strip(striprev, tr) |
27873
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
178 for fn in files: |
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
179 repo.file(fn).strip(striprev, tr) |
60ea60fea5f3
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27871
diff
changeset
|
180 tr.endgroup() |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
7361
diff
changeset
|
181 |
11197
4bb4895e1693
strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents:
10881
diff
changeset
|
182 for i in xrange(offset, len(tr.entries)): |
4bb4895e1693
strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents:
10881
diff
changeset
|
183 file, troffset, ignore = tr.entries[i] |
30005
e38d85be978f
repair: open a file with checkambig=True to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29958
diff
changeset
|
184 with repo.svfs(file, 'a', checkambig=True) as fp: |
e38d85be978f
repair: open a file with checkambig=True to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29958
diff
changeset
|
185 fp.truncate(troffset) |
20885
f49d60fa40a5
fncache: clean up fncache during strips
Durham Goode <durham@fb.com>
parents:
20074
diff
changeset
|
186 if troffset == 0: |
f49d60fa40a5
fncache: clean up fncache during strips
Durham Goode <durham@fb.com>
parents:
20074
diff
changeset
|
187 repo.store.markremoved(file) |
11197
4bb4895e1693
strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents:
10881
diff
changeset
|
188 |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
189 if tmpbundlefile: |
11202
f974fe896921
strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents:
11200
diff
changeset
|
190 ui.note(_("adding branch\n")) |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
191 f = vfs.open(tmpbundlefile, "rb") |
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
192 gen = exchange.readbundle(ui, f, tmpbundlefile, vfs) |
11202
f974fe896921
strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents:
11200
diff
changeset
|
193 if not repo.ui.verbose: |
f974fe896921
strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents:
11200
diff
changeset
|
194 # silence internal shuffling chatter |
f974fe896921
strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents:
11200
diff
changeset
|
195 repo.ui.pushbuffer() |
23898
b21c2e0ee8a3
repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents:
23895
diff
changeset
|
196 if isinstance(gen, bundle2.unbundle20): |
27875
add2ba16430e
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27873
diff
changeset
|
197 with repo.transaction('strip') as tr: |
add2ba16430e
with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents:
27873
diff
changeset
|
198 tr.hookargs = {'source': 'strip', |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
199 'url': 'bundle:' + vfs.join(tmpbundlefile)} |
26797
75d550b7d8f5
strip: pass source and url to bundle2 processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26701
diff
changeset
|
200 bundle2.applybundle(repo, gen, tr, source='strip', |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
201 url='bundle:' + vfs.join(tmpbundlefile)) |
23898
b21c2e0ee8a3
repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents:
23895
diff
changeset
|
202 else: |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
203 gen.apply(repo, 'strip', 'bundle:' + vfs.join(tmpbundlefile), |
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
204 True) |
11202
f974fe896921
strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents:
11200
diff
changeset
|
205 if not repo.ui.verbose: |
f974fe896921
strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents:
11200
diff
changeset
|
206 repo.ui.popbuffer() |
11197
4bb4895e1693
strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents:
10881
diff
changeset
|
207 f.close() |
29196
bf7b8157c483
strip: invalidate phase cache after stripping changeset (issue5235)
Laurent Charignon <lcharignon@fb.com>
parents:
28868
diff
changeset
|
208 repo._phasecache.invalidate() |
13362
ee01d9d84115
bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents:
12057
diff
changeset
|
209 |
27157
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
210 for m in updatebm: |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
211 bm[m] = repo[newbmtarget].node() |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
212 lock = tr = None |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
213 try: |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
214 lock = repo.lock() |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
215 tr = repo.transaction('repair') |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
216 bm.recordchange(tr) |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
217 tr.close() |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
218 finally: |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
219 tr.release() |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
220 lock.release() |
5f2e4eb08e41
repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
26797
diff
changeset
|
221 |
16237
b5c0c7d0f83f
repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents:
15901
diff
changeset
|
222 # remove undo files |
20975
37cdf1fca1b2
localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20933
diff
changeset
|
223 for undovfs, undofile in repo.undofiles(): |
16237
b5c0c7d0f83f
repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents:
15901
diff
changeset
|
224 try: |
20975
37cdf1fca1b2
localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20933
diff
changeset
|
225 undovfs.unlink(undofile) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25652
diff
changeset
|
226 except OSError as e: |
16237
b5c0c7d0f83f
repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents:
15901
diff
changeset
|
227 if e.errno != errno.ENOENT: |
20975
37cdf1fca1b2
localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20933
diff
changeset
|
228 ui.warn(_('error removing %s: %s\n') % |
37cdf1fca1b2
localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20933
diff
changeset
|
229 (undovfs.join(undofile), str(e))) |
16237
b5c0c7d0f83f
repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents:
15901
diff
changeset
|
230 |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16628
diff
changeset
|
231 except: # re-raises |
11197
4bb4895e1693
strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents:
10881
diff
changeset
|
232 if backupfile: |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
233 ui.warn(_("strip failed, backup bundle stored in '%s'\n") |
20979
ad5b61370514
repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20977
diff
changeset
|
234 % vfs.join(backupfile)) |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
235 if tmpbundlefile: |
29957
94ebf56db04e
strip: clarify that user action is required to recover temp bundle
Martin von Zweigbergk <martinvonz@google.com>
parents:
29956
diff
changeset
|
236 ui.warn(_("strip failed, unrecovered changes stored in '%s'\n") |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
237 % vfs.join(tmpbundlefile)) |
29957
94ebf56db04e
strip: clarify that user action is required to recover temp bundle
Martin von Zweigbergk <martinvonz@google.com>
parents:
29956
diff
changeset
|
238 ui.warn(_("(fix the problem, then recover the changesets with " |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
239 "\"hg unbundle '%s'\")\n") % vfs.join(tmpbundlefile)) |
8073
e8a28556a0a8
strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
7361
diff
changeset
|
240 raise |
22057
445472225ccd
strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
21064
diff
changeset
|
241 else: |
29958
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
242 if tmpbundlefile: |
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
243 # Remove temporary bundle only if there were no exceptions |
769aee32fae0
strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents:
29957
diff
changeset
|
244 vfs.unlink(tmpbundlefile) |
4702
18e91c9def0c
strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
245 |
18395
904b7109938e
destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18311
diff
changeset
|
246 repo.destroyed() |
30288
c1345969f6c5
repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents:
30005
diff
changeset
|
247 # return the backup file path (or None if 'backup' was False) so |
c1345969f6c5
repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents:
30005
diff
changeset
|
248 # extensions can use it |
c1345969f6c5
repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents:
30005
diff
changeset
|
249 return backupfile |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
250 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
251 def rebuildfncache(ui, repo): |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
252 """Rebuilds the fncache file from repo history. |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
253 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
254 Missing entries will be added. Extra entries will be removed. |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
255 """ |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
256 repo = repo.unfiltered() |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
257 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
258 if 'fncache' not in repo.requirements: |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
259 ui.warn(_('(not rebuilding fncache because repository does not ' |
25874
3e84f40232c7
repair: fix typo in warning message
Wagner Bruna <wbruna@yahoo.com>
parents:
25845
diff
changeset
|
260 'support fncache)\n')) |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
261 return |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
262 |
27860
0da102e4f203
with: use context manager in rebuildfncache again
Bryan O'Sullivan <bryano@fb.com>
parents:
27553
diff
changeset
|
263 with repo.lock(): |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
264 fnc = repo.store.fncache |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
265 # Trigger load of fncache. |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
266 if 'irrelevant' in fnc: |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
267 pass |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
268 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
269 oldentries = set(fnc.entries) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
270 newentries = set() |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
271 seenfiles = set() |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
272 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
273 repolen = len(repo) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
274 for rev in repo: |
28466
c7d45c5a8cea
repair: specify unit for ui.progress in rebuildfncache()
Anton Shestakov <av6@dwimlabs.net>
parents:
28465
diff
changeset
|
275 ui.progress(_('rebuilding'), rev, total=repolen, |
c7d45c5a8cea
repair: specify unit for ui.progress in rebuildfncache()
Anton Shestakov <av6@dwimlabs.net>
parents:
28465
diff
changeset
|
276 unit=_('changesets')) |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
277 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
278 ctx = repo[rev] |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
279 for f in ctx.files(): |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
280 # This is to minimize I/O. |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
281 if f in seenfiles: |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
282 continue |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
283 seenfiles.add(f) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
284 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
285 i = 'data/%s.i' % f |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
286 d = 'data/%s.d' % f |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
287 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
288 if repo.store._exists(i): |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
289 newentries.add(i) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
290 if repo.store._exists(d): |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
291 newentries.add(d) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
292 |
28465
43eb31ea2dcb
repair: use 'rebuilding' progress topic in rebuildfncache()
Anton Shestakov <av6@dwimlabs.net>
parents:
28031
diff
changeset
|
293 ui.progress(_('rebuilding'), None) |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
294 |
28031
6f248ba85309
treemanifest: fix debugrebuildfncache
Martin von Zweigbergk <martinvonz@google.com>
parents:
28007
diff
changeset
|
295 if 'treemanifest' in repo.requirements: # safe but unnecessary otherwise |
28007
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
296 for dir in util.dirs(seenfiles): |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
297 i = 'meta/%s/00manifest.i' % dir |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
298 d = 'meta/%s/00manifest.d' % dir |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
299 |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
300 if repo.store._exists(i): |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
301 newentries.add(i) |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
302 if repo.store._exists(d): |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
303 newentries.add(d) |
fb92927f9775
treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents:
27930
diff
changeset
|
304 |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
305 addcount = len(newentries - oldentries) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
306 removecount = len(oldentries - newentries) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
307 for p in sorted(oldentries - newentries): |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
308 ui.write(_('removing %s\n') % p) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
309 for p in sorted(newentries - oldentries): |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
310 ui.write(_('adding %s\n') % p) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
311 |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
312 if addcount or removecount: |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
313 ui.write(_('%d items added, %d removed from fncache\n') % |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
314 (addcount, removecount)) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
315 fnc.entries = newentries |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
316 fnc._dirty = True |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
317 |
27871
f1c316fd91f9
with: use context manager in rebuildfncache
Bryan O'Sullivan <bryano@fb.com>
parents:
27860
diff
changeset
|
318 with repo.transaction('fncache') as tr: |
25652
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
319 fnc.write(tr) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
320 else: |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
321 ui.write(_('fncache already up to date\n')) |
2882d6886919
repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25404
diff
changeset
|
322 |
26624
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
323 def stripbmrevset(repo, mark): |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
324 """ |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
325 The revset to strip when strip is called with -B mark |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
326 |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
327 Needs to live here so extensions can use it and wrap it even when strip is |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
328 not enabled or not present on a box. |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
329 """ |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
330 return repo.revs("ancestors(bookmark(%s)) - " |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
331 "ancestors(head() and not bookmark(%s)) - " |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
332 "ancestors(bookmark() and not bookmark(%s))", |
bcace0fbb4c8
strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents:
26587
diff
changeset
|
333 mark, mark, mark) |
28868
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
334 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
335 def deleteobsmarkers(obsstore, indices): |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
336 """Delete some obsmarkers from obsstore and return how many were deleted |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
337 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
338 'indices' is a list of ints which are the indices |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
339 of the markers to be deleted. |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
340 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
341 Every invocation of this function completely rewrites the obsstore file, |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
342 skipping the markers we want to be removed. The new temporary file is |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
343 created, remaining markers are written there and on .close() this file |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
344 gets atomically renamed to obsstore, thus guaranteeing consistency.""" |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
345 if not indices: |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
346 # we don't want to rewrite the obsstore with the same content |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
347 return |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
348 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
349 left = [] |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
350 current = obsstore._all |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
351 n = 0 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
352 for i, m in enumerate(current): |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
353 if i in indices: |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
354 n += 1 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
355 continue |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
356 left.append(m) |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
357 |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
358 newobsstorefile = obsstore.svfs('obsstore', 'w', atomictemp=True) |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
359 for bytes in obsolete.encodemarkers(left, True, obsstore._version): |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
360 newobsstorefile.write(bytes) |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
361 newobsstorefile.close() |
445a25bb70be
obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents:
28666
diff
changeset
|
362 return n |