|
|
|
@ -31,18 +31,18 @@ import (
|
|
|
|
|
type DiffLineType uint8
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
DIFF_LINE_PLAIN DiffLineType = iota + 1
|
|
|
|
|
DIFF_LINE_ADD
|
|
|
|
|
DIFF_LINE_DEL
|
|
|
|
|
DiffLinePlain DiffLineType = iota + 1
|
|
|
|
|
DiffLineAdd
|
|
|
|
|
DiffLineDel
|
|
|
|
|
DIFF_LINE_SECTION
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type DiffFileType uint8
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
DIFF_FILE_ADD DiffFileType = iota + 1
|
|
|
|
|
DIFF_FILE_CHANGE
|
|
|
|
|
DIFF_FILE_DEL
|
|
|
|
|
DiffFileAdd DiffFileType = iota + 1
|
|
|
|
|
DiffFileChange
|
|
|
|
|
DiffFileDel
|
|
|
|
|
DIFF_FILE_RENAME
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -73,19 +73,19 @@ func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTM
|
|
|
|
|
|
|
|
|
|
// Reproduce signs which are cutted for inline diff before.
|
|
|
|
|
switch lineType {
|
|
|
|
|
case DIFF_LINE_ADD:
|
|
|
|
|
case DiffLineAdd:
|
|
|
|
|
buf.WriteByte('+')
|
|
|
|
|
case DIFF_LINE_DEL:
|
|
|
|
|
case DiffLineDel:
|
|
|
|
|
buf.WriteByte('-')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := range diffs {
|
|
|
|
|
switch {
|
|
|
|
|
case diffs[i].Type == diffmatchpatch.DiffInsert && lineType == DIFF_LINE_ADD:
|
|
|
|
|
case diffs[i].Type == diffmatchpatch.DiffInsert && lineType == DiffLineAdd:
|
|
|
|
|
buf.Write(addedCodePrefix)
|
|
|
|
|
buf.WriteString(html.EscapeString(diffs[i].Text))
|
|
|
|
|
buf.Write(codeTagSuffix)
|
|
|
|
|
case diffs[i].Type == diffmatchpatch.DiffDelete && lineType == DIFF_LINE_DEL:
|
|
|
|
|
case diffs[i].Type == diffmatchpatch.DiffDelete && lineType == DiffLineDel:
|
|
|
|
|
buf.Write(removedCodePrefix)
|
|
|
|
|
buf.WriteString(html.EscapeString(diffs[i].Text))
|
|
|
|
|
buf.Write(codeTagSuffix)
|
|
|
|
@ -109,9 +109,9 @@ func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLin
|
|
|
|
|
LOOP:
|
|
|
|
|
for _, diffLine := range diffSection.Lines {
|
|
|
|
|
switch diffLine.Type {
|
|
|
|
|
case DIFF_LINE_ADD:
|
|
|
|
|
case DiffLineAdd:
|
|
|
|
|
addCount++
|
|
|
|
|
case DIFF_LINE_DEL:
|
|
|
|
|
case DiffLineDel:
|
|
|
|
|
delCount++
|
|
|
|
|
default:
|
|
|
|
|
if matchDiffLine != nil {
|
|
|
|
@ -123,11 +123,11 @@ LOOP:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch lineType {
|
|
|
|
|
case DIFF_LINE_DEL:
|
|
|
|
|
case DiffLineDel:
|
|
|
|
|
if diffLine.RightIdx == 0 && diffLine.LeftIdx == idx-difference {
|
|
|
|
|
matchDiffLine = diffLine
|
|
|
|
|
}
|
|
|
|
|
case DIFF_LINE_ADD:
|
|
|
|
|
case DiffLineAdd:
|
|
|
|
|
if diffLine.LeftIdx == 0 && diffLine.RightIdx == idx+difference {
|
|
|
|
|
matchDiffLine = diffLine
|
|
|
|
|
}
|
|
|
|
@ -159,15 +159,15 @@ func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) tem
|
|
|
|
|
|
|
|
|
|
// try to find equivalent diff line. ignore, otherwise
|
|
|
|
|
switch diffLine.Type {
|
|
|
|
|
case DIFF_LINE_ADD:
|
|
|
|
|
compareDiffLine = diffSection.GetLine(DIFF_LINE_DEL, diffLine.RightIdx)
|
|
|
|
|
case DiffLineAdd:
|
|
|
|
|
compareDiffLine = diffSection.GetLine(DiffLineDel, diffLine.RightIdx)
|
|
|
|
|
if compareDiffLine == nil {
|
|
|
|
|
return template.HTML(html.EscapeString(diffLine.Content))
|
|
|
|
|
}
|
|
|
|
|
diff1 = compareDiffLine.Content
|
|
|
|
|
diff2 = diffLine.Content
|
|
|
|
|
case DIFF_LINE_DEL:
|
|
|
|
|
compareDiffLine = diffSection.GetLine(DIFF_LINE_ADD, diffLine.LeftIdx)
|
|
|
|
|
case DiffLineDel:
|
|
|
|
|
compareDiffLine = diffSection.GetLine(DiffLineAdd, diffLine.LeftIdx)
|
|
|
|
|
if compareDiffLine == nil {
|
|
|
|
|
return template.HTML(html.EscapeString(diffLine.Content))
|
|
|
|
|
}
|
|
|
|
@ -264,7 +264,7 @@ func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*
|
|
|
|
|
|
|
|
|
|
switch {
|
|
|
|
|
case line[0] == ' ':
|
|
|
|
|
diffLine := &DiffLine{Type: DIFF_LINE_PLAIN, Content: line, LeftIdx: leftLine, RightIdx: rightLine}
|
|
|
|
|
diffLine := &DiffLine{Type: DiffLinePlain, Content: line, LeftIdx: leftLine, RightIdx: rightLine}
|
|
|
|
|
leftLine++
|
|
|
|
|
rightLine++
|
|
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
|
@ -289,14 +289,14 @@ func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*
|
|
|
|
|
case line[0] == '+':
|
|
|
|
|
curFile.Addition++
|
|
|
|
|
diff.TotalAddition++
|
|
|
|
|
diffLine := &DiffLine{Type: DIFF_LINE_ADD, Content: line, RightIdx: rightLine}
|
|
|
|
|
diffLine := &DiffLine{Type: DiffLineAdd, Content: line, RightIdx: rightLine}
|
|
|
|
|
rightLine++
|
|
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
|
|
continue
|
|
|
|
|
case line[0] == '-':
|
|
|
|
|
curFile.Deletion++
|
|
|
|
|
diff.TotalDeletion++
|
|
|
|
|
diffLine := &DiffLine{Type: DIFF_LINE_DEL, Content: line, LeftIdx: leftLine}
|
|
|
|
|
diffLine := &DiffLine{Type: DiffLineDel, Content: line, LeftIdx: leftLine}
|
|
|
|
|
if leftLine > 0 {
|
|
|
|
|
leftLine++
|
|
|
|
|
}
|
|
|
|
@ -330,7 +330,7 @@ func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*
|
|
|
|
|
curFile = &DiffFile{
|
|
|
|
|
Name: a,
|
|
|
|
|
Index: len(diff.Files) + 1,
|
|
|
|
|
Type: DIFF_FILE_CHANGE,
|
|
|
|
|
Type: DiffFileChange,
|
|
|
|
|
Sections: make([]*DiffSection, 0, 10),
|
|
|
|
|
}
|
|
|
|
|
diff.Files = append(diff.Files, curFile)
|
|
|
|
@ -354,13 +354,13 @@ func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*
|
|
|
|
|
|
|
|
|
|
switch {
|
|
|
|
|
case strings.HasPrefix(line, "new file"):
|
|
|
|
|
curFile.Type = DIFF_FILE_ADD
|
|
|
|
|
curFile.Type = DiffFileAdd
|
|
|
|
|
curFile.IsCreated = true
|
|
|
|
|
case strings.HasPrefix(line, "deleted"):
|
|
|
|
|
curFile.Type = DIFF_FILE_DEL
|
|
|
|
|
curFile.Type = DiffFileDel
|
|
|
|
|
curFile.IsDeleted = true
|
|
|
|
|
case strings.HasPrefix(line, "index"):
|
|
|
|
|
curFile.Type = DIFF_FILE_CHANGE
|
|
|
|
|
curFile.Type = DiffFileChange
|
|
|
|
|
case strings.HasPrefix(line, "similarity index 100%"):
|
|
|
|
|
curFile.Type = DIFF_FILE_RENAME
|
|
|
|
|
curFile.IsRenamed = true
|
|
|
|
@ -459,8 +459,8 @@ func GetDiffRange(repoPath, beforeCommitID, afterCommitID string, maxLines, maxL
|
|
|
|
|
type RawDiffType string
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
RAW_DIFF_NORMAL RawDiffType = "diff"
|
|
|
|
|
RAW_DIFF_PATCH RawDiffType = "patch"
|
|
|
|
|
RawDiffNormal RawDiffType = "diff"
|
|
|
|
|
RawDiffPatch RawDiffType = "patch"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// GetRawDiff dumps diff results of repository in given commit ID to io.Writer.
|
|
|
|
@ -478,14 +478,14 @@ func GetRawDiff(repoPath, commitID string, diffType RawDiffType, writer io.Write
|
|
|
|
|
|
|
|
|
|
var cmd *exec.Cmd
|
|
|
|
|
switch diffType {
|
|
|
|
|
case RAW_DIFF_NORMAL:
|
|
|
|
|
case RawDiffNormal:
|
|
|
|
|
if commit.ParentCount() == 0 {
|
|
|
|
|
cmd = exec.Command("git", "show", commitID)
|
|
|
|
|
} else {
|
|
|
|
|
c, _ := commit.Parent(0)
|
|
|
|
|
cmd = exec.Command("git", "diff", "-M", c.ID.String(), commitID)
|
|
|
|
|
}
|
|
|
|
|
case RAW_DIFF_PATCH:
|
|
|
|
|
case RawDiffPatch:
|
|
|
|
|
if commit.ParentCount() == 0 {
|
|
|
|
|
cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", "--root", commitID)
|
|
|
|
|
} else {
|
|
|
|
|