From 1bf8479bb19be230b61a11ba3f74d7341ffd6914 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Thu, 20 May 2021 14:45:08 -0400 Subject: Emit 'mode [-+]x' instead of full file permission bits (#607) Ref #583 --- src/parse.rs | 10 +++++++--- src/tests/test_example_diffs.rs | 28 ++++++++++++++++++++++++---- 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 "; } -- cgit v1.2.3