lib.rs
192 lines
| 5.5 KiB
| application/rls-services+xml
|
RustLexer
Georges Racinet
|
r44455 | // Copyright 2018-2020 Georges Racinet <georges.racinet@octobus.net> | ||
// and Mercurial contributors | ||||
Georges Racinet
|
r40307 | // | ||
// 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
|
r41278 | pub mod dagops; | ||
Georges Racinet
|
r41084 | pub use ancestors::{AncestorsIterator, LazyAncestors, MissingAncestors}; | ||
Raphaël Gomès
|
r42489 | mod dirstate; | ||
Georges Racinet
|
r42355 | pub mod discovery; | ||
Raphaël Gomès
|
r42489 | pub mod testing; // unconditionally built, for use from integration tests | ||
pub use dirstate::{ | ||||
Yuya Nishihara
|
r43155 | dirs_multiset::{DirsMultiset, DirsMultisetIter}, | ||
Raphaël Gomès
|
r42998 | dirstate_map::DirstateMap, | ||
Raphaël Gomès
|
r42993 | parsers::{pack_dirstate, parse_dirstate, PARENT_SIZE}, | ||
Raphaël Gomès
|
r45015 | status::{ | ||
status, BadMatch, BadType, DirstateStatus, StatusError, StatusOptions, | ||||
}, | ||||
Yuya Nishihara
|
r43156 | CopyMap, CopyMapIter, DirstateEntry, DirstateParents, EntryState, | ||
StateMap, StateMapIter, | ||||
Raphaël Gomès
|
r42489 | }; | ||
Raphaël Gomès
|
r42514 | mod filepatterns; | ||
Raphaël Gomès
|
r43742 | pub mod matchers; | ||
Georges Racinet
|
r44457 | pub mod revlog; | ||
pub use revlog::*; | ||||
Antoine Cezar
|
r45501 | pub mod operations; | ||
Raphaël Gomès
|
r42829 | pub mod utils; | ||
Raphaël Gomès
|
r42514 | |||
Raphaël Gomès
|
r45037 | // Remove this to see (potential) non-artificial compile failures. MacOS | ||
// *should* compile, but fail to compile tests for example as of 2020-03-06 | ||||
#[cfg(not(target_os = "linux"))] | ||||
compile_error!( | ||||
"`hg-core` has only been tested on Linux and will most \ | ||||
likely not behave correctly on other platforms." | ||||
); | ||||
Raphaël Gomès
|
r44765 | use crate::utils::hg_path::{HgPathBuf, HgPathError}; | ||
Raphaël Gomès
|
r42514 | pub use filepatterns::{ | ||
Raphaël Gomès
|
r44784 | parse_pattern_syntax, read_pattern_file, IgnorePattern, | ||
PatternFileWarning, PatternSyntax, | ||||
Raphaël Gomès
|
r42514 | }; | ||
Raphaël Gomès
|
r44278 | use std::collections::HashMap; | ||
use twox_hash::RandomXxHashBuilder64; | ||||
Georges Racinet
|
r40307 | |||
Raphaël Gomès
|
r45028 | /// This is a contract between the `micro-timer` crate and us, to expose | ||
/// the `log` crate as `crate::log`. | ||||
use log; | ||||
Raphaël Gomès
|
r42514 | pub type LineNumber = usize; | ||
Raphaël Gomès
|
r44278 | /// 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>; | ||||
Georges Racinet
|
r40307 | #[derive(Clone, Debug, PartialEq)] | ||
Raphaël Gomès
|
r42488 | pub enum DirstateParseError { | ||
TooLittleData, | ||||
Overflow, | ||||
Antoine Cezar
|
r45923 | // TODO refactor to use bytes instead of String | ||
Raphaël Gomès
|
r42488 | CorruptedEntry(String), | ||
Raphaël Gomès
|
r42993 | Damaged, | ||
Raphaël Gomès
|
r42488 | } | ||
Raphaël Gomès
|
r42994 | 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
|
r42488 | #[derive(Debug, PartialEq)] | ||
pub enum DirstatePackError { | ||||
CorruptedEntry(String), | ||||
CorruptedParent, | ||||
BadSize(usize, usize), | ||||
} | ||||
Raphaël Gomès
|
r42994 | impl From<std::io::Error> for DirstatePackError { | ||
fn from(e: std::io::Error) -> Self { | ||||
DirstatePackError::CorruptedEntry(e.to_string()) | ||||
} | ||||
} | ||||
Raphaël Gomès
|
r42736 | #[derive(Debug, PartialEq)] | ||
pub enum DirstateMapError { | ||||
Raphaël Gomès
|
r43227 | PathNotFound(HgPathBuf), | ||
Raphaël Gomès
|
r42736 | EmptyPath, | ||
Raphaël Gomès
|
r44765 | InvalidPath(HgPathError), | ||
Raphaël Gomès
|
r44227 | } | ||
impl ToString for DirstateMapError { | ||||
fn to_string(&self) -> String { | ||||
match self { | ||||
Raphaël Gomès
|
r44765 | DirstateMapError::PathNotFound(_) => { | ||
"expected a value, found none".to_string() | ||||
Raphaël Gomès
|
r44227 | } | ||
Raphaël Gomès
|
r44765 | DirstateMapError::EmptyPath => "Overflow in dirstate.".to_string(), | ||
DirstateMapError::InvalidPath(e) => e.to_string(), | ||||
Raphaël Gomès
|
r44227 | } | ||
} | ||||
Raphaël Gomès
|
r42736 | } | ||
Raphaël Gomès
|
r45052 | #[derive(Debug)] | ||
Raphaël Gomès
|
r42994 | 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
|
r42488 | } | ||
} | ||||
Raphaël Gomès
|
r42994 | impl From<DirstatePackError> for DirstateError { | ||
fn from(e: DirstatePackError) -> Self { | ||||
DirstateError::Pack(e) | ||||
Raphaël Gomès
|
r42488 | } | ||
} | ||||
Raphaël Gomès
|
r42514 | |||
#[derive(Debug)] | ||||
pub enum PatternError { | ||||
Raphaël Gomès
|
r44784 | Path(HgPathError), | ||
Raphaël Gomès
|
r42514 | UnsupportedSyntax(String), | ||
Raphaël Gomès
|
r44784 | UnsupportedSyntaxInFile(String, String, usize), | ||
TooLong(usize), | ||||
IO(std::io::Error), | ||||
Raphaël Gomès
|
r44785 | /// 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), | ||||
Raphaël Gomès
|
r42514 | } | ||
Raphaël Gomès
|
r44784 | impl ToString for PatternError { | ||
fn to_string(&self) -> String { | ||||
match self { | ||||
PatternError::UnsupportedSyntax(syntax) => { | ||||
format!("Unsupported syntax {}", syntax) | ||||
} | ||||
PatternError::UnsupportedSyntaxInFile(syntax, file_path, line) => { | ||||
format!( | ||||
"{}:{}: unsupported syntax {}", | ||||
file_path, line, syntax | ||||
) | ||||
} | ||||
PatternError::TooLong(size) => { | ||||
format!("matcher pattern is too long ({} bytes)", size) | ||||
} | ||||
PatternError::IO(e) => e.to_string(), | ||||
PatternError::Path(e) => e.to_string(), | ||||
Raphaël Gomès
|
r44785 | PatternError::NonRegexPattern(pattern) => { | ||
format!("'{:?}' cannot be turned into a regex", pattern) | ||||
} | ||||
Raphaël Gomès
|
r44784 | } | ||
Raphaël Gomès
|
r42514 | } | ||
} | ||||
Raphaël Gomès
|
r42994 | |||
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) | ||||
} | ||||
} | ||||
Raphaël Gomès
|
r44784 | |||
impl From<std::io::Error> for PatternError { | ||||
fn from(e: std::io::Error) -> Self { | ||||
PatternError::IO(e) | ||||
} | ||||
} | ||||
impl From<HgPathError> for PatternError { | ||||
fn from(e: HgPathError) -> Self { | ||||
PatternError::Path(e) | ||||
} | ||||
} | ||||