# HG changeset patch # User Yuya Nishihara # Date 1548410123 -32400 # Node ID 0ae3ddb4fbed67b5c70e6ab3cd70d9d5e2a0b7ac # Parent 40787a96fda70b0db8294861c951ad09c0643a9a# Parent ab0d762d89ef6e2fdcf2a4cc31e9889ea04bc13b merge with stable diff -r 40787a96fda7 -r 0ae3ddb4fbed mercurial/revlog.py --- a/mercurial/revlog.py Thu Jan 24 15:03:00 2019 -0500 +++ b/mercurial/revlog.py Fri Jan 25 18:55:23 2019 +0900 @@ -396,6 +396,11 @@ newversionflags = REVLOGV1 | FLAG_INLINE_DATA if 'generaldelta' in opts: newversionflags |= FLAG_GENERALDELTA + elif getattr(self.opener, 'options', None) is not None: + # If options provided but no 'revlog*' found, the repository + # would have no 'requires' file in it, which means we have to + # stick to the old format. + newversionflags = REVLOGV0 else: newversionflags = REVLOG_DEFAULT_VERSION @@ -896,8 +901,6 @@ common = [nullrev] if rustext is not None: - # TODO: WdirUnsupported should be raised instead of GraphError - # if common includes wdirrev return rustext.ancestor.MissingAncestors(self.index, common) return ancestor.incrementalmissingancestors(self.parentrevs, common) diff -r 40787a96fda7 -r 0ae3ddb4fbed mercurial/setdiscovery.py --- a/mercurial/setdiscovery.py Thu Jan 24 15:03:00 2019 -0500 +++ b/mercurial/setdiscovery.py Fri Jan 25 18:55:23 2019 +0900 @@ -183,7 +183,8 @@ def addcommons(self, commons): """registrer nodes known as common""" self._common.addbases(commons) - self._common.removeancestorsfrom(self.undecided) + if self._undecided is not None: + self._common.removeancestorsfrom(self._undecided) def addmissings(self, missings): """registrer some nodes as missing""" diff -r 40787a96fda7 -r 0ae3ddb4fbed mercurial/ui.py --- a/mercurial/ui.py Thu Jan 24 15:03:00 2019 -0500 +++ b/mercurial/ui.py Fri Jan 25 18:55:23 2019 +0900 @@ -999,15 +999,47 @@ "cmdname.type" is recommended. For example, status issues a label of "status.modified" for modified files. ''' - self._write(self._fout, *args, **opts) + dest = self._fout + + # inlined _write() for speed + if self._buffers: + label = opts.get(r'label', '') + if label and self._bufferapplylabels: + self._buffers[-1].extend(self.label(a, label) for a in args) + else: + self._buffers[-1].extend(args) + return + + # inliend _writenobuf() for speed + self._progclear() + msg = b''.join(args) + + # opencode timeblockedsection because this is a critical path + starttime = util.timer() + try: + if self._colormode == 'win32': + # windows color printing is its own can of crab, defer to + # the color module and that is it. + color.win32print(self, dest.write, msg, **opts) + else: + if self._colormode is not None: + label = opts.get(r'label', '') + msg = self.label(msg, label) + dest.write(msg) + except IOError as err: + raise error.StdioError(err) + finally: + self._blockedtimes['stdio_blocked'] += \ + (util.timer() - starttime) * 1000 def write_err(self, *args, **opts): self._write(self._ferr, *args, **opts) def _write(self, dest, *args, **opts): + # update write() as well if you touch this code if self._isbuffered(dest): - if self._bufferapplylabels: - label = opts.get(r'label', '') + label = opts.get(r'label', '') + if label and self._bufferapplylabels: self._buffers[-1].extend(self.label(a, label) for a in args) else: self._buffers[-1].extend(args) @@ -1015,6 +1047,7 @@ self._writenobuf(dest, *args, **opts) def _writenobuf(self, dest, *args, **opts): + # update write() as well if you touch this code self._progclear() msg = b''.join(args) diff -r 40787a96fda7 -r 0ae3ddb4fbed rust/hg-core/src/lib.rs --- a/rust/hg-core/src/lib.rs Thu Jan 24 15:03:00 2019 -0500 +++ b/rust/hg-core/src/lib.rs Fri Jan 25 18:55:23 2019 +0900 @@ -16,6 +16,12 @@ pub const NULL_REVISION: Revision = -1; +/// Same as `mercurial.node.wdirrev` +/// +/// This is also equal to `i32::max_value()`, but it's better to spell +/// it out explicitely, same as in `mercurial.node` +pub const WORKING_DIRECTORY_REVISION: Revision = 0x7fffffff; + /// The simplest expression of what we need of Mercurial DAGs. pub trait Graph { /// Return the two parents of the given `Revision`. @@ -27,4 +33,5 @@ #[derive(Clone, Debug, PartialEq)] pub enum GraphError { ParentOutOfRange(Revision), + WorkingDirectoryUnsupported, } diff -r 40787a96fda7 -r 0ae3ddb4fbed rust/hg-cpython/src/cindex.rs --- a/rust/hg-cpython/src/cindex.rs Thu Jan 24 15:03:00 2019 -0500 +++ b/rust/hg-cpython/src/cindex.rs Fri Jan 25 18:55:23 2019 +0900 @@ -16,7 +16,7 @@ use self::python_sys::PyCapsule_Import; use cpython::{PyClone, PyErr, PyObject, PyResult, Python}; -use hg::{Graph, GraphError, Revision}; +use hg::{Graph, GraphError, Revision, WORKING_DIRECTORY_REVISION}; use libc::c_int; use std::ffi::CStr; use std::mem::transmute; @@ -86,6 +86,9 @@ impl Graph for Index { /// wrap a call to the C extern parents function fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> { + if rev == WORKING_DIRECTORY_REVISION { + return Err(GraphError::WorkingDirectoryUnsupported); + } let mut res: [c_int; 2] = [0; 2]; let code = unsafe { (self.parents)( diff -r 40787a96fda7 -r 0ae3ddb4fbed rust/hg-cpython/src/exceptions.rs --- a/rust/hg-cpython/src/exceptions.rs Thu Jan 24 15:03:00 2019 -0500 +++ b/rust/hg-cpython/src/exceptions.rs Fri Jan 25 18:55:23 2019 +0900 @@ -8,6 +8,8 @@ //! Bindings for Rust errors //! //! [`GraphError`] exposes `hg::GraphError` as a subclass of `ValueError` +//! but some variants of `hg::GraphError` can be converted directly to other +//! existing Python exceptions if appropriate. //! //! [`GraphError`]: struct.GraphError.html use cpython::exc::ValueError; @@ -22,6 +24,15 @@ hg::GraphError::ParentOutOfRange(r) => { GraphError::new(py, ("ParentOutOfRange", r)) } + hg::GraphError::WorkingDirectoryUnsupported => { + match py + .import("mercurial.error") + .and_then(|m| m.get(py, "WdirUnsupported")) + { + Err(e) => e, + Ok(cls) => PyErr::from_instance(py, cls), + } + } } } } diff -r 40787a96fda7 -r 0ae3ddb4fbed tests/test-clone.t --- a/tests/test-clone.t Thu Jan 24 15:03:00 2019 -0500 +++ b/tests/test-clone.t Fri Jan 25 18:55:23 2019 +0900 @@ -717,6 +717,9 @@ $ hg -R src commit -m '#0' $ hg -R src log -q 0:e1bab28bca43 + $ hg -R src debugrevlog -c | egrep 'format|flags' + format : 0 + flags : (none) $ hg clone -U -q src dst $ hg -R dst log -q 0:e1bab28bca43 diff -r 40787a96fda7 -r 0ae3ddb4fbed tests/test-rust-ancestor.py --- a/tests/test-rust-ancestor.py Thu Jan 24 15:03:00 2019 -0500 +++ b/tests/test-rust-ancestor.py Fri Jan 25 18:55:23 2019 +0900 @@ -2,6 +2,11 @@ import sys import unittest +from mercurial import ( + error, + node, +) + try: from mercurial import rustext rustext.__name__ # trigger immediate actual import @@ -153,6 +158,12 @@ # rust-cpython issues appropriate str instances for Python 2 and 3 self.assertEqual(exc.args, ('ParentOutOfRange', 1)) + def testwdirunsupported(self): + # trying to access ancestors of the working directory raises + # WdirUnsupported directly + idx = self.parseindex() + with self.assertRaises(error.WdirUnsupported): + list(AncestorsIterator(idx, [node.wdirrev], -1, False)) if __name__ == '__main__': import silenttestrunner