|
|
|
@ -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()
|
|
|
|
|
}
|
|
|
|
|