diff --git a/docs/changelog.rst b/docs/changelog.rst index a036962f6..f4bd28ae4 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -78,6 +78,8 @@ Detailed list of changes - ssh kitten: Fix a regression causing hostname directives in :file:`ssh.conf` not matching when username is specified (:disc:`6609`) +- diff kitten: Add support for files that are identical apart from mode changes (:iss:`6611`) + 0.29.2 [2023-07-27] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/kittens/diff/collect.go b/kittens/diff/collect.go index 99c42fe50..5b9f7770e 100644 --- a/kittens/diff/collect.go +++ b/kittens/diff/collect.go @@ -312,6 +312,16 @@ func (self *Collection) collect_files(left, right string) error { if ld != rd { changed_names.Add(n) self.add_change(left_path_map[n], right_path_map[n]) + } else { + if lstat, err := os.Stat(left_path_map[n]); err == nil { + if rstat, err := os.Stat(right_path_map[n]); err == nil { + if lstat.Mode() != rstat.Mode() { + // identical files with only a mode change + changed_names.Add(n) + self.add_change(left_path_map[n], right_path_map[n]) + } + } + } } } removed := left_names.Subtract(common_names) diff --git a/kittens/diff/render.go b/kittens/diff/render.go index c570ba259..ec1846ba5 100644 --- a/kittens/diff/render.go +++ b/kittens/diff/render.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math" + "os" "strconv" "strings" @@ -571,7 +572,15 @@ func lines_for_diff(left_path string, right_path string, patch *Patch, columns, is_full_width: true, } if patch.Len() == 0 { - for _, line := range splitlines("The files are identical", columns-margin_size) { + txt := "The files are identical" + if lstat, err := os.Stat(left_path); err == nil { + if rstat, err := os.Stat(right_path); err == nil { + if lstat.Mode() != rstat.Mode() { + txt = fmt.Sprintf("Mode changed: %s to %s", lstat.Mode(), rstat.Mode()) + } + } + } + for _, line := range splitlines(txt, columns-margin_size) { sl := ScreenLine{} sl.left.marked_up_text = line ht.screen_lines = append(ht.screen_lines, &sl)