|
@@ -5,14 +5,14 @@
|
|
|
package models
|
|
|
|
|
|
import (
|
|
|
+ "bufio"
|
|
|
"container/list"
|
|
|
"fmt"
|
|
|
- "path"
|
|
|
- "strings"
|
|
|
"io"
|
|
|
- "bufio"
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
+ "path"
|
|
|
+ "strings"
|
|
|
|
|
|
"github.com/gogits/git"
|
|
|
)
|
|
@@ -228,28 +228,29 @@ func GetCommits(userName, reposName, branchname string) (*list.List, error) {
|
|
|
return r.AllCommits()
|
|
|
}
|
|
|
|
|
|
+// Diff line types.
|
|
|
const (
|
|
|
- PlainLine = iota + 1
|
|
|
- AddLine
|
|
|
- DelLine
|
|
|
- SectionLine
|
|
|
+ DIFF_LINE_PLAIN = iota + 1
|
|
|
+ DIFF_LINE_ADD
|
|
|
+ DIFF_LINE_DEL
|
|
|
+ DIFF_LINE_SECTION
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
- AddFile = iota + 1
|
|
|
- ChangeFile
|
|
|
- DelFile
|
|
|
+ DIFF_FILE_ADD = iota + 1
|
|
|
+ DIFF_FILE_CHANGE
|
|
|
+ DIFF_FILE_DEL
|
|
|
)
|
|
|
|
|
|
type DiffLine struct {
|
|
|
- LeftIdx int
|
|
|
+ LeftIdx int
|
|
|
RightIdx int
|
|
|
- Type int
|
|
|
- Content string
|
|
|
+ Type int
|
|
|
+ Content string
|
|
|
}
|
|
|
|
|
|
type DiffSection struct {
|
|
|
- Name string
|
|
|
+ Name string
|
|
|
Lines []*DiffLine
|
|
|
}
|
|
|
|
|
@@ -257,7 +258,7 @@ type DiffFile struct {
|
|
|
Name string
|
|
|
Addition, Deletion int
|
|
|
Type int
|
|
|
- Sections []*DiffSection
|
|
|
+ Sections []*DiffSection
|
|
|
}
|
|
|
|
|
|
type Diff struct {
|
|
@@ -269,15 +270,17 @@ func (diff *Diff) NumFiles() int {
|
|
|
return len(diff.Files)
|
|
|
}
|
|
|
|
|
|
-const diffHead = "diff --git "
|
|
|
+const DIFF_HEAD = "diff --git "
|
|
|
|
|
|
func ParsePatch(reader io.Reader) (*Diff, error) {
|
|
|
scanner := bufio.NewScanner(reader)
|
|
|
var totalAdd, totalDel int
|
|
|
var curFile *DiffFile
|
|
|
- var curSection * DiffSection
|
|
|
+ curSection := &DiffSection{
|
|
|
+ Lines: make([]*DiffLine, 0, 10),
|
|
|
+ }
|
|
|
//var leftLine, rightLine int
|
|
|
- diff := &Diff{Files:make([]*DiffFile, 0)}
|
|
|
+ diff := &Diff{Files: make([]*DiffFile, 0)}
|
|
|
var i int
|
|
|
for scanner.Scan() {
|
|
|
line := scanner.Text()
|
|
@@ -287,50 +290,48 @@ func ParsePatch(reader io.Reader) (*Diff, error) {
|
|
|
continue
|
|
|
}
|
|
|
if line[0] == ' ' {
|
|
|
- diffLine := &DiffLine{Type: PlainLine, Content:line}
|
|
|
+ diffLine := &DiffLine{Type: DIFF_LINE_PLAIN, Content: line}
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
continue
|
|
|
} else if line[0] == '@' {
|
|
|
curSection = &DiffSection{}
|
|
|
curFile.Sections = append(curFile.Sections, curSection)
|
|
|
ss := strings.Split(line, "@@")
|
|
|
- diffLine := &DiffLine{Type: SectionLine, Content:"@@ "+ss[len(ss)-2]}
|
|
|
+ diffLine := &DiffLine{Type: DIFF_LINE_SECTION, Content: "@@" + ss[len(ss)-2] + "@@"}
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- diffLine = &DiffLine{Type: PlainLine, Content:ss[len(ss)-1]}
|
|
|
+ diffLine = &DiffLine{Type: DIFF_LINE_PLAIN, Content: ss[len(ss)-1]}
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
continue
|
|
|
} else if line[0] == '+' {
|
|
|
- diffLine := &DiffLine{Type: AddLine, Content:line}
|
|
|
+ diffLine := &DiffLine{Type: DIFF_LINE_ADD, Content: line}
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
continue
|
|
|
} else if line[0] == '-' {
|
|
|
- diffLine := &DiffLine{Type: DelLine, Content:line}
|
|
|
+ diffLine := &DiffLine{Type: DIFF_LINE_DEL, Content: line}
|
|
|
curSection.Lines = append(curSection.Lines, diffLine)
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- if strings.HasPrefix(line, diffHead) {
|
|
|
+ if strings.HasPrefix(line, DIFF_HEAD) {
|
|
|
if curFile != nil {
|
|
|
curFile.Addition, totalAdd = totalAdd, 0
|
|
|
curFile.Deletion, totalDel = totalDel, 0
|
|
|
curFile = nil
|
|
|
}
|
|
|
- fs := strings.Split(line[len(diffHead):], " ")
|
|
|
+ fs := strings.Split(line[len(DIFF_HEAD):], " ")
|
|
|
a := fs[0]
|
|
|
-
|
|
|
+
|
|
|
curFile = &DiffFile{
|
|
|
- Name:a[strings.Index(a, "/")+1:],
|
|
|
- Type: ChangeFile,
|
|
|
- Sections:make([]*DiffSection, 0),
|
|
|
+ Name: a[strings.Index(a, "/")+1:],
|
|
|
+ Type: DIFF_FILE_CHANGE,
|
|
|
+ Sections: make([]*DiffSection, 0),
|
|
|
}
|
|
|
diff.Files = append(diff.Files, curFile)
|
|
|
scanner.Scan()
|
|
|
scanner.Scan()
|
|
|
if scanner.Text() == "--- /dev/null" {
|
|
|
- curFile.Type = AddFile
|
|
|
+ curFile.Type = DIFF_FILE_ADD
|
|
|
}
|
|
|
scanner.Scan()
|
|
|
}
|