summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Davison <dandavison7@gmail.com>2021-05-20 14:45:08 -0400
committerGitHub <noreply@github.com>2021-05-20 14:45:08 -0400
commit1bf8479bb19be230b61a11ba3f74d7341ffd6914 (patch)
tree90c65b69c9bb30a8824b685f72be69ed5e1fbbd5
parentfe16f7533deb55e83ed0d736e1cd826ad8ae7522 (diff)
Emit 'mode [-+]x' instead of full file permission bits (#607)
Ref #583
-rw-r--r--src/parse.rs10
-rw-r--r--src/tests/test_example_diffs.rs28
2 files changed, 31 insertions, 7 deletions
diff --git a/src/parse.rs b/src/parse.rs
index 3329248b..8e93dd6a 100644
--- a/src/parse.rs
+++ b/src/parse.rs
@@ -162,9 +162,13 @@ pub fn get_file_change_description_from_file_paths(
plus_file,
FileEvent::ModeChange(old_mode),
FileEvent::ModeChange(new_mode),
- ) if minus_file == plus_file => {
- format!("{}: {} ⟶ {}", plus_file, old_mode, new_mode)
- }
+ ) if minus_file == plus_file => match (old_mode.as_str(), new_mode.as_str()) {
+ // 100755 for executable and 100644 for non-executable are the only file modes Git records.
+ // https://medium.com/@tahteche/how-git-treats-changes-in-file-permissions-f71874ca239d
+ ("100644", "100755") => format!("{}: mode +x", plus_file),
+ ("100755", "100644") => format!("{}: mode -x", plus_file),
+ _ => format!("{}: {} ⟶ {}", plus_file, old_mode, new_mode),
+ },
(minus_file, plus_file, _, _) if minus_file == plus_file => format!(
"{}{}",
format_label(&config.file_modified_label),
diff --git a/src/tests/test_example_diffs.rs b/src/tests/test_example_diffs.rs
index a4d0b854..82b12f52 100644
--- a/src/tests/test_example_diffs.rs
+++ b/src/tests/test_example_diffs.rs
@@ -1570,11 +1570,25 @@ src/align.rs:71: impl<'a> Alignment<'a> { │
}
#[test]
- fn test_file_mode_change() {
+ fn test_file_mode_change_gain_executable_bit() {
let config = integration_test_utils::make_config_from_args(&[]);
- let output = integration_test_utils::run_delta(GIT_DIFF_FILE_MODE_CHANGE, &config);
+ let output = integration_test_utils::run_delta(
+ GIT_DIFF_FILE_MODE_CHANGE_GAIN_EXECUTABLE_BIT,
+ &config,
+ );
+ let output = strip_ansi_codes(&output);
+ assert!(output.contains(r"src/delta.rs: mode +x"));
+ }
+
+ #[test]
+ fn test_file_mode_change_lose_executable_bit() {
+ let config = integration_test_utils::make_config_from_args(&[]);
+ let output = integration_test_utils::run_delta(
+ GIT_DIFF_FILE_MODE_CHANGE_LOSE_EXECUTABLE_BIT,
+ &config,
+ );
let output = strip_ansi_codes(&output);
- assert!(output.contains(r"src/delta.rs: 100644 ⟶ 100755"));
+ assert!(output.contains(r"src/delta.rs: mode -x"));
}
const GIT_DIFF_SINGLE_HUNK: &str = "\
@@ -2181,9 +2195,15 @@ Date: Sun Nov 1 15:28:53 2020 -0500
+]
"#;
- const GIT_DIFF_FILE_MODE_CHANGE: &str = "
+ const GIT_DIFF_FILE_MODE_CHANGE_GAIN_EXECUTABLE_BIT: &str = "
diff --git a/src/delta.rs b/src/delta.rs
old mode 100644
new mode 100755
";
+
+ const GIT_DIFF_FILE_MODE_CHANGE_LOSE_EXECUTABLE_BIT: &str = "
+diff --git a/src/delta.rs b/src/delta.rs
+old mode 100755
+new mode 100644
+";
}