|
|
@ -30,7 +30,7 @@ type Tree struct { |
|
|
|
|
|
|
|
|
|
|
|
var escapeChar = []byte("\\") |
|
|
|
var escapeChar = []byte("\\") |
|
|
|
|
|
|
|
|
|
|
|
func unescapeChars(in []byte) []byte { |
|
|
|
func UnescapeChars(in []byte) []byte { |
|
|
|
if bytes.Index(in, escapeChar) == -1 { |
|
|
|
if bytes.Index(in, escapeChar) == -1 { |
|
|
|
return in |
|
|
|
return in |
|
|
|
} |
|
|
|
} |
|
|
@ -39,12 +39,11 @@ func unescapeChars(in []byte) []byte { |
|
|
|
isEscape := false |
|
|
|
isEscape := false |
|
|
|
out := make([]byte, 0, endIdx+1) |
|
|
|
out := make([]byte, 0, endIdx+1) |
|
|
|
for i := range in { |
|
|
|
for i := range in { |
|
|
|
if in[i] == '\\' && i != endIdx { |
|
|
|
if in[i] == '\\' && !isEscape { |
|
|
|
isEscape = !isEscape |
|
|
|
isEscape = true |
|
|
|
if isEscape { |
|
|
|
continue |
|
|
|
continue |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
isEscape = false |
|
|
|
out = append(out, in[i]) |
|
|
|
out = append(out, in[i]) |
|
|
|
} |
|
|
|
} |
|
|
|
return out |
|
|
|
return out |
|
|
@ -92,11 +91,12 @@ func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) { |
|
|
|
pos += step + 1 // Skip half of sha1.
|
|
|
|
pos += step + 1 // Skip half of sha1.
|
|
|
|
|
|
|
|
|
|
|
|
step = bytes.IndexByte(data[pos:], '\n') |
|
|
|
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).
|
|
|
|
// In case entry name is surrounded by double quotes(it happens only in git-shell).
|
|
|
|
if entry.name[0] == '"' { |
|
|
|
if data[pos] == '"' { |
|
|
|
entry.name = string(unescapeChars(data[pos+1 : pos+step-1])) |
|
|
|
entry.name = string(UnescapeChars(data[pos+1 : pos+step-1])) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
entry.name = string(data[pos : pos+step]) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
pos += step + 1 |
|
|
|
pos += step + 1 |
|
|
|