Mercurial > public > mercurial-scm > hg
comparison rust/rhg/src/commands/files.rs @ 50537:9db197c73138
rhg: support `rhg files` with `ui.relative-paths=false`
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Mon, 29 May 2023 17:04:14 +0100 |
parents | 74e4dbb0fcd5 |
children | 788113f056d4 |
comparison
equal
deleted
inserted
replaced
50536:74e4dbb0fcd5 | 50537:9db197c73138 |
---|---|
1 use crate::error::CommandError; | 1 use crate::error::CommandError; |
2 use crate::ui::{print_narrow_sparse_warnings, Ui, RelativePaths, relative_paths}; | 2 use crate::ui::{ |
3 print_narrow_sparse_warnings, relative_paths, RelativePaths, Ui, | |
4 }; | |
3 use crate::utils::path_utils::RelativizePaths; | 5 use crate::utils::path_utils::RelativizePaths; |
4 use clap::Arg; | 6 use clap::Arg; |
5 use hg::narrow; | 7 use hg::narrow; |
6 use hg::operations::list_rev_tracked_files; | 8 use hg::operations::list_rev_tracked_files; |
7 use hg::repo::Repo; | 9 use hg::repo::Repo; |
26 ) | 28 ) |
27 .about(HELP_TEXT) | 29 .about(HELP_TEXT) |
28 } | 30 } |
29 | 31 |
30 pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> { | 32 pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> { |
31 match relative_paths(invocation.config)? { | 33 let relative_paths = match relative_paths(invocation.config)? { |
32 RelativePaths::Legacy | RelativePaths::Bool(true) => (), | 34 RelativePaths::Legacy => true, |
33 RelativePaths::Bool(false) => { | 35 RelativePaths::Bool(v) => v, |
34 return Err(CommandError::unsupported( | 36 }; |
35 "non-default ui.relative-paths", | |
36 )); | |
37 } | |
38 } | |
39 | 37 |
40 let rev = invocation.subcommand_args.get_one::<String>("rev"); | 38 let rev = invocation.subcommand_args.get_one::<String>("rev"); |
41 | 39 |
42 let repo = invocation.repo?; | 40 let repo = invocation.repo?; |
43 | 41 |
57 print_narrow_sparse_warnings(&narrow_warnings, &[], invocation.ui, repo)?; | 55 print_narrow_sparse_warnings(&narrow_warnings, &[], invocation.ui, repo)?; |
58 | 56 |
59 if let Some(rev) = rev { | 57 if let Some(rev) = rev { |
60 let files = list_rev_tracked_files(repo, rev, narrow_matcher) | 58 let files = list_rev_tracked_files(repo, rev, narrow_matcher) |
61 .map_err(|e| (e, rev.as_ref()))?; | 59 .map_err(|e| (e, rev.as_ref()))?; |
62 display_files(invocation.ui, repo, files.iter()) | 60 display_files(invocation.ui, repo, relative_paths, files.iter()) |
63 } else { | 61 } else { |
64 // The dirstate always reflects the sparse narrowspec. | 62 // The dirstate always reflects the sparse narrowspec. |
65 let dirstate = repo.dirstate_map()?; | 63 let dirstate = repo.dirstate_map()?; |
66 let files_res: Result<Vec<_>, _> = | 64 let files_res: Result<Vec<_>, _> = |
67 filter_map_results(dirstate.iter(), |(path, entry)| { | 65 filter_map_results(dirstate.iter(), |(path, entry)| { |
77 files.par_sort_unstable(); | 75 files.par_sort_unstable(); |
78 | 76 |
79 display_files( | 77 display_files( |
80 invocation.ui, | 78 invocation.ui, |
81 repo, | 79 repo, |
80 relative_paths, | |
82 files.into_iter().map::<Result<_, CommandError>, _>(Ok), | 81 files.into_iter().map::<Result<_, CommandError>, _>(Ok), |
83 ) | 82 ) |
84 } | 83 } |
85 } | 84 } |
86 | 85 |
87 fn display_files<'a, E>( | 86 fn display_files<'a, E>( |
88 ui: &Ui, | 87 ui: &Ui, |
89 repo: &Repo, | 88 repo: &Repo, |
89 relative_paths: bool, | |
90 files: impl IntoIterator<Item = Result<&'a HgPath, E>>, | 90 files: impl IntoIterator<Item = Result<&'a HgPath, E>>, |
91 ) -> Result<(), CommandError> | 91 ) -> Result<(), CommandError> |
92 where | 92 where |
93 CommandError: From<E>, | 93 CommandError: From<E>, |
94 { | 94 { |
96 let mut any = false; | 96 let mut any = false; |
97 | 97 |
98 let relativize = RelativizePaths::new(repo)?; | 98 let relativize = RelativizePaths::new(repo)?; |
99 for result in files { | 99 for result in files { |
100 let path = result?; | 100 let path = result?; |
101 stdout.write_all(&relativize.relativize(path))?; | 101 if relative_paths { |
102 stdout.write_all(&relativize.relativize(path))?; | |
103 } else { | |
104 stdout.write_all(path.as_bytes())?; | |
105 } | |
102 stdout.write_all(b"\n")?; | 106 stdout.write_all(b"\n")?; |
103 any = true; | 107 any = true; |
104 } | 108 } |
105 | 109 |
106 stdout.flush()?; | 110 stdout.flush()?; |