##// END OF EJS Templates
rust-index: using `hg::index::Index` in `hg-cpython::dagops`...
rust-index: using `hg::index::Index` in `hg-cpython::dagops` Hooking `headrevs` to the Rust index is straightforward as long as we go the `PySharedRef` way. Direct attempts of obtaining a reference to the inner `hg::index::Index` fail for lifetime reasons: the reference is bound to the GIL, yet the `as_set` local variable is considered to be static (the borrow checker clearly does not realize or care that this set only stores `Revision` values). In `rank()`, the chosen solution is the simplest as far as `hg-cpython` is concerned, but it has the defect of removing an implementation that would be easily adaptable if the core index did implement `RankedGraph` (returning the same error as long as only `REVLOGV1` is supported), but that would introduce a direct dependency of `hg-core` on the ``vcsgraph` crate.

File last commit:

r51759:c112cc9e default
r52134:578c049f default
Show More
lib.rs
144 lines | 4.2 KiB | application/rls-services+xml | RustLexer
// Copyright 2018-2020 Georges Racinet <georges.racinet@octobus.net>
// and Mercurial contributors
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
mod ancestors;
pub mod dagops;
pub mod errors;
pub mod narrow;
pub mod sparse;
pub use ancestors::{AncestorsIterator, MissingAncestors};
pub mod dirstate;
pub mod dirstate_tree;
pub mod discovery;
pub mod exit_codes;
pub mod requirements;
pub mod testing; // unconditionally built, for use from integration tests
pub use dirstate::{
dirs_multiset::{DirsMultiset, DirsMultisetIter},
status::{
BadMatch, BadType, DirstateStatus, HgPathCow, StatusError,
StatusOptions,
},
DirstateEntry, DirstateParents, EntryState,
};
pub mod copy_tracing;
pub mod filepatterns;
pub mod matchers;
pub mod repo;
pub mod revlog;
pub use revlog::*;
pub mod checkexec;
pub mod config;
pub mod lock;
pub mod logging;
pub mod operations;
pub mod revset;
pub mod utils;
pub mod vfs;
use crate::utils::hg_path::{HgPathBuf, HgPathError};
pub use filepatterns::{
parse_pattern_syntax, read_pattern_file, IgnorePattern,
PatternFileWarning, PatternSyntax,
};
use std::collections::HashMap;
use std::fmt;
use twox_hash::RandomXxHashBuilder64;
pub type LineNumber = usize;
/// Rust's default hasher is too slow because it tries to prevent collision
/// attacks. We are not concerned about those: if an ill-minded person has
/// write access to your repository, you have other issues.
pub type FastHashMap<K, V> = HashMap<K, V, RandomXxHashBuilder64>;
// TODO: should this be the default `FastHashMap` for all of hg-core, not just
// dirstate_tree? How does XxHash compare with AHash, hashbrown’s default?
pub type FastHashbrownMap<K, V> =
hashbrown::HashMap<K, V, RandomXxHashBuilder64>;
#[derive(Debug, PartialEq)]
pub enum DirstateMapError {
PathNotFound(HgPathBuf),
InvalidPath(HgPathError),
}
impl From<HgPathError> for DirstateMapError {
fn from(error: HgPathError) -> Self {
Self::InvalidPath(error)
}
}
impl fmt::Display for DirstateMapError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
DirstateMapError::PathNotFound(_) => {
f.write_str("expected a value, found none")
}
DirstateMapError::InvalidPath(path_error) => path_error.fmt(f),
}
}
}
#[derive(Debug, derive_more::From)]
pub enum DirstateError {
Map(DirstateMapError),
Common(errors::HgError),
}
impl From<HgPathError> for DirstateError {
fn from(error: HgPathError) -> Self {
Self::Map(DirstateMapError::InvalidPath(error))
}
}
impl fmt::Display for DirstateError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
DirstateError::Map(error) => error.fmt(f),
DirstateError::Common(error) => error.fmt(f),
}
}
}
#[derive(Debug, derive_more::From)]
pub enum PatternError {
#[from]
Path(HgPathError),
UnsupportedSyntax(String),
UnsupportedSyntaxInFile(String, String, usize),
TooLong(usize),
#[from]
IO(std::io::Error),
/// Needed a pattern that can be turned into a regex but got one that
/// can't. This should only happen through programmer error.
NonRegexPattern(IgnorePattern),
}
impl fmt::Display for PatternError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
PatternError::UnsupportedSyntax(syntax) => {
write!(f, "Unsupported syntax {}", syntax)
}
PatternError::UnsupportedSyntaxInFile(syntax, file_path, line) => {
write!(
f,
"{}:{}: unsupported syntax {}",
file_path, line, syntax
)
}
PatternError::TooLong(size) => {
write!(f, "matcher pattern is too long ({} bytes)", size)
}
PatternError::IO(error) => error.fmt(f),
PatternError::Path(error) => error.fmt(f),
PatternError::NonRegexPattern(pattern) => {
write!(f, "'{:?}' cannot be turned into a regex", pattern)
}
}
}
}