annotate mercurial/repair.py @ 45391:e58e234096de

repository: introduce constant for treemanifest requirement and use it In future we will like to much cleaner logic around which requirement is for working copy and which can go in store. To start with that, we first need to de-clutter the requirement values spread around and replace them with constants. Differential Revision: https://phab.mercurial-scm.org/D8916
author Pulkit Goyal <7895pulkit@gmail.com>
date Sat, 08 Aug 2020 15:48:17 +0530
parents c93dd9d9f1e6
children 77b8588dd84e
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>
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 # Copyright 2007 Matt Mackall
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
5 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8073
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
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,
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
29 util,
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
30 )
45391
e58e234096de repository: introduce constant for treemanifest requirement and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45144
diff changeset
31 from .interfaces import repository
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
32 from .utils import (
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
33 hashutil,
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
34 stringutil,
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43811
diff changeset
35 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
36
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
37
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
38 def backupbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
39 repo, bases, heads, node, suffix, compress=True, obsolescence=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
40 ):
5905
3afbd82a6c82 repair.py: don't use nested functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5904
diff changeset
41 """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
42
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
43 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
44 vfs = repo.vfs
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
45 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
46 vfs.mkdir(backupdir)
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
47
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
48 # 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
49 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
50 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
51 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
52 name = b"%s/%s-%s-%s.hg" % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
53 backupdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
54 short(node),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
55 hex(totalhash[:4]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
56 suffix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
57 )
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
58
33676
91f0677dc920 repair: preserve phase also when not using generaldelta (issue5678)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33490
diff changeset
59 cgversion = changegroup.localversion(repo)
26425
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
60 comp = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
61 if cgversion != b'01':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
62 bundletype = b"HG20"
26425
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
63 if compress:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
64 comp = b'BZ'
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
65 elif compress:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
66 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
67 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
68 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
69
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
70 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
71 contentopts = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
72 b'cg.version': cgversion,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
73 b'obsolescence': obsolescence,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
74 b'phases': True,
33044
8e3021fd1a44 strip: include phases in bundle (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32948
diff changeset
75 }
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
76 return bundle2.writenewbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
77 repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
78 repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
79 b'strip',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
80 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
81 bundletype,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
82 outgoing,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
83 contentopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
84 vfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
85 compression=comp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
86 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
87
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
88
5910
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
89 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
90 """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
91 files = set()
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
92
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38529
diff changeset
93 for x in pycompat.xrange(striprev, len(repo)):
8479
3e16c0fc2241 repair: bulk update sets
Martin Geisler <mg@lazybytes.net>
parents: 8462
diff changeset
94 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
95
8462
e7e4e41b3bbc repair: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8363
diff changeset
96 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
97
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
98
33750
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
99 def _collectrevlog(revlog, striprev):
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
100 _, brokenset = revlog.getstrippoint(striprev)
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
101 return [revlog.linkrev(r) for r in brokenset]
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
102
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
103
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
104 def _collectbrokencsets(repo, files, striprev):
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
105 """return the changesets which will be broken by the truncation"""
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
106 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
107
42919
a8b249b2f8cc strip: fix bug with treemanifests and unordered linkrevs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42918
diff changeset
108 for revlog in manifestrevlogs(repo):
a8b249b2f8cc strip: fix bug with treemanifests and unordered linkrevs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42918
diff changeset
109 s.update(_collectrevlog(revlog, striprev))
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
110 for fname in files:
33750
6626d12e7a85 repair: refactor broken linkrev collection
Durham Goode <durham@fb.com>
parents: 33490
diff changeset
111 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
112
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
113 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
114
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
115
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
116 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
117 # 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
118 # 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
119 # transaction when it is called.
32942
f044295cdb7a repair: move check for existing transaction earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 32941
diff changeset
120 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
121 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
122
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
123 # 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
124 # argument.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
125 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
126 backup = False
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
127
18004
747a2f43d5d9 clfilter: strip logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
128 repo = repo.unfiltered()
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18121
diff changeset
129 repo.destroying()
41101
cfd95219102d strip: move attributes shortcut assigned earlier
Boris Feld <boris.feld@octobus.net>
parents: 41079
diff changeset
130 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
131 # 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
132 # 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
133 repo._bookmarks
41101
cfd95219102d strip: move attributes shortcut assigned earlier
Boris Feld <boris.feld@octobus.net>
parents: 41079
diff changeset
134 cl = repo.changelog
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 16867
diff changeset
135
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
136 # 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
137 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
138 nodelist = [nodelist]
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
139 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
140 striprev = min(striplist)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
141
30707
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
142 files = _collectfiles(repo, striprev)
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
143 saverevs = _collectbrokencsets(repo, files, striprev)
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
144
6147
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
145 # 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
146 # 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
147 # 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
148 # 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
149 # 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
150 # (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
151 # 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
152 tostrip = set(striplist)
30707
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
153 saveheads = set(saverevs)
30706
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30385
diff changeset
154 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
155 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
156 tostrip.add(r)
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
157
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
158 if r not in tostrip:
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
159 saverevs.add(r)
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
160 saveheads.difference_update(cl.parentrevs(r))
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
161 saveheads.add(r)
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
162 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
163
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
164 # compute base nodes
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
165 if saverevs:
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16745
diff changeset
166 descendants = set(cl.descendants(saverevs))
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
167 saverevs.difference_update(descendants)
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
168 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
169 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
170
32652
71eb6a098315 strip: strip obsmarkers exclusive to the stripped changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32651
diff changeset
171 stripobsidx = obsmarkers = ()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
172 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
173 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
174 if obsmarkers:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
175 stripobsidx = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
176 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
177 ]
32652
71eb6a098315 strip: strip obsmarkers exclusive to the stripped changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32651
diff changeset
178
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
179 newbmtarget, updatebm = _bookmarkmovements(repo, tostrip)
13362
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
180
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
181 backupfile = None
24252
f962692853c0 repair: define explicit local variable, don't reuse a comprehension variable
Mike Edgar <adgar@google.com>
parents: 24170
diff changeset
182 node = nodelist[-1]
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
183 if backup:
41103
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
184 backupfile = _createstripbackup(repo, stripbases, node, topic)
41102
e80329a3952c strip: clarify comment around bundle create
Boris Feld <boris.feld@octobus.net>
parents: 41101
diff changeset
185 # 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
186 tmpbundlefile = None
29955
e7acbe538baf strip: simplify some repeated conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 29721
diff changeset
187 if saveheads:
29958
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29957
diff changeset
188 # 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
189 #
5732e6d2b369 strip: do not include obsolescence markers for the temporary bundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32646
diff changeset
190 # 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
191 # 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
192 # 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
193 # saved changesets.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
194 tmpbundlefile = backupbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
195 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
196 savebases,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
197 saveheads,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
198 node,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
199 b'temp',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
200 compress=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
201 obsolescence=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
202 )
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
203
41079
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 39761
diff changeset
204 with ui.uninterruptible():
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
205 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
206 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
207 # 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
208 # 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
209 # 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
210 # API to handle stripping for us.
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
211 offset = len(tr._entries)
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
212
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
213 tr.startgroup()
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
214 cl.strip(striprev, tr)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
215 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
216
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
217 for fn in files:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
218 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
219 tr.endgroup()
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
220
39702
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
221 for i in pycompat.xrange(offset, len(tr._entries)):
3d22aef3ecd5 transaction: make entries a private attribute (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39272
diff changeset
222 file, troffset, ignore = tr._entries[i]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
223 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
224 fp.truncate(troffset)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
225 if troffset == 0:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
226 repo.store.markremoved(file)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
227
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
228 deleteobsmarkers(repo.obsstore, stripobsidx)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
229 del repo.obsstore
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
230 repo.invalidatevolatilesets()
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
231 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
232
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
233 if tmpbundlefile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
234 ui.note(_(b"adding branch\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
235 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
236 gen = exchange.readbundle(ui, f, tmpbundlefile, vfs)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
237 if not repo.ui.verbose:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
238 # silence internal shuffling chatter
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
239 repo.ui.pushbuffer()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
240 tmpbundleurl = b'bundle:' + vfs.join(tmpbundlefile)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
241 txnname = b'strip'
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
242 if not isinstance(gen, bundle2.unbundle20):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
243 txnname = b"strip\n%s" % util.hidepassword(tmpbundleurl)
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
244 with repo.transaction(txnname) as tr:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
245 bundle2.applybundle(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
246 repo, gen, tr, source=b'strip', url=tmpbundleurl
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
247 )
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
248 if not repo.ui.verbose:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
249 repo.ui.popbuffer()
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
250 f.close()
31631
0febf8e4e2ce repair: use context manager for lock management
Matt Harbison <matt_harbison@yahoo.com>
parents: 31333
diff changeset
251
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
252 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
253 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
254 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
255
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
256 # remove undo files
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
257 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
258 try:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
259 undovfs.unlink(undofile)
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
260 except OSError as e:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
261 if e.errno != errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
262 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
263 _(b'error removing %s: %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
264 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
265 undovfs.join(undofile),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
266 stringutil.forcebytestr(e),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
267 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
268 )
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
269
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
270 except: # re-raises
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
271 if backupfile:
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"strip failed, backup bundle stored in '%s'\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
274 % vfs.join(backupfile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
275 )
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
276 if tmpbundlefile:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
277 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
278 _(b"strip failed, unrecovered changes stored in '%s'\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
279 % vfs.join(tmpbundlefile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
280 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
281 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
282 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 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
284 b"\"hg unbundle '%s'\")\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
285 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
286 % vfs.join(tmpbundlefile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
287 )
38529
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
288 raise
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
289 else:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
290 if tmpbundlefile:
6e0c66ef8cd0 repair: mark the critical section of strip() as unsafe
Augie Fackler <augie@google.com>
parents: 38400
diff changeset
291 # 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
292 vfs.unlink(tmpbundlefile)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
293
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18311
diff changeset
294 repo.destroyed()
30288
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30005
diff changeset
295 # 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
296 # extensions can use it
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30005
diff changeset
297 return backupfile
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
298
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
299
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
300 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
301 """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
302 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
303 if not tostrip:
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
304 return None
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
305
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
306 newbmtarget, updatebm = _bookmarkmovements(repo, tostrip)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
307 if backup:
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
308 node = tostrip[0]
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
309 backupfile = _createstripbackup(repo, tostrip, node, topic)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
310
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
311 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
312 phases.retractboundary(repo, tr, phases.archived, tostrip)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
313 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
314 repo._bookmarks.applychanges(repo, tr, bmchanges)
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
315 return backupfile
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
316
8c42b4a3d447 strip: introduce a soft strip option
Boris Feld <boris.feld@octobus.net>
parents: 41105
diff changeset
317
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
318 def _bookmarkmovements(repo, tostrip):
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
319 # compute necessary bookmark movement
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
320 bm = repo._bookmarks
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
321 updatebm = []
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
322 for m in bm:
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
323 rev = repo[bm[m]].rev()
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
324 if rev in tostrip:
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
325 updatebm.append(m)
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
326 newbmtarget = None
42275
e10b8058da84 repair: reword comment about bookmarks logic
Augie Fackler <augie@google.com>
parents: 41803
diff changeset
327 # If we need to move bookmarks, compute bookmark
e10b8058da84 repair: reword comment about bookmarks logic
Augie Fackler <augie@google.com>
parents: 41803
diff changeset
328 # targets. Otherwise we can skip doing this logic.
e10b8058da84 repair: reword comment about bookmarks logic
Augie Fackler <augie@google.com>
parents: 41803
diff changeset
329 if updatebm:
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
330 # 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
331 # but is much faster
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
332 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
333 if newbmtarget:
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
334 newbmtarget = repo[newbmtarget.first()].node()
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
335 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
336 newbmtarget = b'.'
41105
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
337 return newbmtarget, updatebm
c9a2c4d0e80f strip: extract bookmark movement into a separate function
Boris Feld <boris.feld@octobus.net>
parents: 41104
diff changeset
338
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
339
41103
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
340 def _createstripbackup(repo, stripbases, node, topic):
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
341 # 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
342 vfs = repo.vfs
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
343 cl = repo.changelog
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
344 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
345 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
346 repo.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
347 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
348 )
41103
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
349 return backupfile
399010051cf4 strip: extract code to create strip backup
Boris Feld <boris.feld@octobus.net>
parents: 41102
diff changeset
350
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
351
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
352 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
353 """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
354 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
355 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
356 # 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
357 # orphaned = affected - wanted
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
358 # affected = descendants(roots(wanted))
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
359 # wanted = revs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
360 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
361 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
362 notstrip = revs - tostrip
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
363 if notstrip:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
364 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
365 ui.warn(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
366 _(b'warning: orphaned descendants detected, not stripping %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
367 % nodestr
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
368 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
369 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
370
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
371
33099
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
372 class stripcallback(object):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
373 """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
374
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
375 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
376 self.ui = ui
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
377 self.repo = repo
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
378 self.backup = backup
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
379 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
380 self.nodelist = []
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
381
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
382 def addnodes(self, nodes):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
383 self.nodelist.extend(nodes)
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
384
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
385 def __call__(self, tr):
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
386 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
387 if roots:
33120
208de1534ebd strip: respect the backup option in stripcallback
Jun Wu <quark@fb.com>
parents: 33099
diff changeset
388 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
389
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
390
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
391 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
392 """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
393
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
394 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
395 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
396
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
397 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
398 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
399 """
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
400 tr = repo.currenttransaction()
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
401 if not tr:
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
402 nodes = safestriproots(ui, repo, nodelist)
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
403 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
404 # 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
405 # 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
406 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
407 if callback is None:
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38823
diff changeset
408 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
409 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
410 if topic:
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
411 callback.topic = topic
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
412 callback.addnodes(nodelist)
fcd1c483f5ea strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents: 33055
diff changeset
413
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
414
33751
86ea201eaeb9 repair: move manifest strip to a separate function
Durham Goode <durham@fb.com>
parents: 33750
diff changeset
415 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
416 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
417 revlog.strip(striprev, tr)
33751
86ea201eaeb9 repair: move manifest strip to a separate function
Durham Goode <durham@fb.com>
parents: 33750
diff changeset
418
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
419
42918
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
420 def manifestrevlogs(repo):
6d0fdba635e5 repair: extract a helper for generating all manifest revlogs
Martin von Zweigbergk <martinvonz@google.com>
parents: 42664
diff changeset
421 yield repo.manifestlog.getstorage(b'')
45391
e58e234096de repository: introduce constant for treemanifest requirement and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45144
diff changeset
422 if repository.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
423 # 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
424 # pointless, so we skip it if treemanifest isn't enabled.
32336
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32242
diff changeset
425 for unencoded, encoded, size in repo.store.datafiles():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 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
427 b'00manifest.i'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
428 ):
32336
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32242
diff changeset
429 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
430 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
431
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
432
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
433 def rebuildfncache(ui, repo):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
434 """Rebuilds the fncache file from repo history.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
435
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
436 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
437 """
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
438 repo = repo.unfiltered()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
439
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
440 if b'fncache' not in repo.requirements:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
441 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
442 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
443 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
444 b'support fncache)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
445 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
446 )
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
447 return
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
448
27860
0da102e4f203 with: use context manager in rebuildfncache again
Bryan O'Sullivan <bryano@fb.com>
parents: 27553
diff changeset
449 with repo.lock():
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
450 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
451 fnc.ensureloaded(warn=ui.warn)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
452
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
453 oldentries = set(fnc.entries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
454 newentries = set()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
455 seenfiles = set()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
456
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
457 progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
458 _(b'rebuilding'), unit=_(b'changesets'), total=len(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
459 )
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
460 for rev in repo:
38400
f0b0c853f598 repair: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38164
diff changeset
461 progress.update(rev)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
462
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
463 ctx = repo[rev]
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
464 for f in ctx.files():
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
465 # This is to minimize I/O.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
466 if f in seenfiles:
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
467 continue
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
468 seenfiles.add(f)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
469
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
470 i = b'data/%s.i' % f
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
471 d = b'data/%s.d' % f
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
472
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
473 if repo.store._exists(i):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
474 newentries.add(i)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
475 if repo.store._exists(d):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
476 newentries.add(d)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
477
38400
f0b0c853f598 repair: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38164
diff changeset
478 progress.complete()
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
479
45391
e58e234096de repository: introduce constant for treemanifest requirement and use it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45144
diff changeset
480 if repository.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
481 # 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
482 # 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
483 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
484 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
485 d = b'meta/%s/00manifest.d' % dir
28007
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
486
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
487 if repo.store._exists(i):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
488 newentries.add(i)
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
489 if repo.store._exists(d):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
490 newentries.add(d)
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
491
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
492 addcount = len(newentries - oldentries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
493 removecount = len(oldentries - newentries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
494 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
495 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
496 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
497 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
498
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
499 if addcount or removecount:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
500 ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
501 _(b'%d items added, %d removed from fncache\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
502 % (addcount, removecount)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
503 )
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
504 fnc.entries = newentries
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
505 fnc._dirty = True
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
506
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
507 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
508 fnc.write(tr)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
509 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
510 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
511
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42919
diff changeset
512
28868
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
513 def deleteobsmarkers(obsstore, indices):
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
514 """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
515
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
516 '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
517 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
518
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
519 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
520 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
521 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
522 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
523 if not indices:
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
524 # 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
525 return
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
526
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
527 left = []
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
528 current = obsstore._all
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
529 n = 0
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
530 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
531 if i in indices:
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
532 n += 1
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
533 continue
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
534 left.append(m)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
535
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
536 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
537 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
538 newobsstorefile.write(bytes)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
539 newobsstorefile.close()
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
540 return n