Browse Source

better escape char handle

Unknwon 9 years ago
parent
commit
902b578465
3 changed files with 14 additions and 15 deletions
  1. 0 1
      .bra.toml
  2. 5 5
      models/git_diff.go
  3. 9 9
      modules/git/tree.go

+ 0 - 1
.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"]

+ 5 - 5
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{

+ 9 - 9
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