From 33d6ecfca667f51c99ef1b9a6fe2ff70cbc19a02 Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Tue, 21 Apr 2026 19:13:56 +0200 Subject: [PATCH] fix(ui): allow creating files with name starting with dash (#12214) Closes: #12204 The underlying git option was already changed in git 2.0.0 to use format `,,`. See https://github.com/git/git/commit/ec160ae12b0ae938ed5076b9f604e88976fc429c. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12214 Reviewed-by: Gusted Co-authored-by: Robert Wolff Co-committed-by: Robert Wolff --- services/repository/files/temp_repo.go | 2 +- services/repository/files/temp_repo_test.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index 17a8467e01..d10689b1fc 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -189,7 +189,7 @@ func (t *TemporaryUploadRepository) HashObject(content io.Reader) (string, error // AddObjectToIndex adds the provided object hash to the index with the provided mode and path func (t *TemporaryUploadRepository) AddObjectToIndex(mode, objectHash, objectPath string) error { - if _, _, err := git.NewCommand(t.ctx, "update-index", "--add", "--replace", "--cacheinfo").AddDynamicArguments(mode, objectHash, objectPath).RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil { + if _, _, err := git.NewCommand(t.ctx, "update-index", "--add", "--replace", "--cacheinfo").AddDynamicArguments(mode + "," + objectHash + "," + objectPath).RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil { stderr := err.Error() if matched, _ := regexp.MatchString(".*Invalid path '.*", stderr); matched { return models.ErrFilePathInvalid{ diff --git a/services/repository/files/temp_repo_test.go b/services/repository/files/temp_repo_test.go index 852e762267..ac63dc677e 100644 --- a/services/repository/files/temp_repo_test.go +++ b/services/repository/files/temp_repo_test.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestRemoveFilesFromIndexSha256(t *testing.T) { +func TestTemporaryUploadRepositoryRemoveFilesFromIndexSha256(t *testing.T) { if git.CheckGitVersionAtLeast("2.42") != nil { t.Skip("skipping because installed Git version doesn't support SHA256") } @@ -26,3 +26,13 @@ func TestRemoveFilesFromIndexSha256(t *testing.T) { require.NoError(t, temp.Init("sha256")) require.NoError(t, temp.RemoveFilesFromIndex("README.md")) } + +func TestTemporaryUploadRepositoryAddObjectToIndex(t *testing.T) { + unittest.PrepareTestEnv(t) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + + temp, err := NewTemporaryUploadRepository(db.DefaultContext, repo) + require.NoError(t, err) + require.NoError(t, temp.Init("sha1")) + require.NoError(t, temp.AddObjectToIndex("100644", "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "--test")) +}