|
|
|
@ -371,6 +371,8 @@ type DiffFile struct { |
|
|
|
|
IsViewed bool // User specific
|
|
|
|
|
HasChangedSinceLastReview bool // User specific
|
|
|
|
|
Language string |
|
|
|
|
Mode string |
|
|
|
|
OldMode string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// GetType returns type of diff file.
|
|
|
|
@ -501,6 +503,11 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader, ski |
|
|
|
|
} |
|
|
|
|
return diff, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
prepareValue := func(s, p string) string { |
|
|
|
|
return strings.TrimSpace(strings.TrimPrefix(s, p)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
parsingLoop: |
|
|
|
|
for { |
|
|
|
|
// 1. A patch file always begins with `diff --git ` + `a/path b/path` (possibly quoted)
|
|
|
|
@ -585,11 +592,20 @@ parsingLoop: |
|
|
|
|
} |
|
|
|
|
break parsingLoop |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch { |
|
|
|
|
case strings.HasPrefix(line, cmdDiffHead): |
|
|
|
|
break curFileLoop |
|
|
|
|
case strings.HasPrefix(line, "old mode ") || |
|
|
|
|
strings.HasPrefix(line, "new mode "): |
|
|
|
|
|
|
|
|
|
if strings.HasPrefix(line, "old mode ") { |
|
|
|
|
curFile.OldMode = prepareValue(line, "old mode ") |
|
|
|
|
} |
|
|
|
|
if strings.HasPrefix(line, "new mode ") { |
|
|
|
|
curFile.Mode = prepareValue(line, "new mode ") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if strings.HasSuffix(line, " 160000\n") { |
|
|
|
|
curFile.IsSubmodule = true |
|
|
|
|
} |
|
|
|
@ -597,31 +613,34 @@ parsingLoop: |
|
|
|
|
curFile.IsRenamed = true |
|
|
|
|
curFile.Type = DiffFileRename |
|
|
|
|
if curFile.IsAmbiguous { |
|
|
|
|
curFile.OldName = line[len("rename from ") : len(line)-1] |
|
|
|
|
curFile.OldName = prepareValue(line, "rename from ") |
|
|
|
|
} |
|
|
|
|
case strings.HasPrefix(line, "rename to "): |
|
|
|
|
curFile.IsRenamed = true |
|
|
|
|
curFile.Type = DiffFileRename |
|
|
|
|
if curFile.IsAmbiguous { |
|
|
|
|
curFile.Name = line[len("rename to ") : len(line)-1] |
|
|
|
|
curFile.Name = prepareValue(line, "rename to ") |
|
|
|
|
curFile.IsAmbiguous = false |
|
|
|
|
} |
|
|
|
|
case strings.HasPrefix(line, "copy from "): |
|
|
|
|
curFile.IsRenamed = true |
|
|
|
|
curFile.Type = DiffFileCopy |
|
|
|
|
if curFile.IsAmbiguous { |
|
|
|
|
curFile.OldName = line[len("copy from ") : len(line)-1] |
|
|
|
|
curFile.OldName = prepareValue(line, "copy from ") |
|
|
|
|
} |
|
|
|
|
case strings.HasPrefix(line, "copy to "): |
|
|
|
|
curFile.IsRenamed = true |
|
|
|
|
curFile.Type = DiffFileCopy |
|
|
|
|
if curFile.IsAmbiguous { |
|
|
|
|
curFile.Name = line[len("copy to ") : len(line)-1] |
|
|
|
|
curFile.Name = prepareValue(line, "copy to ") |
|
|
|
|
curFile.IsAmbiguous = false |
|
|
|
|
} |
|
|
|
|
case strings.HasPrefix(line, "new file"): |
|
|
|
|
curFile.Type = DiffFileAdd |
|
|
|
|
curFile.IsCreated = true |
|
|
|
|
if strings.HasPrefix(line, "new file mode ") { |
|
|
|
|
curFile.Mode = prepareValue(line, "new file mode ") |
|
|
|
|
} |
|
|
|
|
if strings.HasSuffix(line, " 160000\n") { |
|
|
|
|
curFile.IsSubmodule = true |
|
|
|
|
} |
|
|
|
|