Mercurial > hg
annotate mercurial/transaction.py @ 51594:e3a5ec2d236a
outgoing: rework the handling of the `missingroots` case to be faster
The previous implementation was slow, to the point it was taking a significant
amount of `hg bundle --type none-streamv2` call. We rework the code to compute
the same value much faster, making the operation disappear from the `hg bundle
--type none-streamv2` profile. Someone would remark that producing a streamclone
does not requires an `outgoing` object. However that is a matter for another
day. There is other user of `missingroots` (non stream `hg bundle` call for
example), and they will also benefit from this rework.
We implement an old TODO in the process, directly computing the missing and
common attribute as we have most element at hand already.
### benchmark.name = hg.command.bundle
# bin-env-vars.hg.flavor = default
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.revs = all
# benchmark.variants.type = none-streamv2
## data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
before: 7.750458
after: 6.665565 (-14.00%, -1.08)
## data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
before: 0.700229
after: 0.496050 (-29.16%, -0.20)
## data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog
before: 346.508952
after: 316.749699 (-8.59%, -29.76)
## data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
before: 3.401700
after: 2.915810 (-14.28%, -0.49)
## data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
before: 1.870798
after: 1.461583 (-21.87%, -0.41)
note: this whole `missingroots` of outgoing has a limited number of callers and
could likely be replace by something simpler (like taking an explicit
"missing_revs" set for example). However this is a wider change and we focus on
a small impact, quick rework that does not change the API for now.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 09 Apr 2024 22:36:35 +0200 |
parents | cf47b83d8ad0 |
children | f4733654f144 |
rev | line source |
---|---|
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
16689
diff
changeset
|
1 # transaction.py - simple journaling scheme for mercurial |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2 # |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
3 # This transaction scheme is intended to gracefully handle program |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
4 # errors and interruptions. More serious failures like system crashes |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
5 # can be recovered with an fsck-like tool. As the whole repository is |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
6 # effectively log-structured, this should amount to simply truncating |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 # anything that isn't referenced in the changelog. |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
8 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46063
diff
changeset
|
9 # Copyright 2005, 2006 Olivia Mackall <olivia@selenic.com> |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
10 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8071
diff
changeset
|
11 # This software may be used and distributed according to the terms of the |
10263 | 12 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
13 |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
14 import errno |
50283
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
15 import os |
25986
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
16 |
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
17 from .i18n import _ |
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 from . import ( |
50868
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50686
diff
changeset
|
19 encoding, |
25986
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
20 error, |
36735
ef345f9e4295
transaction: fix an error string with bytestr() on a repr()d value
Augie Fackler <augie@google.com>
parents:
35832
diff
changeset
|
21 pycompat, |
25986
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
22 util, |
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
23 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
24 from .utils import stringutil |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
25 |
23313
991098579940
transaction: set backupentries version to proper value
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23312
diff
changeset
|
26 version = 2 |
23064
5dc888b79e70
transactions: add version number to journal.backupfiles
Durham Goode <durham@fb.com>
parents:
23063
diff
changeset
|
27 |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
28 GEN_GROUP_ALL = b'all' |
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
29 GEN_GROUP_PRE_FINALIZE = b'prefinalize' |
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
30 GEN_GROUP_POST_FINALIZE = b'postfinalize' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
31 |
28830
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
32 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
33 def active(func): |
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
34 def _active(self, *args, **kwds): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
35 if self._count == 0: |
45738
5df1655edf42
transaction: use ProgrammingError for when an committed transaction is used
Martin von Zweigbergk <martinvonz@google.com>
parents:
44543
diff
changeset
|
36 raise error.ProgrammingError( |
5df1655edf42
transaction: use ProgrammingError for when an committed transaction is used
Martin von Zweigbergk <martinvonz@google.com>
parents:
44543
diff
changeset
|
37 b'cannot use transaction when it is already committed/aborted' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
38 ) |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
39 return func(self, *args, **kwds) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
40 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
41 return _active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
42 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
43 |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
44 UNDO_BACKUP = b'%s.backupfiles' |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
45 |
50287
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
46 UNDO_FILES_MAY_NEED_CLEANUP = [ |
50291
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
47 # legacy entries that might exists on disk from previous version: |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
48 (b'store', b'%s.narrowspec'), |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
49 (b'plain', b'%s.narrowspec.dirstate'), |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
50 (b'plain', b'%s.branch'), |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
51 (b'plain', b'%s.bookmarks'), |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
52 (b'store', b'%s.phaseroots'), |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
53 (b'plain', b'%s.dirstate'), |
862969b6c359
undo-files: cleanup legacy files when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50290
diff
changeset
|
54 # files actually in uses today: |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
55 (b'plain', b'%s.desc'), |
50287
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
56 # Always delete undo last to make sure we detect that a clean up is needed if |
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
57 # the process is interrupted. |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
58 (b'store', b'%s'), |
50287
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
59 ] |
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
60 |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
61 |
50988
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Raphaël Gomès <rgomes@octobus.net>
parents:
50936
diff
changeset
|
62 def has_abandoned_transaction(repo): |
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Raphaël Gomès <rgomes@octobus.net>
parents:
50936
diff
changeset
|
63 """Return True if the repo has an abandoned transaction""" |
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Raphaël Gomès <rgomes@octobus.net>
parents:
50936
diff
changeset
|
64 return os.path.exists(repo.sjoin(b"journal")) |
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Raphaël Gomès <rgomes@octobus.net>
parents:
50936
diff
changeset
|
65 |
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Raphaël Gomès <rgomes@octobus.net>
parents:
50936
diff
changeset
|
66 |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
67 def cleanup_undo_files(report, vfsmap, undo_prefix=b'undo'): |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
68 """remove "undo" files used by the rollback logic |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
69 |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
70 This is useful to prevent rollback running in situation were it does not |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
71 make sense. For example after a strip. |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
72 """ |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
73 backup_listing = UNDO_BACKUP % undo_prefix |
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
74 |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
75 backup_entries = [] |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
76 undo_files = [] |
50288
d89eecf9605e
undo-files: no longer pass the `repo` to `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50287
diff
changeset
|
77 svfs = vfsmap[b'store'] |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
78 try: |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
79 with svfs(backup_listing) as f: |
50288
d89eecf9605e
undo-files: no longer pass the `repo` to `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50287
diff
changeset
|
80 backup_entries = read_backup_files(report, f) |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
81 except OSError as e: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
82 if e.errno != errno.ENOENT: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
83 msg = _(b'could not read %s: %s\n') |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
84 msg %= (svfs.join(backup_listing), stringutil.forcebytestr(e)) |
50288
d89eecf9605e
undo-files: no longer pass the `repo` to `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50287
diff
changeset
|
85 report(msg) |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
86 |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
87 for location, f, backup_path, c in backup_entries: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
88 if location in vfsmap and backup_path: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
89 undo_files.append((vfsmap[location], backup_path)) |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
90 |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
91 undo_files.append((svfs, backup_listing)) |
50287
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
92 for location, undo_path in UNDO_FILES_MAY_NEED_CLEANUP: |
50289
94a8c354242b
undo-files: make the undo-prefix configurable in `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
93 undo_files.append((vfsmap[location], undo_path % undo_prefix)) |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
94 for undovfs, undofile in undo_files: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
95 try: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
96 undovfs.unlink(undofile) |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
97 except OSError as e: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
98 if e.errno != errno.ENOENT: |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
99 msg = _(b'error removing %s: %s\n') |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
100 msg %= (undovfs.join(undofile), stringutil.forcebytestr(e)) |
50288
d89eecf9605e
undo-files: no longer pass the `repo` to `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50287
diff
changeset
|
101 report(msg) |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
102 |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
103 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
104 def _playback( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
105 journal, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
106 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
107 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
108 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
109 entries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
110 backupentries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
111 unlink=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
112 checkambigfiles=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
113 ): |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
114 """rollback a transaction : |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
115 - truncate files that have been appended to |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
116 - restore file backups |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
117 - delete temporary files |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
118 """ |
50309
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
119 backupfiles = [] |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
120 |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
121 def restore_one_backup(vfs, f, b, checkambig): |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
122 filepath = vfs.join(f) |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
123 backuppath = vfs.join(b) |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
124 try: |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
125 util.copyfile(backuppath, filepath, checkambig=checkambig) |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
126 backupfiles.append((vfs, b)) |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
127 except IOError as exc: |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
128 e_msg = stringutil.forcebytestr(exc) |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
129 report(_(b"failed to recover %s (%s)\n") % (f, e_msg)) |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
130 raise |
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
131 |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
132 # gather all backup files that impact the store |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
133 # (we need this to detect files that are both backed up and truncated) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
134 store_backup = {} |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
135 for entry in backupentries: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
136 location, file_path, backup_path, cache = entry |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
137 vfs = vfsmap[location] |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
138 is_store = vfs.join(b'') == opener.join(b'') |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
139 if is_store and file_path and backup_path: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
140 store_backup[file_path] = entry |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
141 copy_done = set() |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
142 |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
143 # truncate all file `f` to offset `o` |
47286
18415fc918a1
recover: only apply last journal record per file (issue6423)
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
144 for f, o in sorted(dict(entries).items()): |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
145 # if we have a backup for `f`, we should restore it first and truncate |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
146 # the restored file |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
147 bck_entry = store_backup.get(f) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
148 if bck_entry is not None: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
149 location, file_path, backup_path, cache = bck_entry |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
150 checkambig = False |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
151 if checkambigfiles: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
152 checkambig = (file_path, location) in checkambigfiles |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
153 restore_one_backup(opener, file_path, backup_path, checkambig) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
154 copy_done.add(bck_entry) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
155 # truncate the file to its pre-transaction size |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
156 if o or not unlink: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
157 checkambig = checkambigfiles and (f, b'') in checkambigfiles |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
158 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 fp = opener(f, b'a', checkambig=checkambig) |
42963
8502f76dbfd7
transaction: detect an attempt to truncate-to-extend on playback, raise error
Kyle Lippincott <spectral@google.com>
parents:
41365
diff
changeset
|
160 if fp.tell() < o: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
161 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
162 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
163 b"attempted to truncate %s to %d bytes, but it was " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
164 b"already %d bytes\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
165 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
166 % (f, o, fp.tell()) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
167 ) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
168 fp.truncate(o) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
169 fp.close() |
9686
ddf2adf88b89
transaction: more specific exceptions, os.unlink can raise OSError
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9220
diff
changeset
|
170 except IOError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
171 report(_(b"failed to truncate %s\n") % f) |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
172 raise |
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
173 else: |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
174 # delete empty file |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
175 try: |
20084
a3378a1b0a05
transaction: unlink target file via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17424
diff
changeset
|
176 opener.unlink(f) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
177 except FileNotFoundError: |
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
178 pass |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
179 # restore backed up files and clean up temporary files |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
180 for entry in backupentries: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
181 if entry in copy_done: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
182 continue |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
183 l, f, b, c = entry |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
184 if l not in vfsmap and c: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 report(b"couldn't handle %s: unknown cache location %s\n" % (b, l)) |
23311
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
186 vfs = vfsmap[l] |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
187 try: |
50309
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
188 checkambig = checkambigfiles and (f, l) in checkambigfiles |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
189 if f and b: |
50309
86dc9e097bed
transaction: move the restoration of backup file in a small closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50308
diff
changeset
|
190 restore_one_backup(vfs, f, b, checkambig) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
191 else: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
192 target = f or b |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
193 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
194 vfs.unlink(target) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
195 except FileNotFoundError: |
50307
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
196 # This is fine because |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
197 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
198 # either we are trying to delete the main file, and it is |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
199 # already deleted. |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
200 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
201 # or we are trying to delete a temporary file and it is |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
202 # already deleted. |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
203 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
204 # in both case, our target result (delete the file) is |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
205 # already achieved. |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
206 pass |
41365
876494fd967d
cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents:
41107
diff
changeset
|
207 except (IOError, OSError, error.Abort): |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
208 if not c: |
23278
aa19432764d6
transaction: handle missing file in backupentries (instead of using entries)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23253
diff
changeset
|
209 raise |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
210 |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
211 # cleanup transaction state file and the backups file |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
212 backuppath = b"%s.backupfiles" % journal |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
213 if opener.exists(backuppath): |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
214 opener.unlink(backuppath) |
26753
96dd93de548c
transaction: reorder unlinking .hg/journal and .hg/journal.backupfiles
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
215 opener.unlink(journal) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
216 try: |
50306
90276164333a
transaction: properly clean up backup file outside of .hg/store/
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50291
diff
changeset
|
217 for vfs, f in backupfiles: |
90276164333a
transaction: properly clean up backup file outside of .hg/store/
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50291
diff
changeset
|
218 if vfs.exists(f): |
90276164333a
transaction: properly clean up backup file outside of .hg/store/
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50291
diff
changeset
|
219 vfs.unlink(f) |
41365
876494fd967d
cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents:
41107
diff
changeset
|
220 except (IOError, OSError, error.Abort): |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
221 # only pure backup file remains, it is sage to ignore any error |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
222 pass |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
223 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
224 |
33793
bbbbd3c30bfc
util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents:
33279
diff
changeset
|
225 class transaction(util.transactional): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
226 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
227 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
228 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
229 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
230 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
231 journalname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
232 undoname=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
233 after=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
234 createmode=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
235 validator=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
236 releasefn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
237 checkambigfiles=None, |
50868
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50686
diff
changeset
|
238 name=b'<unnamed>', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
239 ): |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
240 """Begin a new transaction |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
241 |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
242 Begins a new transaction that allows rolling back writes in the event of |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
243 an exception. |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
244 |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
245 * `after`: called after the transaction has been committed |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
246 * `createmode`: the mode of the journal file that will be created |
26576
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
247 * `releasefn`: called after releasing (with transaction and result) |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
248 |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
249 `checkambigfiles` is a set of (path, vfs-location) tuples, |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
250 which determine whether file stat ambiguity should be avoided |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
251 for corresponded files. |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
252 """ |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
253 self._count = 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
254 self._usages = 1 |
39683
337d6e0fd9c9
transaction: make report a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39682
diff
changeset
|
255 self._report = report |
23310
5bd1f6572db0
transaction: pass a vfs map to the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23309
diff
changeset
|
256 # a vfs to the store content |
39682
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
257 self._opener = opener |
23310
5bd1f6572db0
transaction: pass a vfs map to the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23309
diff
changeset
|
258 # a map to access file in various {location -> vfs} |
5bd1f6572db0
transaction: pass a vfs map to the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23309
diff
changeset
|
259 vfsmap = vfsmap.copy() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
260 vfsmap[b''] = opener # set default value |
23310
5bd1f6572db0
transaction: pass a vfs map to the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23309
diff
changeset
|
261 self._vfsmap = vfsmap |
39681
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39680
diff
changeset
|
262 self._after = after |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
263 self._offsetmap = {} |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
264 self._newfiles = set() |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
265 self._journal = journalname |
50284
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
266 self._journal_files = [] |
39675
da9ce63bfa9b
transaction: make undoname a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39674
diff
changeset
|
267 self._undoname = undoname |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
268 self._queue = [] |
26576
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
269 # A callback to do something just after releasing transaction. |
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
270 if releasefn is None: |
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
271 releasefn = lambda tr, success: None |
39678
040007cd3d81
transaction: make releasefn a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39677
diff
changeset
|
272 self._releasefn = releasefn |
26576
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
273 |
39680
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39679
diff
changeset
|
274 self._checkambigfiles = set() |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
275 if checkambigfiles: |
39680
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39679
diff
changeset
|
276 self._checkambigfiles.update(checkambigfiles) |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
277 |
39685
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
278 self._names = [name] |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36735
diff
changeset
|
279 |
32261
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
280 # A dict dedicated to precisely tracking the changes introduced in the |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
281 # transaction. |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
282 self.changes = {} |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
283 |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
284 # a dict of arguments to be passed to hooks |
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
285 self.hookargs = {} |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
286 self._file = opener.open(self._journal, b"w+") |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
287 |
23309
7eb520f5efe4
transaction: change the on disk format for backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23291
diff
changeset
|
288 # a list of ('location', 'path', 'backuppath', cache) entries. |
23311
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
289 # - if 'backuppath' is empty, no file existed at backup time |
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
290 # - if 'path' is empty, this is a temporary transaction file |
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
291 # - if 'location' is not empty, the path is outside main opener reach. |
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
292 # use 'location' value as a key in a vfsmap to find the right 'vfs' |
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
293 # (cache is currently unused) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
294 self._backupentries = [] |
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
295 self._backupmap = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
296 self._backupjournal = b"%s.backupfiles" % self._journal |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
297 self._backupsfile = opener.open(self._backupjournal, b'w') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
298 self._backupsfile.write(b'%d\n' % version) |
50642
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
299 # the set of temporary files |
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
300 self._tmp_files = set() |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
301 |
6065
53ed9b40cfc4
make the journal/undo files from transactions inherit the mode from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5865
diff
changeset
|
302 if createmode is not None: |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
303 opener.chmod(self._journal, createmode & 0o666) |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25302
diff
changeset
|
304 opener.chmod(self._backupjournal, createmode & 0o666) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
305 |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
306 # hold file generations to be performed on commit |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
307 self._filegenerators = {} |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23513
diff
changeset
|
308 # hold callback to write pending data for hooks |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
309 self._pendingcallback = {} |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
310 # True is any pending data have been written ever |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
311 self._anypending = False |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
312 # holds callback to call when writing the transaction |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
313 self._finalizecallback = {} |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
314 # holds callback to call when validating the transaction |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
315 # should raise exception if anything is wrong |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
316 self._validatecallback = {} |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
317 if validator is not None: |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
318 self._validatecallback[b'001-userhooks'] = validator |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23513
diff
changeset
|
319 # hold callback for post transaction close |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
320 self._postclosecallback = {} |
23764
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
321 # holds callbacks to call during abort |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
322 self._abortcallback = {} |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
323 |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36735
diff
changeset
|
324 def __repr__(self): |
50686
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50642
diff
changeset
|
325 name = b'/'.join(self._names) |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
326 return '<transaction name=%s, count=%d, usages=%d>' % ( |
50868
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50686
diff
changeset
|
327 encoding.strfromlocal(name), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
328 self._count, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
329 self._usages, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
330 ) |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36735
diff
changeset
|
331 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
332 def __del__(self): |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
333 if self._journal: |
9693
c40a1ee20aa5
transaction: always remove empty journal on abort
Sune Foldager <cryo@cyanite.org>
parents:
9686
diff
changeset
|
334 self._abort() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
335 |
48676
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47422
diff
changeset
|
336 @property |
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47422
diff
changeset
|
337 def finalized(self): |
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47422
diff
changeset
|
338 return self._finalizecallback is None |
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47422
diff
changeset
|
339 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
340 @active |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
341 def startgroup(self): |
23250
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
342 """delay registration of file entry |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
343 |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
344 This is used by strip to delay vision of strip offset. The transaction |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
345 sees either none or all of the strip actions to be done.""" |
23251
85c634ff395a
transaction: drop backupentries logic from startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23250
diff
changeset
|
346 self._queue.append([]) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
347 |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
348 @active |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
349 def endgroup(self): |
23250
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
350 """apply delayed registration of file entry. |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
351 |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
352 This is used by strip to delay vision of strip offset. The transaction |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
353 sees either none or all of the strip actions to be done.""" |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
354 q = self._queue.pop() |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
355 for f, o in q: |
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
356 self._addentry(f, o) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
357 |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
358 @active |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
359 def add(self, file, offset): |
23252
70809438c644
transaction: document `tr.add`
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23251
diff
changeset
|
360 """record the state of an append-only file before update""" |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
361 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
362 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
363 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
364 or file in self._backupmap |
50642
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
365 or file in self._tmp_files |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
366 ): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
367 return |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
368 if self._queue: |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
369 self._queue[-1].append((file, offset)) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
370 return |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
371 |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
372 self._addentry(file, offset) |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
373 |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
374 def _addentry(self, file, offset): |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
375 """add a append-only entry to memory and on-disk state""" |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
376 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
377 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
378 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
379 or file in self._backupmap |
50642
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
380 or file in self._tmp_files |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
381 ): |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
382 return |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
383 if offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
384 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
385 else: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
386 self._newfiles.add(file) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
387 # add enough data to the journal to do the truncate |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
388 self._file.write(b"%s\0%d\n" % (file, offset)) |
39677
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39676
diff
changeset
|
389 self._file.flush() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
390 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
391 @active |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
392 def addbackup(self, file, hardlink=True, location=b'', for_offset=False): |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
393 """Adds a backup of the file to the transaction |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
394 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
395 Calling addbackup() creates a hardlink backup of the specified file |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
396 that is used to recover the file in the event of the transaction |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
397 aborting. |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
398 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
399 * `file`: the file path, relative to .hg/store |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
400 * `hardlink`: use a hardlink to quickly create the backup |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
401 |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
402 If `for_offset` is set, we expect a offset for this file to have been previously recorded |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
403 """ |
23251
85c634ff395a
transaction: drop backupentries logic from startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23250
diff
changeset
|
404 if self._queue: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
405 msg = b'cannot use transaction.addbackup inside "group"' |
31648 | 406 raise error.ProgrammingError(msg) |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
407 |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
408 if file in self._newfiles or file in self._backupmap: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
409 return |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
410 elif file in self._offsetmap and not for_offset: |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
411 return |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
412 elif for_offset and file not in self._offsetmap: |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
413 msg = ( |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
414 'calling `addbackup` with `for_offmap=True`, ' |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
415 'but no offset recorded: [%r] %r' |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
416 ) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
417 msg %= (location, file) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
418 raise error.ProgrammingError(msg) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
419 |
23582
7559dc8c4238
vfs: add a 'split' method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23581
diff
changeset
|
420 vfs = self._vfsmap[location] |
7559dc8c4238
vfs: add a 'split' method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23581
diff
changeset
|
421 dirname, filename = vfs.split(file) |
50686
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50642
diff
changeset
|
422 backupfilename = b"%s.backup.%s.bck" % (self._journal, filename) |
23581
aed981c7bebf
vfs: add a 'reljoin' function for joining relative paths
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23543
diff
changeset
|
423 backupfile = vfs.reljoin(dirname, backupfilename) |
22663
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
424 if vfs.exists(file): |
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
425 filepath = vfs.join(file) |
23314
43f66ae57a66
addbackup: use the vfs for the backup destination too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23313
diff
changeset
|
426 backuppath = vfs.join(backupfile) |
50366
a445194f0a4d
backup: fix issue when the backup end up in a different directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50310
diff
changeset
|
427 # store encoding may result in different directory here. |
a445194f0a4d
backup: fix issue when the backup end up in a different directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50310
diff
changeset
|
428 # so we have to ensure the destination directory exist |
a445194f0a4d
backup: fix issue when the backup end up in a different directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50310
diff
changeset
|
429 final_dir_name = os.path.dirname(backuppath) |
a445194f0a4d
backup: fix issue when the backup end up in a different directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50310
diff
changeset
|
430 util.makedirs(final_dir_name, mode=vfs.createmode, notindexed=True) |
a445194f0a4d
backup: fix issue when the backup end up in a different directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50310
diff
changeset
|
431 # then we can copy the backup |
23900
5eb3541f907e
transaction: use 'util.copyfile' for creating backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23764
diff
changeset
|
432 util.copyfile(filepath, backuppath, hardlink=hardlink) |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
433 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
434 backupfile = b'' |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
435 |
23316
fc3670f41d3e
transaction: use 'location' instead of 'vfs' in the addbackup method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23315
diff
changeset
|
436 self._addbackupentry((location, file, backupfile, False)) |
23283
b04263c38a92
transaction: extract backupentry registration in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23282
diff
changeset
|
437 |
b04263c38a92
transaction: extract backupentry registration in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23282
diff
changeset
|
438 def _addbackupentry(self, entry): |
b04263c38a92
transaction: extract backupentry registration in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23282
diff
changeset
|
439 """register a new backup entry and write it to disk""" |
b04263c38a92
transaction: extract backupentry registration in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23282
diff
changeset
|
440 self._backupentries.append(entry) |
25294
b1b89a0a606d
transaction: really fix _addbackupentry key usage (issue4684)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25263
diff
changeset
|
441 self._backupmap[entry[1]] = len(self._backupentries) - 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
442 self._backupsfile.write(b"%s\0%s\0%s\0%d\n" % entry) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
443 self._backupsfile.flush() |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
444 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
445 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
446 def registertmp(self, tmpfile, location=b''): |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
447 """register a temporary transaction file |
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
448 |
23355
7faa55c20b0e
transaction: fix some docstring grammar
Matt Mackall <mpm@selenic.com>
parents:
23354
diff
changeset
|
449 Such files will be deleted when the transaction exits (on both |
7faa55c20b0e
transaction: fix some docstring grammar
Matt Mackall <mpm@selenic.com>
parents:
23354
diff
changeset
|
450 failure and success). |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
451 """ |
50642
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
452 self._tmp_files.add(tmpfile) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
453 self._addbackupentry((location, b'', tmpfile, False)) |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
454 |
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
455 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
456 def addfilegenerator( |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
457 self, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
458 genid, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
459 filenames, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
460 genfunc, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
461 order=0, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
462 location=b'', |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
463 post_finalize=False, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
464 ): |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
465 """add a function to generates some files at transaction commit |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
466 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
467 The `genfunc` argument is a function capable of generating proper |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
468 content of each entry in the `filename` tuple. |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
469 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
470 At transaction close time, `genfunc` will be called with one file |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
471 object argument per entries in `filenames`. |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
472 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
473 The transaction itself is responsible for the backup, creation and |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
474 final write of such file. |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
475 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
476 The `genid` argument is used to ensure the same set of file is only |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
477 generated once. Call to `addfilegenerator` for a `genid` already |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
478 present will overwrite the old entry. |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
479 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
480 The `order` argument may be used to control the order in which multiple |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
481 generator will be executed. |
23317
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
482 |
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
483 The `location` arguments may be used to indicate the files are located |
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
484 outside of the the standard directory for transaction. It should match |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23513
diff
changeset
|
485 one of the key of the `transaction.vfsmap` dictionary. |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
486 |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
487 The `post_finalize` argument can be set to `True` for file generation |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
488 that must be run after the transaction has been finalized. |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
489 """ |
22663
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
490 # For now, we are unable to do proper backup and restore of custom vfs |
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
491 # but for bookmarks that are handled outside this mechanism. |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
492 entry = (order, filenames, genfunc, location, post_finalize) |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
493 self._filegenerators[genid] = entry |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
494 |
33056
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
495 @active |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
496 def removefilegenerator(self, genid): |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
497 """reverse of addfilegenerator, remove a file generator function""" |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
498 if genid in self._filegenerators: |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
499 del self._filegenerators[genid] |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
500 |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
501 def _generatefiles(self, suffix=b'', group=GEN_GROUP_ALL): |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
502 # write files registered for generation |
23357
ba033f461f00
transaction: have _generatefile return a boolean
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23356
diff
changeset
|
503 any = False |
44407
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
504 |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
505 if group == GEN_GROUP_ALL: |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
506 skip_post = skip_pre = False |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
507 else: |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
508 skip_pre = group == GEN_GROUP_POST_FINALIZE |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
509 skip_post = group == GEN_GROUP_PRE_FINALIZE |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
510 |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
511 for id, entry in sorted(self._filegenerators.items()): |
23357
ba033f461f00
transaction: have _generatefile return a boolean
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23356
diff
changeset
|
512 any = True |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
513 order, filenames, genfunc, location, post_finalize = entry |
28830
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
514 |
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
515 # for generation at closing, check if it's before or after finalize |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
516 if skip_post and post_finalize: |
44407
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
517 continue |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
518 elif skip_pre and not post_finalize: |
28830
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
519 continue |
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
520 |
23317
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
521 vfs = self._vfsmap[location] |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
522 files = [] |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
523 try: |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
524 for name in filenames: |
23356
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
525 name += suffix |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
526 if suffix: |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
527 self.registertmp(name, location=location) |
33279
7912404b70f2
transaction: apply checkambig=True only on limited files for similarity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33278
diff
changeset
|
528 checkambig = False |
23356
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
529 else: |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
530 self.addbackup(name, location=location) |
39680
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39679
diff
changeset
|
531 checkambig = (name, location) in self._checkambigfiles |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
532 files.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
533 vfs(name, b'w', atomictemp=True, checkambig=checkambig) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
534 ) |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
535 genfunc(*files) |
41107
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
536 for f in files: |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
537 f.close() |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
538 # skip discard() loop since we're sure no open file remains |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
539 del files[:] |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
540 finally: |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
541 for f in files: |
41107
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
542 f.discard() |
23357
ba033f461f00
transaction: have _generatefile return a boolean
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23356
diff
changeset
|
543 return any |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
544 |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
545 @active |
45870
a6f08085edfe
transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents:
45869
diff
changeset
|
546 def findoffset(self, file): |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
547 if file in self._newfiles: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
548 return 0 |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
549 return self._offsetmap.get(file) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
550 |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
551 @active |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
552 def readjournal(self): |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
553 self._file.seek(0) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
554 entries = [] |
46063
88de2639901b
transaction: windows workaround for missing line iteration support
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
555 for l in self._file.readlines(): |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
556 file, troffset = l.split(b'\0') |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
557 entries.append((file, int(troffset))) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
558 return entries |
2084 | 559 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
560 @active |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
561 def replace(self, file, offset): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
562 """ |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
563 replace can only replace already committed entries |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
564 that are not pending in the queue |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
565 """ |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
566 if file in self._newfiles: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
567 if not offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
568 return |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
569 self._newfiles.remove(file) |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
570 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
571 elif file in self._offsetmap: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
572 if not offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
573 del self._offsetmap[file] |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
574 self._newfiles.add(file) |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
575 else: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
576 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
577 else: |
2084 | 578 raise KeyError(file) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
579 self._file.write(b"%s\0%d\n" % (file, offset)) |
39677
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39676
diff
changeset
|
580 self._file.flush() |
2084 | 581 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
582 @active |
50868
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50686
diff
changeset
|
583 def nest(self, name=b'<unnamed>'): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
584 self._count += 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
585 self._usages += 1 |
39685
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
586 self._names.append(name) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
587 return self |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
588 |
11230
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
589 def release(self): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
590 if self._count > 0: |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
591 self._usages -= 1 |
39685
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
592 if self._names: |
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
593 self._names.pop() |
11685 | 594 # if the transaction scopes are left without being closed, fail |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
595 if self._count > 0 and self._usages == 0: |
11230
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
596 self._abort() |
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
597 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
598 def running(self): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
599 return self._count > 0 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
600 |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
601 def addpending(self, category, callback): |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
602 """add a callback to be called when the transaction is pending |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
603 |
23280
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23279
diff
changeset
|
604 The transaction will be given as callback's first argument. |
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23279
diff
changeset
|
605 |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
606 Category is a unique identifier to allow overwriting an old callback |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
607 with a newer callback. |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
608 """ |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
609 self._pendingcallback[category] = callback |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
610 |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
611 @active |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
612 def writepending(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
613 """write pending file to temporary version |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
614 |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
615 This is used to allow hooks to view a transaction before commit""" |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
616 categories = sorted(self._pendingcallback) |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
617 for cat in categories: |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
618 # remove callback since the data will have been flushed |
23280
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23279
diff
changeset
|
619 any = self._pendingcallback.pop(cat)(self) |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
620 self._anypending = self._anypending or any |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
621 self._anypending |= self._generatefiles(suffix=b'.pending') |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
622 return self._anypending |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
623 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
624 @active |
44056
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
625 def hasfinalize(self, category): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
626 """check is a callback already exist for a category""" |
44056
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
627 return category in self._finalizecallback |
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
628 |
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
629 @active |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
630 def addfinalize(self, category, callback): |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
631 """add a callback to be called when the transaction is closed |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
632 |
23281
f60ed8cf4afc
transaction: pass the transaction to 'finalize' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23280
diff
changeset
|
633 The transaction will be given as callback's first argument. |
f60ed8cf4afc
transaction: pass the transaction to 'finalize' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23280
diff
changeset
|
634 |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
635 Category is a unique identifier to allow overwriting old callbacks with |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
636 newer callbacks. |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
637 """ |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
638 self._finalizecallback[category] = callback |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
639 |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
640 @active |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
641 def addpostclose(self, category, callback): |
33087
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
642 """add or replace a callback to be called after the transaction closed |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
643 |
23282
6c1351352b6c
transaction: pass the transaction to 'postclose' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
644 The transaction will be given as callback's first argument. |
6c1351352b6c
transaction: pass the transaction to 'postclose' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
645 |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
646 Category is a unique identifier to allow overwriting an old callback |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
647 with a newer callback. |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
648 """ |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
649 self._postclosecallback[category] = callback |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
650 |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
651 @active |
33087
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
652 def getpostclose(self, category): |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
653 """return a postclose callback added before, or None""" |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
654 return self._postclosecallback.get(category, None) |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
655 |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
656 @active |
23764
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
657 def addabort(self, category, callback): |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
658 """add a callback to be called when the transaction is aborted. |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
659 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
660 The transaction will be given as the first argument to the callback. |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
661 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
662 Category is a unique identifier to allow overwriting an old callback |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
663 with a newer callback. |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
664 """ |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
665 self._abortcallback[category] = callback |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
666 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
667 @active |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
668 def addvalidator(self, category, callback): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
669 """adds a callback to be called when validating the transaction. |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
670 |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
671 The transaction will be given as the first argument to the callback. |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
672 |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
673 callback should raise exception if to abort transaction""" |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
674 self._validatecallback[category] = callback |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
675 |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
676 @active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
677 def close(self): |
9220
8a4da1388553
transaction: document close(), abort() methods
Greg Ward <greg-hg@gerg.ca>
parents:
9094
diff
changeset
|
678 '''commit the transaction''' |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
679 if self._count == 1: |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
680 for category in sorted(self._validatecallback): |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
681 self._validatecallback[category](self) |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
682 self._validatecallback = None # Help prevent cycles. |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
683 self._generatefiles(group=GEN_GROUP_PRE_FINALIZE) |
44097
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
684 while self._finalizecallback: |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
685 callbacks = self._finalizecallback |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
686 self._finalizecallback = {} |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
687 categories = sorted(callbacks) |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
688 for cat in categories: |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
689 callbacks[cat](self) |
28960
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
690 # Prevent double usage and help clear cycles. |
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
691 self._finalizecallback = None |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
692 self._generatefiles(group=GEN_GROUP_POST_FINALIZE) |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
693 |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
694 self._count -= 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
695 if self._count != 0: |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
696 return |
39677
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39676
diff
changeset
|
697 self._file.close() |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
698 self._backupsfile.close() |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
699 # cleanup temporary files |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
700 for l, f, b, c in self._backupentries: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
701 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
702 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
703 b"couldn't remove %s: unknown cache location %s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
704 ) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
705 continue |
23311
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
706 vfs = self._vfsmap[l] |
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
707 if not f and b and vfs.exists(b): |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
708 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
709 vfs.unlink(b) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26576
diff
changeset
|
710 except (IOError, OSError, error.Abort) as inst: |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
711 if not c: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
712 raise |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
713 # Abort may be raise by read only opener |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
714 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
715 b"couldn't remove %s: %s\n" % (vfs.join(b), inst) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
716 ) |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
717 self._offsetmap = {} |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
718 self._newfiles = set() |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
719 self._writeundo() |
39681
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39680
diff
changeset
|
720 if self._after: |
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39680
diff
changeset
|
721 self._after() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
722 self._after = None # Help prevent cycles. |
39682
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
723 if self._opener.isfile(self._backupjournal): |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
724 self._opener.unlink(self._backupjournal) |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
725 if self._opener.isfile(self._journal): |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
726 self._opener.unlink(self._journal) |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
727 for l, _f, b, c in self._backupentries: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
728 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
729 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
730 b"couldn't remove %s: unknown cache location" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
731 b"%s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
732 ) |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
733 continue |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
734 vfs = self._vfsmap[l] |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
735 if b and vfs.exists(b): |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
736 try: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
737 vfs.unlink(b) |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
738 except (IOError, OSError, error.Abort) as inst: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
739 if not c: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
740 raise |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
741 # Abort may be raise by read only opener |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
742 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
743 b"couldn't remove %s: %s\n" % (vfs.join(b), inst) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
744 ) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
745 self._backupentries = [] |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
746 self._journal = None |
26576
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
747 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
748 self._releasefn(self, True) # notify success of closing transaction |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
749 self._releasefn = None # Help prevent cycles. |
26576
9e0aaac0d9eb
transaction: add releasefn to notify the end of a transaction scope
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25986
diff
changeset
|
750 |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
751 # run post close action |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
752 categories = sorted(self._postclosecallback) |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
753 for cat in categories: |
23282
6c1351352b6c
transaction: pass the transaction to 'postclose' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
754 self._postclosecallback[cat](self) |
28960
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
755 # Prevent double usage and help clear cycles. |
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
756 self._postclosecallback = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
757 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
758 @active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
759 def abort(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
760 """abort the transaction (generally called on error, or when the |
9220
8a4da1388553
transaction: document close(), abort() methods
Greg Ward <greg-hg@gerg.ca>
parents:
9094
diff
changeset
|
761 transaction is not explicitly committed before going out of |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
762 scope)""" |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
763 self._abort() |
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
764 |
50284
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
765 @active |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
766 def add_journal(self, vfs_id, path): |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
767 self._journal_files.append((vfs_id, path)) |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
768 |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
769 def _writeundo(self): |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
770 """write transaction data for possible future undo call""" |
39675
da9ce63bfa9b
transaction: make undoname a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39674
diff
changeset
|
771 if self._undoname is None: |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
772 return |
50290
92734603e33e
undo-files: clean existing files up before writing new one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50289
diff
changeset
|
773 cleanup_undo_files( |
92734603e33e
undo-files: clean existing files up before writing new one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50289
diff
changeset
|
774 self._report, |
92734603e33e
undo-files: clean existing files up before writing new one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50289
diff
changeset
|
775 self._vfsmap, |
92734603e33e
undo-files: clean existing files up before writing new one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50289
diff
changeset
|
776 undo_prefix=self._undoname, |
92734603e33e
undo-files: clean existing files up before writing new one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50289
diff
changeset
|
777 ) |
47422
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47420
diff
changeset
|
778 |
50283
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
779 def undoname(fn: bytes) -> bytes: |
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
780 base, name = os.path.split(fn) |
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
781 assert name.startswith(self._journal) |
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
782 new_name = name.replace(self._journal, self._undoname, 1) |
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
783 return os.path.join(base, new_name) |
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
784 |
47422
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47420
diff
changeset
|
785 undo_backup_path = b"%s.backupfiles" % self._undoname |
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47420
diff
changeset
|
786 undobackupfile = self._opener.open(undo_backup_path, b'w') |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
787 undobackupfile.write(b'%d\n' % version) |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
788 for l, f, b, c in self._backupentries: |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
789 if not f: # temporary file |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
790 continue |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
791 if not b: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
792 u = b'' |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
793 else: |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
794 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
795 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
796 b"couldn't remove %s: unknown cache location" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
797 b"%s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
798 ) |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
799 continue |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
800 vfs = self._vfsmap[l] |
50283
dda43856ef96
undo-files: add a undoname closure to the _write_undo method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50280
diff
changeset
|
801 u = undoname(b) |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
802 util.copyfile(vfs.join(b), vfs.join(u), hardlink=True) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
803 undobackupfile.write(b"%s\0%s\0%s\0%d\n" % (l, f, u, c)) |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
804 undobackupfile.close() |
50284
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
805 for vfs, src in self._journal_files: |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
806 dest = undoname(src) |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
807 # if src and dest refer to a same file, vfs.rename is a no-op, |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
808 # leaving both src and dest on disk. delete dest to make sure |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
809 # the rename couldn't be such a no-op. |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
810 vfs.tryunlink(dest) |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
811 try: |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
812 vfs.rename(src, dest) |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
813 except FileNotFoundError: # journal file does not yet exist |
a43f0562220c
undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50283
diff
changeset
|
814 pass |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
815 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
816 def _abort(self): |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
817 entries = self.readjournal() |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
818 self._count = 0 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
819 self._usages = 0 |
39677
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39676
diff
changeset
|
820 self._file.close() |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
821 self._backupsfile.close() |
8290
560af1bbfd6e
transaction: reset transaction on abort
Henrik Stuart <hg@hstuart.dk>
parents:
8289
diff
changeset
|
822 |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
823 quick = self._can_quick_abort(entries) |
10228
056c366fea8c
transaction: initialize self.journal to None after deletion
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9693
diff
changeset
|
824 try: |
49994
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
825 if not quick: |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
826 self._report(_(b"transaction abort!\n")) |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
827 for cat in sorted(self._abortcallback): |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
828 self._abortcallback[cat](self) |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
829 # Prevent double usage and help clear cycles. |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
830 self._abortcallback = None |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
831 if quick: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
832 self._do_quick_abort(entries) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
833 else: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
834 self._do_full_abort(entries) |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
835 finally: |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
836 self._journal = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
837 self._releasefn(self, False) # notify failure of transaction |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
838 self._releasefn = None # Help prevent cycles. |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
839 |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
840 def _can_quick_abort(self, entries): |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
841 """False if any semantic content have been written on disk |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
842 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
843 True if nothing, except temporary files has been writen on disk.""" |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
844 if entries: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
845 return False |
49995
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
846 for e in self._backupentries: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
847 if e[1]: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
848 return False |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
849 return True |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
850 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
851 def _do_quick_abort(self, entries): |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
852 """(Silently) do a quick cleanup (see _can_quick_abort)""" |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
853 assert self._can_quick_abort(entries) |
49995
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
854 tmp_files = [e for e in self._backupentries if not e[1]] |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
855 for vfs_id, old_path, tmp_path, xxx in tmp_files: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
856 vfs = self._vfsmap[vfs_id] |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
857 try: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
858 vfs.unlink(tmp_path) |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
859 except FileNotFoundError: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
860 pass |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
861 if self._backupjournal: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
862 self._opener.unlink(self._backupjournal) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
863 if self._journal: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
864 self._opener.unlink(self._journal) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
865 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
866 def _do_full_abort(self, entries): |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
867 """(Noisily) rollback all the change introduced by the transaction""" |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
868 try: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
869 _playback( |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
870 self._journal, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
871 self._report, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
872 self._opener, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
873 self._vfsmap, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
874 entries, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
875 self._backupentries, |
50810
5c3d07950bac
transaction: actually delete file created during the transaction on rollback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50686
diff
changeset
|
876 unlink=True, |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
877 checkambigfiles=self._checkambigfiles, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
878 ) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
879 self._report(_(b"rollback completed\n")) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
880 except BaseException as exc: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
881 self._report(_(b"rollback failed - please run hg recover\n")) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
882 self._report( |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
883 _(b"(failure reason: %s)\n") % stringutil.forcebytestr(exc) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
884 ) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
885 |
8290
560af1bbfd6e
transaction: reset transaction on abort
Henrik Stuart <hg@hstuart.dk>
parents:
8289
diff
changeset
|
886 |
47419
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
887 BAD_VERSION_MSG = _( |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
888 b"journal was created by a different version of Mercurial\n" |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
889 ) |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
890 |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
891 |
50280
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
892 def read_backup_files(report, fp): |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
893 """parse an (already open) backup file an return contained backup entries |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
894 |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
895 entries are in the form: (location, file, backupfile, xxx) |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
896 |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
897 :location: the vfs identifier (vfsmap's key) |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
898 :file: original file path (in the vfs) |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
899 :backupfile: path of the backup (in the vfs) |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
900 :cache: a boolean currently always set to False |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
901 """ |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
902 lines = fp.readlines() |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
903 backupentries = [] |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
904 if lines: |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
905 ver = lines[0][:-1] |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
906 if ver != (b'%d' % version): |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
907 report(BAD_VERSION_MSG) |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
908 else: |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
909 for line in lines[1:]: |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
910 if line: |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
911 # Shave off the trailing newline |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
912 line = line[:-1] |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
913 l, f, b, c = line.split(b'\0') |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
914 backupentries.append((l, f, b, bool(c))) |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
915 return backupentries |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
916 |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
917 |
50070
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
918 def rollback( |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
919 opener, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
920 vfsmap, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
921 file, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
922 report, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
923 checkambigfiles=None, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
924 skip_journal_pattern=None, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
925 ): |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
926 """Rolls back the transaction contained in the given file |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
927 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
928 Reads the entries in the specified file, and the corresponding |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
929 '*.backupfiles' file, to recover from an incomplete transaction. |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
930 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
931 * `file`: a file containing a list of entries, specifying where |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
932 to truncate each file. The file should contain a list of |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
933 file\0offset pairs, delimited by newlines. The corresponding |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
934 '*.backupfiles' file should contain a list of file\0backupfile |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
935 pairs, delimited by \0. |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
936 |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
937 `checkambigfiles` is a set of (path, vfs-location) tuples, |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
938 which determine whether file stat ambiguity should be avoided at |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
939 restoring corresponded files. |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
940 """ |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
941 entries = [] |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
942 backupentries = [] |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
943 |
47307
13dd5bb5492a
transaction: trivial refactoring
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
47286
diff
changeset
|
944 with opener.open(file) as fp: |
13dd5bb5492a
transaction: trivial refactoring
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
47286
diff
changeset
|
945 lines = fp.readlines() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
946 for l in lines: |
20524
28b8ff84db3f
journal: report parsing errors on recover/rollback (issue4172)
Matt Mackall <mpm@selenic.com>
parents:
20087
diff
changeset
|
947 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
948 f, o = l.split(b'\0') |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
949 entries.append((f, int(o))) |
20524
28b8ff84db3f
journal: report parsing errors on recover/rollback (issue4172)
Matt Mackall <mpm@selenic.com>
parents:
20087
diff
changeset
|
950 except ValueError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
951 report( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
952 _(b"couldn't read journal entry %r!\n") % pycompat.bytestr(l) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
953 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
954 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
955 backupjournal = b"%s.backupfiles" % file |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
956 if opener.exists(backupjournal): |
50280
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
957 with opener.open(backupjournal) as fp: |
5e568d70f54d
undo-files: add a utility function to read the backup-files definition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50268
diff
changeset
|
958 backupentries = read_backup_files(report, fp) |
50070
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
959 if skip_journal_pattern is not None: |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
960 keep = lambda x: not skip_journal_pattern.match(x[1]) |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
961 backupentries = [x for x in backupentries if keep(x)] |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
962 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
963 _playback( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
964 file, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
965 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
966 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
967 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
968 entries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
969 backupentries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
970 checkambigfiles=checkambigfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
971 ) |