diff --git a/modules/git/config.go b/modules/git/config.go index a44350a7761..90120aaed79 100644 --- a/modules/git/config.go +++ b/modules/git/config.go @@ -167,7 +167,7 @@ func configSet(ctx context.Context, key, value string) error { return nil } - if _, _, err = gitcmd.NewCommand("config", "--global"). + if _, _, err = gitcmd.NewCommand("config", "--global", "--replace-all"). AddDynamicArguments(key, value). RunStdString(ctx); err != nil { return fmt.Errorf("failed to set git global config %s, err: %w", key, err) @@ -195,7 +195,7 @@ func configSetNonExist(ctx context.Context, key, value string) error { } func configAddNonExist(ctx context.Context, key, value string) error { - _, _, err := gitcmd.NewCommand("config", "--global", "--get").AddDynamicArguments(key, regexp.QuoteMeta(value)).RunStdString(ctx) + _, _, err := gitcmd.NewCommand("config", "--global", "--get").AddDynamicArguments(key, "^"+regexp.QuoteMeta(value)+"$").RunStdString(ctx) if err == nil { // already exist return nil @@ -212,18 +212,9 @@ func configAddNonExist(ctx context.Context, key, value string) error { } func configUnsetAll(ctx context.Context, key, value string) error { - _, _, err := gitcmd.NewCommand("config", "--global", "--get").AddDynamicArguments(key).RunStdString(ctx) - if err == nil { - // exist, need to remove - _, _, err = gitcmd.NewCommand("config", "--global", "--unset-all").AddDynamicArguments(key, regexp.QuoteMeta(value)).RunStdString(ctx) - if err != nil { - return fmt.Errorf("failed to unset git global config %s, err: %w", key, err) - } - return nil + _, _, err := gitcmd.NewCommand("config", "--global", "--unset-all").AddDynamicArguments(key, "^"+regexp.QuoteMeta(value)+"$").RunStdString(ctx) + if err != nil && !gitcmd.IsErrorExitCode(err, 5) { // 5: no such key or no matching value + return fmt.Errorf("failed to unset git global config %s, err: %w", key, err) } - if gitcmd.IsErrorExitCode(err, 1) { - // not exist - return nil - } - return fmt.Errorf("failed to get git config %s, err: %w", key, err) + return nil } diff --git a/modules/git/config_test.go b/modules/git/config_test.go index 60e4f2c6479..206c99684e4 100644 --- a/modules/git/config_test.go +++ b/modules/git/config_test.go @@ -32,7 +32,9 @@ func TestGitConfig(t *testing.T) { assert.NoError(t, configSetNonExist(ctx, "test.key-a", "val-a-changed")) assert.False(t, gitConfigContains("key-a = val-a-changed")) + assert.NoError(t, configAddNonExist(ctx, "test.key-a", "val-a2")) assert.NoError(t, configSet(ctx, "test.key-a", "val-a-changed")) + assert.NoError(t, configUnsetAll(ctx, "test.key-a", "val-a")) assert.True(t, gitConfigContains("key-a = val-a-changed")) assert.NoError(t, configAddNonExist(ctx, "test.key-b", "val-b")) @@ -41,6 +43,8 @@ func TestGitConfig(t *testing.T) { assert.NoError(t, configAddNonExist(ctx, "test.key-b", "val-2b")) assert.True(t, gitConfigContains("key-b = val-b")) assert.True(t, gitConfigContains("key-b = val-2b")) + assert.NoError(t, configAddNonExist(ctx, "test.key-b", "val")) + assert.True(t, gitConfigContains("key-b = val\n")) assert.NoError(t, configUnsetAll(ctx, "test.key-b", "val-b")) assert.False(t, gitConfigContains("key-b = val-b"))