1
// Copyright 2020 The Gitea Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
13
// Tree represents a flat directory listing.
25
entriesRecursive Entries
26
entriesRecursiveParsed bool
29
// ListEntries returns all entries of current tree.
30
func (t *Tree) ListEntries() (Entries, error) {
36
wr, rd, cancel := t.repo.CatFileBatch(t.repo.Ctx)
39
_, _ = wr.Write([]byte(t.ID.String() + "\n"))
40
_, typ, sz, err := ReadBatchLine(rd)
45
treeID, err := ReadTreeID(rd, sz)
46
if err != nil && err != io.EOF {
49
_, _ = wr.Write([]byte(treeID + "\n"))
50
_, typ, sz, err = ReadBatchLine(rd)
56
t.entries, err = catBatchParseTreeEntries(t.ID.Type(), t, rd, sz)
60
t.entriesParsed = true
64
// Not a tree just use ls-tree instead
65
if err := DiscardFull(rd, sz+1); err != nil {
70
stdout, _, runErr := NewCommand(t.repo.Ctx, "ls-tree", "-l").AddDynamicArguments(t.ID.String()).RunStdBytes(&RunOpts{Dir: t.repo.Path})
72
if strings.Contains(runErr.Error(), "fatal: Not a valid object name") || strings.Contains(runErr.Error(), "fatal: not a tree object") {
73
return nil, ErrNotExist{
80
objectFormat, err := t.repo.GetObjectFormat()
84
t.entries, err = parseTreeEntries(objectFormat, stdout, t)
86
t.entriesParsed = true
92
// listEntriesRecursive returns all entries of current tree recursively including all subtrees
93
// extraArgs could be "-l" to get the size, which is slower
94
func (t *Tree) listEntriesRecursive(extraArgs TrustedCmdArgs) (Entries, error) {
95
if t.entriesRecursiveParsed {
96
return t.entriesRecursive, nil
99
stdout, _, runErr := NewCommand(t.repo.Ctx, "ls-tree", "-t", "-r").
100
AddArguments(extraArgs...).
101
AddDynamicArguments(t.ID.String()).
102
RunStdBytes(&RunOpts{Dir: t.repo.Path})
107
objectFormat, err := t.repo.GetObjectFormat()
111
t.entriesRecursive, err = parseTreeEntries(objectFormat, stdout, t)
113
t.entriesRecursiveParsed = true
116
return t.entriesRecursive, err
119
// ListEntriesRecursiveFast returns all entries of current tree recursively including all subtrees, no size
120
func (t *Tree) ListEntriesRecursiveFast() (Entries, error) {
121
return t.listEntriesRecursive(nil)
124
// ListEntriesRecursiveWithSize returns all entries of current tree recursively including all subtrees, with size
125
func (t *Tree) ListEntriesRecursiveWithSize() (Entries, error) {
126
return t.listEntriesRecursive(TrustedCmdArgs{"--long"})