Mercurial > public > mercurial-scm > hg-stable
comparison rust/rhg/src/commands/files.rs @ 48186:9ecf802b06e0
rhg: refactor function to relativize paths in utils
Commands like `files`, `status` supports printing relative paths. Hence we need
to re-use this code in other places too. So let's take this out from `rhg files`
into a utility function.
Next patch will make `rhg status` use it.
Differential Revision: https://phab.mercurial-scm.org/D11613
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Tue, 05 Oct 2021 18:02:22 +0530 |
parents | b5e8bf10436e |
children | 10c32e1b892a |
comparison
equal
deleted
inserted
replaced
48185:1d70fb83ff4a | 48186:9ecf802b06e0 |
---|---|
1 use crate::error::CommandError; | 1 use crate::error::CommandError; |
2 use crate::ui::Ui; | 2 use crate::ui::Ui; |
3 use crate::ui::UiError; | |
4 use crate::utils::path_utils::relativize_paths; | |
3 use clap::Arg; | 5 use clap::Arg; |
4 use hg::operations::list_rev_tracked_files; | 6 use hg::operations::list_rev_tracked_files; |
5 use hg::operations::Dirstate; | 7 use hg::operations::Dirstate; |
6 use hg::repo::Repo; | 8 use hg::repo::Repo; |
7 use hg::utils::current_dir; | 9 use hg::utils::hg_path::HgPath; |
8 use hg::utils::files::{get_bytes_from_path, relativize_path}; | 10 use std::borrow::Cow; |
9 use hg::utils::hg_path::{HgPath, HgPathBuf}; | |
10 | 11 |
11 pub const HELP_TEXT: &str = " | 12 pub const HELP_TEXT: &str = " |
12 List tracked files. | 13 List tracked files. |
13 | 14 |
14 Returns 0 on success. | 15 Returns 0 on success. |
52 ui: &Ui, | 53 ui: &Ui, |
53 repo: &Repo, | 54 repo: &Repo, |
54 files: impl IntoIterator<Item = &'a HgPath>, | 55 files: impl IntoIterator<Item = &'a HgPath>, |
55 ) -> Result<(), CommandError> { | 56 ) -> Result<(), CommandError> { |
56 let mut stdout = ui.stdout_buffer(); | 57 let mut stdout = ui.stdout_buffer(); |
58 let mut any = false; | |
57 | 59 |
58 let cwd = current_dir()?; | 60 relativize_paths(repo, files, |path: Cow<[u8]>| -> Result<(), UiError> { |
59 let working_directory = repo.working_directory_path(); | 61 any = true; |
60 let working_directory = cwd.join(working_directory); // Make it absolute | 62 stdout.write_all(path.as_ref())?; |
61 | 63 stdout.write_all(b"\n") |
62 let mut any = false; | 64 })?; |
63 if let Ok(cwd_relative_to_repo) = cwd.strip_prefix(&working_directory) { | |
64 // The current directory is inside the repo, so we can work with | |
65 // relative paths | |
66 let cwd = HgPathBuf::from(get_bytes_from_path(cwd_relative_to_repo)); | |
67 for file in files { | |
68 any = true; | |
69 stdout.write_all(relativize_path(&file, &cwd).as_ref())?; | |
70 stdout.write_all(b"\n")?; | |
71 } | |
72 } else { | |
73 let working_directory = | |
74 HgPathBuf::from(get_bytes_from_path(working_directory)); | |
75 let cwd = HgPathBuf::from(get_bytes_from_path(cwd)); | |
76 for file in files { | |
77 any = true; | |
78 // Absolute path in the filesystem | |
79 let file = working_directory.join(file); | |
80 stdout.write_all(relativize_path(&file, &cwd).as_ref())?; | |
81 stdout.write_all(b"\n")?; | |
82 } | |
83 } | |
84 | |
85 stdout.flush()?; | 65 stdout.flush()?; |
86 if any { | 66 if any { |
87 Ok(()) | 67 Ok(()) |
88 } else { | 68 } else { |
89 Err(CommandError::Unsuccessful) | 69 Err(CommandError::Unsuccessful) |