Mercurial > hg
annotate mercurial/dirstateguard.py @ 45637:ad6ebb6f0dfe
copies: make two version of the changeset centric algorithm
They are two main ways to run the changeset-centric copy-tracing algorithm. One
fed from data stored in side-data and still in development, and one based on
data stored in extra (with a "compatibility" mode).
The `extra` based is used in production at Google, but still experimental in
code. It is mostly unsuitable for other users because it affects the hash.
The side-data based storage and algorithm have been evolving to store more data, cover more cases
(mostly around merge, that Google do not really care about) and use lower level
storage for efficiency.
All this changes make is increasingly hard to maintain de common code base,
without impacting code complexity and performance. For example, the
compatibility mode requires to keep things at different level than what we
need for side-data.
So, I am duplicating the involved functions. The newly added `_extra` variants
will be kept as today, while I will do some deeper rework of the side data
versions.
Long terms, the side-data version should be more featureful and performant than
the extra based version, so I expect the duplicated `_extra` functions to
eventually get dropped.
Differential Revision: https://phab.mercurial-scm.org/D9114
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 25 Sep 2020 14:39:04 +0200 |
parents | 687b865b95ad |
children | 89a2afe31e82 |
rev | line source |
---|---|
30488
751639bf6fc4
dirstateguard: move to new module so I can break some layering violations
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
1 # dirstateguard.py - class to allow restoring dirstate after failure |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8210
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
7 |
28322
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
8 from __future__ import absolute_import |
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
9 |
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
10 from .i18n import _ |
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
11 |
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
12 from . import ( |
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
13 error, |
38869
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
33793
diff
changeset
|
14 narrowspec, |
33793
bbbbd3c30bfc
util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents:
33619
diff
changeset
|
15 util, |
28322
ebd0e86bdf89
cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28313
diff
changeset
|
16 ) |
27624
d46db4390715
resolve: suggest the next action
timeless <timeless@mozdev.org>
parents:
27622
diff
changeset
|
17 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
18 |
33793
bbbbd3c30bfc
util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents:
33619
diff
changeset
|
19 class dirstateguard(util.transactional): |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
20 '''Restore dirstate at unexpected failure. |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
21 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
22 At the construction, this class does: |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
23 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
24 - write current ``repo.dirstate`` out, and |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
25 - save ``.hg/dirstate`` into the backup file |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
26 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
27 This restores ``.hg/dirstate`` from backup file, if ``release()`` |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
28 is invoked before ``close()``. |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
29 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
30 This just removes the backup file at ``close()`` before ``release()``. |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
31 ''' |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
32 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
33 def __init__(self, repo, name): |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
34 self._repo = repo |
30182
144d8fe266d9
cmdutil: satisfy expections in dirstateguard.__del__, even if __init__ fails
Mads Kiilerich <madski@unity3d.com>
parents:
30151
diff
changeset
|
35 self._active = False |
144d8fe266d9
cmdutil: satisfy expections in dirstateguard.__del__, even if __init__ fails
Mads Kiilerich <madski@unity3d.com>
parents:
30151
diff
changeset
|
36 self._closed = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43075
diff
changeset
|
37 self._backupname = b'dirstate.backup.%s.%d' % (name, id(self)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43075
diff
changeset
|
38 self._narrowspecbackupname = b'narrowspec.backup.%s.%d' % ( |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
39 name, |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
40 id(self), |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
41 ) |
33440
ec306bc6915b
dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents:
30488
diff
changeset
|
42 repo.dirstate.savebackup(repo.currenttransaction(), self._backupname) |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
38869
diff
changeset
|
43 narrowspec.savewcbackup(repo, self._narrowspecbackupname) |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
44 self._active = True |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
45 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
46 def __del__(self): |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
47 if self._active: # still active |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
48 # this may occur, even if this class is used correctly: |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
49 # for example, releasing other resources like transaction |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
50 # may raise exception before ``dirstateguard.release`` in |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
51 # ``release(tr, ....)``. |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
52 self._abort() |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
53 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
54 def close(self): |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
55 if not self._active: # already inactivated |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
56 msg = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43075
diff
changeset
|
57 _(b"can't close already inactivated backup: %s") |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
58 % self._backupname |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
59 ) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26579
diff
changeset
|
60 raise error.Abort(msg) |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
61 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
62 self._repo.dirstate.clearbackup( |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
63 self._repo.currenttransaction(), self._backupname |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
64 ) |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
38869
diff
changeset
|
65 narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname) |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
66 self._active = False |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
67 self._closed = True |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
68 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
69 def _abort(self): |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
38869
diff
changeset
|
70 narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname) |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
71 self._repo.dirstate.restorebackup( |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
72 self._repo.currenttransaction(), self._backupname |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
73 ) |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
74 self._active = False |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
75 |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
76 def release(self): |
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
77 if not self._closed: |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
78 if not self._active: # already inactivated |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
79 msg = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43075
diff
changeset
|
80 _(b"can't release already inactivated backup: %s") |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
81 % self._backupname |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
41227
diff
changeset
|
82 ) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26579
diff
changeset
|
83 raise error.Abort(msg) |
24991
4169a4f83548
cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24988
diff
changeset
|
84 self._abort() |