1 use crate::commands::Command; |
1 use crate::commands::Command; |
2 use crate::error::{CommandError, CommandErrorKind}; |
2 use crate::error::{CommandError, CommandErrorKind}; |
3 use crate::ui::utf8_to_local; |
3 use crate::ui::utf8_to_local; |
4 use crate::ui::Ui; |
4 use crate::ui::Ui; |
5 use hg::operations::find_root; |
|
6 use hg::operations::{ |
5 use hg::operations::{ |
7 list_rev_tracked_files, ListRevTrackedFilesError, |
6 list_rev_tracked_files, ListRevTrackedFilesError, |
8 ListRevTrackedFilesErrorKind, |
7 ListRevTrackedFilesErrorKind, |
9 }; |
8 }; |
10 use hg::operations::{ |
9 use hg::operations::{ |
11 Dirstate, ListDirstateTrackedFilesError, ListDirstateTrackedFilesErrorKind, |
10 Dirstate, ListDirstateTrackedFilesError, ListDirstateTrackedFilesErrorKind, |
12 }; |
11 }; |
13 use hg::requirements; |
12 use hg::repo::Repo; |
14 use hg::utils::files::{get_bytes_from_path, relativize_path}; |
13 use hg::utils::files::{get_bytes_from_path, relativize_path}; |
15 use hg::utils::hg_path::{HgPath, HgPathBuf}; |
14 use hg::utils::hg_path::{HgPath, HgPathBuf}; |
16 use std::path::Path; |
|
17 |
15 |
18 pub const HELP_TEXT: &str = " |
16 pub const HELP_TEXT: &str = " |
19 List tracked files. |
17 List tracked files. |
20 |
18 |
21 Returns 0 on success. |
19 Returns 0 on success. |
31 } |
29 } |
32 |
30 |
33 fn display_files( |
31 fn display_files( |
34 &self, |
32 &self, |
35 ui: &Ui, |
33 ui: &Ui, |
36 root: &Path, |
34 repo: &Repo, |
37 files: impl IntoIterator<Item = &'a HgPath>, |
35 files: impl IntoIterator<Item = &'a HgPath>, |
38 ) -> Result<(), CommandError> { |
36 ) -> Result<(), CommandError> { |
39 let cwd = std::env::current_dir() |
37 let cwd = std::env::current_dir() |
40 .or_else(|e| Err(CommandErrorKind::CurrentDirNotFound(e)))?; |
38 .or_else(|e| Err(CommandErrorKind::CurrentDirNotFound(e)))?; |
41 let rooted_cwd = cwd |
39 let rooted_cwd = cwd |
42 .strip_prefix(root) |
40 .strip_prefix(repo.working_directory_path()) |
43 .expect("cwd was already checked within the repository"); |
41 .expect("cwd was already checked within the repository"); |
44 let rooted_cwd = HgPathBuf::from(get_bytes_from_path(rooted_cwd)); |
42 let rooted_cwd = HgPathBuf::from(get_bytes_from_path(rooted_cwd)); |
45 |
43 |
46 let mut stdout = ui.stdout_buffer(); |
44 let mut stdout = ui.stdout_buffer(); |
47 |
45 |
54 } |
52 } |
55 } |
53 } |
56 |
54 |
57 impl<'a> Command for FilesCommand<'a> { |
55 impl<'a> Command for FilesCommand<'a> { |
58 fn run(&self, ui: &Ui) -> Result<(), CommandError> { |
56 fn run(&self, ui: &Ui) -> Result<(), CommandError> { |
59 let root = find_root()?; |
57 let repo = Repo::find()?; |
60 requirements::check(&root)?; |
58 repo.check_requirements()?; |
61 if let Some(rev) = self.rev { |
59 if let Some(rev) = self.rev { |
62 let files = list_rev_tracked_files(&root, rev) |
60 let files = list_rev_tracked_files(&repo, rev) |
63 .map_err(|e| map_rev_error(rev, e))?; |
61 .map_err(|e| map_rev_error(rev, e))?; |
64 self.display_files(ui, &root, files.iter()) |
62 self.display_files(ui, &repo, files.iter()) |
65 } else { |
63 } else { |
66 let distate = Dirstate::new(&root).map_err(map_dirstate_error)?; |
64 let distate = Dirstate::new(&repo).map_err(map_dirstate_error)?; |
67 let files = distate.tracked_files().map_err(map_dirstate_error)?; |
65 let files = distate.tracked_files().map_err(map_dirstate_error)?; |
68 self.display_files(ui, &root, files) |
66 self.display_files(ui, &repo, files) |
69 } |
67 } |
70 } |
68 } |
71 } |
69 } |
72 |
70 |
73 /// Convert `ListRevTrackedFilesErrorKind` to `CommandError` |
71 /// Convert `ListRevTrackedFilesErrorKind` to `CommandError` |