##// END OF EJS Templates
recover: only apply last journal record per file (issue6423)...
recover: only apply last journal record per file (issue6423) This got broken in 2019 when the size check was introduced. It is most noticable when dealing with transactions that involve an inline to non-inline revlog storage transaction. It wasn't seen as much at the time because the in-memory journal actually de-duplicated the entry implicity, but since 63edc384d3b7 the on-disk journal is used for rollback as well as recover. Differential Revision: https://phab.mercurial-scm.org/D10726

File last commit:

r47880:9c6b458a default
r48066:18415fc9 default
Show More
dirstate_status.rs
68 lines | 2.5 KiB | application/rls-services+xml | RustLexer
Raphaël Gomès
hg-core: define a `dirstate_status` `Operation`...
r45673 // dirstate_status.rs
//
// Copyright 2019, Raphaël Gomès <rgomes@octobus.net>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
Simon Sapin
rust: Move "lookup" a.k.a. "unsure" paths into `DirstateStatus` struct...
r47880 use crate::dirstate::status::{build_response, Dispatch, Status};
Raphaël Gomès
hg-core: define a `dirstate_status` `Operation`...
r45673 use crate::matchers::Matcher;
use crate::{DirstateStatus, StatusError};
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 impl<'a, M: ?Sized + Matcher + Sync> Status<'a, M> {
Simon Sapin
rust: Move "lookup" a.k.a. "unsure" paths into `DirstateStatus` struct...
r47880 pub(crate) fn run(&self) -> Result<DirstateStatus<'a>, StatusError> {
Raphaël Gomès
hg-core: define a `dirstate_status` `Operation`...
r45673 let (traversed_sender, traversed_receiver) =
Simon Sapin
rust: use crossbeam-channel crate directly...
r46669 crossbeam_channel::unbounded();
Raphaël Gomès
hg-core: define a `dirstate_status` `Operation`...
r45673
// Step 1: check the files explicitly mentioned by the user
let (work, mut results) = self.walk_explicit(traversed_sender.clone());
if !work.is_empty() {
// Hashmaps are quite a bit slower to build than vecs, so only
// build it if needed.
let old_results = results.iter().cloned().collect();
// Step 2: recursively check the working directory for changes if
// needed
for (dir, dispatch) in work {
match dispatch {
Dispatch::Directory { was_file } => {
if was_file {
results.push((dir.to_owned(), Dispatch::Removed));
}
if self.options.list_ignored
|| self.options.list_unknown
&& !self.dir_ignore(&dir)
{
self.traverse(
&dir,
&old_results,
&mut results,
traversed_sender.clone(),
Raphaël Gomès
rust-status: don't bubble up os errors, translate them to bad matches...
r46466 );
Raphaël Gomès
hg-core: define a `dirstate_status` `Operation`...
r45673 }
}
_ => {
unreachable!("There can only be directories in `work`")
}
}
}
}
if !self.matcher.is_exact() {
if self.options.list_unknown {
Raphaël Gomès
rust-status: don't bubble up os errors, translate them to bad matches...
r46466 self.handle_unknowns(&mut results);
Raphaël Gomès
hg-core: define a `dirstate_status` `Operation`...
r45673 } else {
// TODO this is incorrect, see issue6335
// This requires a fix in both Python and Rust that can happen
// with other pending changes to `status`.
self.extend_from_dmap(&mut results);
}
}
drop(traversed_sender);
let traversed = traversed_receiver.into_iter().collect();
Ok(build_response(results, traversed))
}
}