Skip to content

Commit 981bc4b

Browse files
authored
Fix parsing of mode lines with trailing space (#38)
If a patch is passed through a system that converts line endings to '\r\n', mode lines end up with trailing whitespace that confuses strconv.ParseInt. In Git, this is avoided by using strtoul() for parsing, which stops at the first non-digit character. Changing line endings in patch content itself will cause other problems so it is best to avoid this transform, but if it does happen, it shouldn't cause a parse error.
1 parent 1575e0c commit 981bc4b

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

gitdiff/file_header.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -324,12 +324,12 @@ func parseGitHeaderNewName(f *File, line, defaultName string) error {
324324
}
325325

326326
func parseGitHeaderOldMode(f *File, line, defaultName string) (err error) {
327-
f.OldMode, err = parseMode(line)
327+
f.OldMode, err = parseMode(strings.TrimSpace(line))
328328
return
329329
}
330330

331331
func parseGitHeaderNewMode(f *File, line, defaultName string) (err error) {
332-
f.NewMode, err = parseMode(line)
332+
f.NewMode, err = parseMode(strings.TrimSpace(line))
333333
return
334334
}
335335

gitdiff/file_header_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,12 @@ func TestParseGitHeaderData(t *testing.T) {
486486
OldMode: os.FileMode(0100644),
487487
},
488488
},
489+
"oldModeWithTrailingSpace": {
490+
Line: "old mode 100644\r\n",
491+
OutputFile: &File{
492+
OldMode: os.FileMode(0100644),
493+
},
494+
},
489495
"invalidOldMode": {
490496
Line: "old mode rw\n",
491497
Err: true,
@@ -496,6 +502,12 @@ func TestParseGitHeaderData(t *testing.T) {
496502
NewMode: os.FileMode(0100755),
497503
},
498504
},
505+
"newModeWithTrailingSpace": {
506+
Line: "new mode 100755\r\n",
507+
OutputFile: &File{
508+
NewMode: os.FileMode(0100755),
509+
},
510+
},
499511
"invalidNewMode": {
500512
Line: "new mode rwx\n",
501513
Err: true,
@@ -518,6 +530,15 @@ func TestParseGitHeaderData(t *testing.T) {
518530
IsNew: true,
519531
},
520532
},
533+
"newFileModeWithTrailingSpace": {
534+
Line: "new file mode 100755\r\n",
535+
DefaultName: "dir/file.txt",
536+
OutputFile: &File{
537+
NewName: "dir/file.txt",
538+
NewMode: os.FileMode(0100755),
539+
IsNew: true,
540+
},
541+
},
521542
"copyFrom": {
522543
Line: "copy from dir/file.txt\n",
523544
OutputFile: &File{

0 commit comments

Comments
 (0)