on main help sign in
fix(diffview): fix diffview width when code is too narrow
b7219b8Andrey Nering
internal/exp/diffview/diffview.go+18−13
@@ -132,21 +132,11 @@ func (dv *DiffView) String() string {
132 var b strings.Builder
132 var b strings.Builder
133
133
134 for i, h := range dv.unified.Hunks {
134 for i, h := range dv.unified.Hunks {
135− beforeShownLines, afterShownLines := dv.hunkShownLines(i)
136−
137 if dv.lineNumbers {
135 if dv.lineNumbers {
138 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", beforeNumDigits)))
136 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", beforeNumDigits)))
139 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", afterNumDigits)))
137 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", afterNumDigits)))
140 }
138 }
141− b.WriteString(dv.style.DividerLine.Code.Width(codeWidth + leadingSymbolsSize).Render(
139+ b.WriteString(dv.style.DividerLine.Code.Width(codeWidth + leadingSymbolsSize).Render(dv.hunkLineFor(i)))
142− fmt.Sprintf(
143− " @@ -%d,%d +%d,%d @@",
144− h.FromLine,
145− beforeShownLines,
146− h.ToLine,
147− afterShownLines,
148− ),
149− ))
150 b.WriteRune('\n')
140 b.WriteRune('\n')
151
141
152 beforeLine := h.FromLine
142 beforeLine := h.FromLine
@@ -217,6 +207,19 @@ func (dv *DiffView) lineNumberDigits() (maxBefore, maxAfter int) {
217 return
207 return
218}
208}
219
209
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+
220// hunkShownLines calculates the number of lines shown in a hunk for both before
223// hunkShownLines calculates the number of lines shown in a hunk for both before
221// and after versions.
224// and after versions.
222func (dv *DiffView) hunkShownLines(i int) (before, after int) {
225func (dv *DiffView) hunkShownLines(i int) (before, after int) {
@@ -239,11 +242,13 @@ func (dv *DiffView) detectWidth() {
239 return
242 return
240 }
243 }
241
244
242− for _, h := range dv.unified.Hunks {
245+ for i, h := range dv.unified.Hunks {
246+ shownLines := ansi.StringWidth(dv.hunkLineFor(i))
247+
243 for _, l := range h.Lines {
248 for _, l := range h.Lines {
244 lineWidth := ansi.StringWidth(strings.TrimSuffix(l.Content, "\n"))
249 lineWidth := ansi.StringWidth(strings.TrimSuffix(l.Content, "\n"))
245 lineWidth += leadingSymbolsSize
250 lineWidth += leadingSymbolsSize
246− dv.width = max(dv.width, lineWidth)
251+ dv.width = max(dv.width, lineWidth, shownLines)
247 }
252 }
248 }
253 }
249}
254}
internal/exp/diffview/diffview_test.go+22
@@ -20,6 +20,12 @@ var TestMultipleHunksBefore string
20//go:embed testdata/TestMultipleHunks.after
20//go:embed testdata/TestMultipleHunks.after
21var TestMultipleHunksAfter string
21var TestMultipleHunksAfter string
22
22
23+//go:embed testdata/TestNarrow.before
24+var TestNarrowBefore string
25+
26+//go:embed testdata/TestNarrow.after
27+var TestNarrowAfter string
28+
23func TestDefault(t *testing.T) {
29func TestDefault(t *testing.T) {
24 dv := diffview.New().
30 dv := diffview.New().
25 Before("main.go", TestDefaultBefore).
31 Before("main.go", TestDefaultBefore).
@@ -85,3 +91,19 @@ func TestCustomContextLines(t *testing.T) {
85 golden.RequireEqual(t, []byte(dv.String()))
91 golden.RequireEqual(t, []byte(dv.String()))
86 })
92 })
87}
93}
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 @@  
2  1   1  package main 
2  1   1  package main 
3  2   2   
3  2   2   
4  3   3  import ( 
4  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 @@  
2  1   1  package main 
2  1   1  package main 
3  2   2   
3  2   2   
4  3   3  import ( 
4  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 @@  
2  5   5  ) 
2  5   5  ) 
3  6   6   
3  6   6   
4  7   7  func main() { 
4  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 @@  
2  5   5  ) 
2  5   5  ) 
3  6   6   
3  6   6   
4  7   7  func main() { 
4  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 @@  
2  2   2   
2  2   2   
3  3   3  import ( 
3  3   3  import ( 
4  4   4  "fmt" 
4  4   4  "fmt" 
@@ -6,7 +6,7 @@
6  5   6  ) 
6  5   6  ) 
7  6   7   
7  6   7   
8  7   8  func main() { 
8  7   8  func main() { 
9−  …   …  @@ -9,5 +10,6 @@ 
9+  …   …  @@ -9,5 +10,6 @@  
10  9  10  } 
10  9  10  } 
11 10  11   
11 10  11   
12 11  12  func getContent() string { 
12 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 @@  
2  2   2   
2  2   2   
3  3   3  import ( 
3  3   3  import ( 
4  4   4  "fmt" 
4  4   4  "fmt" 
@@ -6,7 +6,7 @@
6  5   6  ) 
6  5   6  ) 
7  6   7   
7  6   7   
8  7   8  func main() { 
8  7   8  func main() { 
9−  …   …  @@ -9,5 +10,6 @@ 
9+  …   …  @@ -9,5 +10,6 @@  
10  9  10  } 
10  9  10  } 
11 10  11   
11 10  11   
12 11  12  func getContent() string { 
12 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 @@  
2 ) 
2 ) 
3  
3  
4 func main() { 
4 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 @@  
2 ) 
2 ) 
3  
3  
4 func main() { 
4 func main() {