Mercurial > public > mercurial-scm > hg
annotate mercurial/transaction.py @ 52640:24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
These were different classes in py2, but now a handful of error classes are just
an alias of `OSError`, like `IOError`, `EnvironmentError`, `WindowsError`, etc.
This is the result of running a hacked version of `pyupgrade` 3.19.1[1]
$ hg files -0 'relglob:**.py' | xargs -0 \
pyupgrade --py38-plus --keep-percent-format --keep-mock --keep-runtime-typing
The hack is because it doesn't have command line switches to disable most
changes, so it makes tons of unrelated changes all at once. The hack is to
1) patch `pyupgrade._main._fix_tokens()` to immediately return its content arg
2) change `pyupgrade._data.register_decorator()` to only register the function
if it's from the fixer we're interested in:
if func.__module__ in (
"pyupgrade._plugins.exceptions",
):
FUNCS[tp].append(func)
return func
[1] https://github.com/asottile/pyupgrade
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sun, 05 Jan 2025 21:03:17 -0500 |
parents | f4733654f144 |
children | ae2848198462 |
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 |
51859
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
50985
diff
changeset
|
14 from __future__ import annotations |
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
50985
diff
changeset
|
15 |
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
|
16 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
|
17 import os |
25986
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 |
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
19 from .i18n import _ |
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
20 from . import ( |
50865
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50683
diff
changeset
|
21 encoding, |
25986
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
22 error, |
36735
ef345f9e4295
transaction: fix an error string with bytestr() on a repr()d value
Augie Fackler <augie@google.com>
parents:
35832
diff
changeset
|
23 pycompat, |
25986
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
24 util, |
89049011f304
transaction: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
25 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
26 from .utils import stringutil |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
27 |
23313
991098579940
transaction: set backupentries version to proper value
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23312
diff
changeset
|
28 version = 2 |
23064
5dc888b79e70
transactions: add version number to journal.backupfiles
Durham Goode <durham@fb.com>
parents:
23063
diff
changeset
|
29 |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
30 GEN_GROUP_ALL = b'all' |
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
31 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
|
32 GEN_GROUP_POST_FINALIZE = b'postfinalize' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
33 |
28830
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
34 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
35 def active(func): |
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
36 def _active(self, *args, **kwds): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
37 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
|
38 raise error.ProgrammingError( |
5df1655edf42
transaction: use ProgrammingError for when an committed transaction is used
Martin von Zweigbergk <martinvonz@google.com>
parents:
44543
diff
changeset
|
39 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
|
40 ) |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
41 return func(self, *args, **kwds) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
42 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
43 return _active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
44 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
45 |
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
|
46 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
|
47 |
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
|
48 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
|
49 # 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
|
50 (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
|
51 (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
|
52 (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
|
53 (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
|
54 (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
|
55 (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
|
56 # 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
|
57 (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
|
58 # 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
|
59 # 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
|
60 (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
|
61 ] |
7ce9862fca7c
undo-files: relies on a explicit list of possible undo files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
62 |
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
|
63 |
50985
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50933
diff
changeset
|
64 def has_abandoned_transaction(repo): |
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50933
diff
changeset
|
65 """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:
50933
diff
changeset
|
66 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:
50933
diff
changeset
|
67 |
cf47b83d8ad0
transaction: abstract away the detection of an abandoned transaction
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50933
diff
changeset
|
68 |
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
|
69 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
|
70 """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
|
71 |
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 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
|
73 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
|
74 """ |
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
|
75 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
|
76 |
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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 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
|
88 |
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 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
|
90 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
|
91 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
|
92 |
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((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
|
94 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
|
95 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 |
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50284
diff
changeset
|
105 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
106 def _playback( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
107 journal, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
108 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
109 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
110 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
111 entries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
112 backupentries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
113 unlink=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
114 checkambigfiles=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
115 ): |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
116 """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
|
117 - 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
|
118 - 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
|
119 - 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
|
120 """ |
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
|
121 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
|
122 |
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 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
|
124 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
|
125 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
|
126 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
|
127 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
|
128 backupfiles.append((vfs, b)) |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
129 except OSError as exc: |
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
|
130 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
|
131 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
|
132 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
|
133 |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
134 # 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
|
135 # (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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 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
|
141 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
|
142 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
|
143 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
|
144 |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
145 # 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
|
146 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
|
147 # 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
|
148 # 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
|
149 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
|
150 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
|
151 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
|
152 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
|
153 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
|
154 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
|
155 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
|
156 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
|
157 # 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
|
158 if o or not unlink: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 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
|
160 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
161 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
|
162 if fp.tell() < o: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
163 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
164 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
165 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
|
166 b"already %d bytes\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
167 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
168 % (f, o, fp.tell()) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
169 ) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
170 fp.truncate(o) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
171 fp.close() |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
172 except OSError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
173 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
|
174 raise |
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
175 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
|
176 # 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
|
177 try: |
20084
a3378a1b0a05
transaction: unlink target file via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17424
diff
changeset
|
178 opener.unlink(f) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
179 except FileNotFoundError: |
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
180 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
|
181 # 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
|
182 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
|
183 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
|
184 continue |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 vfs = vfsmap[l] |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
189 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
|
190 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
|
191 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
|
192 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
|
193 else: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
194 target = f or b |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
195 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
196 vfs.unlink(target) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
197 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
|
198 # 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
|
199 # |
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 # 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
|
201 # 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
|
202 # |
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 # 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
|
204 # 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
|
205 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
206 # 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
|
207 # already achieved. |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48913
diff
changeset
|
208 pass |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
209 except (OSError, error.Abort): |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
210 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
|
211 raise |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
212 |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
213 # 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
|
214 backuppath = b"%s.backupfiles" % journal |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
215 if opener.exists(backuppath): |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
216 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
|
217 opener.unlink(journal) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
218 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
|
219 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
|
220 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
|
221 vfs.unlink(f) |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
222 except (OSError, error.Abort): |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
223 # 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
|
224 pass |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
225 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
226 |
33793
bbbbd3c30bfc
util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents:
33279
diff
changeset
|
227 class transaction(util.transactional): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
228 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
229 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
230 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
231 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
232 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
233 journalname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
234 undoname=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
235 after=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
236 createmode=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
237 validator=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
238 releasefn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
239 checkambigfiles=None, |
50865
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50683
diff
changeset
|
240 name=b'<unnamed>', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
241 ): |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
242 """Begin a new transaction |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
243 |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
244 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
|
245 an exception. |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
246 |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
247 * `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
|
248 * `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
|
249 * `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
|
250 |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
251 `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
|
252 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
|
253 for corresponded files. |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
254 """ |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
255 self._count = 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
256 self._usages = 1 |
39683
337d6e0fd9c9
transaction: make report a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39682
diff
changeset
|
257 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
|
258 # a vfs to the store content |
39682
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
259 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
|
260 # 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
|
261 vfsmap = vfsmap.copy() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
262 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
|
263 self._vfsmap = vfsmap |
39681
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39680
diff
changeset
|
264 self._after = after |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
265 self._offsetmap = {} |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
266 self._newfiles = set() |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
267 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
|
268 self._journal_files = [] |
39675
da9ce63bfa9b
transaction: make undoname a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39674
diff
changeset
|
269 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
|
270 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
|
271 # 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
|
272 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
|
273 releasefn = lambda tr, success: None |
39678
040007cd3d81
transaction: make releasefn a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39677
diff
changeset
|
274 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
|
275 |
39680
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39679
diff
changeset
|
276 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
|
277 if checkambigfiles: |
39680
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39679
diff
changeset
|
278 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
|
279 |
39685
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
280 self._names = [name] |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36735
diff
changeset
|
281 |
32261
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
282 # 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
|
283 # transaction. |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
284 self.changes = {} |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31648
diff
changeset
|
285 |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
286 # 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
|
287 self.hookargs = {} |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
288 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
|
289 |
23309
7eb520f5efe4
transaction: change the on disk format for backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23291
diff
changeset
|
290 # 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
|
291 # - 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
|
292 # - 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
|
293 # - 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
|
294 # 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
|
295 # (cache is currently unused) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
296 self._backupentries = [] |
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
297 self._backupmap = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
298 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
|
299 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
|
300 self._backupsfile.write(b'%d\n' % version) |
50639
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
301 # the set of temporary files |
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
302 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
|
303 |
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
|
304 if createmode is not None: |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
305 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
|
306 opener.chmod(self._backupjournal, createmode & 0o666) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
307 |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
308 # 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
|
309 self._filegenerators = {} |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23513
diff
changeset
|
310 # 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
|
311 self._pendingcallback = {} |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
312 # 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
|
313 self._anypending = False |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
314 # 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
|
315 self._finalizecallback = {} |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
316 # 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
|
317 # should raise exception if anything is wrong |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
318 self._validatecallback = {} |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
319 if validator is not None: |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
320 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
|
321 # 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
|
322 self._postclosecallback = {} |
23764
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
323 # holds callbacks to call during abort |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
324 self._abortcallback = {} |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
325 |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36735
diff
changeset
|
326 def __repr__(self): |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50639
diff
changeset
|
327 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
|
328 return '<transaction name=%s, count=%d, usages=%d>' % ( |
50865
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50683
diff
changeset
|
329 encoding.strfromlocal(name), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
330 self._count, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
331 self._usages, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
332 ) |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36735
diff
changeset
|
333 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
334 def __del__(self): |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
335 if self._journal: |
9693
c40a1ee20aa5
transaction: always remove empty journal on abort
Sune Foldager <cryo@cyanite.org>
parents:
9686
diff
changeset
|
336 self._abort() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
337 |
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
|
338 @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
|
339 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
|
340 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
|
341 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
342 @active |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
343 def startgroup(self): |
23250
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
344 """delay registration of file entry |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
345 |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
346 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
|
347 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
|
348 self._queue.append([]) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
349 |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
350 @active |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
351 def endgroup(self): |
23250
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
352 """apply delayed registration of file entry. |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
353 |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
354 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
|
355 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
|
356 q = self._queue.pop() |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
357 for f, o in q: |
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
358 self._addentry(f, o) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
359 |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
360 @active |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
361 def add(self, file, offset): |
23252
70809438c644
transaction: document `tr.add`
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23251
diff
changeset
|
362 """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
|
363 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
364 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
365 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
366 or file in self._backupmap |
50639
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
367 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
|
368 ): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
369 return |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
370 if self._queue: |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
371 self._queue[-1].append((file, offset)) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
372 return |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
373 |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
374 self._addentry(file, offset) |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
375 |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
376 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
|
377 """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
|
378 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
379 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
380 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
381 or file in self._backupmap |
50639
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
382 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
|
383 ): |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
384 return |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
385 if offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
386 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
387 else: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
388 self._newfiles.add(file) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
389 # 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
|
390 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
|
391 self._file.flush() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
392 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
393 @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
|
394 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
|
395 """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
|
396 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
397 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
|
398 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
|
399 aborting. |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
400 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
401 * `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
|
402 * `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
|
403 |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
404 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
|
405 """ |
23251
85c634ff395a
transaction: drop backupentries logic from startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23250
diff
changeset
|
406 if self._queue: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
407 msg = b'cannot use transaction.addbackup inside "group"' |
31648 | 408 raise error.ProgrammingError(msg) |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
409 |
50310
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
410 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
|
411 return |
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 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
|
413 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
|
414 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
|
415 msg = ( |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
416 '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
|
417 '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
|
418 ) |
4c1061b3e55a
transaction: allow to backup file that already have an offset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50309
diff
changeset
|
419 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
|
420 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
|
421 |
23582
7559dc8c4238
vfs: add a 'split' method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23581
diff
changeset
|
422 vfs = self._vfsmap[location] |
7559dc8c4238
vfs: add a 'split' method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23581
diff
changeset
|
423 dirname, filename = vfs.split(file) |
50683
a41eeb877d07
branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50639
diff
changeset
|
424 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
|
425 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
|
426 if vfs.exists(file): |
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
427 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
|
428 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
|
429 # 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
|
430 # 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
|
431 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
|
432 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
|
433 # 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
|
434 util.copyfile(filepath, backuppath, hardlink=hardlink) |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
435 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
436 backupfile = b'' |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
437 |
23316
fc3670f41d3e
transaction: use 'location' instead of 'vfs' in the addbackup method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23315
diff
changeset
|
438 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
|
439 |
b04263c38a92
transaction: extract backupentry registration in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23282
diff
changeset
|
440 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
|
441 """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
|
442 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
|
443 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
|
444 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
|
445 self._backupsfile.flush() |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
446 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
447 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
448 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
|
449 """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
|
450 |
23355
7faa55c20b0e
transaction: fix some docstring grammar
Matt Mackall <mpm@selenic.com>
parents:
23354
diff
changeset
|
451 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
|
452 failure and success). |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
453 """ |
50639
05d429fe84ed
revlog: fix a bug in revlog splitting
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50366
diff
changeset
|
454 self._tmp_files.add(tmpfile) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
455 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
|
456 |
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
457 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
458 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
|
459 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
|
460 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
|
461 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
|
462 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
|
463 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
|
464 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
|
465 post_finalize=False, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
466 ): |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
467 """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
|
468 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
469 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
|
470 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
|
471 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
472 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
|
473 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
|
474 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
475 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
|
476 final write of such file. |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
477 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
478 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
|
479 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
|
480 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
|
481 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
482 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
|
483 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
|
484 |
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
485 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
|
486 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
|
487 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
|
488 |
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
|
489 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
|
490 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
|
491 """ |
22663
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
492 # 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
|
493 # 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
|
494 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
|
495 self._filegenerators[genid] = entry |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
496 |
33056
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
497 @active |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
498 def removefilegenerator(self, genid): |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
499 """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
|
500 if genid in self._filegenerators: |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
501 del self._filegenerators[genid] |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32558
diff
changeset
|
502 |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
503 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
|
504 # 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
|
505 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
|
506 |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
507 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
|
508 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
|
509 else: |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44406
diff
changeset
|
510 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
|
511 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
|
512 |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
513 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
|
514 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
|
515 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
|
516 |
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
517 # 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
|
518 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
|
519 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
|
520 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
|
521 continue |
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
522 |
23317
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
523 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
|
524 files = [] |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
525 try: |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
526 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
|
527 name += suffix |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
528 if suffix: |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
529 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
|
530 checkambig = False |
23356
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
531 else: |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
532 self.addbackup(name, location=location) |
39680
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39679
diff
changeset
|
533 checkambig = (name, location) in self._checkambigfiles |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
534 files.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
535 vfs(name, b'w', atomictemp=True, checkambig=checkambig) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
536 ) |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
537 genfunc(*files) |
41107
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
538 for f in files: |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
539 f.close() |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
540 # 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
|
541 del files[:] |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
542 finally: |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
543 for f in files: |
41107
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40579
diff
changeset
|
544 f.discard() |
23357
ba033f461f00
transaction: have _generatefile return a boolean
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23356
diff
changeset
|
545 return any |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
546 |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
547 @active |
45870
a6f08085edfe
transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents:
45869
diff
changeset
|
548 def findoffset(self, file): |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
549 if file in self._newfiles: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
550 return 0 |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
551 return self._offsetmap.get(file) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
552 |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
553 @active |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
554 def readjournal(self): |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
555 self._file.seek(0) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
556 entries = [] |
46063
88de2639901b
transaction: windows workaround for missing line iteration support
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
557 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
|
558 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
|
559 entries.append((file, int(troffset))) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
560 return entries |
2084 | 561 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
562 @active |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
563 def replace(self, file, offset): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
564 """ |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
565 replace can only replace already committed entries |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
566 that are not pending in the queue |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
567 """ |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
568 if file in self._newfiles: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
569 if not offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
570 return |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
571 self._newfiles.remove(file) |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
572 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
573 elif file in self._offsetmap: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
574 if not offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
575 del self._offsetmap[file] |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
576 self._newfiles.add(file) |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
577 else: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
578 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
579 else: |
2084 | 580 raise KeyError(file) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
581 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
|
582 self._file.flush() |
2084 | 583 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
584 @active |
50865
0a4efb650b3e
transaction: fix __repr__() and make the default name bytes
Matt Harbison <matt_harbison@yahoo.com>
parents:
50683
diff
changeset
|
585 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
|
586 self._count += 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
587 self._usages += 1 |
39685
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
588 self._names.append(name) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
589 return self |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
590 |
11230
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
591 def release(self): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
592 if self._count > 0: |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
593 self._usages -= 1 |
39685
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
594 if self._names: |
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39684
diff
changeset
|
595 self._names.pop() |
11685 | 596 # 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
|
597 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
|
598 self._abort() |
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
599 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
600 def running(self): |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
601 return self._count > 0 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
602 |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
603 def addpending(self, category, callback): |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
604 """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
|
605 |
23280
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23279
diff
changeset
|
606 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
|
607 |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
608 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
|
609 with a newer 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 self._pendingcallback[category] = callback |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
612 |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
613 @active |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
614 def writepending(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
615 """write pending file to temporary version |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
616 |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
617 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
|
618 categories = sorted(self._pendingcallback) |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
619 for cat in categories: |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
620 # 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
|
621 any = self._pendingcallback.pop(cat)(self) |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
622 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
|
623 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
|
624 return self._anypending |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
625 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
626 @active |
44056
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
627 def hasfinalize(self, category): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
628 """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
|
629 return category in self._finalizecallback |
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
630 |
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43506
diff
changeset
|
631 @active |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
632 def addfinalize(self, category, callback): |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
633 """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
|
634 |
23281
f60ed8cf4afc
transaction: pass the transaction to 'finalize' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23280
diff
changeset
|
635 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
|
636 |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
637 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
|
638 newer callbacks. |
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 self._finalizecallback[category] = callback |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
641 |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
642 @active |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
643 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
|
644 """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
|
645 |
23282
6c1351352b6c
transaction: pass the transaction to 'postclose' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
646 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
|
647 |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
648 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
|
649 with a newer 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 self._postclosecallback[category] = callback |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
652 |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
653 @active |
33087
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
654 def getpostclose(self, category): |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
655 """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
|
656 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
|
657 |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33056
diff
changeset
|
658 @active |
23764
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
659 def addabort(self, category, callback): |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
660 """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
|
661 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
662 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
|
663 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
664 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
|
665 with a newer 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 self._abortcallback[category] = callback |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
668 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
669 @active |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
670 def addvalidator(self, category, callback): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
671 """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
|
672 |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
673 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
|
674 |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
675 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
|
676 self._validatecallback[category] = callback |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
677 |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
678 @active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
679 def close(self): |
9220
8a4da1388553
transaction: document close(), abort() methods
Greg Ward <greg-hg@gerg.ca>
parents:
9094
diff
changeset
|
680 '''commit the transaction''' |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
681 if self._count == 1: |
44543
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
682 for category in sorted(self._validatecallback): |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
683 self._validatecallback[category](self) |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44407
diff
changeset
|
684 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
|
685 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
|
686 while self._finalizecallback: |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
687 callbacks = self._finalizecallback |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
688 self._finalizecallback = {} |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
689 categories = sorted(callbacks) |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
690 for cat in categories: |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
691 callbacks[cat](self) |
28960
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
692 # Prevent double usage and help clear cycles. |
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
693 self._finalizecallback = None |
44406
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
694 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
|
695 |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
696 self._count -= 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
697 if self._count != 0: |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
698 return |
39677
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39676
diff
changeset
|
699 self._file.close() |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
700 self._backupsfile.close() |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
701 # cleanup temporary files |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
702 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
|
703 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
704 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
705 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
|
706 ) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
707 continue |
23311
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
708 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
|
709 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
|
710 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
711 vfs.unlink(b) |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
712 except (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
|
713 if not c: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
714 raise |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
715 # Abort may be raise by read only opener |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
716 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
717 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
|
718 ) |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
719 self._offsetmap = {} |
45872
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45871
diff
changeset
|
720 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
|
721 self._writeundo() |
39681
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39680
diff
changeset
|
722 if self._after: |
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39680
diff
changeset
|
723 self._after() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
724 self._after = None # Help prevent cycles. |
39682
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
725 if self._opener.isfile(self._backupjournal): |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
726 self._opener.unlink(self._backupjournal) |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
727 if self._opener.isfile(self._journal): |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39681
diff
changeset
|
728 self._opener.unlink(self._journal) |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
729 for l, _f, b, c in self._backupentries: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
730 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
731 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
732 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
|
733 b"%s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
734 ) |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
735 continue |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
736 vfs = self._vfsmap[l] |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
737 if b and vfs.exists(b): |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
738 try: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
739 vfs.unlink(b) |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51859
diff
changeset
|
740 except (OSError, error.Abort) as inst: |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
741 if not c: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
742 raise |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
743 # Abort may be raise by read only opener |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
744 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
745 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
|
746 ) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
747 self._backupentries = [] |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
748 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
|
749 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
750 self._releasefn(self, True) # notify success of closing transaction |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
751 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
|
752 |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
753 # run post close action |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
754 categories = sorted(self._postclosecallback) |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
755 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
|
756 self._postclosecallback[cat](self) |
28960
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
757 # Prevent double usage and help clear cycles. |
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
758 self._postclosecallback = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
759 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
760 @active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
761 def abort(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45872
diff
changeset
|
762 """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
|
763 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
|
764 scope)""" |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
765 self._abort() |
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
766 |
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
|
767 @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
|
768 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
|
769 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
|
770 |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
771 def _writeundo(self): |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
772 """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
|
773 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
|
774 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
|
775 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
|
776 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
|
777 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
|
778 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
|
779 ) |
47422
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47420
diff
changeset
|
780 |
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
|
781 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
|
782 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
|
783 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
|
784 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
|
785 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
|
786 |
47422
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47420
diff
changeset
|
787 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
|
788 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
|
789 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
|
790 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
|
791 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
|
792 continue |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
793 if not b: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
794 u = b'' |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
795 else: |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
796 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
797 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
798 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
|
799 b"%s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
800 ) |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
801 continue |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
802 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
|
803 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
|
804 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
|
805 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
|
806 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
|
807 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
|
808 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
|
809 # 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
|
810 # 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
|
811 # 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
|
812 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
|
813 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
|
814 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
|
815 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
|
816 pass |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
817 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
818 def _abort(self): |
45871
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45870
diff
changeset
|
819 entries = self.readjournal() |
39674
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
820 self._count = 0 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36819
diff
changeset
|
821 self._usages = 0 |
39677
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39676
diff
changeset
|
822 self._file.close() |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
823 self._backupsfile.close() |
8290
560af1bbfd6e
transaction: reset transaction on abort
Henrik Stuart <hg@hstuart.dk>
parents:
8289
diff
changeset
|
824 |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
825 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
|
826 try: |
49994
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
827 if not quick: |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
828 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
|
829 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
|
830 self._abortcallback[cat](self) |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49993
diff
changeset
|
831 # 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
|
832 self._abortcallback = None |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
833 if quick: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
834 self._do_quick_abort(entries) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
835 else: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
836 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
|
837 finally: |
39676
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39675
diff
changeset
|
838 self._journal = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
839 self._releasefn(self, False) # notify failure of transaction |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
840 self._releasefn = None # Help prevent cycles. |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
841 |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
842 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
|
843 """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
|
844 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
845 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
|
846 if entries: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
847 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
|
848 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
|
849 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
|
850 return False |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
851 return True |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
852 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
853 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
|
854 """(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
|
855 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
|
856 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
|
857 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
|
858 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
|
859 try: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49994
diff
changeset
|
860 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
|
861 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
|
862 pass |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
863 if self._backupjournal: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
864 self._opener.unlink(self._backupjournal) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
865 if self._journal: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
866 self._opener.unlink(self._journal) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
867 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
868 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
|
869 """(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
|
870 try: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
871 _playback( |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
872 self._journal, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
873 self._report, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
874 self._opener, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
875 self._vfsmap, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
876 entries, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
877 self._backupentries, |
50807
5c3d07950bac
transaction: actually delete file created during the transaction on rollback
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50683
diff
changeset
|
878 unlink=True, |
49993
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
879 checkambigfiles=self._checkambigfiles, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
880 ) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
881 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
|
882 except BaseException as exc: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
883 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
|
884 self._report( |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
885 _(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
|
886 ) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49306
diff
changeset
|
887 |
8290
560af1bbfd6e
transaction: reset transaction on abort
Henrik Stuart <hg@hstuart.dk>
parents:
8289
diff
changeset
|
888 |
47419
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
889 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
|
890 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
|
891 ) |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
892 |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47418
diff
changeset
|
893 |
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
|
894 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
|
895 """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
|
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 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
|
898 |
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 :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
|
900 :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
|
901 :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
|
902 :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
|
903 """ |
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 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 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
|
910 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
|
911 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
|
912 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
|
913 # 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
|
914 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
|
915 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
|
916 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
|
917 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
|
918 |
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
|
919 |
50070
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
920 def rollback( |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
921 opener, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
922 vfsmap, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
923 file, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
924 report, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
925 checkambigfiles=None, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
926 skip_journal_pattern=None, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49995
diff
changeset
|
927 ): |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
928 """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
|
929 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
930 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
|
931 '*.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
|
932 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
933 * `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
|
934 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
|
935 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
|
936 '*.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
|
937 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
|
938 |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33087
diff
changeset
|
939 `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
|
940 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
|
941 restoring corresponded files. |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
942 """ |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
943 entries = [] |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
944 backupentries = [] |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
945 |
47307
13dd5bb5492a
transaction: trivial refactoring
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
47286
diff
changeset
|
946 with opener.open(file) as fp: |
13dd5bb5492a
transaction: trivial refactoring
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
47286
diff
changeset
|
947 lines = fp.readlines() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
948 for l in lines: |
20524
28b8ff84db3f
journal: report parsing errors on recover/rollback (issue4172)
Matt Mackall <mpm@selenic.com>
parents:
20087
diff
changeset
|
949 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
950 f, o = l.split(b'\0') |
45869
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
951 entries.append((f, int(o))) |
20524
28b8ff84db3f
journal: report parsing errors on recover/rollback (issue4172)
Matt Mackall <mpm@selenic.com>
parents:
20087
diff
changeset
|
952 except ValueError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
953 report( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
954 _(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
|
955 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
956 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
957 backupjournal = b"%s.backupfiles" % file |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
958 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
|
959 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
|
960 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
|
961 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
|
962 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
|
963 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
|
964 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
965 _playback( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
966 file, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
967 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
968 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
969 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
970 entries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
971 backupentries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
972 checkambigfiles=checkambigfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
973 ) |