gitech

Форк
0
/
tree_nogogit.go 
127 строк · 3.1 Кб
1
// Copyright 2020 The Gitea Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
3

4
//go:build !gogit
5

6
package git
7

8
import (
9
	"io"
10
	"strings"
11
)
12

13
// Tree represents a flat directory listing.
14
type Tree struct {
15
	ID         ObjectID
16
	ResolvedID ObjectID
17
	repo       *Repository
18

19
	// parent tree
20
	ptree *Tree
21

22
	entries       Entries
23
	entriesParsed bool
24

25
	entriesRecursive       Entries
26
	entriesRecursiveParsed bool
27
}
28

29
// ListEntries returns all entries of current tree.
30
func (t *Tree) ListEntries() (Entries, error) {
31
	if t.entriesParsed {
32
		return t.entries, nil
33
	}
34

35
	if t.repo != nil {
36
		wr, rd, cancel := t.repo.CatFileBatch(t.repo.Ctx)
37
		defer cancel()
38

39
		_, _ = wr.Write([]byte(t.ID.String() + "\n"))
40
		_, typ, sz, err := ReadBatchLine(rd)
41
		if err != nil {
42
			return nil, err
43
		}
44
		if typ == "commit" {
45
			treeID, err := ReadTreeID(rd, sz)
46
			if err != nil && err != io.EOF {
47
				return nil, err
48
			}
49
			_, _ = wr.Write([]byte(treeID + "\n"))
50
			_, typ, sz, err = ReadBatchLine(rd)
51
			if err != nil {
52
				return nil, err
53
			}
54
		}
55
		if typ == "tree" {
56
			t.entries, err = catBatchParseTreeEntries(t.ID.Type(), t, rd, sz)
57
			if err != nil {
58
				return nil, err
59
			}
60
			t.entriesParsed = true
61
			return t.entries, nil
62
		}
63

64
		// Not a tree just use ls-tree instead
65
		if err := DiscardFull(rd, sz+1); err != nil {
66
			return nil, err
67
		}
68
	}
69

70
	stdout, _, runErr := NewCommand(t.repo.Ctx, "ls-tree", "-l").AddDynamicArguments(t.ID.String()).RunStdBytes(&RunOpts{Dir: t.repo.Path})
71
	if runErr != nil {
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{
74
				ID: t.ID.String(),
75
			}
76
		}
77
		return nil, runErr
78
	}
79

80
	objectFormat, err := t.repo.GetObjectFormat()
81
	if err != nil {
82
		return nil, err
83
	}
84
	t.entries, err = parseTreeEntries(objectFormat, stdout, t)
85
	if err == nil {
86
		t.entriesParsed = true
87
	}
88

89
	return t.entries, err
90
}
91

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
97
	}
98

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})
103
	if runErr != nil {
104
		return nil, runErr
105
	}
106

107
	objectFormat, err := t.repo.GetObjectFormat()
108
	if err != nil {
109
		return nil, err
110
	}
111
	t.entriesRecursive, err = parseTreeEntries(objectFormat, stdout, t)
112
	if err == nil {
113
		t.entriesRecursiveParsed = true
114
	}
115

116
	return t.entriesRecursive, err
117
}
118

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)
122
}
123

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"})
127
}
128

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.