1
// Copyright 2019 The Gitea Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
13
"code.gitea.io/gitea/modules/log"
14
"code.gitea.io/gitea/modules/util"
17
// ReadTreeToIndex reads a treeish to the index
18
func (repo *Repository) ReadTreeToIndex(treeish string, indexFilename ...string) error {
19
objectFormat, err := repo.GetObjectFormat()
24
if len(treeish) != objectFormat.FullLength() {
25
res, _, err := NewCommand(repo.Ctx, "rev-parse", "--verify").AddDynamicArguments(treeish).RunStdString(&RunOpts{Dir: repo.Path})
30
treeish = res[:len(res)-1]
33
id, err := NewIDFromString(treeish)
37
return repo.readTreeToIndex(id, indexFilename...)
40
func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) error {
42
if len(indexFilename) > 0 {
43
env = append(os.Environ(), "GIT_INDEX_FILE="+indexFilename[0])
45
_, _, err := NewCommand(repo.Ctx, "read-tree").AddDynamicArguments(id.String()).RunStdString(&RunOpts{Dir: repo.Path, Env: env})
52
// ReadTreeToTemporaryIndex reads a treeish to a temporary index file
53
func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpDir string, cancel context.CancelFunc, err error) {
54
tmpDir, err = os.MkdirTemp("", "index")
56
return filename, tmpDir, cancel, err
59
filename = filepath.Join(tmpDir, ".tmp-index")
61
err := util.RemoveAll(tmpDir)
63
log.Error("failed to remove tmp index file: %v", err)
66
err = repo.ReadTreeToIndex(treeish, filename)
69
return "", "", func() {}, err
71
return filename, tmpDir, cancel, err
74
// EmptyIndex empties the index
75
func (repo *Repository) EmptyIndex() error {
76
_, _, err := NewCommand(repo.Ctx, "read-tree", "--empty").RunStdString(&RunOpts{Dir: repo.Path})
80
// LsFiles checks if the given filenames are in the index
81
func (repo *Repository) LsFiles(filenames ...string) ([]string, error) {
82
cmd := NewCommand(repo.Ctx, "ls-files", "-z").AddDashesAndList(filenames...)
83
res, _, err := cmd.RunStdBytes(&RunOpts{Dir: repo.Path})
87
filelist := make([]string, 0, len(filenames))
88
for _, line := range bytes.Split(res, []byte{'\000'}) {
89
filelist = append(filelist, string(line))
95
// RemoveFilesFromIndex removes given filenames from the index - it does not check whether they are present.
96
func (repo *Repository) RemoveFilesFromIndex(filenames ...string) error {
97
objectFormat, err := repo.GetObjectFormat()
101
cmd := NewCommand(repo.Ctx, "update-index", "--remove", "-z", "--index-info")
102
stdout := new(bytes.Buffer)
103
stderr := new(bytes.Buffer)
104
buffer := new(bytes.Buffer)
105
for _, file := range filenames {
107
buffer.WriteString("0 ")
108
buffer.WriteString(objectFormat.EmptyObjectID().String())
109
buffer.WriteByte('\t')
110
buffer.WriteString(file)
111
buffer.WriteByte('\000')
114
return cmd.Run(&RunOpts{
116
Stdin: bytes.NewReader(buffer.Bytes()),
122
// AddObjectToIndex adds the provided object hash to the index at the provided filename
123
func (repo *Repository) AddObjectToIndex(mode string, object ObjectID, filename string) error {
124
cmd := NewCommand(repo.Ctx, "update-index", "--add", "--replace", "--cacheinfo").AddDynamicArguments(mode, object.String(), filename)
125
_, _, err := cmd.RunStdString(&RunOpts{Dir: repo.Path})
129
// WriteTree writes the current index as a tree to the object db and returns its hash
130
func (repo *Repository) WriteTree() (*Tree, error) {
131
stdout, _, runErr := NewCommand(repo.Ctx, "write-tree").RunStdString(&RunOpts{Dir: repo.Path})
135
id, err := NewIDFromString(strings.TrimSpace(stdout))
139
return NewTree(repo, id), nil