##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r49098:96aa3a68 merge default
parent child Browse files
Show More
@@ -141,7 +141,7 b' check-pytype-py3:'
141 141 - $PYTHON -m pip install --user -U pytype==2021.04.15
142 142 variables:
143 143 RUNTEST_ARGS: " --allow-slow-tests tests/test-check-pytype.t"
144 HGTEST_TIMEOUT: "3600"
144 HGTEST_SLOWTIMEOUT: "3600"
145 145 PYTHON: python3
146 146 TEST_HGMODULEPOLICY: "c"
147 147
@@ -1714,6 +1714,10 b' def applyupdates('
1714 1714 progress.increment(item=f, total=numupdates)
1715 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 1721 finally:
1718 1722 ms.commit()
1719 1723
@@ -589,7 +589,9 b' def _is_revision_affected_inner('
589 589 except error.CensoredNodeError:
590 590 # We don't care about censored nodes as they never carry metadata
591 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 595 if metadata_cache is not None:
594 596 metadata_cache[filerev] = has_meta
595 597 if has_meta:
@@ -59,22 +59,12 b' py_class!(pub class MixedIndex |py| {'
59 59
60 60 /// Return Revision if found, raises a bare `error.RevlogError`
61 61 /// in case of ambiguity, same as C version does
62 def get_rev(&self, pynode: PyBytes) -> PyResult<Option<Revision>> {
62 def get_rev(&self, node: PyBytes) -> PyResult<Option<Revision>> {
63 63 let opt = self.get_nodetree(py)?.borrow();
64 64 let nt = opt.as_ref().unwrap();
65 65 let idx = &*self.cindex(py).borrow();
66 let node = node_from_py_bytes(py, &pynode)?;
67 match nt.find_bin(idx, node.into())
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 }
66 let node = node_from_py_bytes(py, &node)?;
67 nt.find_bin(idx, node.into()).map_err(|e| nodemap_error(py, e))
78 68 }
79 69
80 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, pynode: PyObject) -> PyResult<Option<PyBytes>> {
97 def partialmatch(&self, node: PyObject) -> PyResult<Option<PyBytes>> {
108 98 let opt = self.get_nodetree(py)?.borrow();
109 99 let nt = opt.as_ref().unwrap();
110 100 let idx = &*self.cindex(py).borrow();
111 101
112 102 let node_as_string = if cfg!(feature = "python3-sys") {
113 pynode.cast_as::<PyString>(py)?.to_string(py)?.to_string()
103 node.cast_as::<PyString>(py)?.to_string(py)?.to_string()
114 104 }
115 105 else {
116 let node = pynode.extract::<PyBytes>(py)?;
106 let node = node.extract::<PyBytes>(py)?;
117 107 String::from_utf8_lossy(node.data(py)).to_string()
118 108 };
119 109
120 110 let prefix = NodePrefix::from_hex(&node_as_string).map_err(|_| PyErr::new::<ValueError, _>(py, "Invalid node or prefix"))?;
121 111
122 match nt.find_bin(idx, prefix) {
123 Ok(None) =>
124 // fallback to C implementation, remove once
125 // https://bz.mercurial-scm.org/show_bug.cgi?id=6554
126 // is fixed (a simple backout should do)
127 self.call_cindex(
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 }
112 nt.find_bin(idx, prefix)
113 // TODO make an inner API returning the node directly
114 .map(|opt| opt.map(
115 |rev| PyBytes::new(py, idx.node(rev).unwrap().as_bytes())))
116 .map_err(|e| nodemap_error(py, e))
117
135 118 }
136 119
137 120 /// append an index entry
@@ -138,7 +138,7 b' def make_exe(dist):'
138 138 )
139 139
140 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 143 # On Windows, we install extra packages for convenience.
144 144 if IS_WINDOWS:
@@ -1,9 +1,15 b''
1 1 from __future__ import absolute_import, print_function
2 2
3 import sys
3 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 13 def __init__(self, options, *args, **kwargs):
8 14 super(TestResult, self).__init__(*args, **kwargs)
9 15 self._options = options
@@ -2235,12 +2235,15 b' iolock = threading.RLock()'
2235 2235 firstlock = threading.RLock()
2236 2236 firsterror = False
2237 2237
2238
2239 class TestResult(unittest._TextTestResult):
2238 if PYTHON3:
2239 base_class = unittest.TextTestResult
2240 else:
2241 base_class = unittest._TextTestResult
2242
2243
2244 class TestResult(base_class):
2240 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 2247 def __init__(self, options, *args, **kwargs):
2245 2248 super(TestResult, self).__init__(*args, **kwargs)
2246 2249
@@ -475,7 +475,7 b' share the same server'
475 475 $ hg init $TESTTMP/profiling
476 476 $ cd $TESTTMP/profiling
477 477 $ filteredchg() {
478 > CHGDEBUG=1 chg "$@" 2>&1 | egrep 'Sample count|start cmdserver' || true
478 > CHGDEBUG=1 chg "$@" 2>&1 | sed -rn 's_^No samples recorded.*$_Sample count: 0_; /Sample count/p; /start cmdserver/p'
479 479 > }
480 480 $ newchg() {
481 481 > chg --kill-chg-daemon
@@ -44,7 +44,7 b' Testing on-failure=halt'
44 44 merging a
45 45 merging b
46 46 merging a failed!
47 merge halted after failed merge (see hg resolve)
47 unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
48 48 [240]
49 49
50 50 $ hg resolve --list
@@ -72,7 +72,7 b' Testing on-failure=prompt'
72 72 continue merge operation (yn)? y
73 73 merging b failed!
74 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 76 [240]
77 77
78 78 $ hg resolve --list
@@ -101,7 +101,7 b' Check that successful tool with failed p'
101 101 was merge successful (yn)? n
102 102 merging b failed!
103 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 105 [240]
106 106
107 107 $ hg resolve --list
@@ -124,7 +124,7 b' Check that conflicts with conflict check'
124 124 merging a
125 125 merging b
126 126 merging a failed!
127 merge halted after failed merge (see hg resolve)
127 unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
128 128 [240]
129 129
130 130 $ hg resolve --list
@@ -145,7 +145,7 b' Check that always-prompt also can halt t'
145 145 was merge of 'a' successful (yn)? y
146 146 was merge of 'b' successful (yn)? n
147 147 merging b failed!
148 merge halted after failed merge (see hg resolve)
148 unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
149 149 [240]
150 150
151 151 $ hg resolve --list
@@ -162,3 +162,59 b' Check that successful tool otherwise all'
162 162 merging b
163 163 $TESTTMP/repo/a *a~base* *a~other* (glob)
164 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 435 data-length: 121088
436 436 data-unused: 0
437 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 438 $ mv ../tmp-data-file $FILE
479 439 $ mv ../tmp-docket .hg/store/00changelog.n
480 440
General Comments 0
You need to be logged in to leave comments. Login now