|  | @@ -87,7 +87,7 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		leftLine, rightLine int
 | 
	
		
			
				|  |  |  		isTooLong           bool
 | 
	
		
			
				|  |  | -		// FIXME: use first 30 lines to detect file encoding. Should use cache in the future.
 | 
	
		
			
				|  |  | +		// FIXME: Should use cache in the future.
 | 
	
		
			
				|  |  |  		buf bytes.Buffer
 | 
	
		
			
				|  |  |  	)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -106,16 +106,10 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		i = i + 1
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		// FIXME: use first 30 lines to detect file encoding.
 | 
	
		
			
				|  |  | -		if i <= 30 {
 | 
	
		
			
				|  |  | -			buf.WriteString(line)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  		// Diff data too large, we only show the first about maxlines lines
 | 
	
		
			
				|  |  |  		if i == maxlines {
 | 
	
		
			
				|  |  |  			isTooLong = true
 | 
	
		
			
				|  |  |  			log.Warn("Diff data too large")
 | 
	
		
			
				|  |  | -			//return &Diff{}, nil
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		switch {
 | 
	
	
		
			
				|  | @@ -127,7 +121,7 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  			continue
 | 
	
		
			
				|  |  |  		case line[0] == '@':
 | 
	
		
			
				|  |  |  			if isTooLong {
 | 
	
		
			
				|  |  | -				return diff, nil
 | 
	
		
			
				|  |  | +				break
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			curSection = &DiffSection{}
 | 
	
	
		
			
				|  | @@ -137,9 +131,14 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  			curSection.Lines = append(curSection.Lines, diffLine)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			// Parse line number.
 | 
	
		
			
				|  |  | -			ranges := strings.Split(ss[len(ss)-2][1:], " ")
 | 
	
		
			
				|  |  | +			ranges := strings.Split(ss[1][1:], " ")
 | 
	
		
			
				|  |  |  			leftLine, _ = com.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int()
 | 
	
		
			
				|  |  | -			rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int()
 | 
	
		
			
				|  |  | +			if len(ranges) > 1 {
 | 
	
		
			
				|  |  | +				rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int()
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				log.Warn("Parse line number failed: %v", line)
 | 
	
		
			
				|  |  | +				rightLine = leftLine
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  |  			continue
 | 
	
		
			
				|  |  |  		case line[0] == '+':
 | 
	
		
			
				|  |  |  			curFile.Addition++
 | 
	
	
		
			
				|  | @@ -164,11 +163,11 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  		// Get new file.
 | 
	
		
			
				|  |  |  		if strings.HasPrefix(line, DIFF_HEAD) {
 | 
	
		
			
				|  |  |  			if isTooLong {
 | 
	
		
			
				|  |  | -				return diff, nil
 | 
	
		
			
				|  |  | +				break
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			fs := strings.Split(line[len(DIFF_HEAD):], " ")
 | 
	
		
			
				|  |  | -			a := fs[0]
 | 
	
		
			
				|  |  | +			beg := len(DIFF_HEAD)
 | 
	
		
			
				|  |  | +			a := line[beg : (len(line)-beg)/2+beg]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			curFile = &DiffFile{
 | 
	
		
			
				|  |  |  				Name:     a[strings.Index(a, "/")+1:],
 | 
	
	
		
			
				|  | @@ -201,14 +200,19 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	// FIXME: use first 30 lines to detect file encoding.
 | 
	
		
			
				|  |  | -	charsetLabel, err := base.DetectEncoding(buf.Bytes())
 | 
	
		
			
				|  |  | -	if charsetLabel != "utf8" && err == nil {
 | 
	
		
			
				|  |  | -		encoding, _ := charset.Lookup(charsetLabel)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		if encoding != nil {
 | 
	
		
			
				|  |  | -			d := encoding.NewDecoder()
 | 
	
		
			
				|  |  | -			for _, f := range diff.Files {
 | 
	
		
			
				|  |  | +	for _, f := range diff.Files {
 | 
	
		
			
				|  |  | +		buf.Reset()
 | 
	
		
			
				|  |  | +		for _, sec := range f.Sections {
 | 
	
		
			
				|  |  | +			for _, l := range sec.Lines {
 | 
	
		
			
				|  |  | +				buf.WriteString(l.Content)
 | 
	
		
			
				|  |  | +				buf.WriteString("\n")
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		charsetLabel, err := base.DetectEncoding(buf.Bytes())
 | 
	
		
			
				|  |  | +		if charsetLabel != "UTF-8" && err == nil {
 | 
	
		
			
				|  |  | +			encoding, _ := charset.Lookup(charsetLabel)
 | 
	
		
			
				|  |  | +			if encoding != nil {
 | 
	
		
			
				|  |  | +				d := encoding.NewDecoder()
 | 
	
		
			
				|  |  |  				for _, sec := range f.Sections {
 | 
	
		
			
				|  |  |  					for _, l := range sec.Lines {
 | 
	
		
			
				|  |  |  						if c, _, err := transform.String(d, l.Content); err == nil {
 | 
	
	
		
			
				|  | @@ -219,7 +223,6 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	return diff, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |