diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 29 |
1 files changed, 28 insertions, 1 deletions
@@ -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(), + } +} |