##// END OF EJS Templates
run-test: install rhg if --rhg is passed...
run-test: install rhg if --rhg is passed Before this, --rhg was only working with --local. Differential Revision: https://phab.mercurial-scm.org/D10195

File last commit:

r47459:df247f58 default
r47488:9ba00a9d default
Show More
revset.rs
57 lines | 1.6 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::changelog::Changelog;
use crate::revlog::revlog::{Revlog, RevlogError};
use crate::revlog::NodePrefix;
use crate::revlog::{Revision, NULL_REVISION};
/// 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> {
let changelog = Changelog::open(repo)?;
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> {
if let Ok(integer) = input.parse::<i32>() {
if integer >= 0 && revlog.has_rev(integer) {
return Ok(integer);
}
}
if let Ok(prefix) = NodePrefix::from_hex(input) {
return revlog.get_node_rev(prefix);
}
Err(RevlogError::InvalidRevision)
}