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