]> source.dussan.org Git - gitea.git/commitdiff
Migrations: Use Process Manager to create own Context (#13792)
author6543 <6543@obermui.de>
Wed, 2 Dec 2020 18:36:06 +0000 (19:36 +0100)
committerGitHub <noreply@github.com>
Wed, 2 Dec 2020 18:36:06 +0000 (18:36 +0000)
integrations/git_helper_for_declarative_test.go
modules/git/git.go
modules/git/repo.go
modules/migrations/gitea_uploader.go
modules/repository/repo.go
modules/task/migrate.go
services/mirror/mirror_test.go

index 04b4c990139d386dcd91011cc356fcf0ffba908c..f681cd143a12e93c2d9e990f852fc95aad71d182 100644 (file)
@@ -111,7 +111,7 @@ func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL), prepare ...bo
 
 func doGitClone(dstLocalPath string, u *url.URL) func(*testing.T) {
        return func(t *testing.T) {
-               assert.NoError(t, git.CloneWithArgs(u.String(), dstLocalPath, allowLFSFilters(), git.CloneRepoOptions{}))
+               assert.NoError(t, git.CloneWithArgs(context.Background(), u.String(), dstLocalPath, allowLFSFilters(), git.CloneRepoOptions{}))
                assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
        }
 }
