##// END OF EJS Templates
rhg: Reuse manifest when checking status of multiple ambiguous files...
rhg: Reuse manifest when checking status of multiple ambiguous files When `rhg status` cannot determine whether a file is clean based on mtime and size alone, it needs to compare its contents with those found in the parent commit. Previously, rhg would find the (same) manifest of that commit again for every such file. This is lifted out of the loop and reused. Differential Revision: https://phab.mercurial-scm.org/D11411

File last commit:

r48776:8c29af0f default
r48778:796206e7 default
Show More
revset.rs
67 lines | 1.9 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 //! The revset query language
//!
//! <https://www.mercurial-scm.org/repo/hg/help/revsets>
Simon Sapin
rhg: Fall back to Python for unsupported revset syntax...
r47459 use crate::errors::HgError;
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 use crate::repo::Repo;
use crate::revlog::revlog::{Revlog, RevlogError};
use crate::revlog::NodePrefix;
Pulkit Goyal
rhg: raise wdir specific error for `hg debugdata`...
r47577 use crate::revlog::{Revision, NULL_REVISION, WORKING_DIRECTORY_HEX};
use crate::Node;
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162
/// Resolve a query string into a single revision.
///
/// Only some of the revset language is implemented yet.
pub fn resolve_single(
input: &str,
repo: &Repo,
) -> Result<Revision, RevlogError> {
Simon Sapin
rust: Keep lazily-initialized Changelog and Manifest log on the Repo object...
r48773 let changelog = repo.changelog()?;
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162
match resolve_rev_number_or_hex_prefix(input, &changelog.revlog) {
Err(RevlogError::InvalidRevision) => {} // Try other syntax
result => return result,
}
if input == "null" {
return Ok(NULL_REVISION);
}
// TODO: support for the rest of the language here.
Simon Sapin
rhg: Fall back to Python for unsupported revset syntax...
r47459 Err(
HgError::unsupported(format!("cannot parse revset '{}'", input))
.into(),
)
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 }
/// Resolve the small subset of the language suitable for revlogs other than
/// the changelog, such as in `hg debugdata --manifest` CLI argument.
///
/// * A non-negative decimal integer for a revision number, or
/// * An hexadecimal string, for the unique node ID that starts with this
/// prefix
pub fn resolve_rev_number_or_hex_prefix(
input: &str,
revlog: &Revlog,
) -> Result<Revision, RevlogError> {
Simon Sapin
rhg: Align with Python on some revset parsing corner cases...
r48776 // The Python equivalent of this is part of `revsymbol` in
// `mercurial/scmutil.py`
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 if let Ok(integer) = input.parse::<i32>() {
Simon Sapin
rhg: Align with Python on some revset parsing corner cases...
r48776 if integer.to_string() == input
&& integer >= 0
&& revlog.has_rev(integer)
{
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 return Ok(integer);
}
}
if let Ok(prefix) = NodePrefix::from_hex(input) {
Pulkit Goyal
rhg: raise wdir specific error for `hg debugdata`...
r47577 if prefix.is_prefix_of(&Node::from_hex(WORKING_DIRECTORY_HEX).unwrap())
{
return Err(RevlogError::WDirUnsupported);
}
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 return revlog.get_node_rev(prefix);
}
Err(RevlogError::InvalidRevision)
}