[BUG] Use correct empty commit ID

- `RemoveFilesFromIndex` used an hardcoded empty commit ID for the SHA1
object format, this would result in an error if the repository was
initialized to use the sha256 object format. Get the object format of
the Git repository and use that to get the empty commit id.
- Adds unit test.
- Resolves #3184
This commit is contained in:
Gusted 2024-04-15 20:45:59 +02:00
parent ceba1abe06
commit eeaef556c2
No known key found for this signature in database
GPG key ID: FD821B732837125F
2 changed files with 36 additions and 1 deletions

View file

@ -136,12 +136,19 @@ func (t *TemporaryUploadRepository) LsFiles(filenames ...string) ([]string, erro
// RemoveFilesFromIndex removes the given files from the index
func (t *TemporaryUploadRepository) RemoveFilesFromIndex(filenames ...string) error {
objectFormat, err := t.gitRepo.GetObjectFormat()
if err != nil {
return err
}
stdOut := new(bytes.Buffer)
stdErr := new(bytes.Buffer)
stdIn := new(bytes.Buffer)
for _, file := range filenames {
if file != "" {
stdIn.WriteString("0 0000000000000000000000000000000000000000\t")
stdIn.WriteString("0 ")
stdIn.WriteString(objectFormat.EmptyObjectID().String())
stdIn.WriteByte('\t')
stdIn.WriteString(file)
stdIn.WriteByte('\000')
}

View file

@ -0,0 +1,28 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package files
import (
"testing"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/git"
"github.com/stretchr/testify/assert"
)
func TestRemoveFilesFromIndexSha256(t *testing.T) {
if git.CheckGitVersionAtLeast("2.42") != nil {
t.Skip("skipping because installed Git version doesn't support SHA256")
}
unittest.PrepareTestEnv(t)
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
temp, err := NewTemporaryUploadRepository(db.DefaultContext, repo)
assert.NoError(t, err)
assert.NoError(t, temp.Init("sha256"))
assert.NoError(t, temp.RemoveFilesFromIndex("README.md"))
}