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<Item = &'a HgPath>,
 ) -> 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(())
 }