Show More
@@ -0,0 +1,50 b'' | |||
|
1 | use crate::commands::Command; | |
|
2 | use crate::error::{CommandError, CommandErrorKind}; | |
|
3 | use crate::ui::Ui; | |
|
4 | use hg::operations::{ListTrackedFiles, ListTrackedFilesErrorKind}; | |
|
5 | ||
|
6 | pub const HELP_TEXT: &str = " | |
|
7 | List tracked files. | |
|
8 | ||
|
9 | Returns 0 on success. | |
|
10 | "; | |
|
11 | ||
|
12 | pub struct FilesCommand<'a> { | |
|
13 | ui: &'a Ui, | |
|
14 | } | |
|
15 | ||
|
16 | impl<'a> FilesCommand<'a> { | |
|
17 | pub fn new(ui: &'a Ui) -> Self { | |
|
18 | FilesCommand { ui } | |
|
19 | } | |
|
20 | } | |
|
21 | ||
|
22 | impl<'a> Command<'a> for FilesCommand<'a> { | |
|
23 | fn run(&self) -> Result<(), CommandError> { | |
|
24 | let operation_builder = ListTrackedFiles::new()?; | |
|
25 | let operation = operation_builder.load().map_err(|err| { | |
|
26 | CommandErrorKind::Abort(Some( | |
|
27 | [b"abort: ", err.to_string().as_bytes(), b"\n"] | |
|
28 | .concat() | |
|
29 | .to_vec(), | |
|
30 | )) | |
|
31 | })?; | |
|
32 | let files = operation.run().map_err(|err| match err.kind { | |
|
33 | ListTrackedFilesErrorKind::ParseError(_) => { | |
|
34 | CommandErrorKind::Abort(Some( | |
|
35 | // TODO find a better error message | |
|
36 | b"abort: parse error\n".to_vec(), | |
|
37 | )) | |
|
38 | } | |
|
39 | })?; | |
|
40 | ||
|
41 | let mut stdout = self.ui.stdout_buffer(); | |
|
42 | for file in files { | |
|
43 | stdout.write_all(file.as_bytes())?; | |
|
44 | stdout.write_all(b"\n")?; | |
|
45 | } | |
|
46 | stdout.flush()?; | |
|
47 | ||
|
48 | Ok(()) | |
|
49 | } | |
|
50 | } |
@@ -57,6 +57,7 b' pub type FastHashMap<K, V> = HashMap<K, ' | |||
|
57 | 57 | pub enum DirstateParseError { |
|
58 | 58 | TooLittleData, |
|
59 | 59 | Overflow, |
|
60 | // TODO refactor to use bytes instead of String | |
|
60 | 61 | CorruptedEntry(String), |
|
61 | 62 | Damaged, |
|
62 | 63 | } |
@@ -16,6 +16,8 b' pub enum CommandErrorKind {' | |||
|
16 | 16 | StdoutError, |
|
17 | 17 | /// The standard error stream cannot be written to |
|
18 | 18 | StderrError, |
|
19 | /// The command aborted | |
|
20 | Abort(Option<Vec<u8>>), | |
|
19 | 21 | } |
|
20 | 22 | |
|
21 | 23 | impl CommandErrorKind { |
@@ -25,6 +27,7 b' impl CommandErrorKind {' | |||
|
25 | 27 | CommandErrorKind::CurrentDirNotFound(_) => exitcode::ABORT, |
|
26 | 28 | CommandErrorKind::StdoutError => exitcode::ABORT, |
|
27 | 29 | CommandErrorKind::StderrError => exitcode::ABORT, |
|
30 | CommandErrorKind::Abort(_) => exitcode::ABORT, | |
|
28 | 31 | } |
|
29 | 32 | } |
|
30 | 33 | |
@@ -52,6 +55,7 b' impl CommandErrorKind {' | |||
|
52 | 55 | ] |
|
53 | 56 | .concat(), |
|
54 | 57 | ), |
|
58 | CommandErrorKind::Abort(message) => message.to_owned(), | |
|
55 | 59 | _ => None, |
|
56 | 60 | } |
|
57 | 61 | } |
General Comments 0
You need to be logged in to leave comments.
Login now