##// 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 - $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, pynode: PyBytes) -> PyResult<Option<Revision>> {
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, &pynode)?;
66 let node = node_from_py_bytes(py, &node)?;
67 match nt.find_bin(idx, node.into())
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, pynode: PyObject) -> PyResult<Option<PyBytes>> {
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 pynode.cast_as::<PyString>(py)?.to_string(py)?.to_string()
103 node.cast_as::<PyString>(py)?.to_string(py)?.to_string()
114 }
104 }
115 else {
105 else {
116 let node = pynode.extract::<PyBytes>(py)?;
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 match nt.find_bin(idx, prefix) {
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 TestResult(unittest._TextTestResult):
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 | 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 $ 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