# HG changeset patch # User Raphaël Gomès # Date 1634829941 -7200 # Node ID 96aa3a68d3b5973e31cd03d2105a2e99b62e6bc4 # Parent d869080503758d124de4a93e9ca94db6a4f57d77# Parent f3e218ae3fd9f661a5545922c82ae73fe71dbfa7 branching: merge stable into default diff -r d86908050375 -r 96aa3a68d3b5 contrib/heptapod-ci.yml --- a/contrib/heptapod-ci.yml Thu Oct 21 11:21:21 2021 +0200 +++ b/contrib/heptapod-ci.yml Thu Oct 21 17:25:41 2021 +0200 @@ -141,7 +141,7 @@ - $PYTHON -m pip install --user -U pytype==2021.04.15 variables: RUNTEST_ARGS: " --allow-slow-tests tests/test-check-pytype.t" - HGTEST_TIMEOUT: "3600" + HGTEST_SLOWTIMEOUT: "3600" PYTHON: python3 TEST_HGMODULEPOLICY: "c" diff -r d86908050375 -r 96aa3a68d3b5 mercurial/merge.py --- a/mercurial/merge.py Thu Oct 21 11:21:21 2021 +0200 +++ b/mercurial/merge.py Thu Oct 21 17:25:41 2021 +0200 @@ -1714,6 +1714,10 @@ progress.increment(item=f, total=numupdates) ms.resolve(f, wctx) + except error.InterventionRequired: + # If the user has merge.on-failure=halt, catch the error and close the + # merge state "properly". + pass finally: ms.commit() diff -r d86908050375 -r 96aa3a68d3b5 mercurial/revlogutils/rewrite.py --- a/mercurial/revlogutils/rewrite.py Thu Oct 21 11:21:21 2021 +0200 +++ b/mercurial/revlogutils/rewrite.py Thu Oct 21 17:25:41 2021 +0200 @@ -589,7 +589,9 @@ except error.CensoredNodeError: # We don't care about censored nodes as they never carry metadata return False - has_meta = raw_text.startswith(b'\x01\n') + + # raw text can be a `memoryview`, which doesn't implement `startswith` + has_meta = bytes(raw_text[:2]) == b'\x01\n' if metadata_cache is not None: metadata_cache[filerev] = has_meta if has_meta: diff -r d86908050375 -r 96aa3a68d3b5 rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs Thu Oct 21 11:21:21 2021 +0200 +++ b/rust/hg-cpython/src/revlog.rs Thu Oct 21 17:25:41 2021 +0200 @@ -59,22 +59,12 @@ /// Return Revision if found, raises a bare `error.RevlogError` /// in case of ambiguity, same as C version does - def get_rev(&self, pynode: PyBytes) -> PyResult> { + def get_rev(&self, node: PyBytes) -> PyResult> { let opt = self.get_nodetree(py)?.borrow(); let nt = opt.as_ref().unwrap(); let idx = &*self.cindex(py).borrow(); - let node = node_from_py_bytes(py, &pynode)?; - match nt.find_bin(idx, node.into()) - { - Ok(None) => - // fallback to C implementation, remove once - // https://bz.mercurial-scm.org/show_bug.cgi?id=6554 - // is fixed (a simple backout should do) - self.call_cindex(py, "get_rev", &PyTuple::new(py, &[pynode.into_object()]), None)? - .extract(py), - Ok(Some(rev)) => Ok(Some(rev)), - Err(e) => Err(nodemap_error(py, e)), - } + let node = node_from_py_bytes(py, &node)?; + nt.find_bin(idx, node.into()).map_err(|e| nodemap_error(py, e)) } /// same as `get_rev()` but raises a bare `error.RevlogError` if node @@ -104,34 +94,27 @@ } } - def partialmatch(&self, pynode: PyObject) -> PyResult> { + def partialmatch(&self, node: PyObject) -> PyResult> { let opt = self.get_nodetree(py)?.borrow(); let nt = opt.as_ref().unwrap(); let idx = &*self.cindex(py).borrow(); let node_as_string = if cfg!(feature = "python3-sys") { - pynode.cast_as::(py)?.to_string(py)?.to_string() + node.cast_as::(py)?.to_string(py)?.to_string() } else { - let node = pynode.extract::(py)?; + let node = node.extract::(py)?; String::from_utf8_lossy(node.data(py)).to_string() }; let prefix = NodePrefix::from_hex(&node_as_string).map_err(|_| PyErr::new::(py, "Invalid node or prefix"))?; - match nt.find_bin(idx, prefix) { - Ok(None) => - // fallback to C implementation, remove once - // https://bz.mercurial-scm.org/show_bug.cgi?id=6554 - // is fixed (a simple backout should do) - self.call_cindex( - py, "partialmatch", - &PyTuple::new(py, &[pynode]), None - )?.extract(py), - Ok(Some(rev)) => - Ok(Some(PyBytes::new(py, idx.node(rev).unwrap().as_bytes()))), - Err(e) => Err(nodemap_error(py, e)), - } + nt.find_bin(idx, prefix) + // TODO make an inner API returning the node directly + .map(|opt| opt.map( + |rev| PyBytes::new(py, idx.node(rev).unwrap().as_bytes()))) + .map_err(|e| nodemap_error(py, e)) + } /// append an index entry diff -r d86908050375 -r 96aa3a68d3b5 rust/hgcli/pyoxidizer.bzl --- a/rust/hgcli/pyoxidizer.bzl Thu Oct 21 11:21:21 2021 +0200 +++ b/rust/hgcli/pyoxidizer.bzl Thu Oct 21 17:25:41 2021 +0200 @@ -138,7 +138,7 @@ ) # Add Mercurial to resources. - exe.add_python_resources(exe.pip_install(["--verbose", ROOT])) + exe.add_python_resources(exe.pip_install(["--verbose", "--no-use-pep517", ROOT])) # On Windows, we install extra packages for convenience. if IS_WINDOWS: diff -r d86908050375 -r 96aa3a68d3b5 tests/basic_test_result.py --- a/tests/basic_test_result.py Thu Oct 21 11:21:21 2021 +0200 +++ b/tests/basic_test_result.py Thu Oct 21 17:25:41 2021 +0200 @@ -1,9 +1,15 @@ from __future__ import absolute_import, print_function +import sys import unittest +if sys.version_info[0] < 3: + base_class = unittest._TextTestResult +else: + base_class = unittest.TextTestResult -class TestResult(unittest._TextTestResult): + +class TestResult(base_class): def __init__(self, options, *args, **kwargs): super(TestResult, self).__init__(*args, **kwargs) self._options = options diff -r d86908050375 -r 96aa3a68d3b5 tests/run-tests.py --- a/tests/run-tests.py Thu Oct 21 11:21:21 2021 +0200 +++ b/tests/run-tests.py Thu Oct 21 17:25:41 2021 +0200 @@ -2235,12 +2235,15 @@ firstlock = threading.RLock() firsterror = False - -class TestResult(unittest._TextTestResult): +if PYTHON3: + base_class = unittest.TextTestResult +else: + base_class = unittest._TextTestResult + + +class TestResult(base_class): """Holds results when executing via unittest.""" - # Don't worry too much about accessing the non-public _TextTestResult. - # It is relatively common in Python testing tools. def __init__(self, options, *args, **kwargs): super(TestResult, self).__init__(*args, **kwargs) diff -r d86908050375 -r 96aa3a68d3b5 tests/test-chg.t --- a/tests/test-chg.t Thu Oct 21 11:21:21 2021 +0200 +++ b/tests/test-chg.t Thu Oct 21 17:25:41 2021 +0200 @@ -475,7 +475,7 @@ $ hg init $TESTTMP/profiling $ cd $TESTTMP/profiling $ filteredchg() { - > CHGDEBUG=1 chg "$@" 2>&1 | egrep 'Sample count|start cmdserver' || true + > CHGDEBUG=1 chg "$@" 2>&1 | sed -rn 's_^No samples recorded.*$_Sample count: 0_; /Sample count/p; /start cmdserver/p' > } $ newchg() { > chg --kill-chg-daemon diff -r d86908050375 -r 96aa3a68d3b5 tests/test-merge-halt.t --- a/tests/test-merge-halt.t Thu Oct 21 11:21:21 2021 +0200 +++ b/tests/test-merge-halt.t Thu Oct 21 17:25:41 2021 +0200 @@ -44,7 +44,7 @@ merging a merging b merging a failed! - merge halted after failed merge (see hg resolve) + unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') [240] $ hg resolve --list @@ -72,7 +72,7 @@ continue merge operation (yn)? y merging b failed! continue merge operation (yn)? n - merge halted after failed merge (see hg resolve) + unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') [240] $ hg resolve --list @@ -101,7 +101,7 @@ was merge successful (yn)? n merging b failed! continue merge operation (yn)? n - merge halted after failed merge (see hg resolve) + unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') [240] $ hg resolve --list @@ -124,7 +124,7 @@ merging a merging b merging a failed! - merge halted after failed merge (see hg resolve) + unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') [240] $ hg resolve --list @@ -145,7 +145,7 @@ was merge of 'a' successful (yn)? y was merge of 'b' successful (yn)? n merging b failed! - merge halted after failed merge (see hg resolve) + unresolved conflicts (see 'hg resolve', then 'hg rebase --continue') [240] $ hg resolve --list @@ -162,3 +162,59 @@ merging b $TESTTMP/repo/a *a~base* *a~other* (glob) $TESTTMP/repo/b *b~base* *b~other* (glob) + +Check that unshelve isn't broken by halting the merge + $ cat <> $HGRCPATH + > [extensions] + > shelve = + > [merge-tools] + > false.check=conflicts + > false.premerge=false + > EOS + $ echo foo > shelve_file1 + $ echo foo > shelve_file2 + $ hg ci -qAm foo + $ echo bar >> shelve_file1 + $ echo bar >> shelve_file2 + $ hg shelve --list + $ hg shelve + shelved as default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo baz >> shelve_file1 + $ echo baz >> shelve_file2 + $ hg ci -m baz + $ hg unshelve --tool false --config merge-tools.false.premerge=keep + unshelving change 'default' + rebasing shelved changes + merging shelve_file1 + merging shelve_file2 + merging shelve_file1 failed! + unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue') + [240] + $ hg status --config commands.status.verbose=True + M shelve_file1 + M shelve_file2 + ? shelve_file1.orig + ? shelve_file2.orig + # The repository is in an unfinished *unshelve* state. + + # Unresolved merge conflicts: + # + # shelve_file1 + # shelve_file2 + # + # To mark files as resolved: hg resolve --mark FILE + + # To continue: hg unshelve --continue + # To abort: hg unshelve --abort + + $ hg resolve --tool false --all --re-merge + merging shelve_file1 + merging shelve_file2 + merging shelve_file1 failed! + merge halted after failed merge (see hg resolve) + [240] + $ hg shelve --list + default (* ago) changes to: foo (glob) + $ hg unshelve --abort + unshelve of 'default' aborted diff -r d86908050375 -r 96aa3a68d3b5 tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t Thu Oct 21 11:21:21 2021 +0200 +++ b/tests/test-persistent-nodemap.t Thu Oct 21 17:25:41 2021 +0200 @@ -435,46 +435,6 @@ data-length: 121088 data-unused: 0 data-unused: 0.000% - -Sub-case: fallback for corrupted data file ------------------------------------------- - -Sabotaging the data file so that nodemap resolutions fail, triggering fallback to -(non-persistent) C implementation. - - - $ UUID=`hg debugnodemap --metadata| grep 'uid:' | \ - > sed 's/uid: //'` - $ FILE=.hg/store/00changelog-"${UUID}".nd - $ python -c "fobj = open('$FILE', 'r+b'); fobj.write(b'\xff' * 121088); fobj.close()" - -The nodemap data file is still considered in sync with the docket. This -would fail without the fallback to the (non-persistent) C implementation: - - $ hg log -r b355ef8adce0949b8bdf6afc72ca853740d65944 -T '{rev}\n' --traceback - 5002 - -The nodemap data file hasn't been fixed, more tests can be inserted: - - $ hg debugnodemap --dump-disk | f --bytes=256 --hexdump --size - size=121088 - 0000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0060: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0070: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 0090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 00a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 00b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 00c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 00d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 00e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - 00f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| - $ mv ../tmp-data-file $FILE $ mv ../tmp-docket .hg/store/00changelog.n