annotate mercurial/repair.py @ 48813:2bb75c65fa6c stable

ci: use the `v1.0` flavor of the docker images in the CI This new versioning will help us to maintain backward compatibility in the docker image. This will be useful to deal with mismatch between default/stable in version and the re-run CI on older changesets in the future. Once this changeset land on stable, we will have to merge it in default. Then we can start make backward incompatible changes in a new image version. Differential Revision: https://phab.mercurial-scm.org/D12388
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 18 Mar 2022 18:09:46 +0100
parents 2174f54aab18
children 6000f5b25c9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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>
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46677
diff changeset
4 # Copyright 2007 Olivia Mackall
4702
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9150
diff changeset
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
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
12
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
13 from .i18n import _
34229
6193d810f7bb repair: reliably obtain bytestr of node ids
Augie Fackler <raf@durin42.com>
parents: 33751
diff changeset
14 from .node import (
6193d810f7bb repair: reliably obtain bytestr of node ids
Augie Fackler <raf@durin42.com>
parents: 33751
diff changeset
15 hex,
6193d810f7bb repair: reliably obtain bytestr of node ids
Augie Fackler <raf@durin42.com>
parents: 33751
diff changeset
16 short,
6193d810f7bb repair: reliably obtain bytestr of node ids
Augie Fackler <raf@durin42.com>
parents: 33751
diff changeset
17 )
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
18 from . import (
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
19 bundle2,
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
20 changegroup,
32502
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32336
diff changeset
21 discovery,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26425
diff changeset
22 error,
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
23 exchange,
28868
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
24 obsolete,
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33120
diff changeset
25 obsutil,
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
26 pathutil,
39761
b2ec79559a4b strip: ignore orphaned internal changesets while computing safe strip roots
Boris Feld <boris.feld@octobus.net>
parents: 39702
diff changeset
27 phases,
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38529
diff changeset
28 pycompat,
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45391
diff changeset
29 requirements,
45558
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45392
diff changeset
30 scmutil,
47443
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
31 util,
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
32 )
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
33 from .utils import (
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
34 hashutil,
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
35 stringutil,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46895
diff changeset
36 urlutil,
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
37 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
38
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
39
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
40 def backupbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
41 repo, bases, heads, node, suffix, compress=True, obsolescence=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
42 ):
5905
3afbd82a6c82 repair.py: don't use nested functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5904
diff changeset
43 """create a bundle with the specified revisions as a backup"""
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
44
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
45 backupdir = b"strip-backup"
20977
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
46 vfs = repo.vfs
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
47 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
48 vfs.mkdir(backupdir)
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
49
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
50 # Include a hash of all the nodes in the filename for uniqueness
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
51 allcommits = repo.set(b'%ln::%ln', bases, heads)
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
52 allhashes = sorted(c.hex() for c in allcommits)
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
53 totalhash = hashutil.sha1(b''.join(allhashes)).digest()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
54 name = b"%s/%s-%s-%s.hg" % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
55 backupdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
56 short(node),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
57 hex(totalhash[:4]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
58 suffix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
59 )
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
60
33676
91f0677dc920 repair: preserve phase also when not using generaldelta (issue5678)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33490
diff changeset
61 cgversion = changegroup.localversion(repo)
26425
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
62 comp = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
63 if cgversion != b'01':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
64 bundletype = b"HG20"
26425
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
65 if compress:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
66 comp = b'BZ'
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
67 elif compress:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
68 bundletype = b"HG10BZ"
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
69 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
70 bundletype = b"HG10UN"
32502
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32336
diff changeset
71
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
72 outgoing = discovery.outgoing(repo, missingroots=bases, ancestorsof=heads)
33044
8e3021fd1a44 strip: include phases in bundle (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32948
diff changeset
73 contentopts = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
74 b'cg.version': cgversion,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
75 b'obsolescence': obsolescence,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
76 b'phases': True,
33044
8e3021fd1a44 strip: include phases in bundle (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32948
diff changeset
77 }
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
78 return bundle2.writenewbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
79 repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
80 repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
81 b'strip',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
82 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
83 bundletype,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
84 outgoing,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
85 contentopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
86 vfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
87 compression=comp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
88 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
89
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
90
5910
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
91 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
92 """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
93 files = set()
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
94
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38529
diff changeset
95 for x in pycompat.xrange(striprev, len(repo)):
8479
3e16c0fc2241 repair: bulk update sets
Martin Geisler <mg@lazybytes.net>
parents: 8462
diff changeset
96 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
97
8462
e7e4e41b3bbc repair: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8363
diff changeset
98 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
99
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
100
33750
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
101 def _collectrevlog(revlog, striprev):
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
102 _, brokenset = revlog.getstrippoint(striprev)
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
103 return [revlog.linkrev(r) for r in brokenset]
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
104
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
105
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
106 def _collectbrokencsets(repo, files, striprev):
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
107 """return the changesets which will be broken by the truncation"""
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
108 s = set()
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
109
42919
a8b249b2f8cc strip: fix bug with treemanifests and unordered linkrevs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42918
diff changeset
110 for revlog in manifestrevlogs(repo):
a8b249b2f8cc strip: fix bug with treemanifests and unordered linkrevs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42918
diff changeset
111 s.update(_collectrevlog(revlog, striprev))
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
112 for fname in files:
33750
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
113 s.update(_collectrevlog(repo.file(fname), striprev))
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
114
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
115 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
116
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
117
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
118 def strip(ui, repo, nodelist, backup=True, topic=b'backup'):
32940
eb84b4ad41e5 repair: clarify in comment that caller must take lock, but not transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32901
diff changeset
119 # This function requires the caller to lock the repo, but it operates
eb84b4ad41e5 repair: clarify in comment that caller must take lock, but not transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32901
diff changeset
120 # within a transaction of its own, and thus requires there to be no current
eb84b4ad41e5 repair: clarify in comment that caller must take lock, but not transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 32901
diff changeset
121 # transaction when it is called.
32942
f044295cdb7a repair: move check for existing transaction earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 32941
diff changeset
122 if repo.currenttransaction() is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
123 raise error.ProgrammingError(b'cannot strip from inside a transaction')
32942
f044295cdb7a repair: move check for existing transaction earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 32941
diff changeset
124
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
125 # 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
126 # argument.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
127 if backup in [b'none', b'strip']:
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
128 backup = False
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
129
18004
747a2f43d5d9 clfilter: strip logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
130 repo = repo.unfiltered()
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18121
diff changeset
131 repo.destroying()
41101
cfd95219102d strip: move attributes shortcut assigned earlier
Boris Feld <boris.feld@octobus.net>
parents: 41079
diff changeset
132 vfs = repo.vfs
42656
a1f10edcf6a6 strip: access bookmark before getting a reference to changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42282
diff changeset
133 # load bookmark before changelog to avoid side effect from outdated
a1f10edcf6a6 strip: access bookmark before getting a reference to changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42282
diff changeset
134 # changelog (see repo._refreshchangelog)
a1f10edcf6a6 strip: access bookmark before getting a reference to changelog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42282
diff changeset
135 repo._bookmarks
41101
cfd95219102d strip: move attributes shortcut assigned earlier
Boris Feld <boris.feld@octobus.net>
parents: 41079
diff changeset
136 cl = repo.changelog
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 16867
diff changeset
137
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
138 # TODO handle undo of merge sets
43446
8accf5fa9930 repair: fix an `isinstance(nodelist, str)` check for py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 43117
diff changeset
139 if isinstance(nodelist, bytes):
16252
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
140 nodelist = [nodelist]
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
141 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
142 striprev = min(striplist)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
143
30707
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
144 files = _collectfiles(repo, striprev)
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
145 saverevs = _collectbrokencsets(repo, files, striprev)
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
146
6147
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
147 # 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
148 # 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
149 # 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
150 # 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
151 # 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
152 # (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
153 # 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
154 tostrip = set(striplist)
30707
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
155 saveheads = set(saverevs)
30706
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30385
diff changeset
156 for r in cl.revs(start=striprev + 1):
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30385
diff changeset
157 if any(p in tostrip for p in cl.parentrevs(r)):
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30385
diff changeset
158 tostrip.add(r)
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
159
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
160 if r not in tostrip:
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
161 saverevs.add(r)
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
162 saveheads.difference_update(cl.parentrevs(r))
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
163 saveheads.add(r)
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
164 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
165
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
166 # compute base nodes
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
167 if saverevs:
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16745
diff changeset
168 descendants = set(cl.descendants(saverevs))
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
169 saverevs.difference_update(descendants)
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
170 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
171 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
172
32652
71eb6a098315 strip: strip obsmarkers exclusive to the stripped changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32651
diff changeset
173 stripobsidx = obsmarkers = ()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
174 if repo.ui.configbool(b'devel', b'strip-obsmarkers'):
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33120
diff changeset
175 obsmarkers = obsutil.exclusivemarkers(repo, stripbases)
32652
71eb6a098315 strip: strip obsmarkers exclusive to the stripped changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32651
diff changeset
176 if obsmarkers:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
177 stripobsidx = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
178 i for i, m in enumerate(repo.obsstore) if m in obsmarkers
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
179 ]
32652
71eb6a098315 strip: strip obsmarkers exclusive to the stripped changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32651
diff changeset
180
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
181 newbmtarget, updatebm = _bookmarkmovements(repo, tostrip)
13362
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
182
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
183 backupfile = None
24252
f962692853c0 repair: define explicit local variable, don't reuse a comprehension variable
Mike Edgar <adgar@google.com>
parents: 24170
diff changeset
184 node = nodelist[-1]
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
185 if backup:
41103
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
186 backupfile = _createstripbackup(repo, stripbases, node, topic)
41102
e80329a3952c strip: clarify comment around bundle create
Boris Feld <boris.feld@octobus.net>
parents: 41101
diff changeset
187 # create a changegroup for all the branches we need to keep
29958
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29957
diff changeset
188 tmpbundlefile = None
29955
e7acbe538baf strip: simplify some repeated conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 29721
diff changeset
189 if saveheads:
29958
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29957
diff changeset
190 # do not compress temporary bundle if we remove it from disk later
32651
5732e6d2b369 strip: do not include obsolescence markers for the temporary bundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32646
diff changeset
191 #
5732e6d2b369 strip: do not include obsolescence markers for the temporary bundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32646
diff changeset
192 # We do not include obsolescence, it might re-introduce prune markers
5732e6d2b369 strip: do not include obsolescence markers for the temporary bundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32646
diff changeset
193 # we are trying to strip. This is harmless since the stripped markers
5732e6d2b369 strip: do not include obsolescence markers for the temporary bundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32646
diff changeset
194 # are already backed up and we did not touched the markers for the
5732e6d2b369 strip: do not include obsolescence markers for the temporary bundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32646
diff changeset
195 # saved changesets.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
196 tmpbundlefile = backupbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
197 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
198 savebases,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
199 saveheads,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
200 node,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
201 b'temp',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
202 compress=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
203 obsolescence=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
204 )
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
205
41079
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 39761
diff changeset
206 with ui.uninterruptible():
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
207 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
208 with repo.transaction(b"strip") as tr:
39702
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
209 # TODO this code violates the interface abstraction of the
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
210 # transaction and makes assumptions that file storage is
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
211 # using append-only files. We'll need some kind of storage
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
212 # API to handle stripping for us.
45886
a985c4fb23ca transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents: 45884
diff changeset
213 oldfiles = set(tr._offsetmap.keys())
45887
ec73a6a75985 transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents: 45886
diff changeset
214 oldfiles.update(tr._newfiles)
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
215
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
216 tr.startgroup()
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
217 cl.strip(striprev, tr)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
218 stripmanifest(repo, striprev, tr, files)
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
219
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
220 for fn in files:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
221 repo.file(fn).strip(striprev, tr)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
222 tr.endgroup()
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
223
45886
a985c4fb23ca transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents: 45884
diff changeset
224 entries = tr.readjournal()
a985c4fb23ca transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents: 45884
diff changeset
225
a985c4fb23ca transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents: 45884
diff changeset
226 for file, troffset in entries:
a985c4fb23ca transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents: 45884
diff changeset
227 if file in oldfiles:
a985c4fb23ca transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents: 45884
diff changeset
228 continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
229 with repo.svfs(file, b'a', checkambig=True) as fp:
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
230 fp.truncate(troffset)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
231 if troffset == 0:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
232 repo.store.markremoved(file)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
233
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
234 deleteobsmarkers(repo.obsstore, stripobsidx)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
235 del repo.obsstore
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
236 repo.invalidatevolatilesets()
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
237 repo._phasecache.filterunknown(repo)
32652
71eb6a098315 strip: strip obsmarkers exclusive to the stripped changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32651
diff changeset
238
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
239 if tmpbundlefile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
240 ui.note(_(b"adding branch\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
241 f = vfs.open(tmpbundlefile, b"rb")
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
242 gen = exchange.readbundle(ui, f, tmpbundlefile, vfs)
47443
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
243 # silence internal shuffling chatter
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
244 maybe_silent = (
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
245 repo.ui.silent()
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
246 if not repo.ui.verbose
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
247 else util.nullcontextmanager()
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
248 )
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
249 with maybe_silent:
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
250 tmpbundleurl = b'bundle:' + vfs.join(tmpbundlefile)
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
251 txnname = b'strip'
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
252 if not isinstance(gen, bundle2.unbundle20):
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
253 txnname = b"strip\n%s" % urlutil.hidepassword(
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
254 tmpbundleurl
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
255 )
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
256 with repo.transaction(txnname) as tr:
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
257 bundle2.applybundle(
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
258 repo, gen, tr, source=b'strip', url=tmpbundleurl
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 46907
diff changeset
259 )
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
260 f.close()
31631
0febf8e4e2ce repair: use context manager for lock management
Matt Harbison <matt_harbison@yahoo.com>
parents: 31333
diff changeset
261
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
262 with repo.transaction(b'repair') as tr:
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
263 bmchanges = [(m, repo[newbmtarget].node()) for m in updatebm]
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
264 repo._bookmarks.applychanges(repo, tr, bmchanges)
27157
5f2e4eb08e41 repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26797
diff changeset
265
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
266 # remove undo files
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
267 for undovfs, undofile in repo.undofiles():
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
268 try:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
269 undovfs.unlink(undofile)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
270 except OSError as e:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
271 if e.errno != errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
272 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
273 _(b'error removing %s: %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
274 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
275 undovfs.join(undofile),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
276 stringutil.forcebytestr(e),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
277 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
278 )
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
279
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
280 except: # re-raises
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
281 if backupfile:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
282 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 _(b"strip failed, backup bundle stored in '%s'\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
284 % vfs.join(backupfile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
285 )
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
286 if tmpbundlefile:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
287 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
288 _(b"strip failed, unrecovered changes stored in '%s'\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
289 % vfs.join(tmpbundlefile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
290 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
291 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
292 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
293 b"(fix the problem, then recover the changesets with "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
294 b"\"hg unbundle '%s'\")\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
295 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
296 % vfs.join(tmpbundlefile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
297 )
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
298 raise
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
299 else:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
300 if tmpbundlefile:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
301 # Remove temporary bundle only if there were no exceptions
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
302 vfs.unlink(tmpbundlefile)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
303
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18311
diff changeset
304 repo.destroyed()
30288
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30005
diff changeset
305 # 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
306 # extensions can use it
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30005
diff changeset
307 return backupfile
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
308
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
309
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
310 def softstrip(ui, repo, nodelist, backup=True, topic=b'backup'):
41803
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
311 """perform a "soft" strip using the archived phase"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
312 tostrip = [c.node() for c in repo.set(b'sort(%ln::)', nodelist)]
41803
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
313 if not tostrip:
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
314 return None
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
315
46567
cd9154343160 softstrip: fix a reference to an undefined variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 46566
diff changeset
316 backupfile = None
41803
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
317 if backup:
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
318 node = tostrip[0]
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
319 backupfile = _createstripbackup(repo, tostrip, node, topic)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
320
46566
beaa233e81f7 softstrip: move _bookmarkmovements() call to where it's needed
Martin von Zweigbergk <martinvonz@google.com>
parents: 45887
diff changeset
321 newbmtarget, updatebm = _bookmarkmovements(repo, tostrip)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
322 with repo.transaction(b'strip') as tr:
41803
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
323 phases.retractboundary(repo, tr, phases.archived, tostrip)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
324 bmchanges = [(m, repo[newbmtarget].node()) for m in updatebm]
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
325 repo._bookmarks.applychanges(repo, tr, bmchanges)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
326 return backupfile
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
327
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
328
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
329 def _bookmarkmovements(repo, tostrip):
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
330 # compute necessary bookmark movement
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
331 bm = repo._bookmarks
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
332 updatebm = []
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
333 for m in bm:
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
334 rev = repo[bm[m]].rev()
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
335 if rev in tostrip:
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
336 updatebm.append(m)
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
337 newbmtarget = None
42275
e10b8058da84 repair: reword comment about bookmarks logic
Augie Fackler <augie@google.com>
parents: 41803
diff changeset
338 # If we need to move bookmarks, compute bookmark
e10b8058da84 repair: reword comment about bookmarks logic
Augie Fackler <augie@google.com>
parents: 41803
diff changeset
339 # targets. Otherwise we can skip doing this logic.
e10b8058da84 repair: reword comment about bookmarks logic
Augie Fackler <augie@google.com>
parents: 41803
diff changeset
340 if updatebm:
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
341 # For a set s, max(parents(s) - s) is the same as max(heads(::s - s)),
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
342 # but is much faster
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
343 newbmtarget = repo.revs(b'max(parents(%ld) - (%ld))', tostrip, tostrip)
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
344 if newbmtarget:
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
345 newbmtarget = repo[newbmtarget.first()].node()
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
346 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
347 newbmtarget = b'.'
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
348 return newbmtarget, updatebm
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
349
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
350
41103
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
351 def _createstripbackup(repo, stripbases, node, topic):
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
352 # backup the changeset we are about to strip
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
353 vfs = repo.vfs
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
354 cl = repo.changelog
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
355 backupfile = backupbundle(repo, stripbases, cl.heads(), node, topic)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
356 repo.ui.status(_(b"saved backup bundle to %s\n") % vfs.join(backupfile))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
357 repo.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
358 b"backupbundle", b"saved backup bundle to %s\n", vfs.join(backupfile)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
359 )
41103
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
360 return backupfile
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
361
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
362
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
363 def safestriproots(ui, repo, nodes):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
364 """return list of roots of nodes where descendants are covered by nodes"""
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
365 torev = repo.unfiltered().changelog.rev
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44060
diff changeset
366 revs = {torev(n) for n in nodes}
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
367 # tostrip = wanted - unsafe = wanted - ancestors(orphaned)
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
368 # orphaned = affected - wanted
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
369 # affected = descendants(roots(wanted))
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
370 # wanted = revs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 revset = b'%ld - ( ::( (roots(%ld):: and not _phase(%s)) -%ld) )'
39761
b2ec79559a4b strip: ignore orphaned internal changesets while computing safe strip roots
Boris Feld <boris.feld@octobus.net>
parents: 39702
diff changeset
372 tostrip = set(repo.revs(revset, revs, revs, phases.internal, revs))
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
373 notstrip = revs - tostrip
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
374 if notstrip:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
375 nodestr = b', '.join(sorted(short(repo[n].node()) for n in notstrip))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
376 ui.warn(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
377 _(b'warning: orphaned descendants detected, not stripping %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
378 % nodestr
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
379 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
380 return [c.node() for c in repo.set(b'roots(%ld)', tostrip)]
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
381
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
382
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
383 class stripcallback(object):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
384 """used as a transaction postclose callback"""
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
385
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
386 def __init__(self, ui, repo, backup, topic):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
387 self.ui = ui
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
388 self.repo = repo
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
389 self.backup = backup
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
390 self.topic = topic or b'backup'
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
391 self.nodelist = []
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
392
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
393 def addnodes(self, nodes):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
394 self.nodelist.extend(nodes)
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
395
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
396 def __call__(self, tr):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
397 roots = safestriproots(self.ui, self.repo, self.nodelist)
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
398 if roots:
33120
208de1534ebd strip: respect the backup option in stripcallback
Jun Wu <quark@fb.com>
parents: 33099
diff changeset
399 strip(self.ui, self.repo, roots, self.backup, self.topic)
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
400
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
401
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
402 def delayedstrip(ui, repo, nodelist, topic=None, backup=True):
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
403 """like strip, but works inside transaction and won't strip irreverent revs
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
404
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
405 nodelist must explicitly contain all descendants. Otherwise a warning will
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
406 be printed that some nodes are not stripped.
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
407
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
408 Will do a backup if `backup` is True. The last non-None "topic" will be
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
409 used as the backup topic name. The default backup topic name is "backup".
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
410 """
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
411 tr = repo.currenttransaction()
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
412 if not tr:
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
413 nodes = safestriproots(ui, repo, nodelist)
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
414 return strip(ui, repo, nodes, backup=backup, topic=topic)
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
415 # transaction postclose callbacks are called in alphabet order.
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
416 # use '\xff' as prefix so we are likely to be called last.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
417 callback = tr.getpostclose(b'\xffstrip')
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
418 if callback is None:
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
419 callback = stripcallback(ui, repo, backup=backup, topic=topic)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
420 tr.addpostclose(b'\xffstrip', callback)
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
421 if topic:
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
422 callback.topic = topic
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
423 callback.addnodes(nodelist)
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
424
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
425
33751
86ea201eaeb9 repair: move manifest strip to a separate function
Durham Goode <durham@fb.com>
parents: 33750
diff changeset
426 def stripmanifest(repo, striprev, tr, files):
42918
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
427 for revlog in manifestrevlogs(repo):
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
428 revlog.strip(striprev, tr)
33751
86ea201eaeb9 repair: move manifest strip to a separate function
Durham Goode <durham@fb.com>
parents: 33750
diff changeset
429
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
430
42918
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
431 def manifestrevlogs(repo):
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
432 yield repo.manifestlog.getstorage(b'')
45558
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45392
diff changeset
433 if scmutil.istreemanifest(repo):
42282
d811f17090a3 repair: reword comments that I noticed while working on source formatting
Augie Fackler <augie@google.com>
parents: 42275
diff changeset
434 # This logic is safe if treemanifest isn't enabled, but also
d811f17090a3 repair: reword comments that I noticed while working on source formatting
Augie Fackler <augie@google.com>
parents: 42275
diff changeset
435 # pointless, so we skip it if treemanifest isn't enabled.
47918
2174f54aab18 store: return just one filename in walk functions
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47916
diff changeset
436 for t, unencoded, size in repo.store.datafiles():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
437 if unencoded.startswith(b'meta/') and unencoded.endswith(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
438 b'00manifest.i'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
439 ):
32336
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32242
diff changeset
440 dir = unencoded[5:-12]
42918
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
441 yield repo.manifestlog.getstorage(dir)
32241
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
442
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
443
47916
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
444 def rebuildfncache(ui, repo, only_data=False):
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
445 """Rebuilds the fncache file from repo history.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
446
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
447 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
448 """
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
449 repo = repo.unfiltered()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
450
46677
b4c2a2af25e2 requirements: also add a fncache constant
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46567
diff changeset
451 if requirements.FNCACHE_REQUIREMENT not in repo.requirements:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
452 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
453 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
454 b'(not rebuilding fncache because repository does not '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
455 b'support fncache)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
456 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
457 )
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
458 return
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
459
27860
0da102e4f203 with: use context manager in rebuildfncache again
Bryan O'Sullivan <bryano@fb.com>
parents: 27553
diff changeset
460 with repo.lock():
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
461 fnc = repo.store.fncache
42664
f59f8a5e9096 fncache: make debugrebuildfncache not fail on broken fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 42656
diff changeset
462 fnc.ensureloaded(warn=ui.warn)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
463
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
464 oldentries = set(fnc.entries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
465 newentries = set()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
466 seenfiles = set()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
467
47916
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
468 if only_data:
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
469 # Trust the listing of .i from the fncache, but not the .d. This is
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
470 # much faster, because we only need to stat every possible .d files,
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
471 # instead of reading the full changelog
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
472 for f in fnc:
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
473 if f[:5] == b'data/' and f[-2:] == b'.i':
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
474 seenfiles.add(f[5:-2])
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
475 newentries.add(f)
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
476 dataf = f[:-2] + b'.d'
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
477 if repo.store._exists(dataf):
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
478 newentries.add(dataf)
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
479 else:
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
480 progress = ui.makeprogress(
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
481 _(b'rebuilding'), unit=_(b'changesets'), total=len(repo)
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
482 )
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
483 for rev in repo:
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
484 progress.update(rev)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
485
47916
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
486 ctx = repo[rev]
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
487 for f in ctx.files():
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
488 # This is to minimize I/O.
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
489 if f in seenfiles:
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
490 continue
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
491 seenfiles.add(f)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
492
47916
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
493 i = b'data/%s.i' % f
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
494 d = b'data/%s.d' % f
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
495
47916
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
496 if repo.store._exists(i):
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
497 newentries.add(i)
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
498 if repo.store._exists(d):
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
499 newentries.add(d)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
500
47916
0fb328bb2459 debugrebuildfncache: add a cheaper option to rebuild the fncache
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 47443
diff changeset
501 progress.complete()
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
502
45392
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45391
diff changeset
503 if requirements.TREEMANIFEST_REQUIREMENT in repo.requirements:
42282
d811f17090a3 repair: reword comments that I noticed while working on source formatting
Augie Fackler <augie@google.com>
parents: 42275
diff changeset
504 # This logic is safe if treemanifest isn't enabled, but also
d811f17090a3 repair: reword comments that I noticed while working on source formatting
Augie Fackler <augie@google.com>
parents: 42275
diff changeset
505 # pointless, so we skip it if treemanifest isn't enabled.
43571
c21aca51b392 utils: move the `dirs` definition in pathutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
506 for dir in pathutil.dirs(seenfiles):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
507 i = b'meta/%s/00manifest.i' % dir
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
508 d = b'meta/%s/00manifest.d' % dir
28007
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
509
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
510 if repo.store._exists(i):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
511 newentries.add(i)
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
512 if repo.store._exists(d):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
513 newentries.add(d)
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
514
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
515 addcount = len(newentries - oldentries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
516 removecount = len(oldentries - newentries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
517 for p in sorted(oldentries - newentries):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
518 ui.write(_(b'removing %s\n') % p)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
519 for p in sorted(newentries - oldentries):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
520 ui.write(_(b'adding %s\n') % p)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
521
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
522 if addcount or removecount:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
523 ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
524 _(b'%d items added, %d removed from fncache\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
525 % (addcount, removecount)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
526 )
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
527 fnc.entries = newentries
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
528 fnc._dirty = True
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
529
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
530 with repo.transaction(b'fncache') as tr:
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
531 fnc.write(tr)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
532 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
533 ui.write(_(b'fncache already up to date\n'))
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
534
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
535
28868
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
536 def deleteobsmarkers(obsstore, indices):
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
537 """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
538
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
539 '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
540 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
541
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
542 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
543 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
544 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
545 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
546 if not indices:
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
547 # 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
548 return
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
549
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
550 left = []
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
551 current = obsstore._all
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
552 n = 0
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
553 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
554 if i in indices:
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
555 n += 1
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
556 continue
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
557 left.append(m)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
558
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
559 newobsstorefile = obsstore.svfs(b'obsstore', b'w', atomictemp=True)
28868
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
560 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
561 newobsstorefile.write(bytes)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
562 newobsstorefile.close()
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
563 return n