author | Antoine Cezar <antoine.cezar@octobus.net> |
Wed, 29 Jul 2020 10:08:09 +0200 | |
changeset 45378 | 452ece5654c5 |
parent 45113 | 98817e5daca7 |
child 45613 | 496537c9c1b4 |
permissions | -rw-r--r-- |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
1 |
// status.rs |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
2 |
// |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
3 |
// Copyright 2019 Raphaël Gomès <rgomes@octobus.net> |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
4 |
// |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
5 |
// This software may be used and distributed according to the terms of the |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
6 |
// GNU General Public License version 2 or any later version. |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
7 |
|
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
8 |
//! Rust implementation of dirstate.status (dirstate.py). |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
9 |
//! It is currently missing a lot of functionality compared to the Python one |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
10 |
//! and will only be triggered in narrow cases. |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
11 |
|
43649
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Raphaël Gomès <rgomes@octobus.net>
parents:
43648
diff
changeset
|
12 |
use crate::{ |
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Raphaël Gomès <rgomes@octobus.net>
parents:
43648
diff
changeset
|
13 |
dirstate::SIZE_FROM_OTHER_PARENT, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
14 |
filepatterns::PatternFileWarning, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
15 |
matchers::{get_ignore_function, Matcher, VisitChildrenSet}, |
43649
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Raphaël Gomès <rgomes@octobus.net>
parents:
43648
diff
changeset
|
16 |
utils::{ |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
17 |
files::{find_dirs, HgMetadata}, |
44533
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
18 |
hg_path::{ |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
19 |
hg_path_to_path_buf, os_string_to_hg_path_buf, HgPath, HgPathBuf, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
20 |
HgPathError, |
44533
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
21 |
}, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
22 |
path_auditor::PathAuditor, |
43649
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Raphaël Gomès <rgomes@octobus.net>
parents:
43648
diff
changeset
|
23 |
}, |
44537
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44536
diff
changeset
|
24 |
CopyMap, DirstateEntry, DirstateMap, EntryState, FastHashMap, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
25 |
PatternError, |
43649
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Raphaël Gomès <rgomes@octobus.net>
parents:
43648
diff
changeset
|
26 |
}; |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
27 |
use lazy_static::lazy_static; |
44551
d880805d5442
hg-core: add function timing information
Raphaël Gomès <rgomes@octobus.net>
parents:
44549
diff
changeset
|
28 |
use micro_timer::timed; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
29 |
use rayon::prelude::*; |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
30 |
use std::{ |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
31 |
borrow::Cow, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
32 |
collections::HashSet, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
33 |
fs::{read_dir, DirEntry}, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
34 |
io::ErrorKind, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
35 |
ops::Deref, |
44604
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44571
diff
changeset
|
36 |
path::{Path, PathBuf}, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
37 |
}; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
38 |
|
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
39 |
/// Wrong type of file from a `BadMatch` |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
40 |
/// Note: a lot of those don't exist on all platforms. |
44546
f8a9922a02cb
rust-status: move to recursive traversal to prepare for parallel traversal
Raphaël Gomès <rgomes@octobus.net>
parents:
44545
diff
changeset
|
41 |
#[derive(Debug, Copy, Clone)] |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
42 |
pub enum BadType { |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
43 |
CharacterDevice, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
44 |
BlockDevice, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
45 |
FIFO, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
46 |
Socket, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
47 |
Directory, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
48 |
Unknown, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
49 |
} |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
50 |
|
44539
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
51 |
impl ToString for BadType { |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
52 |
fn to_string(&self) -> String { |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
53 |
match self { |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
54 |
BadType::CharacterDevice => "character device", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
55 |
BadType::BlockDevice => "block device", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
56 |
BadType::FIFO => "fifo", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
57 |
BadType::Socket => "socket", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
58 |
BadType::Directory => "directory", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
59 |
BadType::Unknown => "unknown", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
60 |
} |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
61 |
.to_string() |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
62 |
} |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
63 |
} |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents:
44538
diff
changeset
|
64 |
|
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
65 |
/// Was explicitly matched but cannot be found/accessed |
44546
f8a9922a02cb
rust-status: move to recursive traversal to prepare for parallel traversal
Raphaël Gomès <rgomes@octobus.net>
parents:
44545
diff
changeset
|
66 |
#[derive(Debug, Copy, Clone)] |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
67 |
pub enum BadMatch { |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
68 |
OsError(i32), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
69 |
BadType(BadType), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
70 |
} |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
71 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
72 |
/// Enum used to dispatch new status entries into the right collections. |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
73 |
/// Is similar to `crate::EntryState`, but represents the transient state of |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
74 |
/// entries during the lifetime of a command. |
44546
f8a9922a02cb
rust-status: move to recursive traversal to prepare for parallel traversal
Raphaël Gomès <rgomes@octobus.net>
parents:
44545
diff
changeset
|
75 |
#[derive(Debug, Copy, Clone)] |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
76 |
pub enum Dispatch { |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
77 |
Unsure, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
78 |
Modified, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
79 |
Added, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
80 |
Removed, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
81 |
Deleted, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
82 |
Clean, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
83 |
Unknown, |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
84 |
Ignored, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
85 |
/// Empty dispatch, the file is not worth listing |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
86 |
None, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
87 |
/// Was explicitly matched but cannot be found/accessed |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
88 |
Bad(BadMatch), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
89 |
Directory { |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
90 |
/// True if the directory used to be a file in the dmap so we can say |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
91 |
/// that it's been removed. |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
92 |
was_file: bool, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
93 |
}, |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
94 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
95 |
|
43921
8c77826116f7
rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43836
diff
changeset
|
96 |
type IoResult<T> = std::io::Result<T>; |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
97 |
|
44604
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44571
diff
changeset
|
98 |
/// `Box<dyn Trait>` is syntactic sugar for `Box<dyn Trait, 'static>`, so add |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44571
diff
changeset
|
99 |
/// an explicit lifetime here to not fight `'static` bounds "out of nowhere". |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44571
diff
changeset
|
100 |
type IgnoreFnType<'a> = Box<dyn for<'r> Fn(&'r HgPath) -> bool + Sync + 'a>; |
43921
8c77826116f7
rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43836
diff
changeset
|
101 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
102 |
/// We have a good mix of owned (from directory traversal) and borrowed (from |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
103 |
/// the dirstate/explicit) paths, this comes up a lot. |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
104 |
pub type HgPathCow<'a> = Cow<'a, HgPath>; |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
105 |
|
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
106 |
/// A path with its computed ``Dispatch`` information |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
107 |
type DispatchedPath<'a> = (HgPathCow<'a>, Dispatch); |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
108 |
|
43648
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
109 |
/// Dates and times that are outside the 31-bit signed range are compared |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
110 |
/// modulo 2^31. This should prevent hg from behaving badly with very large |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
111 |
/// files or corrupt dates while still having a high probability of detecting |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
112 |
/// changes. (issue2608) |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
113 |
/// TODO I haven't found a way of having `b` be `Into<i32>`, since `From<u64>` |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
114 |
/// is not defined for `i32`, and there is no `As` trait. This forces the |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
115 |
/// caller to cast `b` as `i32`. |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
116 |
fn mod_compare(a: i32, b: i32) -> bool { |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
117 |
a & i32::max_value() != b & i32::max_value() |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
118 |
} |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
119 |
|
44533
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
120 |
/// Return a sorted list containing information about the entries |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
121 |
/// in the directory. |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
122 |
/// |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
123 |
/// * `skip_dot_hg` - Return an empty vec if `path` contains a `.hg` directory |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
124 |
fn list_directory( |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
125 |
path: impl AsRef<Path>, |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
126 |
skip_dot_hg: bool, |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
127 |
) -> std::io::Result<Vec<(HgPathBuf, DirEntry)>> { |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
128 |
let mut results = vec![]; |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
129 |
let entries = read_dir(path.as_ref())?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
130 |
|
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
131 |
for entry in entries { |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
132 |
let entry = entry?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
133 |
let filename = os_string_to_hg_path_buf(entry.file_name())?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
134 |
let file_type = entry.file_type()?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
135 |
if skip_dot_hg && filename.as_bytes() == b".hg" && file_type.is_dir() { |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
136 |
return Ok(vec![]); |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
137 |
} else { |
44998
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44967
diff
changeset
|
138 |
results.push((filename, entry)) |
44533
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
139 |
} |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
140 |
} |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
141 |
|
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
142 |
results.sort_unstable_by_key(|e| e.0.clone()); |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
143 |
Ok(results) |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
144 |
} |
0d97bcb3cee9
rust-status: add util for listing a directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44268
diff
changeset
|
145 |
|
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
146 |
/// The file corresponding to the dirstate entry was found on the filesystem. |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
147 |
fn dispatch_found( |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
148 |
filename: impl AsRef<HgPath>, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
149 |
entry: DirstateEntry, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
150 |
metadata: HgMetadata, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
151 |
copy_map: &CopyMap, |
44534
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
152 |
options: StatusOptions, |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
153 |
) -> Dispatch { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
154 |
let DirstateEntry { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
155 |
state, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
156 |
mode, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
157 |
mtime, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
158 |
size, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
159 |
} = entry; |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
160 |
|
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
161 |
let HgMetadata { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
162 |
st_mode, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
163 |
st_size, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
164 |
st_mtime, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
165 |
.. |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
166 |
} = metadata; |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
167 |
|
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
168 |
match state { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
169 |
EntryState::Normal => { |
43648
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
170 |
let size_changed = mod_compare(size, st_size as i32); |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
171 |
let mode_changed = |
44534
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
172 |
(mode ^ st_mode as i32) & 0o100 != 0o000 && options.check_exec; |
43648
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
173 |
let metadata_changed = size >= 0 && (size_changed || mode_changed); |
43649
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Raphaël Gomès <rgomes@octobus.net>
parents:
43648
diff
changeset
|
174 |
let other_parent = size == SIZE_FROM_OTHER_PARENT; |
44998
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44967
diff
changeset
|
175 |
|
43648
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
176 |
if metadata_changed |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
177 |
|| other_parent |
51cd86735608
rust-status: refactor dispatch case for normal files
Raphaël Gomès <rgomes@octobus.net>
parents:
43647
diff
changeset
|
178 |
|| copy_map.contains_key(filename.as_ref()) |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
179 |
{ |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
180 |
Dispatch::Modified |
44998
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44967
diff
changeset
|
181 |
} else if mod_compare(mtime, st_mtime as i32) |
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44967
diff
changeset
|
182 |
|| st_mtime == options.last_normal_time |
26114bd6ec60
rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents:
44967
diff
changeset
|
183 |
{ |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
184 |
// the file may have just been marked as normal and |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
185 |
// it may have changed in the same second without |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
186 |
// changing its size. This can happen if we quickly |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
187 |
// do multiple commits. Force lookup, so we don't |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
188 |
// miss such a racy file change. |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
189 |
Dispatch::Unsure |
44534
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
190 |
} else if options.list_clean { |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
191 |
Dispatch::Clean |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
192 |
} else { |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
193 |
Dispatch::None |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
194 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
195 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
196 |
EntryState::Merged => Dispatch::Modified, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
197 |
EntryState::Added => Dispatch::Added, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
198 |
EntryState::Removed => Dispatch::Removed, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
199 |
EntryState::Unknown => Dispatch::Unknown, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
200 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
201 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
202 |
|
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
203 |
/// The file corresponding to this Dirstate entry is missing. |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
204 |
fn dispatch_missing(state: EntryState) -> Dispatch { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
205 |
match state { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
206 |
// File was removed from the filesystem during commands |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
207 |
EntryState::Normal | EntryState::Merged | EntryState::Added => { |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
208 |
Dispatch::Deleted |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
209 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
210 |
// File was removed, everything is normal |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
211 |
EntryState::Removed => Dispatch::Removed, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
212 |
// File is unknown to Mercurial, everything is normal |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
213 |
EntryState::Unknown => Dispatch::Unknown, |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
214 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
215 |
} |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
216 |
|
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
217 |
lazy_static! { |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
218 |
static ref DEFAULT_WORK: HashSet<&'static HgPath> = { |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
219 |
let mut h = HashSet::new(); |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
220 |
h.insert(HgPath::new(b"")); |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
221 |
h |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
222 |
}; |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
223 |
} |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
224 |
|
44534
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
225 |
#[derive(Debug, Copy, Clone)] |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
226 |
pub struct StatusOptions { |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
227 |
/// Remember the most recent modification timeslot for status, to make |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
228 |
/// sure we won't miss future size-preserving file content modifications |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
229 |
/// that happen within the same timeslot. |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
230 |
pub last_normal_time: i64, |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
231 |
/// Whether we are on a filesystem with UNIX-like exec flags |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
232 |
pub check_exec: bool, |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
233 |
pub list_clean: bool, |
44537
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44536
diff
changeset
|
234 |
pub list_unknown: bool, |
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44536
diff
changeset
|
235 |
pub list_ignored: bool, |
44897
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
236 |
/// Whether to collect traversed dirs for applying a callback later. |
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
237 |
/// Used by `hg purge` for example. |
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
238 |
pub collect_traversed_dirs: bool, |
44537
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44536
diff
changeset
|
239 |
} |
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Raphaël Gomès <rgomes@octobus.net>
parents:
44536
diff
changeset
|
240 |
|
44571
ece43c79333e
rust-core: add missing `Debug` traits
Raphaël Gomès <rgomes@octobus.net>
parents:
44551
diff
changeset
|
241 |
#[derive(Debug)] |
44535
f13d19549efd
rust-status: rename `StatusResult` to `DirstateStatus`
Raphaël Gomès <rgomes@octobus.net>
parents:
44534
diff
changeset
|
242 |
pub struct DirstateStatus<'a> { |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
243 |
pub modified: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
244 |
pub added: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
245 |
pub removed: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
246 |
pub deleted: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
247 |
pub clean: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
248 |
pub ignored: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
249 |
pub unknown: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
250 |
pub bad: Vec<(HgPathCow<'a>, BadMatch)>, |
44897
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
251 |
/// Only filled if `collect_traversed_dirs` is `true` |
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
252 |
pub traversed: Vec<HgPathBuf>, |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
253 |
} |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
254 |
|
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
255 |
#[derive(Debug)] |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
256 |
pub enum StatusError { |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
257 |
/// Generic IO error |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
258 |
IO(std::io::Error), |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
259 |
/// An invalid path that cannot be represented in Mercurial was found |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
260 |
Path(HgPathError), |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
261 |
/// An invalid "ignore" pattern was found |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
262 |
Pattern(PatternError), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
263 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
264 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
265 |
pub type StatusResult<T> = Result<T, StatusError>; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
266 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
267 |
impl From<PatternError> for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
268 |
fn from(e: PatternError) -> Self { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
269 |
StatusError::Pattern(e) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
270 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
271 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
272 |
impl From<HgPathError> for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
273 |
fn from(e: HgPathError) -> Self { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
274 |
StatusError::Path(e) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
275 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
276 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
277 |
impl From<std::io::Error> for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
278 |
fn from(e: std::io::Error) -> Self { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
279 |
StatusError::IO(e) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
280 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
281 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
282 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
283 |
impl ToString for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
284 |
fn to_string(&self) -> String { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
285 |
match self { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
286 |
StatusError::IO(e) => e.to_string(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
287 |
StatusError::Path(e) => e.to_string(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
288 |
StatusError::Pattern(e) => e.to_string(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
289 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
290 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
291 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
292 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
293 |
/// Gives information about which files are changed in the working directory |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
294 |
/// and how, compared to the revision we're based on |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
295 |
pub struct Status<'a, M: Matcher + Sync> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
296 |
dmap: &'a DirstateMap, |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
297 |
pub(crate) matcher: &'a M, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
298 |
root_dir: PathBuf, |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
299 |
pub(crate) options: StatusOptions, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
300 |
ignore_fn: IgnoreFnType<'a>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
301 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
302 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
303 |
impl<'a, M> Status<'a, M> |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
304 |
where |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
305 |
M: Matcher + Sync, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
306 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
307 |
pub fn new( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
308 |
dmap: &'a DirstateMap, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
309 |
matcher: &'a M, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
310 |
root_dir: PathBuf, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
311 |
ignore_files: Vec<PathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
312 |
options: StatusOptions, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
313 |
) -> StatusResult<(Self, Vec<PatternFileWarning>)> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
314 |
// Needs to outlive `dir_ignore_fn` since it's captured. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
315 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
316 |
let (ignore_fn, warnings): (IgnoreFnType, _) = |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
317 |
if options.list_ignored || options.list_unknown { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
318 |
get_ignore_function(ignore_files, &root_dir)? |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
319 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
320 |
(Box::new(|&_| true), vec![]) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
321 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
322 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
323 |
Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
324 |
Self { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
325 |
dmap, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
326 |
matcher, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
327 |
root_dir, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
328 |
options, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
329 |
ignore_fn, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
330 |
}, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
331 |
warnings, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
332 |
)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
333 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
334 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
335 |
/// Is the path ignored? |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
336 |
pub fn is_ignored(&self, path: impl AsRef<HgPath>) -> bool { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
337 |
(self.ignore_fn)(path.as_ref()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
338 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
339 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
340 |
/// Is the path or one of its ancestors ignored? |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
341 |
pub fn dir_ignore(&self, dir: impl AsRef<HgPath>) -> bool { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
342 |
// Only involve ignore mechanism if we're listing unknowns or ignored. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
343 |
if self.options.list_ignored || self.options.list_unknown { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
344 |
if self.is_ignored(&dir) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
345 |
true |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
346 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
347 |
for p in find_dirs(dir.as_ref()) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
348 |
if self.is_ignored(p) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
349 |
return true; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
350 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
351 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
352 |
false |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
353 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
354 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
355 |
true |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
356 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
357 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
358 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
359 |
/// Get stat data about the files explicitly specified by the matcher. |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
360 |
/// Returns a tuple of the directories that need to be traversed and the |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
361 |
/// files with their corresponding `Dispatch`. |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
362 |
/// TODO subrepos |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
363 |
#[timed] |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
364 |
pub fn walk_explicit( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
365 |
&self, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
366 |
traversed_sender: crossbeam::Sender<HgPathBuf>, |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
367 |
) -> (Vec<DispatchedPath<'a>>, Vec<DispatchedPath<'a>>) { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
368 |
self.matcher |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
369 |
.file_set() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
370 |
.unwrap_or(&DEFAULT_WORK) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
371 |
.par_iter() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
372 |
.map(|&filename| -> Option<IoResult<_>> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
373 |
// TODO normalization |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
374 |
let normalized = filename; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
375 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
376 |
let buf = match hg_path_to_path_buf(normalized) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
377 |
Ok(x) => x, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
378 |
Err(e) => return Some(Err(e.into())), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
379 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
380 |
let target = self.root_dir.join(buf); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
381 |
let st = target.symlink_metadata(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
382 |
let in_dmap = self.dmap.get(normalized); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
383 |
match st { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
384 |
Ok(meta) => { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
385 |
let file_type = meta.file_type(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
386 |
return if file_type.is_file() || file_type.is_symlink() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
387 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
388 |
if let Some(entry) = in_dmap { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
389 |
return Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
390 |
Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
391 |
dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
392 |
&normalized, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
393 |
*entry, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
394 |
HgMetadata::from_metadata(meta), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
395 |
&self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
396 |
self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
397 |
), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
398 |
))); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
399 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
400 |
Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
401 |
Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
402 |
Dispatch::Unknown, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
403 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
404 |
} else if file_type.is_dir() { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
405 |
if self.options.collect_traversed_dirs { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
406 |
traversed_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
407 |
.send(normalized.to_owned()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
408 |
.expect("receiver should outlive sender"); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
409 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
410 |
Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
411 |
Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
412 |
Dispatch::Directory { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
413 |
was_file: in_dmap.is_some(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
414 |
}, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
415 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
416 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
417 |
Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
418 |
Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
419 |
Dispatch::Bad(BadMatch::BadType( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
420 |
// TODO do more than unknown |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
421 |
// Support for all `BadType` variant |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
422 |
// varies greatly between platforms. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
423 |
// So far, no tests check the type and |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
424 |
// this should be good enough for most |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
425 |
// users. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
426 |
BadType::Unknown, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
427 |
)), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
428 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
429 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
430 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
431 |
Err(_) => { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
432 |
if let Some(entry) = in_dmap { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
433 |
return Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
434 |
Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
435 |
dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
436 |
))); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
437 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
438 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
439 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
440 |
None |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
441 |
}) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
442 |
.flatten() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
443 |
.filter_map(Result::ok) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
444 |
.partition(|(_, dispatch)| match dispatch { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
445 |
Dispatch::Directory { .. } => true, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
446 |
_ => false, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
447 |
}) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
448 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
449 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
450 |
/// Walk the working directory recursively to look for changes compared to |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
451 |
/// the current `DirstateMap`. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
452 |
/// |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
453 |
/// This takes a mutable reference to the results to account for the |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
454 |
/// `extend` in timings |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
455 |
#[timed] |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
456 |
pub fn traverse( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
457 |
&self, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
458 |
path: impl AsRef<HgPath>, |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
459 |
old_results: &FastHashMap<HgPathCow<'a>, Dispatch>, |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
460 |
results: &mut Vec<DispatchedPath<'a>>, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
461 |
traversed_sender: crossbeam::Sender<HgPathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
462 |
) -> IoResult<()> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
463 |
// The traversal is done in parallel, so use a channel to gather |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
464 |
// entries. `crossbeam::Sender` is `Sync`, while `mpsc::Sender` |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
465 |
// is not. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
466 |
let (files_transmitter, files_receiver) = |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
467 |
crossbeam::channel::unbounded(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
468 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
469 |
self.traverse_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
470 |
&files_transmitter, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
471 |
path, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
472 |
&old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
473 |
traversed_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
474 |
)?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
475 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
476 |
// Disconnect the channel so the receiver stops waiting |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
477 |
drop(files_transmitter); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
478 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
479 |
// TODO don't collect. Find a way of replicating the behavior of |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
480 |
// `itertools::process_results`, but for `rayon::ParallelIterator` |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
481 |
let new_results: IoResult<Vec<(Cow<HgPath>, Dispatch)>> = |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
482 |
files_receiver |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
483 |
.into_iter() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
484 |
.map(|item| { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
485 |
let (f, d) = item?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
486 |
Ok((Cow::Owned(f), d)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
487 |
}) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
488 |
.collect(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
489 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
490 |
results.par_extend(new_results?); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
491 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
492 |
Ok(()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
493 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
494 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
495 |
/// Dispatch a single entry (file, folder, symlink...) found during |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
496 |
/// `traverse`. If the entry is a folder that needs to be traversed, it |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
497 |
/// will be handled in a separate thread. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
498 |
fn handle_traversed_entry<'b>( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
499 |
&'a self, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
500 |
scope: &rayon::Scope<'b>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
501 |
files_sender: &'b crossbeam::Sender<IoResult<(HgPathBuf, Dispatch)>>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
502 |
old_results: &'a FastHashMap<Cow<HgPath>, Dispatch>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
503 |
filename: HgPathBuf, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
504 |
dir_entry: DirEntry, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
505 |
traversed_sender: crossbeam::Sender<HgPathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
506 |
) -> IoResult<()> |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
507 |
where |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
508 |
'a: 'b, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
509 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
510 |
let file_type = dir_entry.file_type()?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
511 |
let entry_option = self.dmap.get(&filename); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
512 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
513 |
if filename.as_bytes() == b".hg" { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
514 |
// Could be a directory or a symlink |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
515 |
return Ok(()); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
516 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
517 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
518 |
if file_type.is_dir() { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
519 |
self.handle_traversed_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
520 |
scope, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
521 |
files_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
522 |
old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
523 |
entry_option, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
524 |
filename, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
525 |
traversed_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
526 |
); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
527 |
} else if file_type.is_file() || file_type.is_symlink() { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
528 |
if let Some(entry) = entry_option { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
529 |
if self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
530 |
|| self.matcher.matches(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
531 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
532 |
let metadata = dir_entry.metadata()?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
533 |
files_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
534 |
.send(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
535 |
filename.to_owned(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
536 |
dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
537 |
&filename, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
538 |
*entry, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
539 |
HgMetadata::from_metadata(metadata), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
540 |
&self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
541 |
self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
542 |
), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
543 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
544 |
.unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
545 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
546 |
} else if (self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
547 |
|| self.matcher.matches(&filename)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
548 |
&& !self.is_ignored(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
549 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
550 |
if (self.options.list_ignored |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
551 |
|| self.matcher.exact_match(&filename)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
552 |
&& self.dir_ignore(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
553 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
554 |
if self.options.list_ignored { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
555 |
files_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
556 |
.send(Ok((filename.to_owned(), Dispatch::Ignored))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
557 |
.unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
558 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
559 |
} else if self.options.list_unknown { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
560 |
files_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
561 |
.send(Ok((filename.to_owned(), Dispatch::Unknown))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
562 |
.unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
563 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
564 |
} else if self.is_ignored(&filename) && self.options.list_ignored { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
565 |
files_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
566 |
.send(Ok((filename.to_owned(), Dispatch::Ignored))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
567 |
.unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
568 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
569 |
} else if let Some(entry) = entry_option { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
570 |
// Used to be a file or a folder, now something else. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
571 |
if self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
572 |
|| self.matcher.matches(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
573 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
574 |
files_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
575 |
.send(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
576 |
filename.to_owned(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
577 |
dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
578 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
579 |
.unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
580 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
581 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
582 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
583 |
Ok(()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
584 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
585 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
586 |
/// A directory was found in the filesystem and needs to be traversed |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
587 |
fn handle_traversed_dir<'b>( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
588 |
&'a self, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
589 |
scope: &rayon::Scope<'b>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
590 |
files_sender: &'b crossbeam::Sender<IoResult<(HgPathBuf, Dispatch)>>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
591 |
old_results: &'a FastHashMap<Cow<HgPath>, Dispatch>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
592 |
entry_option: Option<&'a DirstateEntry>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
593 |
directory: HgPathBuf, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
594 |
traversed_sender: crossbeam::Sender<HgPathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
595 |
) where |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
596 |
'a: 'b, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
597 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
598 |
scope.spawn(move |_| { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
599 |
// Nested `if` until `rust-lang/rust#53668` is stable |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
600 |
if let Some(entry) = entry_option { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
601 |
// Used to be a file, is now a folder |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
602 |
if self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
603 |
|| self.matcher.matches(&directory) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
604 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
605 |
files_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
606 |
.send(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
607 |
directory.to_owned(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
608 |
dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
609 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
610 |
.unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
611 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
612 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
613 |
// Do we need to traverse it? |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
614 |
if !self.is_ignored(&directory) || self.options.list_ignored { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
615 |
self.traverse_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
616 |
files_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
617 |
directory, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
618 |
&old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
619 |
traversed_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
620 |
) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
621 |
.unwrap_or_else(|e| files_sender.send(Err(e)).unwrap()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
622 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
623 |
}); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
624 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
625 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
626 |
/// Decides whether the directory needs to be listed, and if so handles the |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
627 |
/// entries in a separate thread. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
628 |
fn traverse_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
629 |
&self, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
630 |
files_sender: &crossbeam::Sender<IoResult<(HgPathBuf, Dispatch)>>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
631 |
directory: impl AsRef<HgPath>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
632 |
old_results: &FastHashMap<Cow<HgPath>, Dispatch>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
633 |
traversed_sender: crossbeam::Sender<HgPathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
634 |
) -> IoResult<()> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
635 |
let directory = directory.as_ref(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
636 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
637 |
if self.options.collect_traversed_dirs { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
638 |
traversed_sender |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
639 |
.send(directory.to_owned()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
640 |
.expect("receiver should outlive sender"); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
641 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
642 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
643 |
let visit_entries = match self.matcher.visit_children_set(directory) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
644 |
VisitChildrenSet::Empty => return Ok(()), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
645 |
VisitChildrenSet::This | VisitChildrenSet::Recursive => None, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
646 |
VisitChildrenSet::Set(set) => Some(set), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
647 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
648 |
let buf = hg_path_to_path_buf(directory)?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
649 |
let dir_path = self.root_dir.join(buf); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
650 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
651 |
let skip_dot_hg = !directory.as_bytes().is_empty(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
652 |
let entries = match list_directory(dir_path, skip_dot_hg) { |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
653 |
Err(e) => { |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
654 |
return match e.kind() { |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
655 |
ErrorKind::NotFound | ErrorKind::PermissionDenied => { |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
656 |
files_sender |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
657 |
.send(Ok(( |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
658 |
directory.to_owned(), |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
659 |
Dispatch::Bad(BadMatch::OsError( |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
660 |
// Unwrapping here is OK because the error |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
661 |
// always is a |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
662 |
// real os error |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
663 |
e.raw_os_error().unwrap(), |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
664 |
)), |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
665 |
))) |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
666 |
.expect("receiver should outlive sender"); |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
667 |
Ok(()) |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
668 |
} |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
669 |
_ => Err(e), |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
670 |
}; |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
671 |
} |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
672 |
Ok(entries) => entries, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
673 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
674 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
675 |
rayon::scope(|scope| -> IoResult<()> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
676 |
for (filename, dir_entry) in entries { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
677 |
if let Some(ref set) = visit_entries { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
678 |
if !set.contains(filename.deref()) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
679 |
continue; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
680 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
681 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
682 |
// TODO normalize |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
683 |
let filename = if directory.is_empty() { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
684 |
filename.to_owned() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
685 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
686 |
directory.join(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
687 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
688 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
689 |
if !old_results.contains_key(filename.deref()) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
690 |
self.handle_traversed_entry( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
691 |
scope, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
692 |
files_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
693 |
old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
694 |
filename, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
695 |
dir_entry, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
696 |
traversed_sender.clone(), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
697 |
)?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
698 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
699 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
700 |
Ok(()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
701 |
}) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
702 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
703 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
704 |
/// Checks all files that are in the dirstate but were not found during the |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
705 |
/// working directory traversal. This means that the rest must |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
706 |
/// be either ignored, under a symlink or under a new nested repo. |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
707 |
/// |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
708 |
/// This takes a mutable reference to the results to account for the |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
709 |
/// `extend` in timings |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
710 |
#[timed] |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
711 |
pub fn handle_unknowns( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
712 |
&self, |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
713 |
results: &mut Vec<DispatchedPath<'a>>, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
714 |
) -> IoResult<()> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
715 |
let to_visit: Vec<(&HgPath, &DirstateEntry)> = |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
716 |
if results.is_empty() && self.matcher.matches_everything() { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
717 |
self.dmap.iter().map(|(f, e)| (f.deref(), e)).collect() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
718 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
719 |
// Only convert to a hashmap if needed. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
720 |
let old_results: FastHashMap<_, _> = |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
721 |
results.iter().cloned().collect(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
722 |
self.dmap |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
723 |
.iter() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
724 |
.filter_map(move |(f, e)| { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
725 |
if !old_results.contains_key(f.deref()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
726 |
&& self.matcher.matches(f) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
727 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
728 |
Some((f.deref(), e)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
729 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
730 |
None |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
731 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
732 |
}) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
733 |
.collect() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
734 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
735 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
736 |
let path_auditor = PathAuditor::new(&self.root_dir); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
737 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
738 |
// TODO don't collect. Find a way of replicating the behavior of |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
739 |
// `itertools::process_results`, but for `rayon::ParallelIterator` |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
740 |
let new_results: IoResult<Vec<_>> = to_visit |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
741 |
.into_par_iter() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
742 |
.filter_map(|(filename, entry)| -> Option<IoResult<_>> { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
743 |
// Report ignored items in the dmap as long as they are not |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
744 |
// under a symlink directory. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
745 |
if path_auditor.check(filename) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
746 |
// TODO normalize for case-insensitive filesystems |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
747 |
let buf = match hg_path_to_path_buf(filename) { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
748 |
Ok(x) => x, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
749 |
Err(e) => return Some(Err(e.into())), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
750 |
}; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
751 |
Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
752 |
Cow::Borrowed(filename), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
753 |
match self.root_dir.join(&buf).symlink_metadata() { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
754 |
// File was just ignored, no links, and exists |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
755 |
Ok(meta) => { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
756 |
let metadata = HgMetadata::from_metadata(meta); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
757 |
dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
758 |
filename, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
759 |
*entry, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
760 |
metadata, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
761 |
&self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
762 |
self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
763 |
) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
764 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
765 |
// File doesn't exist |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
766 |
Err(_) => dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
767 |
}, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
768 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
769 |
} else { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
770 |
// It's either missing or under a symlink directory which |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
771 |
// we, in this case, report as missing. |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
772 |
Some(Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
773 |
Cow::Borrowed(filename), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
774 |
dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
775 |
))) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
776 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
777 |
}) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
778 |
.collect(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
779 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
780 |
results.par_extend(new_results?); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
781 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
782 |
Ok(()) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
783 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
784 |
|
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
785 |
/// Add the files in the dirstate to the results. |
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
786 |
/// |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
787 |
/// This takes a mutable reference to the results to account for the |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
788 |
/// `extend` in timings |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
789 |
#[timed] |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
790 |
pub fn extend_from_dmap(&self, results: &mut Vec<DispatchedPath<'a>>) { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
791 |
results.par_extend(self.dmap.par_iter().flat_map( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
792 |
move |(filename, entry)| { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
793 |
let filename: &HgPath = filename; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
794 |
let filename_as_path = hg_path_to_path_buf(filename)?; |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
795 |
let meta = |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
796 |
self.root_dir.join(filename_as_path).symlink_metadata(); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
797 |
|
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
798 |
match meta { |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
799 |
Ok(ref m) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
800 |
if !(m.file_type().is_file() |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
801 |
|| m.file_type().is_symlink()) => |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
802 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
803 |
Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
804 |
Cow::Borrowed(filename), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
805 |
dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
806 |
)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
807 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
808 |
Ok(m) => Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
809 |
Cow::Borrowed(filename), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
810 |
dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
811 |
filename, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
812 |
*entry, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
813 |
HgMetadata::from_metadata(m), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
814 |
&self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
815 |
self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
816 |
), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
817 |
)), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
818 |
Err(ref e) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
819 |
if e.kind() == ErrorKind::NotFound |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
820 |
|| e.raw_os_error() == Some(20) => |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
821 |
{ |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
822 |
// Rust does not yet have an `ErrorKind` for |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
823 |
// `NotADirectory` (errno 20) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
824 |
// It happens if the dirstate contains `foo/bar` |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
825 |
// and foo is not a |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
826 |
// directory |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
827 |
Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
828 |
Cow::Borrowed(filename), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
829 |
dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
830 |
)) |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
831 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
832 |
Err(e) => Err(e), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
833 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
834 |
}, |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
835 |
)); |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
836 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
837 |
} |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
838 |
|
44551
d880805d5442
hg-core: add function timing information
Raphaël Gomès <rgomes@octobus.net>
parents:
44549
diff
changeset
|
839 |
#[timed] |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
840 |
pub fn build_response<'a>( |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
841 |
results: impl IntoIterator<Item = DispatchedPath<'a>>, |
44897
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
842 |
traversed: Vec<HgPathBuf>, |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
843 |
) -> (Vec<HgPathCow<'a>>, DirstateStatus<'a>) { |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
844 |
let mut lookup = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
845 |
let mut modified = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
846 |
let mut added = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
847 |
let mut removed = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
848 |
let mut deleted = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
849 |
let mut clean = vec![]; |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
850 |
let mut ignored = vec![]; |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
851 |
let mut unknown = vec![]; |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
852 |
let mut bad = vec![]; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
853 |
|
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
854 |
for (filename, dispatch) in results.into_iter() { |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
855 |
match dispatch { |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
856 |
Dispatch::Unknown => unknown.push(filename), |
43646
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
857 |
Dispatch::Unsure => lookup.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
858 |
Dispatch::Modified => modified.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
859 |
Dispatch::Added => added.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
860 |
Dispatch::Removed => removed.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
861 |
Dispatch::Deleted => deleted.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Raphaël Gomès <rgomes@octobus.net>
parents:
43508
diff
changeset
|
862 |
Dispatch::Clean => clean.push(filename), |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
863 |
Dispatch::Ignored => ignored.push(filename), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
864 |
Dispatch::None => {} |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
865 |
Dispatch::Bad(reason) => bad.push((filename, reason)), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
866 |
Dispatch::Directory { .. } => {} |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
867 |
} |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
868 |
} |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
869 |
|
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
870 |
( |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
871 |
lookup, |
44535
f13d19549efd
rust-status: rename `StatusResult` to `DirstateStatus`
Raphaël Gomès <rgomes@octobus.net>
parents:
44534
diff
changeset
|
872 |
DirstateStatus { |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
873 |
modified, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
874 |
added, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
875 |
removed, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
876 |
deleted, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
877 |
clean, |
44536
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
878 |
ignored, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
879 |
unknown, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Raphaël Gomès <rgomes@octobus.net>
parents:
44535
diff
changeset
|
880 |
bad, |
44897
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
881 |
traversed, |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
882 |
}, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
883 |
) |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
884 |
} |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
885 |
|
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
886 |
/// Get the status of files in the working directory. |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
887 |
/// |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
888 |
/// This is the current entry-point for `hg-core` and is realistically unusable |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
889 |
/// outside of a Python context because its arguments need to provide a lot of |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
890 |
/// information that will not be necessary in the future. |
44551
d880805d5442
hg-core: add function timing information
Raphaël Gomès <rgomes@octobus.net>
parents:
44549
diff
changeset
|
891 |
#[timed] |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
892 |
pub fn status<'a>( |
43921
8c77826116f7
rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents:
43836
diff
changeset
|
893 |
dmap: &'a DirstateMap, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
894 |
matcher: &'a (impl Matcher + Sync), |
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
895 |
root_dir: PathBuf, |
44604
e62052d0f377
rust-status: only involve ignore mechanism when needed
Raphaël Gomès <rgomes@octobus.net>
parents:
44571
diff
changeset
|
896 |
ignore_files: Vec<PathBuf>, |
44534
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44533
diff
changeset
|
897 |
options: StatusOptions, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
898 |
) -> StatusResult<( |
45112
470d306e616c
rust-status: improve documentation and readability
Raphaël Gomès <rgomes@octobus.net>
parents:
45111
diff
changeset
|
899 |
(Vec<HgPathCow<'a>>, DirstateStatus<'a>), |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
900 |
Vec<PatternFileWarning>, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Raphaël Gomès <rgomes@octobus.net>
parents:
44537
diff
changeset
|
901 |
)> { |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
902 |
let (status, warnings) = |
45111
7528699c6ccb
rust-status: refactor status into a struct
Raphaël Gomès <rgomes@octobus.net>
parents:
44998
diff
changeset
|
903 |
Status::new(dmap, matcher, root_dir, ignore_files, options)?; |
44897
c802ec4f7196
rust-status: collect traversed directories if required
Raphaël Gomès <rgomes@octobus.net>
parents:
44896
diff
changeset
|
904 |
|
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Raphaël Gomès <rgomes@octobus.net>
parents:
45112
diff
changeset
|
905 |
Ok((status.run()?, warnings)) |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff
changeset
|
906 |
} |