author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
Tue, 09 Apr 2024 11:12:24 +0100 | |
changeset 51602 | 68929cf3c0c6 |
parent 46607 | e9901d01d135 |
child 51864 | 1c5810ce737e |
permissions | -rw-r--r-- |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
1 |
from ..i18n import _ |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
2 |
from .. import error |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
3 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
4 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
5 |
def get_checker(ui, revlog_name=b'changelog'): |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
6 |
"""Get a function that checks file handle position is as expected. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
7 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
8 |
This is used to ensure that files haven't been modified outside of our |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
9 |
knowledge (such as on a networked filesystem, if `hg debuglocks` was used, |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
10 |
or writes to .hg that ignored locks happened). |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
11 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
12 |
Due to revlogs supporting a concept of buffered, delayed, or diverted |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
13 |
writes, we're allowing the files to be shorter than expected (the data may |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
14 |
not have been written yet), but they can't be longer. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
15 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
16 |
Please note that this check is not perfect; it can't detect all cases (there |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
17 |
may be false-negatives/false-OKs), but it should never claim there's an |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
18 |
issue when there isn't (false-positives/false-failures). |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
19 |
""" |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
20 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
21 |
vpos = ui.config(b'debug', b'revlog.verifyposition.' + revlog_name) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
22 |
# Avoid any `fh.tell` cost if this isn't enabled. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
23 |
if not vpos or vpos not in [b'log', b'warn', b'fail']: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
24 |
return None |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
25 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
26 |
def _checker(fh, fn, expected): |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
27 |
if fh.tell() <= expected: |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
28 |
return |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
29 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
30 |
msg = _(b'%s: file cursor at position %d, expected %d') |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
31 |
# Always log if we're going to warn or fail. |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
32 |
ui.log(b'debug', msg + b'\n', fn, fh.tell(), expected) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
33 |
if vpos == b'warn': |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
34 |
ui.warn((msg + b'\n') % (fn, fh.tell(), expected)) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
35 |
elif vpos == b'fail': |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
36 |
raise error.RevlogError(msg % (fn, fh.tell(), expected)) |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
37 |
|
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
diff
changeset
|
38 |
return _checker |