Browse Source

Partial impl of git diff encoding

Vladimir Vissoultchev 9 years ago
parent
commit
4917d29c12
1 changed files with 23 additions and 20 deletions
  1. 23 20
      models/git_diff.go

+ 23 - 20
models/git_diff.go

@@ -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,7 +163,7 @@ 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
 			}
 
 			beg := len(DIFF_HEAD)
@@ -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
 }