From 36af11c137c02b17b2f1f1fb46e04ca387e170ae Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 4 Jun 2023 16:43:40 +0800 Subject: [PATCH 1/5] Use gogit config instead of ini to parse git config file --- modules/repository/repo.go | 23 +++++++++++++----- modules/repository/repo_test.go | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 modules/repository/repo_test.go diff --git a/modules/repository/repo.go b/modules/repository/repo.go index 3991e9ad995b..ac2883376fd7 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -9,6 +9,7 @@ import ( "fmt" "io" "net/http" + "os" "path" "strings" "time" @@ -27,7 +28,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" - "gopkg.in/ini.v1" //nolint:depguard + config "github.com/go-git/go-git/v5/config" ) /* @@ -241,15 +242,25 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, // cleanUpMigrateGitConfig removes mirror info which prevents "push --all". // This also removes possible user credentials. func cleanUpMigrateGitConfig(configPath string) error { - cfg, err := ini.Load(configPath) // FIXME: the ini package doesn't really work with git config files + f, err := os.Open(configPath) if err != nil { return fmt.Errorf("open config file: %w", err) } - cfg.DeleteSection("remote \"origin\"") - if err = cfg.SaveToIndent(configPath, "\t"); err != nil { - return fmt.Errorf("save config file: %w", err) + cfg, err := config.ReadConfig(f) + if err != nil { + f.Close() + return fmt.Errorf("read config: %w", err) } - return nil + delete(cfg.Remotes, "origin") + bs, err := cfg.Marshal() + if err != nil { + f.Close() + return fmt.Errorf("marshal config file: %w", err) + } + + stat, _ := f.Stat() + f.Close() + return os.WriteFile(configPath, bs, stat.Mode()) } // CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors. diff --git a/modules/repository/repo_test.go b/modules/repository/repo_test.go new file mode 100644 index 000000000000..a4931c1437bc --- /dev/null +++ b/modules/repository/repo_test.go @@ -0,0 +1,42 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repository + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_cleanUpMigrateGitConfig(t *testing.T) { + f, err := os.CreateTemp(os.TempDir(), "cleanUpMigrateGitConfig") + assert.NoError(t, err) + + _, err = f.Write([]byte(`[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = https://oauth2:xxxxxxxxxxxxx@github.com/lunny/tango.git +`)) + assert.NoError(t, err) + + p := f.Name() + f.Close() + + assert.NoError(t, cleanUpMigrateGitConfig(p)) + + bs, err := os.ReadFile(p) + assert.NoError(t, err) + assert.EqualValues(t, `[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +`, string(bs)) +} From 5c7c2c1d8d85fbc16e2716e34d23b1688338e667 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 4 Jun 2023 17:03:09 +0800 Subject: [PATCH 2/5] Use git remote rm command instead --- modules/repository/repo.go | 31 +++++------------------- modules/repository/repo_test.go | 42 --------------------------------- 2 files changed, 6 insertions(+), 67 deletions(-) delete mode 100644 modules/repository/repo_test.go diff --git a/modules/repository/repo.go b/modules/repository/repo.go index ac2883376fd7..b85de773039e 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -9,8 +9,6 @@ import ( "fmt" "io" "net/http" - "os" - "path" "strings" "time" @@ -27,8 +25,6 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" - - config "github.com/go-git/go-git/v5/config" ) /* @@ -241,26 +237,11 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, // cleanUpMigrateGitConfig removes mirror info which prevents "push --all". // This also removes possible user credentials. -func cleanUpMigrateGitConfig(configPath string) error { - f, err := os.Open(configPath) - if err != nil { - return fmt.Errorf("open config file: %w", err) - } - cfg, err := config.ReadConfig(f) - if err != nil { - f.Close() - return fmt.Errorf("read config: %w", err) - } - delete(cfg.Remotes, "origin") - bs, err := cfg.Marshal() - if err != nil { - f.Close() - return fmt.Errorf("marshal config file: %w", err) - } - - stat, _ := f.Stat() - f.Close() - return os.WriteFile(configPath, bs, stat.Mode()) +func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error { + cmd := git.NewCommand(ctx, "remote", "rm", "origin") + return cmd.Run(&git.RunOpts{ + Dir: repoPath, + }) } // CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors. @@ -281,7 +262,7 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo } if repo.HasWiki() { - if err := cleanUpMigrateGitConfig(path.Join(repo.WikiPath(), "config")); err != nil { + if err := cleanUpMigrateGitConfig(ctx, repo.WikiPath()); err != nil { return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %w", err) } } diff --git a/modules/repository/repo_test.go b/modules/repository/repo_test.go deleted file mode 100644 index a4931c1437bc..000000000000 --- a/modules/repository/repo_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package repository - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_cleanUpMigrateGitConfig(t *testing.T) { - f, err := os.CreateTemp(os.TempDir(), "cleanUpMigrateGitConfig") - assert.NoError(t, err) - - _, err = f.Write([]byte(`[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = https://oauth2:xxxxxxxxxxxxx@github.com/lunny/tango.git -`)) - assert.NoError(t, err) - - p := f.Name() - f.Close() - - assert.NoError(t, cleanUpMigrateGitConfig(p)) - - bs, err := os.ReadFile(p) - assert.NoError(t, err) - assert.EqualValues(t, `[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -`, string(bs)) -} From b3fafa01ca3829772f2d24925dade40648f80cdd Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 4 Jun 2023 22:41:35 +0800 Subject: [PATCH 3/5] Ignore no such remote --- modules/repository/repo.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/repository/repo.go b/modules/repository/repo.go index b85de773039e..52db2ec15223 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -239,9 +239,17 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, // This also removes possible user credentials. func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error { cmd := git.NewCommand(ctx, "remote", "rm", "origin") - return cmd.Run(&git.RunOpts{ + // if the origin does not exist + stdout, _, err := cmd.RunStdString(&git.RunOpts{ Dir: repoPath, }) + if err != nil { + return err + } + if strings.HasPrefix(stdout, "fatal: No such remote") || stdout == "" { + return nil + } + return errors.New(stdout) } // CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors. From 44fb8bdcef6c164a9076d51732f00aecc1c0e40c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 5 Jun 2023 14:30:13 +0800 Subject: [PATCH 4/5] Fix bug --- modules/repository/repo.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/repository/repo.go b/modules/repository/repo.go index 52db2ec15223..b6c569a15122 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -240,16 +240,13 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error { cmd := git.NewCommand(ctx, "remote", "rm", "origin") // if the origin does not exist - stdout, _, err := cmd.RunStdString(&git.RunOpts{ + _, _, err := cmd.RunStdString(&git.RunOpts{ Dir: repoPath, }) - if err != nil { + if err != nil && !strings.HasPrefix(err.Error(), "fatal: No such remote") { return err } - if strings.HasPrefix(stdout, "fatal: No such remote") || stdout == "" { - return nil - } - return errors.New(stdout) + return nil } // CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors. From d6587238bdbe18f03641a4535b6d65a83fabd0f1 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 5 Jun 2023 16:13:59 +0800 Subject: [PATCH 5/5] Fix bug --- modules/repository/repo.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/repository/repo.go b/modules/repository/repo.go index b6c569a15122..bcb43f15e1d1 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -240,10 +240,10 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error { cmd := git.NewCommand(ctx, "remote", "rm", "origin") // if the origin does not exist - _, _, err := cmd.RunStdString(&git.RunOpts{ + _, stderr, err := cmd.RunStdString(&git.RunOpts{ Dir: repoPath, }) - if err != nil && !strings.HasPrefix(err.Error(), "fatal: No such remote") { + if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") { return err } return nil