Skip to content

Commit 0d7d2ed

Browse files
yp05327wxiaoguang
andauthored
Support the new exit code for git remote subcommands for git version >=2.30.0 (#33129)
Fix #32889 --------- Co-authored-by: wxiaoguang <[email protected]>
1 parent 34dfc25 commit 0d7d2ed

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

modules/git/remote.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,15 @@ func (err *ErrInvalidCloneAddr) Unwrap() error {
7979
return util.ErrInvalidArgument
8080
}
8181

82+
// IsRemoteNotExistError checks the prefix of the error message to see whether a remote does not exist.
83+
func IsRemoteNotExistError(err error) bool {
84+
// see: https://github.com/go-gitea/gitea/issues/32889#issuecomment-2571848216
85+
// Should not add space in the end, sometimes git will add a `:`
86+
prefix1 := "exit status 128 - fatal: No such remote" // git < 2.30
87+
prefix2 := "exit status 2 - error: No such remote" // git >= 2.30
88+
return strings.HasPrefix(err.Error(), prefix1) || strings.HasPrefix(err.Error(), prefix2)
89+
}
90+
8291
// ParseRemoteAddr checks if given remote address is valid,
8392
// and returns composed URL with needed username and password.
8493
func ParseRemoteAddr(remoteAddr, authUsername, authPassword string) (string, error) {

services/mirror/mirror_pull.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ 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

4848
cmd := git.NewCommand(ctx, "remote", "add").AddDynamicArguments(remoteName).AddArguments("--mirror=fetch").AddDynamicArguments(addr)
4949
_, _, err = cmd.RunStdString(&git.RunOpts{Dir: repoPath})
50-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
50+
if err != nil && !git.IsRemoteNotExistError(err) {
5151
return err
5252
}
5353

@@ -56,13 +56,13 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
5656
wikiRemotePath := repo_module.UncycloRemoteURL(ctx, addr)
5757
// Remove old remote of wiki
5858
_, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: wikiPath})
59-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
59+
if err != nil && !git.IsRemoteNotExistError(err) {
6060
return err
6161
}
6262

6363
cmd = git.NewCommand(ctx, "remote", "add").AddDynamicArguments(remoteName).AddArguments("--mirror=fetch").AddDynamicArguments(wikiRemotePath)
6464
_, _, err = cmd.RunStdString(&git.RunOpts{Dir: wikiPath})
65-
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
65+
if err != nil && !git.IsRemoteNotExistError(err) {
6666
return err
6767
}
6868
}

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"
@@ -254,10 +253,10 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
254253
func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error {
255254
cmd := git.NewCommand(ctx, "remote", "rm", "origin")
256255
// if the origin does not exist
257-
_, stderr, err := cmd.RunStdString(&git.RunOpts{
256+
_, _, err := cmd.RunStdString(&git.RunOpts{
258257
Dir: repoPath,
259258
})
260-
if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") {
259+
if err != nil && !git.IsRemoteNotExistError(err) {
261260
return err
262261
}
263262
return nil
@@ -276,7 +275,7 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo
276275
}
277276

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

0 commit comments

Comments
 (0)