on main help sign in
fix(diffview): fix diffview width when code is too narrow
commitb7219b848466d6f8aeddb3a1eb57f46ccc068471 authorAndrey Nering <andreynering@users.noreply.github.com> dateThu 5 Jun 2025, 16:02 (1 year ago) parent357d727
14 files changed+70−23
internal/exp/diffview/diffview.go+18−13 internal/exp/diffview/diffview_test.go+22 internal/exp/diffview/testdata/TestCustomContextLines/DarkMode.golden+1−1 internal/exp/diffview/testdata/TestCustomContextLines/LightMode.golden+1−1 internal/exp/diffview/testdata/TestDefault/DarkMode.golden+1−1 internal/exp/diffview/testdata/TestDefault/LightMode.golden+1−1 internal/exp/diffview/testdata/TestMultipleHunks/DarkMode.golden+2−2 internal/exp/diffview/testdata/TestMultipleHunks/LightMode.golden+2−2 internal/exp/diffview/testdata/TestNarrow.after+3 internal/exp/diffview/testdata/TestNarrow.before+3 internal/exp/diffview/testdata/TestNarrow/DarkMode.golden+7 internal/exp/diffview/testdata/TestNarrow/LightMode.golden+7 internal/exp/diffview/testdata/TestNoLineNumbers/DarkMode.golden+1−1 internal/exp/diffview/testdata/TestNoLineNumbers/LightMode.golden+1−1
internal/exp/diffview/diffview.go+18−13
@@ -132,21 +132,11 @@ func (dv *DiffView) String() string {
132132 var b strings.Builder
133133
134134 for i, h := range dv.unified.Hunks {
135− beforeShownLines, afterShownLines := dv.hunkShownLines(i)
136−
137135 if dv.lineNumbers {
138136 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", beforeNumDigits)))
139137 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", afterNumDigits)))
140138 }
141− b.WriteString(dv.style.DividerLine.Code.Width(codeWidth + leadingSymbolsSize).Render(
142− fmt.Sprintf(
143− " @@ -%d,%d +%d,%d @@",
144− h.FromLine,
145− beforeShownLines,
146− h.ToLine,
147− afterShownLines,
148− ),
149− ))
139+ b.WriteString(dv.style.DividerLine.Code.Width(codeWidth + leadingSymbolsSize).Render(dv.hunkLineFor(i)))
150140 b.WriteRune('\n')
151141
152142 beforeLine := h.FromLine
@@ -217,6 +207,19 @@ func (dv *DiffView) lineNumberDigits() (maxBefore, maxAfter int) {
217207 return
218208}
219209
210+func (dv *DiffView) hunkLineFor(i int) string {
211+ h := dv.unified.Hunks[i]
212+ beforeShownLines, afterShownLines := dv.hunkShownLines(i)
213+
214+ return fmt.Sprintf(
215+ " @@ -%d,%d +%d,%d @@ ",
216+ h.FromLine,
217+ beforeShownLines,
218+ h.ToLine,
219+ afterShownLines,
220+ )
221+}
222+
220223// hunkShownLines calculates the number of lines shown in a hunk for both before
221224// and after versions.
222225func (dv *DiffView) hunkShownLines(i int) (before, after int) {
@@ -239,11 +242,13 @@ func (dv *DiffView) detectWidth() {
239242 return
240243 }
241244
242− for _, h := range dv.unified.Hunks {
245+ for i, h := range dv.unified.Hunks {
246+ shownLines := ansi.StringWidth(dv.hunkLineFor(i))
247+
243248 for _, l := range h.Lines {
244249 lineWidth := ansi.StringWidth(strings.TrimSuffix(l.Content, "\n"))
245250 lineWidth += leadingSymbolsSize
246− dv.width = max(dv.width, lineWidth)
251+ dv.width = max(dv.width, lineWidth, shownLines)
247252 }
248253 }
249254}
internal/exp/diffview/diffview_test.go+22
@@ -20,6 +20,12 @@ var TestMultipleHunksBefore string
2020//go:embed testdata/TestMultipleHunks.after
2121var TestMultipleHunksAfter string
2222
23+//go:embed testdata/TestNarrow.before
24+var TestNarrowBefore string
25+
26+//go:embed testdata/TestNarrow.after
27+var TestNarrowAfter string
28+
2329func TestDefault(t *testing.T) {
2430 dv := diffview.New().
2531 Before("main.go", TestDefaultBefore).
@@ -85,3 +91,19 @@ func TestCustomContextLines(t *testing.T) {
8591 golden.RequireEqual(t, []byte(dv.String()))
8692 })
8793}
94+
95+func TestNarrow(t *testing.T) {
96+ dv := diffview.New().
97+ Before("text.txt", TestNarrowBefore).
98+ After("text.txt", TestNarrowAfter)
99+
100+ t.Run("LightMode", func(t *testing.T) {
101+ dv = dv.Style(diffview.DefaultLightStyle)
102+ golden.RequireEqual(t, []byte(dv.String()))
103+ })
104+
105+ t.Run("DarkMode", func(t *testing.T) {
106+ dv = dv.Style(diffview.DefaultDarkStyle)
107+ golden.RequireEqual(t, []byte(dv.String()))
108+ })
109+}
internal/exp/diffview/testdata/TestCustomContextLines/DarkMode.golden+1−1
@@ -1,4 +1,4 @@
1−  …   …  @@ -1,13 +1,15 @@ 
1+  …   …  @@ -1,13 +1,15 @@  
22  1   1  package main 
33  2   2   
44  3   3  import ( 
internal/exp/diffview/testdata/TestCustomContextLines/LightMode.golden+1−1
@@ -1,4 +1,4 @@
1−  …   …  @@ -1,13 +1,15 @@ 
1+  …   …  @@ -1,13 +1,15 @@  
22  1   1  package main 
33  2   2   
44  3   3  import ( 
internal/exp/diffview/testdata/TestDefault/DarkMode.golden+1−1
@@ -1,4 +1,4 @@
1−  …   …  @@ -5,5 +5,6 @@ 
1+  …   …  @@ -5,5 +5,6 @@  
22  5   5  ) 
33  6   6   
44  7   7  func main() { 
internal/exp/diffview/testdata/TestDefault/LightMode.golden+1−1
@@ -1,4 +1,4 @@
1−  …   …  @@ -5,5 +5,6 @@ 
1+  …   …  @@ -5,5 +5,6 @@  
22  5   5  ) 
33  6   6   
44  7   7  func main() { 
internal/exp/diffview/testdata/TestMultipleHunks/DarkMode.golden+2−2
@@ -1,4 +1,4 @@
1−  …   …  @@ -2,6 +2,7 @@ 
1+  …   …  @@ -2,6 +2,7 @@  
22  2   2   
33  3   3  import ( 
44  4   4  "fmt" 
@@ -6,7 +6,7 @@
66  5   6  ) 
77  6   7   
88  7   8  func main() { 
9−  …   …  @@ -9,5 +10,6 @@ 
9+  …   …  @@ -9,5 +10,6 @@  
1010  9  10  } 
1111 10  11   
1212 11  12  func getContent() string { 
internal/exp/diffview/testdata/TestMultipleHunks/LightMode.golden+2−2
@@ -1,4 +1,4 @@
1−  …   …  @@ -2,6 +2,7 @@ 
1+  …   …  @@ -2,6 +2,7 @@  
22  2   2   
33  3   3  import ( 
44  4   4  "fmt" 
@@ -6,7 +6,7 @@
66  5   6  ) 
77  6   7   
88  7   8  func main() { 
9−  …   …  @@ -9,5 +10,6 @@ 
9+  …   …  @@ -9,5 +10,6 @@  
1010  9  10  } 
1111 10  11   
1212 11  12  func getContent() string { 
internal/exp/diffview/testdata/TestNarrow.afternew file+3
@@ -0,0 +1,3 @@
1+d
2+e
3+f
internal/exp/diffview/testdata/TestNarrow.beforenew file+3
@@ -0,0 +1,3 @@
1+a
2+b
3+c
internal/exp/diffview/testdata/TestNarrow/DarkMode.goldennew file+7
@@ -0,0 +1,7 @@
1+ …  …  @@ -1,3 +1,3 @@ 
2+ 1    - a 
3+ 2    - b 
4+ 3    - c 
5+    1 + d 
6+    2 + e 
7+    3 + f 
internal/exp/diffview/testdata/TestNarrow/LightMode.goldennew file+7
@@ -0,0 +1,7 @@
1+ …  …  @@ -1,3 +1,3 @@ 
2+ 1    - a 
3+ 2    - b 
4+ 3    - c 
5+    1 + d 
6+    2 + e 
7+    3 + f 
internal/exp/diffview/testdata/TestNoLineNumbers/DarkMode.golden+1−1
@@ -1,4 +1,4 @@
1− @@ -5,5 +5,6 @@ 
1+ @@ -5,5 +5,6 @@  
22 ) 
33  
44 func main() { 
internal/exp/diffview/testdata/TestNoLineNumbers/LightMode.golden+1−1
@@ -1,4 +1,4 @@
1− @@ -5,5 +5,6 @@ 
1+ @@ -5,5 +5,6 @@  
22 ) 
33  
44 func main() {