From 84c394e7b054391e07a571b713816d7d357e7c75 Mon Sep 17 00:00:00 2001 From: Saghm Rossi Date: Fri, 16 Aug 2019 23:29:22 -0400 Subject: [PATCH] feat: Add option to control git directory truncation (#165) --- .gitignore | 1 + docs/config/README.md | 9 +++--- src/modules/directory.rs | 22 +++++++------ tests/testsuite/directory.rs | 62 ++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 25458deb..246bef6a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ Cargo.lock # Intellij IDE configuration .idea/ +/*.iml # Compiled files for documentation docs/node_modules diff --git a/docs/config/README.md b/docs/config/README.md index d6e3c2f9..ef327c9c 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -153,10 +153,11 @@ git repo that you're currently in. ### Options -| Variable | Default | Description | -| ------------------- | ------- | ------------------------------------------------------------------------------- | -| `truncation_length` | `3` | The number of parent folders that the current directory should be truncated to. | -| `disabled` | `false` | Disables the `directory` module. | +| Variable | Default | Description | +| ------------------- | ------- | -------------------------------------------------------------------------------- | +| `truncation_length` | `3` | The number of parent folders that the current directory should be truncated to. | +| `truncate_to_repo` | `true` | Whether or not to truncate to the root of the git repo that you're currently in. | +| `disabled` | `false` | Disables the `directory` module. | ### Example diff --git a/src/modules/directory.rs b/src/modules/directory.rs index 51c776e4..ee3924b9 100644 --- a/src/modules/directory.rs +++ b/src/modules/directory.rs @@ -24,22 +24,26 @@ pub fn module<'a>(context: &'a Context) -> Option> { let truncation_length = module .config_value_i64("truncation_length") .unwrap_or(DIR_TRUNCATION_LENGTH); + let truncate_to_repo = module.config_value_bool("truncate_to_repo").unwrap_or(true); let current_dir = &context.current_dir; log::debug!("Current directory: {:?}", current_dir); let dir_string; - if let Some(repo_root) = &context.repo_root { - // Contract the path to the git repo root - let repo_folder_name = repo_root.file_name().unwrap().to_str().unwrap(); + match &context.repo_root { + Some(repo_root) if truncate_to_repo => { + // Contract the path to the git repo root + let repo_folder_name = repo_root.file_name().unwrap().to_str().unwrap(); - dir_string = contract_path(current_dir, repo_root, repo_folder_name); - } else { - // Contract the path to the home directory - let home_dir = dirs::home_dir().unwrap(); + dir_string = contract_path(current_dir, repo_root, repo_folder_name); + } + _ => { + // Contract the path to the home directory + let home_dir = dirs::home_dir().unwrap(); - dir_string = contract_path(current_dir, &home_dir, HOME_SYMBOL); - } + dir_string = contract_path(current_dir, &home_dir, HOME_SYMBOL); + } + }; // Truncate the dir string to the maximum number of path components let truncated_dir_string = truncate(dir_string, truncation_length as usize); diff --git a/tests/testsuite/directory.rs b/tests/testsuite/directory.rs index 7bbafe9b..05ac3370 100644 --- a/tests/testsuite/directory.rs +++ b/tests/testsuite/directory.rs @@ -207,3 +207,65 @@ fn truncated_directory_in_git_repo() -> io::Result<()> { assert_eq!(expected, actual); Ok(()) } + +#[test] +#[ignore] +fn directory_in_git_repo_truncate_to_repo_false() -> io::Result<()> { + let tmp_dir = TempDir::new_in(dirs::home_dir().unwrap())?; + let repo_dir = tmp_dir.path().join("above-repo").join("rocket-controls"); + let dir = repo_dir.join("src/meters/fuel-gauge"); + fs::create_dir_all(&dir)?; + Repository::init(&repo_dir).unwrap(); + + let output = common::render_module("directory") + .use_config(toml::toml! { + [directory] + // Don't truncate the path at all. + truncation_length = 5 + truncate_to_repo = false + }) + .arg("--path") + .arg(dir) + .output()?; + let actual = String::from_utf8(output.stdout).unwrap(); + + let expected = format!( + "in {} ", + Color::Cyan + .bold() + .paint("above-repo/rocket-controls/src/meters/fuel-gauge") + ); + assert_eq!(expected, actual); + Ok(()) +} + +#[test] +#[ignore] +fn directory_in_git_repo_truncate_to_repo_true() -> io::Result<()> { + let tmp_dir = TempDir::new_in(dirs::home_dir().unwrap())?; + let repo_dir = tmp_dir.path().join("above-repo").join("rocket-controls"); + let dir = repo_dir.join("src/meters/fuel-gauge"); + fs::create_dir_all(&dir)?; + Repository::init(&repo_dir).unwrap(); + + let output = common::render_module("directory") + .use_config(toml::toml! { + [directory] + // `truncate_to_repo = true` should display the truncated path + truncation_length = 5 + truncate_to_repo = true + }) + .arg("--path") + .arg(dir) + .output()?; + let actual = String::from_utf8(output.stdout).unwrap(); + + let expected = format!( + "in {} ", + Color::Cyan + .bold() + .paint("rocket-controls/src/meters/fuel-gauge") + ); + assert_eq!(expected, actual); + Ok(()) +}