diff --git a/rust/rhg/src/commands/files.rs b/rust/rhg/src/commands/files.rs --- a/rust/rhg/src/commands/files.rs +++ b/rust/rhg/src/commands/files.rs @@ -45,17 +45,28 @@ repo: &Repo, files: impl IntoIterator, ) -> Result<(), CommandError> { - let cwd = HgPathBuf::from(get_bytes_from_path(hg::utils::current_dir()?)); - let working_directory = - HgPathBuf::from(get_bytes_from_path(repo.working_directory_path())); - let mut stdout = ui.stdout_buffer(); + let cwd = hg::utils::current_dir()?; + let working_directory = repo.working_directory_path(); - for file in files { - let file = working_directory.join(file); - stdout.write_all(relativize_path(&file, &cwd).as_ref())?; - stdout.write_all(b"\n")?; + if let Ok(cwd_relative_to_repo) = cwd.strip_prefix(working_directory) { + // The current directory is inside the repo, so we can work with relative paths + let cwd = HgPathBuf::from(get_bytes_from_path(cwd_relative_to_repo)); + for file in files { + stdout.write_all(relativize_path(&file, &cwd).as_ref())?; + stdout.write_all(b"\n")?; + } + } else { + let cwd = HgPathBuf::from(get_bytes_from_path(cwd)); + let working_directory = HgPathBuf::from(get_bytes_from_path(working_directory)); + for file in files { + // Absolute path in the filesystem + let file = working_directory.join(file); + stdout.write_all(relativize_path(&file, &cwd).as_ref())?; + stdout.write_all(b"\n")?; + } } + stdout.flush()?; Ok(()) }