Skip to content

Commit d251316

Browse files
yp05327wxiaoguang
andcommitted
Support the new exit code for git remote subcommands for git version >=2.30.0 (go-gitea#33129)
Fix go-gitea#32889 --------- Co-authored-by: wxiaoguang <[email protected]> # Conflicts: # modules/git/remote.go
1 parent 63b3a33 commit d251316

File tree

3 files changed

+17
-8
lines changed

3 files changed

+17
-8
lines changed

modules/git/remote.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package git
55

66
import (
77
"context"
8+
"strings"
89

910
giturl "code.gitea.io/gitea/modules/git/url"
1011
)
@@ -37,3 +38,12 @@ func GetRemoteURL(ctx context.Context, repoPath, remoteName string) (*giturl.Git
3738
}
3839
return giturl.Parse(addr)
3940
}
41+
42+
// IsRemoteNotExistError checks the prefix of the error message to see whether a remote does not exist.
43+
func IsRemoteNotExistError(err error) bool {
44+
// see: https://github.com/go-gitea/gitea/issues/32889#issuecomment-2571848216
45+
// Should not add space in the end, sometimes git will add a `:`
46+
prefix1 := "exit status 128 - fatal: No such remote" // git < 2.30
47+
prefix2 := "exit status 2 - error: No such remote" // git >= 2.30
48+
return strings.HasPrefix(err.Error(), prefix1) || strings.HasPrefix(err.Error(), prefix2)
49+
}

services/mirror/mirror_pull.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
4141
repoPath := m.GetRepository(ctx).RepoPath()
4242
// Remove old remote
4343
_, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: repoPath})
44-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
44+
if err != nil && !git.IsRemoteNotExistError(err) {
4545
return err
4646
}
4747

@@ -52,7 +52,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
5252
cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=fetch %s [repo_path: %s]", remoteName, addr, repoPath))
5353
}
5454
_, _, err = cmd.RunStdString(&git.RunOpts{Dir: repoPath})
55-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
55+
if err != nil && !git.IsRemoteNotExistError(err) {
5656
return err
5757
}
5858

@@ -61,7 +61,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
6161
wikiRemotePath := repo_module.WikiRemoteURL(ctx, addr)
6262
// Remove old remote of wiki
6363
_, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: wikiPath})
64-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
64+
if err != nil && !git.IsRemoteNotExistError(err) {
6565
return err
6666
}
6767

@@ -72,7 +72,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
7272
cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=fetch %s [repo_path: %s]", remoteName, wikiRemotePath, wikiPath))
7373
}
7474
_, _, err = cmd.RunStdString(&git.RunOpts{Dir: wikiPath})
75-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
75+
if err != nil && !git.IsRemoteNotExistError(err) {
7676
return err
7777
}
7878
}

services/repository/migrate.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"errors"
99
"fmt"
1010
"net/http"
11-
"strings"
1211
"time"
1312

1413
"code.gitea.io/gitea/models/db"
@@ -255,10 +254,10 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
255254
func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error {
256255
cmd := git.NewCommand(ctx, "remote", "rm", "origin")
257256
// if the origin does not exist
258-
_, stderr, err := cmd.RunStdString(&git.RunOpts{
257+
_, _, err := cmd.RunStdString(&git.RunOpts{
259258
Dir: repoPath,
260259
})
261-
if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") {
260+
if err != nil && !git.IsRemoteNotExistError(err) {
262261
return err
263262
}
264263
return nil
@@ -277,7 +276,7 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo
277276
}
278277

279278
_, _, err := git.NewCommand(ctx, "remote", "rm", "origin").RunStdString(&git.RunOpts{Dir: repoPath})
280-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
279+
if err != nil && !git.IsRemoteNotExistError(err) {
281280
return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err)
282281
}
283282

0 commit comments

Comments
 (0)