// Copyright 2015 The Gogs Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package git import ( "strings" ) // Tree represents a flat directory listing. type Tree struct { ID SHA1 repo *Repository // parent tree ptree *Tree entries Entries entriesParsed bool } // NewTree create a new tree according the repository and commit id func NewTree(repo *Repository, id SHA1) *Tree { return &Tree{ ID: id, repo: repo, } } // SubTree get a sub tree by the sub dir path func (t *Tree) SubTree(rpath string) (*Tree, error) { if len(rpath) == 0 { return t, nil } paths := strings.Split(rpath, "/") var ( err error g = t p = t te *TreeEntry ) for _, name := range paths { te, err = p.GetTreeEntryByPath(name) if err != nil { return nil, err } g, err = t.repo.getTree(te.ID) if err != nil { return nil, err } g.ptree = p p = g } return g, nil } // ListEntries returns all entries of current tree. func (t *Tree) ListEntries() (Entries, error) { if t.entriesParsed { return t.entries, nil } stdout, err := NewCommand("ls-tree", t.ID.String()).RunInDirBytes(t.repo.Path) if err != nil { return nil, err } t.entries, err = parseTreeEntries(stdout, t) return t.entries, err }