mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Refactor git module, make Gitea use internal git config (#19732)
* Refactor git module, make Gitea use internal git config, add safe.directory config * introduce git.InitSimple and git.InitWithConfigSync, make serv cmd use gitconfig * use HOME instead of GIT_CONFIG_GLOBAL, because git always needs a correct HOME * fix cmd env in cmd/serv.go * fine tune error message * Fix a incorrect test case * fix configAddNonExist * fix configAddNonExist logic, add `--fixed-value` flag, add tests * add configSetNonExist function in case it's needed. * use configSetNonExist for `user.name` and `user.email` * add some comments * Update cmd/serv.go Co-authored-by: zeripath <art27@cantab.net> * Update cmd/serv.go Co-authored-by: zeripath <art27@cantab.net> * Update modules/git/git.go Co-authored-by: zeripath <art27@cantab.net> * Update modules/setting/setting.go Co-authored-by: zeripath <art27@cantab.net> * Update modules/git/repo_attribute.go Co-authored-by: zeripath <art27@cantab.net> * fix spaces in messages * use `configSet("core.protectNTFS", ...)` instead of `globalCommandArgs` * remove GIT_CONFIG_NOSYSTEM, continue to use system's git config * Update cmd/serv.go Co-authored-by: zeripath <art27@cantab.net> * fix merge * remove code for safe.directory * separate git.CommonEnvs to CommonGitCmdEnvs and CommonCmdServEnvs * avoid Golang's data race error Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		@@ -8,23 +8,74 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func fatalTestError(fmtStr string, args ...interface{}) {
 | 
			
		||||
	fmt.Fprintf(os.Stderr, fmtStr, args...)
 | 
			
		||||
	os.Exit(1)
 | 
			
		||||
func testRun(m *testing.M) error {
 | 
			
		||||
	_ = log.NewLogger(1000, "console", "console", `{"level":"trace","stacktracelevel":"NONE","stderr":true}`)
 | 
			
		||||
 | 
			
		||||
	repoRootPath, err := os.MkdirTemp(os.TempDir(), "repos")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("unable to create temp dir: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer util.RemoveAll(repoRootPath)
 | 
			
		||||
	setting.RepoRootPath = repoRootPath
 | 
			
		||||
 | 
			
		||||
	if err = InitWithConfigSync(context.Background()); err != nil {
 | 
			
		||||
		return fmt.Errorf("failed to call Init: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exitCode := m.Run()
 | 
			
		||||
	if exitCode != 0 {
 | 
			
		||||
		return fmt.Errorf("run test failed, ExitCode=%d", exitCode)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMain(m *testing.M) {
 | 
			
		||||
	_ = log.NewLogger(1000, "console", "console", `{"level":"trace","stacktracelevel":"NONE","stderr":true}`)
 | 
			
		||||
	if err := testRun(m); err != nil {
 | 
			
		||||
		_, _ = fmt.Fprintf(os.Stderr, "Test failed: %v", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	if err := Init(context.Background()); err != nil {
 | 
			
		||||
		fatalTestError("Init failed: %v", err)
 | 
			
		||||
func TestGitConfig(t *testing.T) {
 | 
			
		||||
	gitConfigContains := func(sub string) bool {
 | 
			
		||||
		if b, err := os.ReadFile(HomeDir() + "/.gitconfig"); err == nil {
 | 
			
		||||
			return strings.Contains(string(b), sub)
 | 
			
		||||
		}
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exitStatus := m.Run()
 | 
			
		||||
	os.Exit(exitStatus)
 | 
			
		||||
	assert.False(t, gitConfigContains("key-a"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configSetNonExist("test.key-a", "val-a"))
 | 
			
		||||
	assert.True(t, gitConfigContains("key-a = val-a"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configSetNonExist("test.key-a", "val-a-changed"))
 | 
			
		||||
	assert.False(t, gitConfigContains("key-a = val-a-changed"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configSet("test.key-a", "val-a-changed"))
 | 
			
		||||
	assert.True(t, gitConfigContains("key-a = val-a-changed"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configAddNonExist("test.key-b", "val-b"))
 | 
			
		||||
	assert.True(t, gitConfigContains("key-b = val-b"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configAddNonExist("test.key-b", "val-2b"))
 | 
			
		||||
	assert.True(t, gitConfigContains("key-b = val-b"))
 | 
			
		||||
	assert.True(t, gitConfigContains("key-b = val-2b"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configUnsetAll("test.key-b", "val-b"))
 | 
			
		||||
	assert.False(t, gitConfigContains("key-b = val-b"))
 | 
			
		||||
	assert.True(t, gitConfigContains("key-b = val-2b"))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, configUnsetAll("test.key-b", "val-2b"))
 | 
			
		||||
	assert.False(t, gitConfigContains("key-b = val-2b"))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user