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