summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2015-11-20 01:18:50 -0500
committerUnknwon <u@gogs.io>2015-11-20 01:18:50 -0500
commit902b5784659327a61ba7de56ef1885fcc6549b17 (patch)
tree8ddbe345e2140d300a20b74c47bd654ff728b096
parent3d14e73fd835f2a0ed4a22daa4c67df245be8103 (diff)
downloadgitea-902b5784659327a61ba7de56ef1885fcc6549b17.tar.gz
gitea-902b5784659327a61ba7de56ef1885fcc6549b17.zip
better escape char handle
-rw-r--r--.bra.toml1
-rw-r--r--models/git_diff.go10
-rw-r--r--modules/git/tree.go18
3 files changed, 14 insertions, 15 deletions
diff --git a/.bra.toml b/.bra.toml
index f1da310aca..7d49786d30 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 4cc9ebf8fa..4b1ec09ea8 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 6cfdbf47c2..1a561cf5c1 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