diff options
author | Emrah URHAN <raxetul@gmail.com> | 2015-11-22 19:40:18 +0200 |
---|---|---|
committer | Emrah URHAN <raxetul@gmail.com> | 2015-11-22 19:40:18 +0200 |
commit | 737da1a3748d7c82af771d3ba4aa4c76ba219eee (patch) | |
tree | b59104944ba28771752adcc1231a847b6704ac4d /modules/git/tree.go | |
parent | f63a468dfce812423b78a47cfa2583c5ad2faa49 (diff) | |
parent | efaf60ba5a4a7c0954dbaf57203859db3258281f (diff) |
Latest develop updates is merged with my RaspberryPi Dockerfile version.
Merge branch 'develop' of https://github.com/gogits/gogs into develop
Diffstat (limited to 'modules/git/tree.go')
-rw-r--r-- | modules/git/tree.go | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/modules/git/tree.go b/modules/git/tree.go index 27539f06..1a561cf5 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -18,7 +18,7 @@ var ( // A tree is a flat directory listing. type Tree struct { - Id sha1 + ID sha1 repo *Repository // parent tree @@ -28,6 +28,27 @@ type Tree struct { entriesParsed bool } +var escapeChar = []byte("\\") + +func UnescapeChars(in []byte) []byte { + if bytes.Index(in, escapeChar) == -1 { + return in + } + + endIdx := len(in) - 1 + isEscape := false + out := make([]byte, 0, endIdx+1) + for i := range in { + if in[i] == '\\' && !isEscape { + isEscape = true + continue + } + isEscape = false + out = append(out, in[i]) + } + return out +} + // Parse tree information from the (uncompressed) raw // data from the tree object. func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) { @@ -66,16 +87,16 @@ func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) { if err != nil { return nil, err } - entry.Id = id + entry.ID = id 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(data[pos+1 : pos+step-1]) - entry.name = strings.Replace(entry.name, `\"`, `"`, -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 @@ -100,7 +121,7 @@ func (t *Tree) SubTree(rpath string) (*Tree, error) { return nil, err } - g, err = t.repo.getTree(te.Id) + g, err = t.repo.getTree(te.ID) if err != nil { return nil, err } @@ -117,7 +138,7 @@ func (t *Tree) ListEntries(relpath string) (Entries, error) { t.entriesParsed = true stdout, stderr, err := com.ExecCmdDirBytes(t.repo.Path, - "git", "ls-tree", t.Id.String()) + "git", "ls-tree", t.ID.String()) if err != nil { if strings.Contains(err.Error(), "exit status 128") { return nil, errors.New(strings.TrimSpace(string(stderr))) @@ -130,7 +151,7 @@ func (t *Tree) ListEntries(relpath string) (Entries, error) { func NewTree(repo *Repository, id sha1) *Tree { tree := new(Tree) - tree.Id = id + tree.ID = id tree.repo = repo return tree } |