Mercurial > hg-stable
annotate mercurial/transaction.py @ 50308:cab3defe6d3b stable
transaction: raise on backup restoration error
A few line above, similar errors in the truncation code result in raising the
associated exception. We should do the same here.
This means the transaction recover is more strict now, which might be a problem
when running `hg recover` in a share different from the one where the
transaction fails. However this has always been a problem and need to be be
addressed independently.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 15 Mar 2023 12:13:08 +0100 |
parents | 70ca1f09ceca |
children | 86dc9e097bed |
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:
46067
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, |
36758
ef345f9e4295
transaction: fix an error string with bytestr() on a repr()d value
Augie Fackler <augie@google.com>
parents:
35872
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 |
44433
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): |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
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:
44553
diff
changeset
|
35 raise error.ProgrammingError( |
5df1655edf42
transaction: use ProgrammingError for when an committed transaction is used
Martin von Zweigbergk <martinvonz@google.com>
parents:
44553
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 ): |
47297
18415fc918a1
recover: only apply last journal record per file (issue6423)
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
108 for f, o in sorted(dict(entries).items()): |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
109 if o or not unlink: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
110 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
|
111 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
112 fp = opener(f, b'a', checkambig=checkambig) |
42965
8502f76dbfd7
transaction: detect an attempt to truncate-to-extend on playback, raise error
Kyle Lippincott <spectral@google.com>
parents:
41387
diff
changeset
|
113 if fp.tell() < o: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
114 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
115 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
116 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
|
117 b"already %d bytes\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
118 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
119 % (f, o, fp.tell()) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
120 ) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
121 fp.truncate(o) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
122 fp.close() |
9686
ddf2adf88b89
transaction: more specific exceptions, os.unlink can raise OSError
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9220
diff
changeset
|
123 except IOError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
124 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
|
125 raise |
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
126 else: |
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
127 try: |
20084
a3378a1b0a05
transaction: unlink target file via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17424
diff
changeset
|
128 opener.unlink(f) |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49004
diff
changeset
|
129 except FileNotFoundError: |
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49004
diff
changeset
|
130 pass |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
131 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
132 backupfiles = [] |
23309
7eb520f5efe4
transaction: change the on disk format for backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23291
diff
changeset
|
133 for l, f, b, c in backupentries: |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
134 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
|
135 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
|
136 vfs = vfsmap[l] |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
137 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
138 if f and b: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
139 filepath = vfs.join(f) |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
140 backuppath = vfs.join(b) |
33279
7912404b70f2
transaction: apply checkambig=True only on limited files for similarity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33278
diff
changeset
|
141 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
|
142 try: |
33279
7912404b70f2
transaction: apply checkambig=True only on limited files for similarity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33278
diff
changeset
|
143 util.copyfile(backuppath, filepath, checkambig=checkambig) |
50306
90276164333a
transaction: properly clean up backup file outside of .hg/store/
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50291
diff
changeset
|
144 backupfiles.append((vfs, b)) |
47424
22e21deed474
transaction: explain why some recovery failed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47318
diff
changeset
|
145 except IOError as exc: |
22e21deed474
transaction: explain why some recovery failed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47318
diff
changeset
|
146 e_msg = stringutil.forcebytestr(exc) |
22e21deed474
transaction: explain why some recovery failed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47318
diff
changeset
|
147 report(_(b"failed to recover %s (%s)\n") % (f, e_msg)) |
50308
cab3defe6d3b
transaction: raise on backup restoration error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50307
diff
changeset
|
148 raise |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
149 else: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
150 target = f or b |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
151 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
152 vfs.unlink(target) |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49004
diff
changeset
|
153 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
|
154 # 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
|
155 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
156 # 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
|
157 # 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
|
158 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
159 # 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
|
160 # 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
|
161 # |
70ca1f09ceca
transaction: add clarifying comment about why ignoring some error is fine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50306
diff
changeset
|
162 # 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
|
163 # already achieved. |
49314
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49004
diff
changeset
|
164 pass |
41387
876494fd967d
cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents:
41110
diff
changeset
|
165 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
|
166 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
|
167 raise |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
168 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 backuppath = b"%s.backupfiles" % journal |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
170 if opener.exists(backuppath): |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
171 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
|
172 opener.unlink(journal) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
173 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
|
174 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
|
175 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
|
176 vfs.unlink(f) |
41387
876494fd967d
cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents:
41110
diff
changeset
|
177 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
|
178 # 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
|
179 pass |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
180 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
181 |
33814
bbbbd3c30bfc
util: add base class for transactional context managers
Martin von Zweigbergk <martinvonz@google.com>
parents:
33279
diff
changeset
|
182 class transaction(util.transactional): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
183 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
184 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
185 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
186 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
187 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
188 journalname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
189 undoname=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
190 after=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
191 createmode=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
192 validator=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
193 releasefn=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
194 checkambigfiles=None, |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
195 name='<unnamed>', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
196 ): |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
197 """Begin a new transaction |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
198 |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
199 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
|
200 an exception. |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
201 |
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
202 * `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
|
203 * `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
|
204 * `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:
33099
diff
changeset
|
205 |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33099
diff
changeset
|
206 `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:
33099
diff
changeset
|
207 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:
33099
diff
changeset
|
208 for corresponded files. |
20881
3c47677a8d04
transaction: add onclose/onabort hook for pre-close logic
Durham Goode <durham@fb.com>
parents:
20524
diff
changeset
|
209 """ |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
210 self._count = 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
211 self._usages = 1 |
39699
337d6e0fd9c9
transaction: make report a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39698
diff
changeset
|
212 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
|
213 # a vfs to the store content |
39698
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
214 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
|
215 # 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
|
216 vfsmap = vfsmap.copy() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
217 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
|
218 self._vfsmap = vfsmap |
39697
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
219 self._after = after |
45886
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
220 self._offsetmap = {} |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
221 self._newfiles = set() |
39692
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
222 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
|
223 self._journal_files = [] |
39691
da9ce63bfa9b
transaction: make undoname a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
224 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
|
225 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
|
226 # 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
|
227 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
|
228 releasefn = lambda tr, success: None |
39694
040007cd3d81
transaction: make releasefn a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
229 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
|
230 |
39696
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39695
diff
changeset
|
231 self._checkambigfiles = set() |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33099
diff
changeset
|
232 if checkambigfiles: |
39696
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39695
diff
changeset
|
233 self._checkambigfiles.update(checkambigfiles) |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33099
diff
changeset
|
234 |
39701
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39700
diff
changeset
|
235 self._names = [name] |
36827
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36758
diff
changeset
|
236 |
32301
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31653
diff
changeset
|
237 # 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:
31653
diff
changeset
|
238 # transaction. |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31653
diff
changeset
|
239 self.changes = {} |
976681123416
transaction: introduce "changes" dictionary to precisely track updates
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31653
diff
changeset
|
240 |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
241 # 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
|
242 self.hookargs = {} |
45886
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
243 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
|
244 |
23309
7eb520f5efe4
transaction: change the on disk format for backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23291
diff
changeset
|
245 # 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
|
246 # - 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
|
247 # - 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
|
248 # - 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
|
249 # 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
|
250 # (cache is currently unused) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
251 self._backupentries = [] |
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
252 self._backupmap = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
253 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
|
254 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
|
255 self._backupsfile.write(b'%d\n' % version) |
23279
e245775f8fd3
transaction: gather backupjournal logic together in the __init__
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23278
diff
changeset
|
256 |
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
|
257 if createmode is not None: |
39692
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
258 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
|
259 opener.chmod(self._backupjournal, createmode & 0o666) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
260 |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
261 # 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
|
262 self._filegenerators = {} |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23513
diff
changeset
|
263 # 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
|
264 self._pendingcallback = {} |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
265 # 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
|
266 self._anypending = False |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
267 # 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
|
268 self._finalizecallback = {} |
44553
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
269 # holds callback to call when validating the transaction |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
270 # should raise exception if anything is wrong |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
271 self._validatecallback = {} |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
272 if validator is not None: |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
273 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
|
274 # 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
|
275 self._postclosecallback = {} |
23764
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
276 # holds callbacks to call during abort |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
277 self._abortcallback = {} |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
278 |
36827
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36758
diff
changeset
|
279 def __repr__(self): |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
280 name = '/'.join(self._names) |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
281 return '<transaction name=%s, count=%d, usages=%d>' % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
282 name, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
283 self._count, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
284 self._usages, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
285 ) |
36827
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36758
diff
changeset
|
286 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
287 def __del__(self): |
39692
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
288 if self._journal: |
9693
c40a1ee20aa5
transaction: always remove empty journal on abort
Sune Foldager <cryo@cyanite.org>
parents:
9686
diff
changeset
|
289 self._abort() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
290 |
48362
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47428
diff
changeset
|
291 @property |
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47428
diff
changeset
|
292 def finalized(self): |
3f618484eeb6
transaction: add a way to know a transaction has been finalized
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47428
diff
changeset
|
293 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:
47428
diff
changeset
|
294 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
295 @active |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
296 def startgroup(self): |
23250
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
297 """delay registration of file entry |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
298 |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
299 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
|
300 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
|
301 self._queue.append([]) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
302 |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
303 @active |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
304 def endgroup(self): |
23250
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
305 """apply delayed registration of file entry. |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
306 |
8919dc7f2dbb
transaction: document startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23249
diff
changeset
|
307 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
|
308 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
|
309 q = self._queue.pop() |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
310 for f, o in q: |
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
311 self._addentry(f, o) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
312 |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
313 @active |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
314 def add(self, file, offset): |
23252
70809438c644
transaction: document `tr.add`
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23251
diff
changeset
|
315 """record the state of an append-only file before update""" |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
316 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
317 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
318 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
319 or file in self._backupmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
320 ): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
321 return |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
322 if self._queue: |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
323 self._queue[-1].append((file, offset)) |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
324 return |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
325 |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
326 self._addentry(file, offset) |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
327 |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
328 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
|
329 """add a append-only entry to memory and on-disk state""" |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
330 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
331 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
332 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
333 or file in self._backupmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
334 ): |
23253
8d84b7a2dd91
transaction: factorise append-only file registration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23252
diff
changeset
|
335 return |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
336 if offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
337 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
338 else: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
339 self._newfiles.add(file) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
340 # 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
|
341 self._file.write(b"%s\0%d\n" % (file, offset)) |
39693
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
342 self._file.flush() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
343 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
344 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
345 def addbackup(self, file, hardlink=True, location=b''): |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
346 """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
|
347 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
348 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
|
349 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
|
350 aborting. |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
351 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
352 * `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
|
353 * `hardlink`: use a hardlink to quickly create the backup |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
354 """ |
23251
85c634ff395a
transaction: drop backupentries logic from startgroup and endgroup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23250
diff
changeset
|
355 if self._queue: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
356 msg = b'cannot use transaction.addbackup inside "group"' |
31653 | 357 raise error.ProgrammingError(msg) |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
358 |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
359 if ( |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
360 file in self._newfiles |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
361 or file in self._offsetmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
362 or file in self._backupmap |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
363 ): |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
364 return |
23582
7559dc8c4238
vfs: add a 'split' method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23581
diff
changeset
|
365 vfs = self._vfsmap[location] |
7559dc8c4238
vfs: add a 'split' method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23581
diff
changeset
|
366 dirname, filename = vfs.split(file) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
367 backupfilename = b"%s.backup.%s" % (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
|
368 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
|
369 if vfs.exists(file): |
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
370 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
|
371 backuppath = vfs.join(backupfile) |
23900
5eb3541f907e
transaction: use 'util.copyfile' for creating backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23764
diff
changeset
|
372 util.copyfile(filepath, backuppath, hardlink=hardlink) |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
373 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
374 backupfile = b'' |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
375 |
23316
fc3670f41d3e
transaction: use 'location' instead of 'vfs' in the addbackup method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23315
diff
changeset
|
376 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
|
377 |
b04263c38a92
transaction: extract backupentry registration in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23282
diff
changeset
|
378 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
|
379 """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
|
380 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
|
381 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
|
382 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
|
383 self._backupsfile.flush() |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
384 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
385 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
386 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
|
387 """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
|
388 |
23355
7faa55c20b0e
transaction: fix some docstring grammar
Matt Mackall <mpm@selenic.com>
parents:
23354
diff
changeset
|
389 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
|
390 failure and success). |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
391 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
392 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
|
393 |
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
394 @active |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
395 def addfilegenerator( |
48699
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
396 self, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
397 genid, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
398 filenames, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
399 genfunc, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
400 order=0, |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
401 location=b'', |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
402 post_finalize=False, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
403 ): |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
404 """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
|
405 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
406 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
|
407 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
|
408 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
409 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
|
410 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
|
411 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
412 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
|
413 final write of such file. |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
414 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 |
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
419 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
|
420 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
|
421 |
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
422 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
|
423 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
|
424 one of the key of the `transaction.vfsmap` dictionary. |
48699
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
425 |
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
426 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:
48698
diff
changeset
|
427 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
|
428 """ |
22663
4c6198737ad8
transaction: allow generating file outside of store
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22662
diff
changeset
|
429 # 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
|
430 # but for bookmarks that are handled outside this mechanism. |
48699
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
431 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:
48698
diff
changeset
|
432 self._filegenerators[genid] = entry |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
433 |
33068
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32591
diff
changeset
|
434 @active |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32591
diff
changeset
|
435 def removefilegenerator(self, genid): |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32591
diff
changeset
|
436 """reverse of addfilegenerator, remove a file generator function""" |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32591
diff
changeset
|
437 if genid in self._filegenerators: |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32591
diff
changeset
|
438 del self._filegenerators[genid] |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32591
diff
changeset
|
439 |
44433
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
440 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
|
441 # 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
|
442 any = False |
44434
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44433
diff
changeset
|
443 |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44433
diff
changeset
|
444 if group == GEN_GROUP_ALL: |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44433
diff
changeset
|
445 skip_post = skip_pre = False |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44433
diff
changeset
|
446 else: |
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44433
diff
changeset
|
447 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:
44433
diff
changeset
|
448 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:
44433
diff
changeset
|
449 |
49004
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
450 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
|
451 any = True |
48699
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
452 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
|
453 |
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
454 # for generation at closing, check if it's before or after finalize |
48699
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
455 if skip_post and post_finalize: |
44434
f6798c1a80fa
transaction: clarify the logic around pre-finalize/post-finalize
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44433
diff
changeset
|
456 continue |
48699
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48698
diff
changeset
|
457 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
|
458 continue |
a5009789960c
transaction: allow running file generators after finalizers
Durham Goode <durham@fb.com>
parents:
27924
diff
changeset
|
459 |
23317
197e17be5407
transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23316
diff
changeset
|
460 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
|
461 files = [] |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
462 try: |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
463 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
|
464 name += suffix |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
465 if suffix: |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
466 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
|
467 checkambig = False |
23356
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
468 else: |
140c21fbf4eb
transaction: allow generating files with a suffix
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23355
diff
changeset
|
469 self.addbackup(name, location=location) |
39696
264d56954dda
transaction: make checkambigfiles a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39695
diff
changeset
|
470 checkambig = (name, location) in self._checkambigfiles |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
471 files.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
472 vfs(name, b'w', atomictemp=True, checkambig=checkambig) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
473 ) |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
474 genfunc(*files) |
41110
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40626
diff
changeset
|
475 for f in files: |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40626
diff
changeset
|
476 f.close() |
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40626
diff
changeset
|
477 # 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:
40626
diff
changeset
|
478 del files[:] |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
479 finally: |
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
480 for f in files: |
41110
3e2c02836420
transaction: do not overwrite atomic-temp files on error
Yuya Nishihara <yuya@tcha.org>
parents:
40626
diff
changeset
|
481 f.discard() |
23357
ba033f461f00
transaction: have _generatefile return a boolean
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23356
diff
changeset
|
482 return any |
23102
16da812ad970
transaction: extract file generation into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23065
diff
changeset
|
483 |
22078
feb4797c676e
transaction: add a file generation mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22077
diff
changeset
|
484 @active |
45885
a6f08085edfe
transaction: rename find to findoffset and drop backup file support
Joerg Sonnenberger <joerg@bec.de>
parents:
45884
diff
changeset
|
485 def findoffset(self, file): |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
486 if file in self._newfiles: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
487 return 0 |
45886
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
488 return self._offsetmap.get(file) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
489 |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
490 @active |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
491 def readjournal(self): |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
492 self._file.seek(0) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
493 entries = [] |
46067
88de2639901b
transaction: windows workaround for missing line iteration support
Joerg Sonnenberger <joerg@bec.de>
parents:
45957
diff
changeset
|
494 for l in self._file.readlines(): |
45886
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
495 file, troffset = l.split(b'\0') |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
496 entries.append((file, int(troffset))) |
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
497 return entries |
2084 | 498 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
499 @active |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
500 def replace(self, file, offset): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
501 """ |
8363
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
502 replace can only replace already committed entries |
c8e81f557da7
transaction: add atomic groups to transaction logic
Henrik Stuart <hg@hstuart.dk>
parents:
8294
diff
changeset
|
503 that are not pending in the queue |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
504 """ |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
505 if file in self._newfiles: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
506 if not offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
507 return |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
508 self._newfiles.remove(file) |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
509 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
510 elif file in self._offsetmap: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
511 if not offset: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
512 del self._offsetmap[file] |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
513 self._newfiles.add(file) |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
514 else: |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
515 self._offsetmap[file] = offset |
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
516 else: |
2084 | 517 raise KeyError(file) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
518 self._file.write(b"%s\0%d\n" % (file, offset)) |
39693
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
519 self._file.flush() |
2084 | 520 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
521 @active |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
522 def nest(self, name='<unnamed>'): |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
523 self._count += 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
524 self._usages += 1 |
39701
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39700
diff
changeset
|
525 self._names.append(name) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
526 return self |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
527 |
11230
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
528 def release(self): |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
529 if self._count > 0: |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
530 self._usages -= 1 |
39701
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39700
diff
changeset
|
531 if self._names: |
4024c363cd33
transaction: make names a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39700
diff
changeset
|
532 self._names.pop() |
11685 | 533 # if the transaction scopes are left without being closed, fail |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
534 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
|
535 self._abort() |
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10282
diff
changeset
|
536 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
537 def running(self): |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
538 return self._count > 0 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
539 |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
540 def addpending(self, category, callback): |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
541 """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
|
542 |
23280
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23279
diff
changeset
|
543 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
|
544 |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
545 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
|
546 with a newer callback. |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
547 """ |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
548 self._pendingcallback[category] = callback |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
549 |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
550 @active |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
551 def writepending(self): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
552 """write pending file to temporary version |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
553 |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
554 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
|
555 categories = sorted(self._pendingcallback) |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
556 for cat in categories: |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
557 # 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
|
558 any = self._pendingcallback.pop(cat)(self) |
23202
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
559 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
|
560 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
|
561 return self._anypending |
ea5af863fbff
transaction: add 'writepending' logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23103
diff
changeset
|
562 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
563 @active |
44056
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
564 def hasfinalize(self, category): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
565 """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:
43554
diff
changeset
|
566 return category in self._finalizecallback |
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
567 |
8e09551206f5
transaction: add a `hasfinalize` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43554
diff
changeset
|
568 @active |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
569 def addfinalize(self, category, callback): |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
570 """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
|
571 |
23281
f60ed8cf4afc
transaction: pass the transaction to 'finalize' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23280
diff
changeset
|
572 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
|
573 |
23204
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
574 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
|
575 newer callbacks. |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
576 """ |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
577 self._finalizecallback[category] = callback |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
578 |
10beda5bd2b7
transaction: allow registering a finalization callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23202
diff
changeset
|
579 @active |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
580 def addpostclose(self, category, callback): |
33099
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33068
diff
changeset
|
581 """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
|
582 |
23282
6c1351352b6c
transaction: pass the transaction to 'postclose' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
583 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
|
584 |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
585 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
|
586 with a newer callback. |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
587 """ |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
588 self._postclosecallback[category] = callback |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
589 |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
590 @active |
33099
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33068
diff
changeset
|
591 def getpostclose(self, category): |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33068
diff
changeset
|
592 """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:
33068
diff
changeset
|
593 return self._postclosecallback.get(category, None) |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33068
diff
changeset
|
594 |
fcd1c483f5ea
strip: add a delayedstrip method that works in a transaction
Jun Wu <quark@fb.com>
parents:
33068
diff
changeset
|
595 @active |
23764
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
596 def addabort(self, category, callback): |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
597 """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
|
598 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
599 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
|
600 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
601 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
|
602 with a newer callback. |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
603 """ |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
604 self._abortcallback[category] = callback |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
605 |
d486e52352e8
transaction: support for callbacks during abort
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23727
diff
changeset
|
606 @active |
44553
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
607 def addvalidator(self, category, callback): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
608 """adds a callback to be called when validating the transaction. |
44553
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
609 |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
610 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:
44434
diff
changeset
|
611 |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
612 callback should raise exception if to abort transaction""" |
44553
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
613 self._validatecallback[category] = callback |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
614 |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
615 @active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
616 def close(self): |
9220
8a4da1388553
transaction: document close(), abort() methods
Greg Ward <greg-hg@gerg.ca>
parents:
9094
diff
changeset
|
617 '''commit the transaction''' |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
618 if self._count == 1: |
44553
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
619 for category in sorted(self._validatecallback): |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
620 self._validatecallback[category](self) |
36f08ae87ef6
transaction: add functionality to have multiple validators
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44434
diff
changeset
|
621 self._validatecallback = None # Help prevent cycles. |
44433
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
622 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
|
623 while self._finalizecallback: |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
624 callbacks = self._finalizecallback |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
625 self._finalizecallback = {} |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
626 categories = sorted(callbacks) |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
627 for cat in categories: |
2f1d6180737f
transaction: allow finalizer to add finalizer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44056
diff
changeset
|
628 callbacks[cat](self) |
28960
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
629 # Prevent double usage and help clear cycles. |
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
630 self._finalizecallback = None |
44433
baf8c3f944eb
transaction: move constant to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44097
diff
changeset
|
631 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
|
632 |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
633 self._count -= 1 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
634 if self._count != 0: |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1559
diff
changeset
|
635 return |
39693
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
636 self._file.close() |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
637 self._backupsfile.close() |
23291
03d2d6931836
transaction: allow registering a temporary transaction file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23290
diff
changeset
|
638 # cleanup temporary files |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
639 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
|
640 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
641 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
642 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
|
643 ) |
23312
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
644 continue |
23311
64ab33ffba14
transaction: use the location value when doing backup
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23310
diff
changeset
|
645 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
|
646 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
|
647 try: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
648 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
|
649 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
|
650 if not c: |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
651 raise |
006e9ef05c31
transaction: support cache file in backupentries
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
652 # Abort may be raise by read only opener |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
653 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
654 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
|
655 ) |
45886
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
656 self._offsetmap = {} |
45887
ec73a6a75985
transaction: split new files into a separate set
Joerg Sonnenberger <joerg@bec.de>
parents:
45886
diff
changeset
|
657 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
|
658 self._writeundo() |
39697
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
659 if self._after: |
0d7b9db85675
transaction: make after a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
660 self._after() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
661 self._after = None # Help prevent cycles. |
39698
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
662 if self._opener.isfile(self._backupjournal): |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
663 self._opener.unlink(self._backupjournal) |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
664 if self._opener.isfile(self._journal): |
b590f4763aba
transaction: make opener a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
665 self._opener.unlink(self._journal) |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
666 for l, _f, b, c in self._backupentries: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
667 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
668 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
669 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
|
670 b"%s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
671 ) |
27662
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
672 continue |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
673 vfs = self._vfsmap[l] |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
674 if b and vfs.exists(b): |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
675 try: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
676 vfs.unlink(b) |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
677 except (IOError, OSError, error.Abort) as inst: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
678 if not c: |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
679 raise |
f7ab50c721ac
transaction: remove 'if True:'
Martin von Zweigbergk <martinvonz@google.com>
parents:
26754
diff
changeset
|
680 # Abort may be raise by read only opener |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
681 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
682 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
|
683 ) |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
684 self._backupentries = [] |
39692
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
685 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
|
686 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
687 self._releasefn(self, True) # notify success of closing transaction |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
688 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
|
689 |
23220
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
690 # run post close action |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
691 categories = sorted(self._postclosecallback) |
3f543f6be500
transaction: allow registering a post-close callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23204
diff
changeset
|
692 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
|
693 self._postclosecallback[cat](self) |
28960
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
694 # Prevent double usage and help clear cycles. |
14e683d6b273
transaction: clear callback instances after usage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28830
diff
changeset
|
695 self._postclosecallback = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
696 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
697 @active |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
698 def abort(self): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
699 """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
|
700 transaction is not explicitly committed before going out of |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45887
diff
changeset
|
701 scope)""" |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
702 self._abort() |
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
703 |
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
|
704 @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
|
705 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
|
706 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
|
707 |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
708 def _writeundo(self): |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
709 """write transaction data for possible future undo call""" |
39691
da9ce63bfa9b
transaction: make undoname a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
710 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
|
711 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
|
712 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
|
713 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
|
714 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
|
715 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
|
716 ) |
47428
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
717 |
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
|
718 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
|
719 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
|
720 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
|
721 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
|
722 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
|
723 |
47428
88439c6fbafc
transaction: simplify `undo.backupfiles` file creation with a variable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47426
diff
changeset
|
724 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:
47426
diff
changeset
|
725 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
|
726 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
|
727 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
|
728 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
|
729 continue |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
730 if not b: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
731 u = b'' |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
732 else: |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
733 if l not in self._vfsmap and c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
734 self._report( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
735 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
|
736 b"%s\n" % (b, l) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
737 ) |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
738 continue |
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
739 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
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 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
|
746 # 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
|
747 # 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
|
748 # 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
|
749 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
|
750 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
|
751 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
|
752 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
|
753 pass |
23904
d251da5e0e84
transaction: include backup file in the "undo" transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23903
diff
changeset
|
754 |
8289
fe8a3e56039f
transaction: ensure finished transactions are not reused
Henrik Stuart <hg@hstuart.dk>
parents:
8225
diff
changeset
|
755 def _abort(self): |
45886
a985c4fb23ca
transaction: change list of journal entries into a dictionary
Joerg Sonnenberger <joerg@bec.de>
parents:
45885
diff
changeset
|
756 entries = self.readjournal() |
39690
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
757 self._count = 0 |
3e8952c0cb45
transaction: make count and usages private attributes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36827
diff
changeset
|
758 self._usages = 0 |
39693
d27fde3e023e
transaction: make file a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
759 self._file.close() |
23249
84720eab4fbd
transaction: mark backup-related attributes private
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23248
diff
changeset
|
760 self._backupsfile.close() |
8290
560af1bbfd6e
transaction: reset transaction on abort
Henrik Stuart <hg@hstuart.dk>
parents:
8289
diff
changeset
|
761 |
50049
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
762 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
|
763 try: |
50050
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50049
diff
changeset
|
764 if not quick: |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50049
diff
changeset
|
765 self._report(_(b"transaction abort!\n")) |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50049
diff
changeset
|
766 for cat in sorted(self._abortcallback): |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50049
diff
changeset
|
767 self._abortcallback[cat](self) |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50049
diff
changeset
|
768 # Prevent double usage and help clear cycles. |
3128018e878b
transaction: run abort callback in all cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50049
diff
changeset
|
769 self._abortcallback = None |
50049
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
770 if quick: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
771 self._do_quick_abort(entries) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
772 else: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
773 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
|
774 finally: |
39692
77c4e2ae9f07
transaction: make journal a private attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
775 self._journal = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
776 self._releasefn(self, False) # notify failure of transaction |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
777 self._releasefn = None # Help prevent cycles. |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
778 |
50049
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
779 def _can_quick_abort(self, entries): |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
780 """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:
49314
diff
changeset
|
781 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
782 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:
49314
diff
changeset
|
783 if entries: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
784 return False |
50051
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50050
diff
changeset
|
785 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:
50050
diff
changeset
|
786 if e[1]: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50050
diff
changeset
|
787 return False |
50049
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
788 return True |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
789 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
790 def _do_quick_abort(self, entries): |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
791 """(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:
49314
diff
changeset
|
792 assert self._can_quick_abort(entries) |
50051
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50050
diff
changeset
|
793 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:
50050
diff
changeset
|
794 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:
50050
diff
changeset
|
795 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:
50050
diff
changeset
|
796 try: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50050
diff
changeset
|
797 vfs.unlink(tmp_path) |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50050
diff
changeset
|
798 except FileNotFoundError: |
27fd12eca557
transaction: quietly rollback if no other changes than temporary files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50050
diff
changeset
|
799 pass |
50049
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
800 if self._backupjournal: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
801 self._opener.unlink(self._backupjournal) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
802 if self._journal: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
803 self._opener.unlink(self._journal) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
804 |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
805 def _do_full_abort(self, entries): |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
806 """(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:
49314
diff
changeset
|
807 try: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
808 _playback( |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
809 self._journal, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
810 self._report, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
811 self._opener, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
812 self._vfsmap, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
813 entries, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
814 self._backupentries, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
815 False, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
816 checkambigfiles=self._checkambigfiles, |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
817 ) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
818 self._report(_(b"rollback completed\n")) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
819 except BaseException as exc: |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
820 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:
49314
diff
changeset
|
821 self._report( |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
822 _(b"(failure reason: %s)\n") % stringutil.forcebytestr(exc) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
823 ) |
2f348babe30d
transaction: clarify the "quick abort" scenario
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49314
diff
changeset
|
824 |
8290
560af1bbfd6e
transaction: reset transaction on abort
Henrik Stuart <hg@hstuart.dk>
parents:
8289
diff
changeset
|
825 |
47425
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
826 BAD_VERSION_MSG = _( |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
827 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:
47424
diff
changeset
|
828 ) |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
829 |
0e4e9c1b4cc8
transaction: extract message about different version in a constants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
830 |
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
|
831 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
|
832 """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
|
833 |
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
|
834 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
|
835 |
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
|
836 :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
|
837 :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
|
838 :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
|
839 :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
|
840 """ |
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
|
841 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
|
842 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
|
843 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
|
844 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
|
845 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
|
846 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
|
847 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
|
848 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
|
849 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
|
850 # 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
|
851 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
|
852 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
|
853 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
|
854 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
|
855 |
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
|
856 |
50126
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
857 def rollback( |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
858 opener, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
859 vfsmap, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
860 file, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
861 report, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
862 checkambigfiles=None, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
863 skip_journal_pattern=None, |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
864 ): |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
865 """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
|
866 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
867 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
|
868 '*.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
|
869 |
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
870 * `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
|
871 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
|
872 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
|
873 '*.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
|
874 pairs, delimited by \0. |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33099
diff
changeset
|
875 |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33099
diff
changeset
|
876 `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:
33099
diff
changeset
|
877 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:
33099
diff
changeset
|
878 restoring corresponded files. |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
879 """ |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
880 entries = [] |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
881 backupentries = [] |
8294
48a382c23226
transaction: refactor transaction.abort and rollback to use the same code
Henrik Stuart <hg@hstuart.dk>
parents:
8290
diff
changeset
|
882 |
47318
13dd5bb5492a
transaction: trivial refactoring
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
47297
diff
changeset
|
883 with opener.open(file) as fp: |
13dd5bb5492a
transaction: trivial refactoring
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
47297
diff
changeset
|
884 lines = fp.readlines() |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11685
diff
changeset
|
885 for l in lines: |
20524
28b8ff84db3f
journal: report parsing errors on recover/rollback (issue4172)
Matt Mackall <mpm@selenic.com>
parents:
20087
diff
changeset
|
886 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
887 f, o = l.split(b'\0') |
45884
63edc384d3b7
transaction: drop per-file extra data support
Joerg Sonnenberger <joerg@bec.de>
parents:
45738
diff
changeset
|
888 entries.append((f, int(o))) |
20524
28b8ff84db3f
journal: report parsing errors on recover/rollback (issue4172)
Matt Mackall <mpm@selenic.com>
parents:
20087
diff
changeset
|
889 except ValueError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
890 report( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
891 _(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
|
892 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
893 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
894 backupjournal = b"%s.backupfiles" % file |
20882
5dffd06f1e50
transaction: add support for non-append files
Durham Goode <durham@fb.com>
parents:
20881
diff
changeset
|
895 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
|
896 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
|
897 backupentries = read_backup_files(report, fp) |
50126
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
898 if skip_journal_pattern is not None: |
c8f32aa80dca
rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50051
diff
changeset
|
899 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:
50051
diff
changeset
|
900 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
|
901 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
902 _playback( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
903 file, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
904 report, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
905 opener, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
906 vfsmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
907 entries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
908 backupentries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
909 checkambigfiles=checkambigfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43050
diff
changeset
|
910 ) |