Show More
@@ -141,7 +141,7 b' check-pytype-py3:' | |||||
141 | - $PYTHON -m pip install --user -U pytype==2021.04.15 |
|
141 | - $PYTHON -m pip install --user -U pytype==2021.04.15 | |
142 | variables: |
|
142 | variables: | |
143 | RUNTEST_ARGS: " --allow-slow-tests tests/test-check-pytype.t" |
|
143 | RUNTEST_ARGS: " --allow-slow-tests tests/test-check-pytype.t" | |
144 | HGTEST_TIMEOUT: "3600" |
|
144 | HGTEST_SLOWTIMEOUT: "3600" | |
145 | PYTHON: python3 |
|
145 | PYTHON: python3 | |
146 | TEST_HGMODULEPOLICY: "c" |
|
146 | TEST_HGMODULEPOLICY: "c" | |
147 |
|
147 |
@@ -1714,6 +1714,10 b' def applyupdates(' | |||||
1714 | progress.increment(item=f, total=numupdates) |
|
1714 | progress.increment(item=f, total=numupdates) | |
1715 | ms.resolve(f, wctx) |
|
1715 | ms.resolve(f, wctx) | |
1716 |
|
1716 | |||
|
1717 | except error.InterventionRequired: | |||
|
1718 | # If the user has merge.on-failure=halt, catch the error and close the | |||
|
1719 | # merge state "properly". | |||
|
1720 | pass | |||
1717 | finally: |
|
1721 | finally: | |
1718 | ms.commit() |
|
1722 | ms.commit() | |
1719 |
|
1723 |
@@ -589,7 +589,9 b' def _is_revision_affected_inner(' | |||||
589 | except error.CensoredNodeError: |
|
589 | except error.CensoredNodeError: | |
590 | # We don't care about censored nodes as they never carry metadata |
|
590 | # We don't care about censored nodes as they never carry metadata | |
591 | return False |
|
591 | return False | |
592 | has_meta = raw_text.startswith(b'\x01\n') |
|
592 | ||
|
593 | # raw text can be a `memoryview`, which doesn't implement `startswith` | |||
|
594 | has_meta = bytes(raw_text[:2]) == b'\x01\n' | |||
593 | if metadata_cache is not None: |
|
595 | if metadata_cache is not None: | |
594 | metadata_cache[filerev] = has_meta |
|
596 | metadata_cache[filerev] = has_meta | |
595 | if has_meta: |
|
597 | if has_meta: |
@@ -59,22 +59,12 b' py_class!(pub class MixedIndex |py| {' | |||||
59 |
|
59 | |||
60 | /// Return Revision if found, raises a bare `error.RevlogError` |
|
60 | /// Return Revision if found, raises a bare `error.RevlogError` | |
61 | /// in case of ambiguity, same as C version does |
|
61 | /// in case of ambiguity, same as C version does | |
62 |
def get_rev(&self, |
|
62 | def get_rev(&self, node: PyBytes) -> PyResult<Option<Revision>> { | |
63 | let opt = self.get_nodetree(py)?.borrow(); |
|
63 | let opt = self.get_nodetree(py)?.borrow(); | |
64 | let nt = opt.as_ref().unwrap(); |
|
64 | let nt = opt.as_ref().unwrap(); | |
65 | let idx = &*self.cindex(py).borrow(); |
|
65 | let idx = &*self.cindex(py).borrow(); | |
66 |
let node = node_from_py_bytes(py, & |
|
66 | let node = node_from_py_bytes(py, &node)?; | |
67 |
|
|
67 | nt.find_bin(idx, node.into()).map_err(|e| nodemap_error(py, e)) | |
68 | { |
|
|||
69 | Ok(None) => |
|
|||
70 | // fallback to C implementation, remove once |
|
|||
71 | // https://bz.mercurial-scm.org/show_bug.cgi?id=6554 |
|
|||
72 | // is fixed (a simple backout should do) |
|
|||
73 | self.call_cindex(py, "get_rev", &PyTuple::new(py, &[pynode.into_object()]), None)? |
|
|||
74 | .extract(py), |
|
|||
75 | Ok(Some(rev)) => Ok(Some(rev)), |
|
|||
76 | Err(e) => Err(nodemap_error(py, e)), |
|
|||
77 | } |
|
|||
78 | } |
|
68 | } | |
79 |
|
69 | |||
80 | /// same as `get_rev()` but raises a bare `error.RevlogError` if node |
|
70 | /// same as `get_rev()` but raises a bare `error.RevlogError` if node | |
@@ -104,34 +94,27 b' py_class!(pub class MixedIndex |py| {' | |||||
104 | } |
|
94 | } | |
105 | } |
|
95 | } | |
106 |
|
96 | |||
107 |
def partialmatch(&self, |
|
97 | def partialmatch(&self, node: PyObject) -> PyResult<Option<PyBytes>> { | |
108 | let opt = self.get_nodetree(py)?.borrow(); |
|
98 | let opt = self.get_nodetree(py)?.borrow(); | |
109 | let nt = opt.as_ref().unwrap(); |
|
99 | let nt = opt.as_ref().unwrap(); | |
110 | let idx = &*self.cindex(py).borrow(); |
|
100 | let idx = &*self.cindex(py).borrow(); | |
111 |
|
101 | |||
112 | let node_as_string = if cfg!(feature = "python3-sys") { |
|
102 | let node_as_string = if cfg!(feature = "python3-sys") { | |
113 |
|
|
103 | node.cast_as::<PyString>(py)?.to_string(py)?.to_string() | |
114 | } |
|
104 | } | |
115 | else { |
|
105 | else { | |
116 |
let node = |
|
106 | let node = node.extract::<PyBytes>(py)?; | |
117 | String::from_utf8_lossy(node.data(py)).to_string() |
|
107 | String::from_utf8_lossy(node.data(py)).to_string() | |
118 | }; |
|
108 | }; | |
119 |
|
109 | |||
120 | let prefix = NodePrefix::from_hex(&node_as_string).map_err(|_| PyErr::new::<ValueError, _>(py, "Invalid node or prefix"))?; |
|
110 | let prefix = NodePrefix::from_hex(&node_as_string).map_err(|_| PyErr::new::<ValueError, _>(py, "Invalid node or prefix"))?; | |
121 |
|
111 | |||
122 |
|
|
112 | nt.find_bin(idx, prefix) | |
123 | Ok(None) => |
|
113 | // TODO make an inner API returning the node directly | |
124 | // fallback to C implementation, remove once |
|
114 | .map(|opt| opt.map( | |
125 | // https://bz.mercurial-scm.org/show_bug.cgi?id=6554 |
|
115 | |rev| PyBytes::new(py, idx.node(rev).unwrap().as_bytes()))) | |
126 | // is fixed (a simple backout should do) |
|
116 | .map_err(|e| nodemap_error(py, e)) | |
127 | self.call_cindex( |
|
117 | ||
128 | py, "partialmatch", |
|
|||
129 | &PyTuple::new(py, &[pynode]), None |
|
|||
130 | )?.extract(py), |
|
|||
131 | Ok(Some(rev)) => |
|
|||
132 | Ok(Some(PyBytes::new(py, idx.node(rev).unwrap().as_bytes()))), |
|
|||
133 | Err(e) => Err(nodemap_error(py, e)), |
|
|||
134 | } |
|
|||
135 | } |
|
118 | } | |
136 |
|
119 | |||
137 | /// append an index entry |
|
120 | /// append an index entry |
@@ -138,7 +138,7 b' def make_exe(dist):' | |||||
138 | ) |
|
138 | ) | |
139 |
|
139 | |||
140 | # Add Mercurial to resources. |
|
140 | # Add Mercurial to resources. | |
141 | exe.add_python_resources(exe.pip_install(["--verbose", ROOT])) |
|
141 | exe.add_python_resources(exe.pip_install(["--verbose", "--no-use-pep517", ROOT])) | |
142 |
|
142 | |||
143 | # On Windows, we install extra packages for convenience. |
|
143 | # On Windows, we install extra packages for convenience. | |
144 | if IS_WINDOWS: |
|
144 | if IS_WINDOWS: |
@@ -1,9 +1,15 b'' | |||||
1 | from __future__ import absolute_import, print_function |
|
1 | from __future__ import absolute_import, print_function | |
2 |
|
2 | |||
|
3 | import sys | |||
3 | import unittest |
|
4 | import unittest | |
4 |
|
5 | |||
|
6 | if sys.version_info[0] < 3: | |||
|
7 | base_class = unittest._TextTestResult | |||
|
8 | else: | |||
|
9 | base_class = unittest.TextTestResult | |||
5 |
|
10 | |||
6 | class TestResult(unittest._TextTestResult): |
|
11 | ||
|
12 | class TestResult(base_class): | |||
7 | def __init__(self, options, *args, **kwargs): |
|
13 | def __init__(self, options, *args, **kwargs): | |
8 | super(TestResult, self).__init__(*args, **kwargs) |
|
14 | super(TestResult, self).__init__(*args, **kwargs) | |
9 | self._options = options |
|
15 | self._options = options |
@@ -2235,12 +2235,15 b' iolock = threading.RLock()' | |||||
2235 | firstlock = threading.RLock() |
|
2235 | firstlock = threading.RLock() | |
2236 | firsterror = False |
|
2236 | firsterror = False | |
2237 |
|
2237 | |||
2238 |
|
2238 | if PYTHON3: | ||
2239 |
class |
|
2239 | base_class = unittest.TextTestResult | |
|
2240 | else: | |||
|
2241 | base_class = unittest._TextTestResult | |||
|
2242 | ||||
|
2243 | ||||
|
2244 | class TestResult(base_class): | |||
2240 | """Holds results when executing via unittest.""" |
|
2245 | """Holds results when executing via unittest.""" | |
2241 |
|
2246 | |||
2242 | # Don't worry too much about accessing the non-public _TextTestResult. |
|
|||
2243 | # It is relatively common in Python testing tools. |
|
|||
2244 | def __init__(self, options, *args, **kwargs): |
|
2247 | def __init__(self, options, *args, **kwargs): | |
2245 | super(TestResult, self).__init__(*args, **kwargs) |
|
2248 | super(TestResult, self).__init__(*args, **kwargs) | |
2246 |
|
2249 |
@@ -475,7 +475,7 b' share the same server' | |||||
475 | $ hg init $TESTTMP/profiling |
|
475 | $ hg init $TESTTMP/profiling | |
476 | $ cd $TESTTMP/profiling |
|
476 | $ cd $TESTTMP/profiling | |
477 | $ filteredchg() { |
|
477 | $ filteredchg() { | |
478 |
> CHGDEBUG=1 chg "$@" 2>&1 | |
|
478 | > CHGDEBUG=1 chg "$@" 2>&1 | sed -rn 's_^No samples recorded.*$_Sample count: 0_; /Sample count/p; /start cmdserver/p' | |
479 | > } |
|
479 | > } | |
480 | $ newchg() { |
|
480 | $ newchg() { | |
481 | > chg --kill-chg-daemon |
|
481 | > chg --kill-chg-daemon |
@@ -44,7 +44,7 b' Testing on-failure=halt' | |||||
44 | merging a |
|
44 | merging a | |
45 | merging b |
|
45 | merging b | |
46 | merging a failed! |
|
46 | merging a failed! | |
47 | merge halted after failed merge (see hg resolve) |
|
47 | unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') | |
48 | [240] |
|
48 | [240] | |
49 |
|
49 | |||
50 | $ hg resolve --list |
|
50 | $ hg resolve --list | |
@@ -72,7 +72,7 b' Testing on-failure=prompt' | |||||
72 | continue merge operation (yn)? y |
|
72 | continue merge operation (yn)? y | |
73 | merging b failed! |
|
73 | merging b failed! | |
74 | continue merge operation (yn)? n |
|
74 | continue merge operation (yn)? n | |
75 | merge halted after failed merge (see hg resolve) |
|
75 | unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') | |
76 | [240] |
|
76 | [240] | |
77 |
|
77 | |||
78 | $ hg resolve --list |
|
78 | $ hg resolve --list | |
@@ -101,7 +101,7 b' Check that successful tool with failed p' | |||||
101 | was merge successful (yn)? n |
|
101 | was merge successful (yn)? n | |
102 | merging b failed! |
|
102 | merging b failed! | |
103 | continue merge operation (yn)? n |
|
103 | continue merge operation (yn)? n | |
104 | merge halted after failed merge (see hg resolve) |
|
104 | unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') | |
105 | [240] |
|
105 | [240] | |
106 |
|
106 | |||
107 | $ hg resolve --list |
|
107 | $ hg resolve --list | |
@@ -124,7 +124,7 b' Check that conflicts with conflict check' | |||||
124 | merging a |
|
124 | merging a | |
125 | merging b |
|
125 | merging b | |
126 | merging a failed! |
|
126 | merging a failed! | |
127 | merge halted after failed merge (see hg resolve) |
|
127 | unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') | |
128 | [240] |
|
128 | [240] | |
129 |
|
129 | |||
130 | $ hg resolve --list |
|
130 | $ hg resolve --list | |
@@ -145,7 +145,7 b' Check that always-prompt also can halt t' | |||||
145 | was merge of 'a' successful (yn)? y |
|
145 | was merge of 'a' successful (yn)? y | |
146 | was merge of 'b' successful (yn)? n |
|
146 | was merge of 'b' successful (yn)? n | |
147 | merging b failed! |
|
147 | merging b failed! | |
148 | merge halted after failed merge (see hg resolve) |
|
148 | unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') | |
149 | [240] |
|
149 | [240] | |
150 |
|
150 | |||
151 | $ hg resolve --list |
|
151 | $ hg resolve --list | |
@@ -162,3 +162,59 b' Check that successful tool otherwise all' | |||||
162 | merging b |
|
162 | merging b | |
163 | $TESTTMP/repo/a *a~base* *a~other* (glob) |
|
163 | $TESTTMP/repo/a *a~base* *a~other* (glob) | |
164 | $TESTTMP/repo/b *b~base* *b~other* (glob) |
|
164 | $TESTTMP/repo/b *b~base* *b~other* (glob) | |
|
165 | ||||
|
166 | Check that unshelve isn't broken by halting the merge | |||
|
167 | $ cat <<EOS >> $HGRCPATH | |||
|
168 | > [extensions] | |||
|
169 | > shelve = | |||
|
170 | > [merge-tools] | |||
|
171 | > false.check=conflicts | |||
|
172 | > false.premerge=false | |||
|
173 | > EOS | |||
|
174 | $ echo foo > shelve_file1 | |||
|
175 | $ echo foo > shelve_file2 | |||
|
176 | $ hg ci -qAm foo | |||
|
177 | $ echo bar >> shelve_file1 | |||
|
178 | $ echo bar >> shelve_file2 | |||
|
179 | $ hg shelve --list | |||
|
180 | $ hg shelve | |||
|
181 | shelved as default | |||
|
182 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
183 | $ echo baz >> shelve_file1 | |||
|
184 | $ echo baz >> shelve_file2 | |||
|
185 | $ hg ci -m baz | |||
|
186 | $ hg unshelve --tool false --config merge-tools.false.premerge=keep | |||
|
187 | unshelving change 'default' | |||
|
188 | rebasing shelved changes | |||
|
189 | merging shelve_file1 | |||
|
190 | merging shelve_file2 | |||
|
191 | merging shelve_file1 failed! | |||
|
192 | unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue') | |||
|
193 | [240] | |||
|
194 | $ hg status --config commands.status.verbose=True | |||
|
195 | M shelve_file1 | |||
|
196 | M shelve_file2 | |||
|
197 | ? shelve_file1.orig | |||
|
198 | ? shelve_file2.orig | |||
|
199 | # The repository is in an unfinished *unshelve* state. | |||
|
200 | ||||
|
201 | # Unresolved merge conflicts: | |||
|
202 | # | |||
|
203 | # shelve_file1 | |||
|
204 | # shelve_file2 | |||
|
205 | # | |||
|
206 | # To mark files as resolved: hg resolve --mark FILE | |||
|
207 | ||||
|
208 | # To continue: hg unshelve --continue | |||
|
209 | # To abort: hg unshelve --abort | |||
|
210 | ||||
|
211 | $ hg resolve --tool false --all --re-merge | |||
|
212 | merging shelve_file1 | |||
|
213 | merging shelve_file2 | |||
|
214 | merging shelve_file1 failed! | |||
|
215 | merge halted after failed merge (see hg resolve) | |||
|
216 | [240] | |||
|
217 | $ hg shelve --list | |||
|
218 | default (* ago) changes to: foo (glob) | |||
|
219 | $ hg unshelve --abort | |||
|
220 | unshelve of 'default' aborted |
@@ -435,46 +435,6 b" mercurial don't crash" | |||||
435 | data-length: 121088 |
|
435 | data-length: 121088 | |
436 | data-unused: 0 |
|
436 | data-unused: 0 | |
437 | data-unused: 0.000% |
|
437 | data-unused: 0.000% | |
438 |
|
||||
439 | Sub-case: fallback for corrupted data file |
|
|||
440 | ------------------------------------------ |
|
|||
441 |
|
||||
442 | Sabotaging the data file so that nodemap resolutions fail, triggering fallback to |
|
|||
443 | (non-persistent) C implementation. |
|
|||
444 |
|
||||
445 |
|
||||
446 | $ UUID=`hg debugnodemap --metadata| grep 'uid:' | \ |
|
|||
447 | > sed 's/uid: //'` |
|
|||
448 | $ FILE=.hg/store/00changelog-"${UUID}".nd |
|
|||
449 | $ python -c "fobj = open('$FILE', 'r+b'); fobj.write(b'\xff' * 121088); fobj.close()" |
|
|||
450 |
|
||||
451 | The nodemap data file is still considered in sync with the docket. This |
|
|||
452 | would fail without the fallback to the (non-persistent) C implementation: |
|
|||
453 |
|
||||
454 | $ hg log -r b355ef8adce0949b8bdf6afc72ca853740d65944 -T '{rev}\n' --traceback |
|
|||
455 | 5002 |
|
|||
456 |
|
||||
457 | The nodemap data file hasn't been fixed, more tests can be inserted: |
|
|||
458 |
|
||||
459 | $ hg debugnodemap --dump-disk | f --bytes=256 --hexdump --size |
|
|||
460 | size=121088 |
|
|||
461 | 0000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
462 | 0010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
463 | 0020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
464 | 0030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
465 | 0040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
466 | 0050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
467 | 0060: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
468 | 0070: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
469 | 0080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
470 | 0090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
471 | 00a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
472 | 00b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
473 | 00c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
474 | 00d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
475 | 00e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
476 | 00f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| |
|
|||
477 |
|
||||
478 | $ mv ../tmp-data-file $FILE |
|
438 | $ mv ../tmp-data-file $FILE | |
479 | $ mv ../tmp-docket .hg/store/00changelog.n |
|
439 | $ mv ../tmp-docket .hg/store/00changelog.n | |
480 |
|
440 |
General Comments 0
You need to be logged in to leave comments.
Login now