From 902b5784659327a61ba7de56ef1885fcc6549b17 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 20 Nov 2015 01:18:50 -0500 Subject: [PATCH] better escape char handle --- .bra.toml | 1 - models/git_diff.go | 10 +++++----- modules/git/tree.go | 18 +++++++++--------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.bra.toml b/.bra.toml index f1da310ac..7d49786d3 100644 --- a/.bra.toml +++ b/.bra.toml @@ -13,7 +13,6 @@ watch_dirs = [ watch_exts = [".go"] build_delay = 1500 cmds = [ - ["go", "install"], ["go", "install", "-race"], # sqlite redis memcache cert pam tidb ["go", "build", "-race"], ["./gogs", "web"] diff --git a/models/git_diff.go b/models/git_diff.go index 4cc9ebf8f..4b1ec09ea 100644 --- a/models/git_diff.go +++ b/models/git_diff.go @@ -163,10 +163,10 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff if strings.HasPrefix(line, DIFF_HEAD) { middle := -1 - // Note: In case file name is surrounded by double quotes(it happens only in git-shell). - hasQuote := strings.Index(line, `\"`) > -1 + // Note: In case file name is surrounded by double quotes (it happens only in git-shell). + // e.g. diff --git "a/xxx" "b/xxx" + hasQuote := line[len(DIFF_HEAD)] == '"' if hasQuote { - line = strings.Replace(line, `\"`, `"`, -1) middle = strings.Index(line, ` "b/`) } else { middle = strings.Index(line, " b/") @@ -176,8 +176,8 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff a := line[beg+2 : middle] b := line[middle+3:] if hasQuote { - a = a[1 : len(a)-1] - b = b[1 : len(b)-1] + a = string(git.UnescapeChars([]byte(a[1 : len(a)-1]))) + b = string(git.UnescapeChars([]byte(b[1 : len(b)-1]))) } curFile = &DiffFile{ diff --git a/modules/git/tree.go b/modules/git/tree.go index 6cfdbf47c..1a561cf5c 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -30,7 +30,7 @@ type Tree struct { var escapeChar = []byte("\\") -func unescapeChars(in []byte) []byte { +func UnescapeChars(in []byte) []byte { if bytes.Index(in, escapeChar) == -1 { return in } @@ -39,12 +39,11 @@ func unescapeChars(in []byte) []byte { isEscape := false out := make([]byte, 0, endIdx+1) for i := range in { - if in[i] == '\\' && i != endIdx { - isEscape = !isEscape - if isEscape { - continue - } + if in[i] == '\\' && !isEscape { + isEscape = true + continue } + isEscape = false out = append(out, in[i]) } return out @@ -92,11 +91,12 @@ func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) { pos += step + 1 // Skip half of sha1. step = bytes.IndexByte(data[pos:], '\n') - entry.name = string(data[pos : pos+step]) // In case entry name is surrounded by double quotes(it happens only in git-shell). - if entry.name[0] == '"' { - entry.name = string(unescapeChars(data[pos+1 : pos+step-1])) + if data[pos] == '"' { + entry.name = string(UnescapeChars(data[pos+1 : pos+step-1])) + } else { + entry.name = string(data[pos : pos+step]) } pos += step + 1