diff --git a/internal/exp/diffview/diffview.go b/internal/exp/diffview/diffview.go index 77cea81f593de49454f3f72c31b9e365a95c25d7..be262a8bac73e4507c69d3b4d8757646f75d03bb 100644 --- a/internal/exp/diffview/diffview.go +++ b/internal/exp/diffview/diffview.go @@ -132,21 +132,11 @@ func (dv *DiffView) String() string { var b strings.Builder for i, h := range dv.unified.Hunks { - beforeShownLines, afterShownLines := dv.hunkShownLines(i) - if dv.lineNumbers { b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", beforeNumDigits))) b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", afterNumDigits))) } - b.WriteString(dv.style.DividerLine.Code.Width(codeWidth + leadingSymbolsSize).Render( - fmt.Sprintf( - " @@ -%d,%d +%d,%d @@", - h.FromLine, - beforeShownLines, - h.ToLine, - afterShownLines, - ), - )) + b.WriteString(dv.style.DividerLine.Code.Width(codeWidth + leadingSymbolsSize).Render(dv.hunkLineFor(i))) b.WriteRune('\n') beforeLine := h.FromLine @@ -217,6 +207,19 @@ func (dv *DiffView) lineNumberDigits() (maxBefore, maxAfter int) { return } +func (dv *DiffView) hunkLineFor(i int) string { + h := dv.unified.Hunks[i] + beforeShownLines, afterShownLines := dv.hunkShownLines(i) + + return fmt.Sprintf( + " @@ -%d,%d +%d,%d @@ ", + h.FromLine, + beforeShownLines, + h.ToLine, + afterShownLines, + ) +} + // hunkShownLines calculates the number of lines shown in a hunk for both before // and after versions. func (dv *DiffView) hunkShownLines(i int) (before, after int) { @@ -239,11 +242,13 @@ func (dv *DiffView) detectWidth() { return } - for _, h := range dv.unified.Hunks { + for i, h := range dv.unified.Hunks { + shownLines := ansi.StringWidth(dv.hunkLineFor(i)) + for _, l := range h.Lines { lineWidth := ansi.StringWidth(strings.TrimSuffix(l.Content, "\n")) lineWidth += leadingSymbolsSize - dv.width = max(dv.width, lineWidth) + dv.width = max(dv.width, lineWidth, shownLines) } } } diff --git a/internal/exp/diffview/diffview_test.go b/internal/exp/diffview/diffview_test.go index 32cccaaf6b4c03503b3c688c9fb8de8d60250ed8..ebfa2f99f808c29b4393ae1e6214add8734cb335 100644 --- a/internal/exp/diffview/diffview_test.go +++ b/internal/exp/diffview/diffview_test.go @@ -20,6 +20,12 @@ var TestMultipleHunksBefore string //go:embed testdata/TestMultipleHunks.after var TestMultipleHunksAfter string +//go:embed testdata/TestNarrow.before +var TestNarrowBefore string + +//go:embed testdata/TestNarrow.after +var TestNarrowAfter string + func TestDefault(t *testing.T) { dv := diffview.New(). Before("main.go", TestDefaultBefore). @@ -85,3 +91,19 @@ func TestCustomContextLines(t *testing.T) { golden.RequireEqual(t, []byte(dv.String())) }) } + +func TestNarrow(t *testing.T) { + dv := diffview.New(). + Before("text.txt", TestNarrowBefore). + After("text.txt", TestNarrowAfter) + + t.Run("LightMode", func(t *testing.T) { + dv = dv.Style(diffview.DefaultLightStyle) + golden.RequireEqual(t, []byte(dv.String())) + }) + + t.Run("DarkMode", func(t *testing.T) { + dv = dv.Style(diffview.DefaultDarkStyle) + golden.RequireEqual(t, []byte(dv.String())) + }) +} diff --git a/internal/exp/diffview/testdata/TestCustomContextLines/DarkMode.golden b/internal/exp/diffview/testdata/TestCustomContextLines/DarkMode.golden index 263ada13e18ba7a28110b358be92b78fbd6a9bc8..476034952acfa039a8fa4d91cb55fb51797d8846 100644 --- a/internal/exp/diffview/testdata/TestCustomContextLines/DarkMode.golden +++ b/internal/exp/diffview/testdata/TestCustomContextLines/DarkMode.golden @@ -1,4 +1,4 @@ -  …   …  @@ -1,13 +1,15 @@  +  …   …  @@ -1,13 +1,15 @@     1   1  package main    2   2      3   3  import (  diff --git a/internal/exp/diffview/testdata/TestCustomContextLines/LightMode.golden b/internal/exp/diffview/testdata/TestCustomContextLines/LightMode.golden index ab3295817aff64626089aa4ea8e6f1c5855c2896..10ca5458cb5fae3c7f2a716fb2d6c10065ed66da 100644 --- a/internal/exp/diffview/testdata/TestCustomContextLines/LightMode.golden +++ b/internal/exp/diffview/testdata/TestCustomContextLines/LightMode.golden @@ -1,4 +1,4 @@ -  …   …  @@ -1,13 +1,15 @@  +  …   …  @@ -1,13 +1,15 @@     1   1  package main    2   2      3   3  import (  diff --git a/internal/exp/diffview/testdata/TestDefault/DarkMode.golden b/internal/exp/diffview/testdata/TestDefault/DarkMode.golden index a173f27e7d2cc981122f2559a5b3784b618a1ace..50445f4e0ba2228fef78161b2d655b5dd4031921 100644 --- a/internal/exp/diffview/testdata/TestDefault/DarkMode.golden +++ b/internal/exp/diffview/testdata/TestDefault/DarkMode.golden @@ -1,4 +1,4 @@ -  …   …  @@ -5,5 +5,6 @@  +  …   …  @@ -5,5 +5,6 @@     5   5  )    6   6      7   7  func main() {  diff --git a/internal/exp/diffview/testdata/TestDefault/LightMode.golden b/internal/exp/diffview/testdata/TestDefault/LightMode.golden index 057fc6b55127c00a1fbbca406bd639e474d3b8a8..fffc7209f0939e453d402fd3d512ca00870dee1a 100644 --- a/internal/exp/diffview/testdata/TestDefault/LightMode.golden +++ b/internal/exp/diffview/testdata/TestDefault/LightMode.golden @@ -1,4 +1,4 @@ -  …   …  @@ -5,5 +5,6 @@  +  …   …  @@ -5,5 +5,6 @@     5   5  )    6   6      7   7  func main() {  diff --git a/internal/exp/diffview/testdata/TestMultipleHunks/DarkMode.golden b/internal/exp/diffview/testdata/TestMultipleHunks/DarkMode.golden index 026618e2403d89e10575b3e5a7737f7ba8b41c46..8d96732f3f3a43891fc6e86e95a2f002a5639b26 100644 --- a/internal/exp/diffview/testdata/TestMultipleHunks/DarkMode.golden +++ b/internal/exp/diffview/testdata/TestMultipleHunks/DarkMode.golden @@ -1,4 +1,4 @@ -  …   …  @@ -2,6 +2,7 @@  +  …   …  @@ -2,6 +2,7 @@     2   2      3   3  import (    4   4  "fmt"  @@ -6,7 +6,7 @@   5   6  )    6   7      7   8  func main() {  -  …   …  @@ -9,5 +10,6 @@  +  …   …  @@ -9,5 +10,6 @@     9  10  }   10  11     11  12  func getContent() string {  diff --git a/internal/exp/diffview/testdata/TestMultipleHunks/LightMode.golden b/internal/exp/diffview/testdata/TestMultipleHunks/LightMode.golden index 2ff673f4d9d103855dd38a63bfffe534e8fe6b9d..3b17cd9eab064dc286b0e3196b7dbcc160afde59 100644 --- a/internal/exp/diffview/testdata/TestMultipleHunks/LightMode.golden +++ b/internal/exp/diffview/testdata/TestMultipleHunks/LightMode.golden @@ -1,4 +1,4 @@ -  …   …  @@ -2,6 +2,7 @@  +  …   …  @@ -2,6 +2,7 @@     2   2      3   3  import (    4   4  "fmt"  @@ -6,7 +6,7 @@   5   6  )    6   7      7   8  func main() {  -  …   …  @@ -9,5 +10,6 @@  +  …   …  @@ -9,5 +10,6 @@     9  10  }   10  11     11  12  func getContent() string {  diff --git a/internal/exp/diffview/testdata/TestNarrow.after b/internal/exp/diffview/testdata/TestNarrow.after new file mode 100644 index 0000000000000000000000000000000000000000..2bb9b90bce52274e75ca3ebcf9ffd4e12d86126b --- /dev/null +++ b/internal/exp/diffview/testdata/TestNarrow.after @@ -0,0 +1,3 @@ +d +e +f diff --git a/internal/exp/diffview/testdata/TestNarrow.before b/internal/exp/diffview/testdata/TestNarrow.before new file mode 100644 index 0000000000000000000000000000000000000000..de980441c3ab03a8c07dda1ad27b8a11f39deb1e --- /dev/null +++ b/internal/exp/diffview/testdata/TestNarrow.before @@ -0,0 +1,3 @@ +a +b +c diff --git a/internal/exp/diffview/testdata/TestNarrow/DarkMode.golden b/internal/exp/diffview/testdata/TestNarrow/DarkMode.golden new file mode 100644 index 0000000000000000000000000000000000000000..6bea8fb809ed316716bff912221081340d05edad --- /dev/null +++ b/internal/exp/diffview/testdata/TestNarrow/DarkMode.golden @@ -0,0 +1,7 @@ + …  …  @@ -1,3 +1,3 @@  + 1    - a  + 2    - b  + 3    - c  +    1 + d  +    2 + e  +    3 + f  diff --git a/internal/exp/diffview/testdata/TestNarrow/LightMode.golden b/internal/exp/diffview/testdata/TestNarrow/LightMode.golden new file mode 100644 index 0000000000000000000000000000000000000000..6820053e41bc12c3e262d7817e5673e4583f7e70 --- /dev/null +++ b/internal/exp/diffview/testdata/TestNarrow/LightMode.golden @@ -0,0 +1,7 @@ + …  …  @@ -1,3 +1,3 @@  + 1    - a  + 2    - b  + 3    - c  +    1 + d  +    2 + e  +    3 + f  diff --git a/internal/exp/diffview/testdata/TestNoLineNumbers/DarkMode.golden b/internal/exp/diffview/testdata/TestNoLineNumbers/DarkMode.golden index 5f919312d6ff3bf0b4918fc6350659bd56feb723..1a971eb0896a7232d0ea03718fb677b310b50348 100644 --- a/internal/exp/diffview/testdata/TestNoLineNumbers/DarkMode.golden +++ b/internal/exp/diffview/testdata/TestNoLineNumbers/DarkMode.golden @@ -1,4 +1,4 @@ - @@ -5,5 +5,6 @@  + @@ -5,5 +5,6 @@    )      func main() {  diff --git a/internal/exp/diffview/testdata/TestNoLineNumbers/LightMode.golden b/internal/exp/diffview/testdata/TestNoLineNumbers/LightMode.golden index d79658d36d68c55b53008ff505295e340b024a23..878ec69d9194d52b0c161f417c06926e3752cc18 100644 --- a/internal/exp/diffview/testdata/TestNoLineNumbers/LightMode.golden +++ b/internal/exp/diffview/testdata/TestNoLineNumbers/LightMode.golden @@ -1,4 +1,4 @@ - @@ -5,5 +5,6 @@  + @@ -5,5 +5,6 @@    )      func main() {