aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 910b488..7adfb2f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -17,6 +17,7 @@
#![warn(rust_2018_idioms)]
use std::io::Write;
+use std::path::{Path, PathBuf};
use git2::{DiffOptions, Repository, Tree};
use thiserror::Error;
@@ -71,7 +72,7 @@ impl Todos<'_> {
write!(
write_to,
"{}:{}:{}",
- path.display(),
+ relative_path(self.repo, path).display(),
line_number,
l,
).expect("write error");
@@ -95,3 +96,29 @@ impl Todos<'_> {
Ok(master.get().peel_to_tree()?)
}
}
+
+/// Get `path` relative to the current directory.
+///
+/// Attempt to remove the current directory prefix from `path` to turn it into a
+/// relative path from the current directory.
+fn relative_path(repo: &Repository, path: &Path) -> PathBuf {
+ let workdir = match repo.workdir() {
+ Some(d) => d,
+ None => return path.to_path_buf(),
+ };
+
+ let current_dir = match std::env::current_dir() {
+ Ok(d) => d,
+ Err(_) => return path.to_path_buf(),
+ };
+
+ let current_dir_relative = match current_dir.strip_prefix(workdir) {
+ Ok(d) => d,
+ Err(_) => return path.to_path_buf(),
+ };
+
+ match path.strip_prefix(current_dir_relative) {
+ Ok(d) => d.to_path_buf(),
+ Err(_) => path.to_path_buf(),
+ }
+}