Skip to content

Commit 8753644

Browse files
committed
Add tests for single fragment parsing
To make output better, also add some (temporary?) String() functions and fix an assumption about the smallest fragment header I discovered was wrong while looking at sample patches.
1 parent 4e8b7b5 commit 8753644

File tree

5 files changed

+289
-31
lines changed

5 files changed

+289
-31
lines changed

gitdiff/file_header.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (p *parser) ParseGitFileHeader() (*File, error) {
6161
}
6262

6363
func (p *parser) ParseTraditionalFileHeader() (*File, error) {
64-
const shortestValidFragHeader = "@@ -0,0 +1 @@\n"
64+
const shortestValidFragHeader = "@@ -1 +1 @@\n"
6565
const (
6666
oldPrefix = "--- "
6767
newPrefix = "+++ "

gitdiff/file_header_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package gitdiff
22

33
import (
4-
"bufio"
54
"os"
65
"reflect"
7-
"strings"
86
"testing"
97
)
108

@@ -150,8 +148,7 @@ index deadbeef
150148

151149
for name, test := range tests {
152150
t.Run(name, func(t *testing.T) {
153-
p := &parser{r: bufio.NewReader(strings.NewReader(test.Input))}
154-
p.Next()
151+
p := newTestParser(test.Input, true)
155152

156153
f, err := p.ParseGitFileHeader()
157154
if test.Err {
@@ -256,8 +253,7 @@ context line
256253

257254
for name, test := range tests {
258255
t.Run(name, func(t *testing.T) {
259-
p := &parser{r: bufio.NewReader(strings.NewReader(test.Input))}
260-
p.Next()
256+
p := newTestParser(test.Input, true)
261257

262258
f, err := p.ParseTraditionalFileHeader()
263259
if test.Err {

gitdiff/gitdiff.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ type FragmentLine struct {
5151
Line string
5252
}
5353

54+
func (fl FragmentLine) String() string {
55+
return fl.Op.String() + fl.Line
56+
}
57+
5458
// LineOp describes the type of a fragment line: context, added, or removed.
5559
type LineOp int
5660

@@ -63,6 +67,18 @@ const (
6367
OpAdd
6468
)
6569

70+
func (op LineOp) String() string {
71+
switch op {
72+
case OpContext:
73+
return " "
74+
case OpDelete:
75+
return "-"
76+
case OpAdd:
77+
return "+"
78+
}
79+
return "?"
80+
}
81+
6682
// Header returns the cannonical header of this fragment.
6783
func (f *Fragment) Header() string {
6884
return fmt.Sprintf("@@ -%d,%d +%d,%d @@ %s", f.OldPosition, f.OldLines, f.NewPosition, f.NewLines, f.Comment)

gitdiff/parser.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,11 @@ func (p *parser) ParseTextChunk(frag *Fragment) error {
245245
oldLines, newLines := frag.OldLines, frag.NewLines
246246
for {
247247
line := p.Line(0)
248-
switch line[0] {
248+
op, data := line[0], line[1:]
249+
250+
switch op {
249251
case '\n':
252+
data = "\n"
250253
fallthrough // newer GNU diff versions create empty context lines
251254
case ' ':
252255
oldLines--
@@ -256,25 +259,25 @@ func (p *parser) ParseTextChunk(frag *Fragment) error {
256259
} else {
257260
frag.TrailingContext++
258261
}
259-
frag.Lines = append(frag.Lines, FragmentLine{OpContext, line[1:]})
262+
frag.Lines = append(frag.Lines, FragmentLine{OpContext, data})
260263
case '-':
261264
oldLines--
262265
frag.LinesDeleted++
263266
frag.TrailingContext = 0
264-
frag.Lines = append(frag.Lines, FragmentLine{OpDelete, line[1:]})
267+
frag.Lines = append(frag.Lines, FragmentLine{OpDelete, data})
265268
case '+':
266269
newLines--
267270
frag.LinesAdded++
268271
frag.TrailingContext = 0
269-
frag.Lines = append(frag.Lines, FragmentLine{OpAdd, line[1:]})
272+
frag.Lines = append(frag.Lines, FragmentLine{OpAdd, data})
270273
default:
271274
// this may appear in middle of fragment if it's for a deleted line
272275
if isNoNewlineLine(line) {
273-
last := len(frag.Lines) - 1
274-
frag.Lines[last].Line = strings.TrimSuffix(frag.Lines[last].Line, "\n")
276+
last := &frag.Lines[len(frag.Lines)-1]
277+
last.Line = strings.TrimSuffix(last.Line, "\n")
275278
break
276279
}
277-
return p.Errorf(0, "invalid line operation: %q", line[0])
280+
return p.Errorf(0, "invalid line operation: %q", op)
278281
}
279282

280283
next := p.Line(1)

0 commit comments

Comments
 (0)