Partial impl of git diff encoding

This commit is contained in:
Vladimir Vissoultchev 2015-07-29 17:55:01 +03:00
parent 2bb1fb8f44
commit 4917d29c12

View File

@ -87,7 +87,7 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
leftLine, rightLine int leftLine, rightLine int
isTooLong bool 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 buf bytes.Buffer
) )
@ -106,16 +106,10 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
i = i + 1 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 // Diff data too large, we only show the first about maxlines lines
if i == maxlines { if i == maxlines {
isTooLong = true isTooLong = true
log.Warn("Diff data too large") log.Warn("Diff data too large")
//return &Diff{}, nil
} }
switch { switch {
@ -127,7 +121,7 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
continue continue
case line[0] == '@': case line[0] == '@':
if isTooLong { if isTooLong {
return diff, nil break
} }
curSection = &DiffSection{} 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) curSection.Lines = append(curSection.Lines, diffLine)
// Parse line number. // 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() leftLine, _ = com.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int()
if len(ranges) > 1 {
rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int() rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int()
} else {
log.Warn("Parse line number failed: %v", line)
rightLine = leftLine
}
continue continue
case line[0] == '+': case line[0] == '+':
curFile.Addition++ curFile.Addition++
@ -164,7 +163,7 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
// Get new file. // Get new file.
if strings.HasPrefix(line, DIFF_HEAD) { if strings.HasPrefix(line, DIFF_HEAD) {
if isTooLong { if isTooLong {
return diff, nil break
} }
beg := len(DIFF_HEAD) 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. 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()) charsetLabel, err := base.DetectEncoding(buf.Bytes())
if charsetLabel != "utf8" && err == nil { if charsetLabel != "UTF-8" && err == nil {
encoding, _ := charset.Lookup(charsetLabel) encoding, _ := charset.Lookup(charsetLabel)
if encoding != nil { if encoding != nil {
d := encoding.NewDecoder() d := encoding.NewDecoder()
for _, f := range diff.Files {
for _, sec := range f.Sections { for _, sec := range f.Sections {
for _, l := range sec.Lines { for _, l := range sec.Lines {
if c, _, err := transform.String(d, l.Content); err == nil { 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 return diff, nil
} }