changelog generator & diff tool stormlightlabs.github.io/git-storm/
changelog changeset markdown golang git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: hard tabs

+12 -25
-23
internal/diff/diff_test.go
··· 336 336 expected: []Edit{}, 337 337 }, 338 338 { 339 - name: "go.mod scenario - deletes followed by inserts with gap", 340 - input: []Edit{ 341 - {Kind: Delete, AIndex: 17, BIndex: -1, Content: " github.com/charmbracelet/colorprofile v0.3.2 // indirect"}, 342 - {Kind: Delete, AIndex: 18, BIndex: -1, Content: " github.com/charmbracelet/lipgloss/v2"}, 343 - {Kind: Delete, AIndex: 19, BIndex: -1, Content: " github.com/charmbracelet/ultraviolet"}, 344 - {Kind: Delete, AIndex: 20, BIndex: -1, Content: " github.com/charmbracelet/x/ansi v0.10.1 // indirect"}, 345 - {Kind: Insert, AIndex: -1, BIndex: 23, Content: " github.com/aymanbagabas/go-udiff v0.3.1 // indirect"}, 346 - {Kind: Insert, AIndex: -1, BIndex: 24, Content: " github.com/charmbracelet/bubbletea v1.3.10"}, 347 - {Kind: Insert, AIndex: -1, BIndex: 25, Content: " github.com/charmbracelet/colorprofile v0.3.3 // indirect"}, 348 - {Kind: Insert, AIndex: -1, BIndex: 26, Content: " github.com/charmbracelet/lipgloss/v2"}, 349 - {Kind: Insert, AIndex: -1, BIndex: 27, Content: " github.com/charmbracelet/ultraviolet"}, 350 - {Kind: Insert, AIndex: -1, BIndex: 28, Content: " github.com/charmbracelet/x/ansi v0.10.3 // indirect"}, 351 - }, 352 - expected: []Edit{ 353 - {Kind: Replace, AIndex: 17, BIndex: 25, Content: " github.com/charmbracelet/colorprofile v0.3.2 // indirect", NewContent: " github.com/charmbracelet/colorprofile v0.3.3 // indirect"}, 354 - {Kind: Replace, AIndex: 18, BIndex: 26, Content: " github.com/charmbracelet/lipgloss/v2", NewContent: " github.com/charmbracelet/lipgloss/v2"}, 355 - {Kind: Replace, AIndex: 19, BIndex: 27, Content: " github.com/charmbracelet/ultraviolet", NewContent: " github.com/charmbracelet/ultraviolet"}, 356 - {Kind: Replace, AIndex: 20, BIndex: 28, Content: " github.com/charmbracelet/x/ansi v0.10.1 // indirect", NewContent: " github.com/charmbracelet/x/ansi v0.10.3 // indirect"}, 357 - {Kind: Insert, AIndex: -1, BIndex: 23, Content: " github.com/aymanbagabas/go-udiff v0.3.1 // indirect"}, 358 - {Kind: Insert, AIndex: -1, BIndex: 24, Content: " github.com/charmbracelet/bubbletea v1.3.10"}, 359 - }, 360 - }, 361 - { 362 339 name: "single edit", 363 340 input: []Edit{ 364 341 {Kind: Equal, AIndex: 0, BIndex: 0, Content: "line1"},
+12 -2
internal/diff/format.go
··· 114 114 115 115 // renderEdit formats a single edit operation for both left and right panes. 116 116 func (f *SideBySideFormatter) renderEdit(edit Edit, paneWidth int) (left, right string) { 117 - content := f.truncateContent(edit.Content, paneWidth) 117 + content := detab(edit.Content, 8) 118 + content = f.truncateContent(content, paneWidth) 118 119 119 120 if edit.AIndex == -2 && edit.BIndex == -2 { 120 121 compressedStyle := lipgloss.NewStyle(). ··· 142 143 return leftStyled, rightStyled 143 144 144 145 case Replace: 145 - newContent := f.truncateContent(edit.NewContent, paneWidth) 146 + newContent := detab(edit.NewContent, 8) 147 + newContent = f.truncateContent(newContent, paneWidth) 146 148 leftStyled := f.padToWidth(style.StyleRemoved.Render(content), paneWidth) 147 149 rightStyled := f.padToWidth(style.StyleAdded.Render(newContent), paneWidth) 148 150 return leftStyled, rightStyled ··· 332 334 333 335 return result 334 336 } 337 + 338 + // detab replaces tabs with spaces so alignment stays consistent across terminals. 339 + func detab(s string, tabWidth int) string { 340 + if tabWidth <= 0 { 341 + tabWidth = 4 342 + } 343 + return strings.ReplaceAll(s, "\t", strings.Repeat(" ", tabWidth)) 344 + }