##// END OF EJS Templates
exchange: ensure all outgoing subrepo references are present before pushing...
exchange: ensure all outgoing subrepo references are present before pushing We've run into occasional problems with people committing a repo, and then amending or rebasing in the subrepo. That makes it so that the revision in the parent can't be checked out, and the problem gets propagated on push. Mercurial already tries to defend against this sort of dangling reference by pushing *all* subrepo revisions first. This reuses the checks that trigger warnings in `hg verify` to bail on the push unless using `--force`. I thought about putting this on the server side, but at that point, all of the data has been transferred, only to bail out. Additionally, SCM Manager hosts subrepos in a location that isn't nested in the parent, so normal subrepo code would complain that the subrepo is missing when run on the server. Because the push command pushes subrepos before calling this exchange code, a subrepo will be pushed before the parent is verified. Not great, but no dangling references are exchanged, so it solves the problem. This code isn't in the loop that pushes the subrepos because: 1) the list of outgoing revisions is needed to limit the scope of the check 2) the loop only accesses the current revision, and therefore can miss subrepos that were dropped in previous commits 3) this code is called when pushing a subrepo, so the protection is recursive I'm not sure if there's a cheap check for the list of files in the outgoing bundle. If there is, that would provide a fast path to bypass this check for people not using subrepos (or if no subrepo changes were made). There's probably also room for verifying other references like tags. But since that doesn't break checkouts, it's much less of a problem. Differential Revision: https://phab.mercurial-scm.org/D7616

File last commit:

r43227:7a01778b default
r44365:4b7d5d10 default
Show More
exceptions.rs
72 lines | 2.2 KiB | application/rls-services+xml | RustLexer
Georges Racinet
rust-cpython: rustdoc improvements...
r41220 // ancestors.rs
//
// Copyright 2018 Georges Racinet <gracinet@anybox.fr>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
//! Bindings for Rust errors
//!
//! [`GraphError`] exposes `hg::GraphError` as a subclass of `ValueError`
Georges Racinet
rust: error for WdirUnsupported with cpython conversion as exception...
r41385 //! but some variants of `hg::GraphError` can be converted directly to other
//! existing Python exceptions if appropriate.
Georges Racinet
rust-cpython: rustdoc improvements...
r41220 //!
//! [`GraphError`]: struct.GraphError.html
Raphaël Gomès
rust: switch hg-core and hg-cpython to rust 2018 edition...
r42828 use cpython::{
exc::{IOError, RuntimeError, ValueError},
py_exception, PyErr, Python,
};
Georges Racinet
rust-cpython: start cpython crate bindings...
r41001 use hg;
py_exception!(rustext, GraphError, ValueError);
impl GraphError {
pub fn pynew(py: Python, inner: hg::GraphError) -> PyErr {
match inner {
hg::GraphError::ParentOutOfRange(r) => {
GraphError::new(py, ("ParentOutOfRange", r))
}
Georges Racinet
rust: error for WdirUnsupported with cpython conversion as exception...
r41385 hg::GraphError::WorkingDirectoryUnsupported => {
match py
.import("mercurial.error")
.and_then(|m| m.get(py, "WdirUnsupported"))
Raphaël Gomès
rust: run rfmt on all hg-core/hg-cpython code...
r42760 {
Err(e) => e,
Ok(cls) => PyErr::from_instance(py, cls),
}
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 }
}
}
}
py_exception!(rustext, PatternError, RuntimeError);
py_exception!(rustext, PatternFileError, RuntimeError);
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 py_exception!(rustext, HgPathPyError, RuntimeError);
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515
impl PatternError {
pub fn pynew(py: Python, inner: hg::PatternError) -> PyErr {
match inner {
hg::PatternError::UnsupportedSyntax(m) => {
PatternError::new(py, ("PatternError", m))
}
}
}
}
impl PatternFileError {
pub fn pynew(py: Python, inner: hg::PatternFileError) -> PyErr {
match inner {
hg::PatternFileError::IO(e) => {
Raphaël Gomès
rust: run rfmt on all hg-core/hg-cpython code...
r42760 let value = (e.raw_os_error().unwrap_or(2), e.to_string());
Raphaël Gomès
rust: switch hg-core and hg-cpython to rust 2018 edition...
r42828 PyErr::new::<IOError, _>(py, value)
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 }
Raphaël Gomès
rust: run rfmt on all hg-core/hg-cpython code...
r42760 hg::PatternFileError::Pattern(e, l) => match e {
hg::PatternError::UnsupportedSyntax(m) => {
PatternFileError::new(py, ("PatternFileError", m, l))
Georges Racinet
rust: error for WdirUnsupported with cpython conversion as exception...
r41385 }
Raphaël Gomès
rust: run rfmt on all hg-core/hg-cpython code...
r42760 },
Georges Racinet
rust-cpython: start cpython crate bindings...
r41001 }
}
}
Raphaël Gomès
rust-cpython: add macro for sharing references...
r42997
py_exception!(shared_ref, AlreadyBorrowed, RuntimeError);