author | Simon Sapin <simon.sapin@octobus.net> |
Wed, 26 May 2021 11:53:37 +0200 | |
changeset 47373 | d2fb8b4adcc3 |
parent 46443 | 43d63979a75e |
child 47374 | bd88b6bfd8da |
permissions | -rw-r--r-- |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1 |
// list_tracked_files.rs |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2 |
// |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
3 |
// Copyright 2020 Antoine Cezar <antoine.cezar@octobus.net> |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
4 |
// |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
5 |
// This software may be used and distributed according to the terms of the |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
6 |
// GNU General Public License version 2 or any later version. |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
7 |
|
47373
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
8 |
use crate::dirstate::parsers::parse_dirstate_entries; |
46443
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46440
diff
changeset
|
9 |
use crate::errors::HgError; |
46167
8a4914397d02
rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents:
46135
diff
changeset
|
10 |
use crate::repo::Repo; |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
11 |
use crate::revlog::changelog::Changelog; |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
12 |
use crate::revlog::manifest::{Manifest, ManifestEntry}; |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46431
diff
changeset
|
13 |
use crate::revlog::node::Node; |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
14 |
use crate::revlog::revlog::RevlogError; |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
15 |
use crate::utils::hg_path::HgPath; |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
16 |
use rayon::prelude::*; |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
17 |
|
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
18 |
/// List files under Mercurial control in the working directory |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
19 |
/// by reading the dirstate |
46135
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
20 |
pub struct Dirstate { |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
21 |
/// The `dirstate` content. |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
22 |
content: Vec<u8>, |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
23 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
24 |
|
46135
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
25 |
impl Dirstate { |
46440
776b97179c06
rust: Remove DirstateParseError and ListDirstateTrackedFilesError
Simon Sapin <simon.sapin@octobus.net>
parents:
46437
diff
changeset
|
26 |
pub fn new(repo: &Repo) -> Result<Self, HgError> { |
46443
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46440
diff
changeset
|
27 |
let content = repo.hg_vfs().read("dirstate")?; |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
28 |
Ok(Self { content }) |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
29 |
} |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
30 |
|
46440
776b97179c06
rust: Remove DirstateParseError and ListDirstateTrackedFilesError
Simon Sapin <simon.sapin@octobus.net>
parents:
46437
diff
changeset
|
31 |
pub fn tracked_files(&self) -> Result<Vec<&HgPath>, HgError> { |
47373
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
32 |
let mut files = Vec::new(); |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
33 |
let _parents = parse_dirstate_entries( |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
34 |
&self.content, |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
35 |
|path, entry, _copy_source| { |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
36 |
if entry.state.is_tracked() { |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
37 |
files.push(path) |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
38 |
} |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
39 |
Ok(()) |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
40 |
}, |
d2fb8b4adcc3
rhg: Remove some intermediate Vecs in `rhg files`
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
41 |
)?; |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
42 |
files.par_sort_unstable(); |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
43 |
Ok(files) |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
44 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
45 |
} |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
46 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
47 |
/// List files under Mercurial control at a given revision. |
46135
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
48 |
pub fn list_rev_tracked_files( |
46167
8a4914397d02
rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents:
46135
diff
changeset
|
49 |
repo: &Repo, |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46431
diff
changeset
|
50 |
revset: &str, |
46437
b274aa2f20fd
rust: remove three enums that were identical to `RevlogError`
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
51 |
) -> Result<FilesForRev, RevlogError> { |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46431
diff
changeset
|
52 |
let rev = crate::revset::resolve_single(revset, repo)?; |
46167
8a4914397d02
rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents:
46135
diff
changeset
|
53 |
let changelog = Changelog::open(repo)?; |
8a4914397d02
rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents:
46135
diff
changeset
|
54 |
let manifest = Manifest::open(repo)?; |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46431
diff
changeset
|
55 |
let changelog_entry = changelog.get_rev(rev)?; |
46443
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46440
diff
changeset
|
56 |
let manifest_node = |
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46440
diff
changeset
|
57 |
Node::from_hex_for_repo(&changelog_entry.manifest_node()?)?; |
46431
645ee7225fab
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents:
46167
diff
changeset
|
58 |
let manifest_entry = manifest.get_node(manifest_node.into())?; |
46135
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
59 |
Ok(FilesForRev(manifest_entry)) |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
60 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
61 |
|
46135
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
62 |
pub struct FilesForRev(ManifestEntry); |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
63 |
|
46135
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
64 |
impl FilesForRev { |
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
65 |
pub fn iter(&self) -> impl Iterator<Item = &HgPath> { |
dca9cb99971c
rust: replace most "operation" structs with functions
Simon Sapin <simon.sapin@octobus.net>
parents:
46134
diff
changeset
|
66 |
self.0.files() |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
67 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
68 |
} |