summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaghm Rossi <saghmrossi@gmail.com>2019-08-16 23:29:22 -0400
committerKevin Song <chipbuster@users.noreply.github.com>2019-08-16 20:29:22 -0700
commit84c394e7b054391e07a571b713816d7d357e7c75 (patch)
treeb5f14484f2977396f79706917f96fce7e306c2ad
parentd065dff695b22fe04d56b89f45a1550bdd93c303 (diff)
feat: Add option to control git directory truncation (#165)
-rw-r--r--.gitignore1
-rw-r--r--docs/config/README.md9
-rw-r--r--src/modules/directory.rs26
-rw-r--r--tests/testsuite/directory.rs62
4 files changed, 83 insertions, 15 deletions
diff --git a/.gitignore b/.gitignore
index 25458deb7..246bef6a8 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 d6e3c2f97..ef327c9c7 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 51c776e40..ee3924b98 100644
--- a/src/modules/directory.rs
+++ b/src/modules/directory.rs
@@ -24,22 +24,26 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
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();
-
- 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, &home_dir, HOME_SYMBOL);
- }
+ 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);
+ }
+ _ => {
+ // Contract the path to the home directory
+ let home_dir = dirs::home_dir().unwrap();
+
+ 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 7bbafe9b2..05ac33707 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(())
+}