index cce5cc738da7f2174aedf700612bd3a3e719745a..6b15138a5c74894c3fbd1e7cb73b2800ada6c924 100644 (file)
@@ -32,6 +32,7 @@ var (
        GitExecutable = "git"
 
        // DefaultContext is the default context to run git commands in
+       // will be overwritten by Init with HammerContext
        DefaultContext = context.Background()
 
        gitVersion *version.Version
index ae370d3da973aedb6812a2af226d64980063fff6..9b1da87a32e8ea2557ee5d83621fa7e253fd748a 100644 (file)
@@ -8,6 +8,7 @@ package git
 import (
        "bytes"
        "container/list"
+       "context"
        "errors"
        "fmt"
        "os"
@@ -166,19 +167,24 @@ type CloneRepoOptions struct {
 
 // Clone clones original repository to target path.
 func Clone(from, to string, opts CloneRepoOptions) (err error) {
+       return CloneWithContext(DefaultContext, from, to, opts)
+}
+
+// CloneWithContext clones original repository to target path.
+func CloneWithContext(ctx context.Context, from, to string, opts CloneRepoOptions) (err error) {
        cargs := make([]string, len(GlobalCommandArgs))
        copy(cargs, GlobalCommandArgs)
-       return CloneWithArgs(from, to, cargs, opts)
+       return CloneWithArgs(ctx, from, to, cargs, opts)
 }
 
 // CloneWithArgs original repository to target path.
-func CloneWithArgs(from, to string, args []string, opts CloneRepoOptions) (err error) {
+func CloneWithArgs(ctx context.Context, from, to string, args []string, opts CloneRepoOptions) (err error) {
        toDir := path.Dir(to)
        if err = os.MkdirAll(toDir, os.ModePerm); err != nil {
                return err
        }
 
-       cmd := NewCommandNoGlobals(args...).AddArguments("clone")
+       cmd := NewCommandContextNoGlobals(ctx, args...).AddArguments("clone")
        if opts.Mirror {
                cmd.AddArguments("--mirror")
        }
index 466c832754c30fde481eda06d6d9bc0868564570..2cb19685fcb9efb74027677aab905e2e367041e4 100644 (file)
@@ -125,7 +125,7 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
        }
        r.DefaultBranch = repo.DefaultBranch
 
-       r, err = repository.MigrateRepositoryGitData(g.doer, owner, r, base.MigrateOptions{
+       r, err = repository.MigrateRepositoryGitData(g.ctx, owner, r, base.MigrateOptions{
                RepoName:       g.repoName,
                Description:    repo.Description,
                OriginalURL:    repo.OriginalURL,
index b18dfddd2e5abcdae202988a5fdf45f25aac4aa1..8ecb43ede6e11d90b3d1301b6c500e7cace2438d 100644 (file)
@@ -5,6 +5,7 @@
 package repository
 
 import (
+       "context"
        "fmt"
        "path"
        "strings"
@@ -41,7 +42,7 @@ func WikiRemoteURL(remote string) string {
 }
 
 // MigrateRepositoryGitData starts migrating git related data after created migrating repository
-func MigrateRepositoryGitData(doer, u *models.User, repo *models.Repository, opts migration.MigrateOptions) (*models.Repository, error) {
+func MigrateRepositoryGitData(ctx context.Context, u *models.User, repo *models.Repository, opts migration.MigrateOptions) (*models.Repository, error) {
        repoPath := models.RepoPath(u.Name, opts.RepoName)
 
        if u.IsOrganization() {
@@ -61,7 +62,7 @@ func MigrateRepositoryGitData(doer, u *models.User, repo *models.Repository, opt
                return repo, fmt.Errorf("Failed to remove %s: %v", repoPath, err)
        }
 
-       if err = git.Clone(opts.CloneAddr, repoPath, git.CloneRepoOptions{
+       if err = git.CloneWithContext(ctx, opts.CloneAddr, repoPath, git.CloneRepoOptions{
                Mirror:  true,
                Quiet:   true,
                Timeout: migrateTimeout,
@@ -77,7 +78,7 @@ func MigrateRepositoryGitData(doer, u *models.User, repo *models.Repository, opt
                                return repo, fmt.Errorf("Failed to remove %s: %v", wikiPath, err)
                        }
 
-                       if err = git.Clone(wikiRemotePath, wikiPath, git.CloneRepoOptions{
+                       if err = git.CloneWithContext(ctx, wikiRemotePath, wikiPath, git.CloneRepoOptions{
                                Mirror:  true,
                                Quiet:   true,
                                Timeout: migrateTimeout,
index 99f0435b280d0f4f9d59ec45f815460a4f582d05..57424abac38cad1a70ab1e8f96681dc7028e7b68 100644 (file)
@@ -5,6 +5,7 @@
 package task
 
 import (
+       "context"
        "errors"
        "fmt"
        "strings"
@@ -15,6 +16,7 @@ import (
        "code.gitea.io/gitea/modules/migrations"
        migration "code.gitea.io/gitea/modules/migrations/base"
        "code.gitea.io/gitea/modules/notification"
+       "code.gitea.io/gitea/modules/process"
        "code.gitea.io/gitea/modules/structs"
        "code.gitea.io/gitea/modules/timeutil"
        "code.gitea.io/gitea/modules/util"
@@ -82,11 +84,6 @@ func runMigrateTask(t *models.Task) (err error) {
        if err = t.LoadOwner(); err != nil {
                return
        }
-       t.StartTime = timeutil.TimeStampNow()
-       t.Status = structs.TaskStatusRunning
-       if err = t.UpdateCols("start_time", "status"); err != nil {
-               return
-       }
 
        var opts *migration.MigrateOptions
        opts, err = t.MigrateConfig()
@@ -96,7 +93,20 @@ func runMigrateTask(t *models.Task) (err error) {
 
        opts.MigrateToRepoID = t.RepoID
        var repo *models.Repository
-       repo, err = migrations.MigrateRepository(graceful.GetManager().HammerContext(), t.Doer, t.Owner.Name, *opts)
+
+       ctx, cancel := context.WithCancel(graceful.GetManager().ShutdownContext())
+       defer cancel()
+       pm := process.GetManager()
+       pid := pm.Add(fmt.Sprintf("MigrateTask: %s/%s", t.Owner.Name, opts.RepoName), cancel)
+       defer pm.Remove(pid)
+
+       t.StartTime = timeutil.TimeStampNow()
+       t.Status = structs.TaskStatusRunning
+       if err = t.UpdateCols("start_time", "status"); err != nil {
+               return
+       }
+
+       repo, err = migrations.MigrateRepository(ctx, t.Doer, t.Owner.Name, *opts)
        if err == nil {
                log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name)
                return
index 79e18885b33838cc02526d7510184bc5ba0a2749..ddfb6c676b6a7249cab66ac9146b99a4f43c7f6a 100644 (file)
@@ -5,6 +5,7 @@
 package mirror
 
 import (
+       "context"
        "path/filepath"
        "testing"
 
@@ -47,7 +48,7 @@ func TestRelease_MirrorDelete(t *testing.T) {
        })
        assert.NoError(t, err)
 
-       mirror, err := repository.MigrateRepositoryGitData(user, user, mirrorRepo, opts)
+       mirror, err := repository.MigrateRepositoryGitData(context.Background(), user, mirrorRepo, opts)
        assert.NoError(t, err)
 
        gitRepo, err := git.OpenRepository(repoPath)