annotate rust/hg-core/src/operations/dirstate_status.rs @ 45358:452ece5654c5

hg-core: remove the `Operation` trait There is no way to currently define a trait which can both return references to `self` and to passed data, which is what we would need. Generic Associated Types may fix this and allow us to have a unified interface. See: rust #44265 Differential Revision: https://phab.mercurial-scm.org/D8862
author Antoine Cezar <antoine.cezar@octobus.net>
date Wed, 29 Jul 2020 10:08:09 +0200
parents 98817e5daca7
children 496537c9c1b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45113
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
1 // dirstate_status.rs
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
2 //
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
3 // Copyright 2019, Raphaël Gomès <rgomes@octobus.net>
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
4 //
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
5 // This software may be used and distributed according to the terms of the
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
6 // GNU General Public License version 2 or any later version.
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
7
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
8 use crate::dirstate::status::{build_response, Dispatch, HgPathCow, Status};
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
9 use crate::matchers::Matcher;
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
10 use crate::{DirstateStatus, StatusError};
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
11
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
12 /// A tuple of the paths that need to be checked in the filelog because it's
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
13 /// ambiguous whether they've changed, and the rest of the already dispatched
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
14 /// files.
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
15 pub type LookupAndStatus<'a> = (Vec<HgPathCow<'a>>, DirstateStatus<'a>);
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
16
45358
452ece5654c5 hg-core: remove the `Operation` trait
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45113
diff changeset
17 impl<'a, M: Matcher + Sync> Status<'a, M> {
452ece5654c5 hg-core: remove the `Operation` trait
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45113
diff changeset
18 pub(crate) fn run(&self) -> Result<LookupAndStatus<'a>, StatusError> {
45113
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
19 let (traversed_sender, traversed_receiver) =
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
20 crossbeam::channel::unbounded();
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
21
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
22 // Step 1: check the files explicitly mentioned by the user
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
23 let (work, mut results) = self.walk_explicit(traversed_sender.clone());
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
24
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
25 if !work.is_empty() {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
26 // Hashmaps are quite a bit slower to build than vecs, so only
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
27 // build it if needed.
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
28 let old_results = results.iter().cloned().collect();
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
29
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
30 // Step 2: recursively check the working directory for changes if
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
31 // needed
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
32 for (dir, dispatch) in work {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
33 match dispatch {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
34 Dispatch::Directory { was_file } => {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
35 if was_file {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
36 results.push((dir.to_owned(), Dispatch::Removed));
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
37 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
38 if self.options.list_ignored
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
39 || self.options.list_unknown
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
40 && !self.dir_ignore(&dir)
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
41 {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
42 self.traverse(
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
43 &dir,
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
44 &old_results,
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
45 &mut results,
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
46 traversed_sender.clone(),
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
47 )?;
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
48 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
49 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
50 _ => {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
51 unreachable!("There can only be directories in `work`")
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
52 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
53 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
54 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
55 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
56
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
57 if !self.matcher.is_exact() {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
58 if self.options.list_unknown {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
59 self.handle_unknowns(&mut results)?;
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
60 } else {
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
61 // TODO this is incorrect, see issue6335
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
62 // This requires a fix in both Python and Rust that can happen
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
63 // with other pending changes to `status`.
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
64 self.extend_from_dmap(&mut results);
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
65 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
66 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
67
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
68 drop(traversed_sender);
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
69 let traversed = traversed_receiver.into_iter().collect();
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
70
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
71 Ok(build_response(results, traversed))
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
72 }
98817e5daca7 hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
73 }