author | Simon Sapin <simon.sapin@octobus.net> |
Mon, 14 Dec 2020 13:47:44 +0100 | |
changeset 46134 | cc6faec62cb7 |
parent 46033 | 88e741bf2d93 |
child 46135 | dca9cb99971c |
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 |
|
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
8 |
use crate::dirstate::parsers::parse_dirstate; |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
9 |
use crate::revlog::changelog::Changelog; |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
10 |
use crate::revlog::manifest::{Manifest, ManifestEntry}; |
46033
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
46032
diff
changeset
|
11 |
use crate::revlog::node::{Node, NodePrefix}; |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
12 |
use crate::revlog::revlog::RevlogError; |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
13 |
use crate::revlog::Revision; |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
14 |
use crate::utils::hg_path::HgPath; |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
15 |
use crate::{DirstateParseError, EntryState}; |
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 |
use std::convert::From; |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
18 |
use std::fs; |
46134
cc6faec62cb7
rust: change &PathBuf parameters to &Path
Simon Sapin <simon.sapin@octobus.net>
parents:
46033
diff
changeset
|
19 |
use std::path::Path; |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
20 |
|
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
21 |
/// Kind of error encountered by `ListDirstateTrackedFiles` |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
22 |
#[derive(Debug)] |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
23 |
pub enum ListDirstateTrackedFilesErrorKind { |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
24 |
/// Error when reading the `dirstate` file |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
25 |
IoError(std::io::Error), |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
26 |
/// Error when parsing the `dirstate` file |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
27 |
ParseError(DirstateParseError), |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
28 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
29 |
|
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
30 |
/// A `ListDirstateTrackedFiles` error |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
31 |
#[derive(Debug)] |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
32 |
pub struct ListDirstateTrackedFilesError { |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
33 |
/// Kind of error encountered by `ListDirstateTrackedFiles` |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
34 |
pub kind: ListDirstateTrackedFilesErrorKind, |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
35 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
36 |
|
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
37 |
impl From<ListDirstateTrackedFilesErrorKind> |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
38 |
for ListDirstateTrackedFilesError |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
39 |
{ |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
40 |
fn from(kind: ListDirstateTrackedFilesErrorKind) -> Self { |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
41 |
ListDirstateTrackedFilesError { kind } |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
42 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
43 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
44 |
|
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
45 |
impl From<std::io::Error> for ListDirstateTrackedFilesError { |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
46 |
fn from(err: std::io::Error) -> Self { |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
47 |
let kind = ListDirstateTrackedFilesErrorKind::IoError(err); |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
48 |
ListDirstateTrackedFilesError { kind } |
45436
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Raphaël Gomès <rgomes@octobus.net>
parents:
45359
diff
changeset
|
49 |
} |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
50 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
51 |
|
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
52 |
/// 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
|
53 |
/// by reading the dirstate |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
54 |
pub struct ListDirstateTrackedFiles { |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
55 |
/// The `dirstate` content. |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
56 |
content: Vec<u8>, |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
57 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
58 |
|
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
59 |
impl ListDirstateTrackedFiles { |
46134
cc6faec62cb7
rust: change &PathBuf parameters to &Path
Simon Sapin <simon.sapin@octobus.net>
parents:
46033
diff
changeset
|
60 |
pub fn new(root: &Path) -> Result<Self, ListDirstateTrackedFilesError> { |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
61 |
let dirstate = root.join(".hg/dirstate"); |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
62 |
let content = fs::read(&dirstate)?; |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
63 |
Ok(Self { content }) |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
64 |
} |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
65 |
|
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
66 |
pub fn run( |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
67 |
&mut self, |
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
68 |
) -> Result<Vec<&HgPath>, ListDirstateTrackedFilesError> { |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
69 |
let (_, entries, _) = parse_dirstate(&self.content) |
45535
72b7d58d6e35
hg-core: simplify `list_tracked_files` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45436
diff
changeset
|
70 |
.map_err(ListDirstateTrackedFilesErrorKind::ParseError)?; |
45359
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
71 |
let mut files: Vec<&HgPath> = entries |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
72 |
.into_iter() |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
73 |
.filter_map(|(path, entry)| match entry.state { |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
74 |
EntryState::Removed => None, |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
75 |
_ => Some(path), |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
76 |
}) |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
77 |
.collect(); |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
78 |
files.par_sort_unstable(); |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
79 |
Ok(files) |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
80 |
} |
0f5286ccf82c
hg-core: define a `ListTrackedFiles` `Operation`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
81 |
} |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
82 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
83 |
/// Kind of error encountered by `ListRevTrackedFiles` |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
84 |
#[derive(Debug)] |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
85 |
pub enum ListRevTrackedFilesErrorKind { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
86 |
/// Error when reading a `revlog` file. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
87 |
IoError(std::io::Error), |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
88 |
/// The revision has not been found. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
89 |
InvalidRevision, |
46032
8d6164098782
rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents:
45603
diff
changeset
|
90 |
/// Found more than one revision whose ID match the requested prefix |
8d6164098782
rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents:
45603
diff
changeset
|
91 |
AmbiguousPrefix, |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
92 |
/// A `revlog` file is corrupted. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
93 |
CorruptedRevlog, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
94 |
/// The `revlog` format version is not supported. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
95 |
UnsuportedRevlogVersion(u16), |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
96 |
/// The `revlog` data format is not supported. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
97 |
UnknowRevlogDataFormat(u8), |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
98 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
99 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
100 |
/// A `ListRevTrackedFiles` error |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
101 |
#[derive(Debug)] |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
102 |
pub struct ListRevTrackedFilesError { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
103 |
/// Kind of error encountered by `ListRevTrackedFiles` |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
104 |
pub kind: ListRevTrackedFilesErrorKind, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
105 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
106 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
107 |
impl From<ListRevTrackedFilesErrorKind> for ListRevTrackedFilesError { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
108 |
fn from(kind: ListRevTrackedFilesErrorKind) -> Self { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
109 |
ListRevTrackedFilesError { kind } |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
110 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
111 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
112 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
113 |
impl From<RevlogError> for ListRevTrackedFilesError { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
114 |
fn from(err: RevlogError) -> Self { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
115 |
match err { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
116 |
RevlogError::IoError(err) => { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
117 |
ListRevTrackedFilesErrorKind::IoError(err) |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
118 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
119 |
RevlogError::UnsuportedVersion(version) => { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
120 |
ListRevTrackedFilesErrorKind::UnsuportedRevlogVersion(version) |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
121 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
122 |
RevlogError::InvalidRevision => { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
123 |
ListRevTrackedFilesErrorKind::InvalidRevision |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
124 |
} |
46032
8d6164098782
rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents:
45603
diff
changeset
|
125 |
RevlogError::AmbiguousPrefix => { |
8d6164098782
rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents:
45603
diff
changeset
|
126 |
ListRevTrackedFilesErrorKind::AmbiguousPrefix |
8d6164098782
rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents:
45603
diff
changeset
|
127 |
} |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
128 |
RevlogError::Corrupted => { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
129 |
ListRevTrackedFilesErrorKind::CorruptedRevlog |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
130 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
131 |
RevlogError::UnknowDataFormat(format) => { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
132 |
ListRevTrackedFilesErrorKind::UnknowRevlogDataFormat(format) |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
133 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
134 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
135 |
.into() |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
136 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
137 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
138 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
139 |
/// List files under Mercurial control at a given revision. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
140 |
pub struct ListRevTrackedFiles<'a> { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
141 |
/// The revision to list the files from. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
142 |
rev: &'a str, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
143 |
/// The changelog file |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
144 |
changelog: Changelog, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
145 |
/// The manifest file |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
146 |
manifest: Manifest, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
147 |
/// The manifest entry corresponding to the revision. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
148 |
/// |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
149 |
/// Used to hold the owner of the returned references. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
150 |
manifest_entry: Option<ManifestEntry>, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
151 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
152 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
153 |
impl<'a> ListRevTrackedFiles<'a> { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
154 |
pub fn new( |
46134
cc6faec62cb7
rust: change &PathBuf parameters to &Path
Simon Sapin <simon.sapin@octobus.net>
parents:
46033
diff
changeset
|
155 |
root: &Path, |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
156 |
rev: &'a str, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
157 |
) -> Result<Self, ListRevTrackedFilesError> { |
46134
cc6faec62cb7
rust: change &PathBuf parameters to &Path
Simon Sapin <simon.sapin@octobus.net>
parents:
46033
diff
changeset
|
158 |
let changelog = Changelog::open(root)?; |
cc6faec62cb7
rust: change &PathBuf parameters to &Path
Simon Sapin <simon.sapin@octobus.net>
parents:
46033
diff
changeset
|
159 |
let manifest = Manifest::open(root)?; |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
160 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
161 |
Ok(Self { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
162 |
rev, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
163 |
changelog, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
164 |
manifest, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
165 |
manifest_entry: None, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
166 |
}) |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
167 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
168 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
169 |
pub fn run( |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
170 |
&mut self, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
171 |
) -> Result<impl Iterator<Item = &HgPath>, ListRevTrackedFilesError> { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
172 |
let changelog_entry = match self.rev.parse::<Revision>() { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
173 |
Ok(rev) => self.changelog.get_rev(rev)?, |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
174 |
_ => { |
46033
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
46032
diff
changeset
|
175 |
let changelog_node = NodePrefix::from_hex(&self.rev) |
45603
be951ca95b08
hg-core: use `.or(Err(Error))` not `.map_err(|_| Error)` (D9100#inline-15067)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45536
diff
changeset
|
176 |
.or(Err(ListRevTrackedFilesErrorKind::InvalidRevision))?; |
46033
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
46032
diff
changeset
|
177 |
self.changelog.get_node(changelog_node.borrow())? |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
178 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
179 |
}; |
46033
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
46032
diff
changeset
|
180 |
let manifest_node = Node::from_hex(&changelog_entry.manifest_node()?) |
45603
be951ca95b08
hg-core: use `.or(Err(Error))` not `.map_err(|_| Error)` (D9100#inline-15067)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45536
diff
changeset
|
181 |
.or(Err(ListRevTrackedFilesErrorKind::CorruptedRevlog))?; |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
182 |
|
46033
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
46032
diff
changeset
|
183 |
self.manifest_entry = |
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
46032
diff
changeset
|
184 |
Some(self.manifest.get_node((&manifest_node).into())?); |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
185 |
|
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
186 |
if let Some(ref manifest_entry) = self.manifest_entry { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
187 |
Ok(manifest_entry.files()) |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
188 |
} else { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
189 |
panic!( |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
190 |
"manifest entry should have been stored in self.manifest_node to ensure its lifetime since references are returned from it" |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
191 |
) |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
192 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
193 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45535
diff
changeset
|
194 |
} |