From 38d337c94a29e4acbf0fab7b5e9ed46d66e079d2 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 22 Apr 2026 00:39:01 +0800 Subject: [PATCH] Use modern "git update-index --cacheinfo" syntax to support more file names (#37338) Modern syntax was added in git 2.0 And add more tests --- services/repository/files/temp_repo.go | 5 ++- services/repository/files/temp_repo_test.go | 45 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 services/repository/files/temp_repo_test.go diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index 68d1df24b7e..5d5cc22513b 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -178,8 +178,9 @@ func (t *TemporaryUploadRepository) HashObjectAndWrite(ctx context.Context, cont // AddObjectToIndex adds the provided object hash to the index with the provided mode and path func (t *TemporaryUploadRepository) AddObjectToIndex(ctx context.Context, mode, objectHash, objectPath string) error { - if err := gitcmd.NewCommand("update-index", "--add", "--replace", "--cacheinfo"). - AddDynamicArguments(mode, objectHash, objectPath).WithDir(t.basePath).RunWithStderr(ctx); err != nil { + cmd := gitcmd.NewCommand("update-index", "--add", "--replace", "--cacheinfo"). + AddDynamicArguments(mode + "," + objectHash + "," + objectPath).WithDir(t.basePath) + if err := cmd.RunWithStderr(ctx); err != nil { if matched, _ := regexp.MatchString(".*Invalid path '.*", err.Stderr()); matched { return ErrFilePathInvalid{ Message: objectPath, diff --git a/services/repository/files/temp_repo_test.go b/services/repository/files/temp_repo_test.go new file mode 100644 index 00000000000..89e44e2721b --- /dev/null +++ b/services/repository/files/temp_repo_test.go @@ -0,0 +1,45 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package files + +import ( + "bytes" + "testing" + + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + + "github.com/stretchr/testify/require" +) + +func TestTemporaryUploadRepository(t *testing.T) { + mockedRepo := &repo_model.Repository{Name: "mocked-repo-name", OwnerName: "mocked-owner-name"} + + doTest := func(t *testing.T, objectFormatName string) { + tmpGitRepo, err := NewTemporaryUploadRepository(mockedRepo) + require.NoError(t, err) + defer tmpGitRepo.Close() + + require.NoError(t, tmpGitRepo.Init(t.Context(), objectFormatName)) + + require.NoError(t, tmpGitRepo.RemoveFilesFromIndex(t.Context(), "any-file-name")) + require.NoError(t, tmpGitRepo.RemoveFilesFromIndex(t.Context(), "--any-file-name")) + + objID, err := tmpGitRepo.HashObjectAndWrite(t.Context(), bytes.NewReader(nil)) + require.NoError(t, err) + require.NoError(t, tmpGitRepo.AddObjectToIndex(t.Context(), "100644", objID, "any-file-name")) + require.NoError(t, tmpGitRepo.AddObjectToIndex(t.Context(), "100644", objID, "--any-file-name")) + } + + t.Run("sha1", func(t *testing.T) { + doTest(t, git.Sha1ObjectFormat.Name()) + }) + + t.Run("sha256", func(t *testing.T) { + if !git.DefaultFeatures().SupportHashSha256 { + t.Skip("sha256 is not supported") + } + doTest(t, git.Sha256ObjectFormat.Name()) + }) +}