##// END OF EJS Templates
copies: do full filtering at end of _changesetforwardcopies()...
copies: do full filtering at end of _changesetforwardcopies() As mentioned earlier, pathcopies() is very slow when copies are stored in the changeset. Most of the cost comes from calling _chain() for every changeset, which is slow because it needs to read manifests. It needs to read manifests to be able to filter out copies that are were created in one commit and then deleted. (It also filters out copies that were created from a file that didn't exist in the starting revision, but that's a fixed revision across calls to _chain(), so it's much cheaper.) This patch changes from _chainandfilter() to just _chain() in the main loop in _changesetforwardcopies(). It instead removes copies that have subsequently been removed by using ctx.filesremoved(). We thus rely on that to be fast. It timed this command in mozilla-unified: hg debugpathcopies FIREFOX_59_0b3_BUILD2 FIREFOX_BETA_59_END It took 18s before and 1.1s after. It's still faster when copy information is stored in filelogs: 0.70s. It also still gets slow when there are merge commits involved, because we read manifests there too. We'll deal with that later. Differential Revision: https://phab.mercurial-scm.org/D6419

File last commit:

r42630:9609430d default
r42685:4c39c99d default
Show More
lib.rs
103 lines | 2.7 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.
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488 extern crate byteorder;
extern crate memchr;
Raphaël Gomès
rust-filepatterns: add a Rust implementation of pattern-related utils...
r42514 #[macro_use]
extern crate lazy_static;
extern crate regex;
Raphaël Gomès
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`...
r42488
Georges Racinet
rust: pure Rust lazyancestors iterator...
r40307 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: create dirstate submodule...
r42617 parsers::{pack_dirstate, parse_dirstate},
CopyVec, CopyVecEntry, DirstateEntry, DirstateParents, DirstateVec,
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-filepatterns: use bytes instead of String...
r42630 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`
Georges Racinet
rust: changed Graph.parents to return [Revision; 2]...
r40969 fn parents(&self, 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),
}
#[derive(Debug, PartialEq)]
pub enum DirstatePackError {
CorruptedEntry(String),
CorruptedParent,
BadSize(usize, usize),
}
impl From<std::io::Error> for DirstatePackError {
fn from(e: std::io::Error) -> Self {
DirstatePackError::CorruptedEntry(e.to_string())
}
}
impl From<std::io::Error> for DirstateParseError {
fn from(e: std::io::Error) -> Self {
DirstateParseError::CorruptedEntry(e.to_string())
}
}
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)
}
}