| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | // Copyright 2014 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 gitimport (	"sort"	"strings"	"github.com/Unknwon/com")type EntryMode int// There are only a few file modes in Git. They look like unix file modes, but they can only be// one of these.const (	ModeBlob    EntryMode = 0100644	ModeExec    EntryMode = 0100755	ModeSymlink EntryMode = 0120000	ModeCommit  EntryMode = 0160000	ModeTree    EntryMode = 0040000)type TreeEntry struct {	Id   sha1	Type ObjectType	mode EntryMode	name string	ptree *Tree	commited bool	size  int64	sized bool}func (te *TreeEntry) Name() string {	return te.name}func (te *TreeEntry) Size() int64 {	if te.IsDir() {		return 0	}	if te.sized {		return te.size	}	stdout, _, err := com.ExecCmdDir(te.ptree.repo.Path, "git", "cat-file", "-s", te.Id.String())	if err != nil {		return 0	}	te.sized = true	te.size = com.StrTo(strings.TrimSpace(stdout)).MustInt64()	return te.size}func (te *TreeEntry) IsDir() bool {	return te.mode == ModeTree}func (te *TreeEntry) EntryMode() EntryMode {	return te.mode}func (te *TreeEntry) Blob() *Blob {	return &Blob{		repo:      te.ptree.repo,		TreeEntry: te,	}}type Entries []*TreeEntryvar sorter = []func(t1, t2 *TreeEntry) bool{	func(t1, t2 *TreeEntry) bool {		return t1.IsDir() && !t2.IsDir()	},	func(t1, t2 *TreeEntry) bool {		return t1.name < t2.name	},}func (bs Entries) Len() int      { return len(bs) }func (bs Entries) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] }func (bs Entries) Less(i, j int) bool {	t1, t2 := bs[i], bs[j]	var k int	for k = 0; k < len(sorter)-1; k++ {		sort := sorter[k]		switch {		case sort(t1, t2):			return true		case sort(t2, t1):			return false		}	}	return sorter[k](t1, t2)}func (bs Entries) Sort() {	sort.Sort(bs)}
 |