From ed9b7d2db9d797105a62a0c2078c614ab90ff956 Mon Sep 17 00:00:00 2001
From: Unknown <joe2010xtmf@163.com>
Date: Wed, 26 Mar 2014 07:24:20 -0400
Subject: More on diff page

---
 models/git.go | 45 +++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 16 deletions(-)

(limited to 'models')

diff --git a/models/git.go b/models/git.go
index ce4434ca..00621776 100644
--- a/models/git.go
+++ b/models/git.go
@@ -274,7 +274,6 @@ const DIFF_HEAD = "diff --git "
 
 func ParsePatch(reader io.Reader) (*Diff, error) {
 	scanner := bufio.NewScanner(reader)
-	var totalAdd, totalDel int
 	var curFile *DiffFile
 	curSection := &DiffSection{
 		Lines: make([]*DiffLine, 0, 10),
@@ -285,6 +284,10 @@ func ParsePatch(reader io.Reader) (*Diff, error) {
 	for scanner.Scan() {
 		line := scanner.Text()
 		fmt.Println(i, line)
+		if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") {
+			continue
+		}
+
 		i = i + 1
 		if line == "" {
 			continue
@@ -300,40 +303,51 @@ func ParsePatch(reader io.Reader) (*Diff, error) {
 			diffLine := &DiffLine{Type: DIFF_LINE_SECTION, Content: "@@" + ss[len(ss)-2] + "@@"}
 			curSection.Lines = append(curSection.Lines, diffLine)
 
-			diffLine = &DiffLine{Type: DIFF_LINE_PLAIN, Content: ss[len(ss)-1]}
-			curSection.Lines = append(curSection.Lines, diffLine)
+			if len(ss[len(ss)-1]) > 0 {
+				diffLine = &DiffLine{Type: DIFF_LINE_PLAIN, Content: ss[len(ss)-1]}
+				curSection.Lines = append(curSection.Lines, diffLine)
+			}
 			continue
 		} else if line[0] == '+' {
+			curFile.Addition++
+			diff.TotalAddition++
 			diffLine := &DiffLine{Type: DIFF_LINE_ADD, Content: line}
 			curSection.Lines = append(curSection.Lines, diffLine)
 			continue
 		} else if line[0] == '-' {
+			curFile.Deletion++
+			diff.TotalDeletion++
 			diffLine := &DiffLine{Type: DIFF_LINE_DEL, Content: line}
 			curSection.Lines = append(curSection.Lines, diffLine)
 			continue
 		}
 
+		// Get new file.
 		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(DIFF_HEAD):], " ")
 			a := fs[0]
 
 			curFile = &DiffFile{
 				Name:     a[strings.Index(a, "/")+1:],
 				Type:     DIFF_FILE_CHANGE,
-				Sections: make([]*DiffSection, 0),
+				Sections: make([]*DiffSection, 0, 10),
 			}
 			diff.Files = append(diff.Files, curFile)
-			scanner.Scan()
-			scanner.Scan()
-			if scanner.Text() == "--- /dev/null" {
-				curFile.Type = DIFF_FILE_ADD
+
+			// Check file diff type.
+			for scanner.Scan() {
+				switch {
+				case strings.HasPrefix(scanner.Text(), "new file"):
+					curFile.Type = DIFF_FILE_ADD
+				case strings.HasPrefix(scanner.Text(), "deleted"):
+					curFile.Type = DIFF_FILE_DEL
+				case strings.HasPrefix(scanner.Text(), "index"):
+					curFile.Type = DIFF_FILE_CHANGE
+				}
+				if curFile.Type > 0 {
+					break
+				}
 			}
-			scanner.Scan()
 		}
 	}
 
@@ -351,14 +365,13 @@ func GetDiff(repoPath, commitid string) (*Diff, error) {
 		return nil, err
 	}
 
-	// ????
 	if commit.ParentCount() == 0 {
 		return &Diff{}, err
 	}
 
 	rd, wr := io.Pipe()
 	go func() {
-		cmd := exec.Command("git", "diff", commitid, commit.Parent(0).Oid.String())
+		cmd := exec.Command("git", "diff", commit.Parent(0).Oid.String(), commitid)
 		cmd.Dir = repoPath
 		cmd.Stdout = wr
 		cmd.Stdin = os.Stdin
-- 
cgit v1.2.3