##// END OF EJS Templates
rust-dirstate: rust implementation of dirstatemap...
rust-dirstate: rust implementation of dirstatemap The `dirstatemap` is one of the last building blocks needed to get to a `dirstate.walk` Rust implementation. Disclaimer: This change is part of a big (10) series of patches, all of which started as one big changeset that took a long time to write. This `dirstatemap` implementation is a compromise in terms of complexity both for me and for the reviewers. I chose to submit this patch right now because while it is not perfect, it works and is simple enough (IMHO) to be reviewed. The Python implementation uses a lot of lazy propertycaches, breaks encapsulation and is used as an iterator in a lot of places, all of which dictated the somewhat unidiomatic patterns in this change. Like written in the comments, rewriting this struct to use the typestate pattern might be a good idea, but this is a good first step. Differential Revision: https://phab.mercurial-scm.org/D6632

File last commit:

r42980:565c143f default
r42980:565c143f default
Show More
lib.rs
149 lines | 3.9 KiB | application/rls-services+xml | RustLexer
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 // 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.
mod ancestors;
Georges Racinet on ishtar.racinet.fr
rust: dagop.headrevs() Rust counterparts...
r41278 pub mod dagops;
Georges Racinet
rust: core implementation for lazyancestors...
r41084 pub use ancestors::{AncestorsIterator, LazyAncestors, MissingAncestors};
Raphaël Gomès
rust-dirstate: add rust-cpython bindings to the new parse/pack functions...
r42489 mod dirstate;
Georges Racinet
rust-discovery: starting core implementation...
r42355 pub mod discovery;
Raphaël Gomès
rust-dirstate: add rust-cpython bindings to the new parse/pack functions...
r42489 pub mod testing; // unconditionally built, for use from integration tests
pub use dirstate::{
Raphaël Gomès
rust-dirstate: add "dirs" Rust implementation...
r42736 dirs_multiset::DirsMultiset,
Raphaël Gomès
rust-dirstate: rust implementation of dirstatemap...
r42980 dirstate_map::DirstateMap,
Raphaël Gomès
rust-parsers: switch to parse/pack_dirstate to mutate-on-loop...
r42975 parsers::{pack_dirstate, parse_dirstate, PARENT_SIZE},
Raphaël Gomès
rust-dirstate: use EntryState enum instead of literals...
r42976 CopyMap, DirsIterable, DirstateEntry, DirstateParents, EntryState,
StateMap,
Raphaël Gomès
rust-dirstate: add rust-cpython bindings to the new parse/pack functions...
r42489 };
Raphaël Gomès
rust-filepatterns: add a Rust implementation of pattern-related utils...
r42514 mod filepatterns;
Raphaël Gomès
rust-utils: add docstrings and doctests for utils.rs...
r42829 pub mod utils;
Raphaël Gomès
rust-filepatterns: add a Rust implementation of pattern-related utils...
r42514
pub use filepatterns::{
build_single_regex, read_pattern_file, PatternSyntax, PatternTuple,
};
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307
/// Mercurial revision numbers
///
/// As noted in revlog.c, revision numbers are actually encoded in
/// 4 bytes, and are liberally converted to ints, whence the i32
pub type Revision = i32;
Georges Racinet
rust: itering less on MissingAncestors.bases for max()...
r41866 /// Marker expressing the absence of a parent
///
/// Independently of the actual representation, `NULL_REVISION` is guaranteed
/// to be smaller that all existing revisions.
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 pub const NULL_REVISION: Revision = -1;
Georges Racinet
rust: working directory revision number constant...
r41384 /// 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;
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 /// The simplest expression of what we need of Mercurial DAGs.
pub trait Graph {
Georges Racinet
rust: translation of missingancestors...
r40995 /// Return the two parents of the given `Revision`.
///
/// Each of the parents can be independently `NULL_REVISION`
Raphaël Gomès
rust: switch hg-core and hg-cpython to rust 2018 edition...
r42828 fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError>;
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 }
Raphaël Gomès
rust-filepatterns: add a Rust implementation of pattern-related utils...
r42514 pub type LineNumber = usize;
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 #[derive(Clone, Debug, PartialEq)]
pub enum GraphError {
ParentOutOfRange(Revision),
Georges Racinet
rust: error for WdirUnsupported with cpython conversion as exception...
r41385 WorkingDirectoryUnsupported,
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 }
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488
#[derive(Clone, Debug, PartialEq)]
pub enum DirstateParseError {
TooLittleData,
Overflow,
CorruptedEntry(String),
Raphaël Gomès
rust-parsers: switch to parse/pack_dirstate to mutate-on-loop...
r42975 Damaged,
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488 }
Raphaël Gomès
rust-dirstate: use EntryState enum instead of literals...
r42976 impl From<std::io::Error> for DirstateParseError {
fn from(e: std::io::Error) -> Self {
DirstateParseError::CorruptedEntry(e.to_string())
}
}
impl ToString for DirstateParseError {
fn to_string(&self) -> String {
use crate::DirstateParseError::*;
match self {
TooLittleData => "Too little data for dirstate.".to_string(),
Overflow => "Overflow in dirstate.".to_string(),
CorruptedEntry(e) => format!("Corrupted entry: {:?}.", e),
Damaged => "Dirstate appears to be damaged.".to_string(),
}
}
}
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488 #[derive(Debug, PartialEq)]
pub enum DirstatePackError {
CorruptedEntry(String),
CorruptedParent,
BadSize(usize, usize),
}
Raphaël Gomès
rust-dirstate: use EntryState enum instead of literals...
r42976 impl From<std::io::Error> for DirstatePackError {
fn from(e: std::io::Error) -> Self {
DirstatePackError::CorruptedEntry(e.to_string())
}
}
Raphaël Gomès
rust-dirstate: add "dirs" Rust implementation...
r42736 #[derive(Debug, PartialEq)]
pub enum DirstateMapError {
PathNotFound(Vec<u8>),
EmptyPath,
}
Raphaël Gomès
rust-dirstate: use EntryState enum instead of literals...
r42976 pub enum DirstateError {
Parse(DirstateParseError),
Pack(DirstatePackError),
Map(DirstateMapError),
IO(std::io::Error),
}
impl From<DirstateParseError> for DirstateError {
fn from(e: DirstateParseError) -> Self {
DirstateError::Parse(e)
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488 }
}
Raphaël Gomès
rust-dirstate: use EntryState enum instead of literals...
r42976 impl From<DirstatePackError> for DirstateError {
fn from(e: DirstatePackError) -> Self {
DirstateError::Pack(e)
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488 }
}
Raphaël Gomès
rust-filepatterns: add a Rust implementation of pattern-related utils...
r42514
#[derive(Debug)]
pub enum PatternError {
UnsupportedSyntax(String),
}
#[derive(Debug)]
pub enum PatternFileError {
IO(std::io::Error),
Pattern(PatternError, LineNumber),
}
impl From<std::io::Error> for PatternFileError {
fn from(e: std::io::Error) -> Self {
PatternFileError::IO(e)
}
}
Raphaël Gomès
rust-dirstate: use EntryState enum instead of literals...
r42976
impl From<DirstateMapError> for DirstateError {
fn from(e: DirstateMapError) -> Self {
DirstateError::Map(e)
}
}
impl From<std::io::Error> for DirstateError {
fn from(e: std::io::Error) -> Self {
DirstateError::IO(e)
}
}