From eaa695424dd24ffda4d6e67b5d184199239d4e0c Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 11 Nov 2019 15:05:14 -0600 Subject: [PATCH 01/12] Add git hooks and webhooks to template options Signed-off-by: jolheiser --- models/repo.go | 64 ++++++++++++++++++++++++++++++++- modules/auth/repo_form.go | 2 ++ options/locale/locale_en-US.ini | 2 ++ routers/repo/repo.go | 2 ++ templates/repo/create.tmpl | 8 +++++ 5 files changed, 77 insertions(+), 1 deletion(-) diff --git a/models/repo.go b/models/repo.go index ccecfe2fdf0a..44d8011ccb95 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1252,11 +1252,13 @@ type GenerateRepoOptions struct { Private bool GitContent bool Topics bool + GitHooks bool + Webhooks bool } // IsValid checks whether at least one option is chosen for generation func (gro GenerateRepoOptions) IsValid() bool { - return gro.GitContent || gro.Topics // or other items as they are added + return gro.GitContent || gro.Topics || gro.GitHooks || gro.Webhooks // or other items as they are added } func getRepoInitFile(tp, name string) ([]byte, error) { @@ -2784,6 +2786,7 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera return repo, err } + // Git Content if opts.GitContent && !templateRepo.IsEmpty { if err = generateRepository(sess, repo, templateRepo); err != nil { return repo, err @@ -2798,6 +2801,7 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera } } + // Topics if opts.Topics { for _, topic := range templateRepo.Topics { if _, err = addTopicByNameToRepo(sess, repo.ID, topic); err != nil { @@ -2806,6 +2810,64 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera } } + // Git Hooks + if opts.GitHooks { + generateRepo, err := git.OpenRepository(repo.repoPath(sess)) + if err != nil { + return repo, err + } + + templateRepo, err := git.OpenRepository(templateRepo.repoPath(sess)) + if err != nil { + return repo, err + } + + templateHooks, err := templateRepo.Hooks() + if err != nil { + return repo, err + } + + for _, templateHook := range templateHooks { + generateHook, err := generateRepo.GetHook(templateHook.Name()) + if err != nil { + return repo, err + } + + generateHook.Content = templateHook.Content + generateHook.IsActive = templateHook.IsActive + if err := generateHook.Update(); err != nil { + return repo, err + } + } + } + + // Webhooks + if opts.Webhooks { + templateWebhooks, err := GetWebhooksByRepoID(templateRepo.ID) + if err != nil { + return repo, err + } + + for _, templateWebhook := range templateWebhooks { + generateWebhook := &Webhook{ + RepoID: repo.ID, + URL: templateWebhook.URL, + HTTPMethod: templateWebhook.HTTPMethod, + ContentType: templateWebhook.ContentType, + Secret: templateWebhook.Secret, + HookEvent: templateWebhook.HookEvent, + IsActive: templateWebhook.IsActive, + HookTaskType: templateWebhook.HookTaskType, + OrgID: templateWebhook.OrgID, + Events: templateWebhook.Events, + Meta: templateWebhook.Meta, + } + if err := createWebhook(sess, generateWebhook); err != nil { + return repo, err + } + } + } + return repo, sess.Commit() } diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index 2602dc42ebd9..1ca9dd1de919 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -40,6 +40,8 @@ type CreateRepoForm struct { RepoTemplate int64 GitContent bool Topics bool + GitHooks bool + Webhooks bool } // Validate validates the fields diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index dc9cc3d6b9e9..758b328e8591 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -627,6 +627,8 @@ reactions_more = and %d more template.items = Template Items template.git_content = Git Content (Default Branch) +template.git_hooks = Git Hooks +template.webhooks = Webhooks template.topics = Topics template.one_item = Must select at least one template item template.invalid = Must select a template repository diff --git a/routers/repo/repo.go b/routers/repo/repo.go index cb4e48333300..de2e13384105 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -188,6 +188,8 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) { Private: form.Private, GitContent: form.GitContent, Topics: form.Topics, + GitHooks: form.GitHooks, + Webhooks: form.Webhooks, } if !opts.IsValid() { diff --git a/templates/repo/create.tmpl b/templates/repo/create.tmpl index f728a9363117..6034b22ccb76 100644 --- a/templates/repo/create.tmpl +++ b/templates/repo/create.tmpl @@ -72,9 +72,17 @@ +
+ + +
+
+ + +
From f350f494bcc3885045f9acf67ef039cede2c5dfa Mon Sep 17 00:00:00 2001 From: John Olheiser <42128690+jolheiser@users.noreply.github.com> Date: Tue, 12 Nov 2019 14:17:20 -0600 Subject: [PATCH 02/12] Update models/repo.go Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> --- models/repo.go | 1 - 1 file changed, 1 deletion(-) diff --git a/models/repo.go b/models/repo.go index 44d8011ccb95..6e574d56c8a0 100644 --- a/models/repo.go +++ b/models/repo.go @@ -2834,7 +2834,6 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera } generateHook.Content = templateHook.Content - generateHook.IsActive = templateHook.IsActive if err := generateHook.Update(); err != nil { return repo, err } From 8da72e198cc29465a6c0cd83cfc2e09472a3255f Mon Sep 17 00:00:00 2001 From: jolheiser Date: Tue, 12 Nov 2019 15:57:34 -0600 Subject: [PATCH 03/12] Add tooltip if the user can't edit git hooks Signed-off-by: jolheiser --- options/locale/locale_en-US.ini | 1 + templates/repo/create.tmpl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 758b328e8591..3396686b90e0 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -628,6 +628,7 @@ reactions_more = and %d more template.items = Template Items template.git_content = Git Content (Default Branch) template.git_hooks = Git Hooks +template.git_hooks_tooltip = You are currently unable to modify git hooks. Select this only if you trust the template repository. template.webhooks = Webhooks template.topics = Topics template.one_item = Must select at least one template item diff --git a/templates/repo/create.tmpl b/templates/repo/create.tmpl index 6034b22ccb76..69f2abb687f0 100644 --- a/templates/repo/create.tmpl +++ b/templates/repo/create.tmpl @@ -72,7 +72,7 @@
-
+
From bbc36474e968a2132c8c0bd738c6b89367ed2aa5 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 13 Nov 2019 08:26:59 -0600 Subject: [PATCH 04/12] Close repositories after copying git hooks Signed-off-by: jolheiser --- models/repo.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/models/repo.go b/models/repo.go index 1a3924377a6b..e6f4ef2c0aca 100644 --- a/models/repo.go +++ b/models/repo.go @@ -2817,11 +2817,13 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera if err != nil { return repo, err } + defer generateRepo.Close() templateRepo, err := git.OpenRepository(templateRepo.repoPath(sess)) if err != nil { return repo, err } + defer templateRepo.Close() templateHooks, err := templateRepo.Hooks() if err != nil { From fccc473e7d2ed25df611407fddf2146e9cc7747b Mon Sep 17 00:00:00 2001 From: John Olheiser <42128690+jolheiser@users.noreply.github.com> Date: Wed, 13 Nov 2019 16:43:06 -0600 Subject: [PATCH 05/12] Wording Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> --- options/locale/locale_en-US.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 9833656b3ce7..8603195050c7 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -629,7 +629,7 @@ reactions_more = and %d more template.items = Template Items template.git_content = Git Content (Default Branch) template.git_hooks = Git Hooks -template.git_hooks_tooltip = You are currently unable to modify git hooks. Select this only if you trust the template repository. +template.git_hooks_tooltip = You are currently unable to modify or remove git hooks once added. Select this only if you trust the template repository. template.webhooks = Webhooks template.topics = Topics template.one_item = Must select at least one template item From d5f2247afcf8b491028dbd695f0d8d284ff14e4c Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 22 Nov 2019 11:47:40 -0600 Subject: [PATCH 06/12] Restructure for services Signed-off-by: jolheiser --- models/repo.go | 158 ---------------------------- models/repo_generate.go | 168 ++++++++++++++++++++++++++++++ services/repository/generate.go | 61 +++++++++++ services/repository/repository.go | 15 --- 4 files changed, 229 insertions(+), 173 deletions(-) create mode 100644 models/repo_generate.go create mode 100644 services/repository/generate.go diff --git a/models/repo.go b/models/repo.go index e32c387a590d..3599d2084445 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1473,37 +1473,6 @@ func initRepository(e Engine, repoPath string, u *User, repo *Repository, opts C return nil } -// generateRepository initializes repository from template -func generateRepository(e Engine, repo, templateRepo *Repository) (err error) { - tmpDir := filepath.Join(os.TempDir(), "gitea-"+repo.Name+"-"+com.ToStr(time.Now().Nanosecond())) - - if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", tmpDir, err) - } - - defer func() { - if err := os.RemoveAll(tmpDir); err != nil { - log.Error("RemoveAll: %v", err) - } - }() - - if err = generateRepoCommit(e, repo, templateRepo, tmpDir); err != nil { - return fmt.Errorf("generateRepoCommit: %v", err) - } - - // re-fetch repo - if repo, err = getRepositoryByID(e, repo.ID); err != nil { - return fmt.Errorf("getRepositoryByID: %v", err) - } - - repo.DefaultBranch = "master" - if err = updateRepository(e, repo, false); err != nil { - return fmt.Errorf("updateRepository: %v", err) - } - - return nil -} - var ( reservedRepoNames = []string{".", ".."} reservedRepoPatterns = []string{"*.git", "*.wiki"} @@ -2761,133 +2730,6 @@ func ForkRepository(doer, owner *User, oldRepo *Repository, name, desc string) ( return repo, CopyLFS(repo, oldRepo) } -// GenerateRepository generates a repository from a template -func GenerateRepository(doer, owner *User, templateRepo *Repository, opts GenerateRepoOptions) (_ *Repository, err error) { - repo := &Repository{ - OwnerID: owner.ID, - Owner: owner, - Name: opts.Name, - LowerName: strings.ToLower(opts.Name), - Description: opts.Description, - IsPrivate: opts.Private, - IsEmpty: !opts.GitContent || templateRepo.IsEmpty, - IsFsckEnabled: templateRepo.IsFsckEnabled, - TemplateID: templateRepo.ID, - } - - createSess := x.NewSession() - defer createSess.Close() - if err = createSess.Begin(); err != nil { - return nil, err - } - - if err = createRepository(createSess, doer, owner, repo); err != nil { - return nil, err - } - - //Commit repo to get created repo ID - err = createSess.Commit() - if err != nil { - return nil, err - } - - sess := x.NewSession() - defer sess.Close() - if err = sess.Begin(); err != nil { - return repo, err - } - - repoPath := RepoPath(owner.Name, repo.Name) - if err = checkInitRepository(repoPath); err != nil { - return repo, err - } - - // Git Content - if opts.GitContent && !templateRepo.IsEmpty { - if err = generateRepository(sess, repo, templateRepo); err != nil { - return repo, err - } - - if err = repo.updateSize(sess); err != nil { - return repo, fmt.Errorf("failed to update size for repository: %v", err) - } - - if err = copyLFS(sess, repo, templateRepo); err != nil { - return repo, fmt.Errorf("failed to copy LFS: %v", err) - } - } - - // Topics - if opts.Topics { - for _, topic := range templateRepo.Topics { - if _, err = addTopicByNameToRepo(sess, repo.ID, topic); err != nil { - return repo, err - } - } - } - - // Git Hooks - if opts.GitHooks { - generateRepo, err := git.OpenRepository(repo.repoPath(sess)) - if err != nil { - return repo, err - } - defer generateRepo.Close() - - templateRepo, err := git.OpenRepository(templateRepo.repoPath(sess)) - if err != nil { - return repo, err - } - defer templateRepo.Close() - - templateHooks, err := templateRepo.Hooks() - if err != nil { - return repo, err - } - - for _, templateHook := range templateHooks { - generateHook, err := generateRepo.GetHook(templateHook.Name()) - if err != nil { - return repo, err - } - - generateHook.Content = templateHook.Content - if err := generateHook.Update(); err != nil { - return repo, err - } - } - } - - // Webhooks - if opts.Webhooks { - templateWebhooks, err := GetWebhooksByRepoID(templateRepo.ID) - if err != nil { - return repo, err - } - - for _, templateWebhook := range templateWebhooks { - generateWebhook := &Webhook{ - RepoID: repo.ID, - URL: templateWebhook.URL, - HTTPMethod: templateWebhook.HTTPMethod, - ContentType: templateWebhook.ContentType, - Secret: templateWebhook.Secret, - HookEvent: templateWebhook.HookEvent, - IsActive: templateWebhook.IsActive, - HookTaskType: templateWebhook.HookTaskType, - OrgID: templateWebhook.OrgID, - Events: templateWebhook.Events, - Meta: templateWebhook.Meta, - } - if err := createWebhook(sess, generateWebhook); err != nil { - return repo, err - } - } - } - - return repo, sess.Commit() -} - // GetForks returns all the forks of the repository func (repo *Repository) GetForks() ([]*Repository, error) { forks := make([]*Repository, 0, repo.NumForks) diff --git a/models/repo_generate.go b/models/repo_generate.go new file mode 100644 index 000000000000..8fb8e4180c82 --- /dev/null +++ b/models/repo_generate.go @@ -0,0 +1,168 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "time" + + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + + "github.com/unknwon/com" +) + +// generateRepository initializes repository from template +func generateRepository(e Engine, repo, templateRepo *Repository) (err error) { + tmpDir := filepath.Join(os.TempDir(), "gitea-"+repo.Name+"-"+com.ToStr(time.Now().Nanosecond())) + + if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil { + return fmt.Errorf("Failed to create dir %s: %v", tmpDir, err) + } + + defer func() { + if err := os.RemoveAll(tmpDir); err != nil { + log.Error("RemoveAll: %v", err) + } + }() + + if err = generateRepoCommit(e, repo, templateRepo, tmpDir); err != nil { + return fmt.Errorf("generateRepoCommit: %v", err) + } + + // re-fetch repo + if repo, err = getRepositoryByID(e, repo.ID); err != nil { + return fmt.Errorf("getRepositoryByID: %v", err) + } + + repo.DefaultBranch = "master" + if err = updateRepository(e, repo, false); err != nil { + return fmt.Errorf("updateRepository: %v", err) + } + + return nil +} + +// GenerateRepository generates a repository from a template +func GenerateRepository(doer, owner *User, templateRepo *Repository, opts GenerateRepoOptions) (_ *Repository, err error) { + generateRepo := &Repository{ + OwnerID: owner.ID, + Owner: owner, + Name: opts.Name, + LowerName: strings.ToLower(opts.Name), + Description: opts.Description, + IsPrivate: opts.Private, + IsEmpty: !opts.GitContent || templateRepo.IsEmpty, + IsFsckEnabled: templateRepo.IsFsckEnabled, + TemplateID: templateRepo.ID, + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + if err = createRepository(sess, doer, owner, generateRepo); err != nil { + return nil, err + } + + repoPath := RepoPath(owner.Name, generateRepo.Name) + if err = checkInitRepository(repoPath); err != nil { + return generateRepo, err + } + + return generateRepo, sess.Commit() +} + +// GenerateGitContent generates git content from a template repository +func GenerateGitContent(ctx DBContext, templateRepo, generateRepo *Repository) error { + if err := generateRepository(ctx.e, generateRepo, templateRepo); err != nil { + return err + } + + if err := generateRepo.updateSize(ctx.e); err != nil { + return fmt.Errorf("failed to update size for repository: %v", err) + } + + if err := copyLFS(ctx.e, generateRepo, templateRepo); err != nil { + return fmt.Errorf("failed to copy LFS: %v", err) + } + return nil +} + +// GenerateTopics generates topics from a template repository +func GenerateTopics(ctx DBContext, templateRepo, generateRepo *Repository) error { + for _, topic := range templateRepo.Topics { + if _, err := addTopicByNameToRepo(ctx.e, generateRepo.ID, topic); err != nil { + return err + } + } + return nil +} + +// GenerateGitHooks generates git hooks from a template repository +func GenerateGitHooks(ctx DBContext, templateRepo, generateRepo *Repository) error { + generateGitRepo, err := git.OpenRepository(generateRepo.repoPath(ctx.e)) + if err != nil { + return err + } + defer generateGitRepo.Close() + + templateGitRepo, err := git.OpenRepository(templateRepo.repoPath(ctx.e)) + if err != nil { + return err + } + defer templateGitRepo.Close() + + templateHooks, err := templateGitRepo.Hooks() + if err != nil { + return err + } + + for _, templateHook := range templateHooks { + generateHook, err := generateGitRepo.GetHook(templateHook.Name()) + if err != nil { + return err + } + + generateHook.Content = templateHook.Content + if err := generateHook.Update(); err != nil { + return err + } + } + return nil +} + +// GenerateWebhooks generates webhooks from a template repository +func GenerateWebhooks(ctx DBContext, templateRepo, generateRepo *Repository) error { + templateWebhooks, err := GetWebhooksByRepoID(templateRepo.ID) + if err != nil { + return err + } + + for _, templateWebhook := range templateWebhooks { + generateWebhook := &Webhook{ + RepoID: generateRepo.ID, + URL: templateWebhook.URL, + HTTPMethod: templateWebhook.HTTPMethod, + ContentType: templateWebhook.ContentType, + Secret: templateWebhook.Secret, + HookEvent: templateWebhook.HookEvent, + IsActive: templateWebhook.IsActive, + HookTaskType: templateWebhook.HookTaskType, + OrgID: templateWebhook.OrgID, + Events: templateWebhook.Events, + Meta: templateWebhook.Meta, + } + if err := createWebhook(ctx.e, generateWebhook); err != nil { + return err + } + } + return nil +} diff --git a/services/repository/generate.go b/services/repository/generate.go new file mode 100644 index 000000000000..f0e6228de8f3 --- /dev/null +++ b/services/repository/generate.go @@ -0,0 +1,61 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package repository + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/notification" +) + +// GenerateRepository generates a repository from a template +func GenerateRepository(doer, owner *models.User, templateRepo *models.Repository, opts models.GenerateRepoOptions) (*models.Repository, error) { + generateRepo, err := models.GenerateRepository(doer, owner, templateRepo, opts) + if err != nil { + if generateRepo != nil { + if errDelete := models.DeleteRepository(doer, owner.ID, generateRepo.ID); errDelete != nil { + log.Error("Rollback deleteRepository: %v", errDelete) + } + } + return nil, err + } + + ctx, sess, err := models.TxDBContext() + if err != nil { + return generateRepo, nil + } + + // Git Content + if opts.GitContent && !templateRepo.IsEmpty { + if err := models.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil { + return generateRepo, nil + } + } + + // Topics + if opts.Topics { + if err := models.GenerateTopics(ctx, templateRepo, generateRepo); err != nil { + return generateRepo, nil + } + } + + // Git Hooks + if opts.GitHooks { + if err := models.GenerateGitHooks(ctx, templateRepo, generateRepo); err != nil { + return generateRepo, nil + } + } + + // Webhooks + if opts.Webhooks { + if err := models.GenerateWebhooks(ctx, templateRepo, generateRepo); err != nil { + return generateRepo, nil + } + } + + notification.NotifyCreateRepository(doer, owner, generateRepo) + + return generateRepo, sess.Commit() +} diff --git a/services/repository/repository.go b/services/repository/repository.go index b1156b41d5df..5135435c7816 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -44,21 +44,6 @@ func ForkRepository(doer, u *models.User, oldRepo *models.Repository, name, desc return repo, nil } -// GenerateRepository generates a repository from a template -func GenerateRepository(doer, u *models.User, oldRepo *models.Repository, opts models.GenerateRepoOptions) (*models.Repository, error) { - repo, err := models.GenerateRepository(doer, u, oldRepo, opts) - if err != nil { - if repo != nil { - if errDelete := models.DeleteRepository(doer, u.ID, repo.ID); errDelete != nil { - log.Error("Rollback deleteRepository: %v", errDelete) - } - } - return nil, err - } - - return repo, nil -} - // DeleteRepository deletes a repository for a user or organization. func DeleteRepository(doer *models.User, repo *models.Repository) error { if err := models.DeleteRepository(doer, repo.OwnerID, repo.ID); err != nil { From 8bbccaa43a587c4730abd36f075526fe7d1319dd Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 22 Nov 2019 11:51:56 -0600 Subject: [PATCH 07/12] Return errors Signed-off-by: jolheiser --- services/repository/generate.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/repository/generate.go b/services/repository/generate.go index f0e6228de8f3..82c4e23794ba 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -24,34 +24,34 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor ctx, sess, err := models.TxDBContext() if err != nil { - return generateRepo, nil + return generateRepo, err } // Git Content if opts.GitContent && !templateRepo.IsEmpty { if err := models.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, nil + return generateRepo, err } } // Topics if opts.Topics { if err := models.GenerateTopics(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, nil + return generateRepo, err } } // Git Hooks if opts.GitHooks { if err := models.GenerateGitHooks(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, nil + return generateRepo, err } } // Webhooks if opts.Webhooks { if err := models.GenerateWebhooks(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, nil + return generateRepo, err } } From faca8aeb01232a34146e7ef093a8313512491ca3 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 22 Nov 2019 14:04:14 -0600 Subject: [PATCH 08/12] Move GenerateRepository to using a DBContext Signed-off-by: jolheiser --- models/repo.go | 3 +-- models/repo_generate.go | 12 +++--------- services/repository/generate.go | 18 +++++++++++------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/models/repo.go b/models/repo.go index 3599d2084445..cc9167403da5 100644 --- a/models/repo.go +++ b/models/repo.go @@ -42,7 +42,6 @@ import ( "github.com/unknwon/com" ini "gopkg.in/ini.v1" "xorm.io/builder" - "xorm.io/xorm" ) var repoWorkingPool = sync.NewExclusivePool() @@ -1483,7 +1482,7 @@ func IsUsableRepoName(name string) error { return isUsableName(reservedRepoNames, reservedRepoPatterns, name) } -func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err error) { +func createRepository(e Engine, doer, u *User, repo *Repository) (err error) { if err = IsUsableRepoName(repo.Name); err != nil { return err } diff --git a/models/repo_generate.go b/models/repo_generate.go index 8fb8e4180c82..6406180038d2 100644 --- a/models/repo_generate.go +++ b/models/repo_generate.go @@ -49,7 +49,7 @@ func generateRepository(e Engine, repo, templateRepo *Repository) (err error) { } // GenerateRepository generates a repository from a template -func GenerateRepository(doer, owner *User, templateRepo *Repository, opts GenerateRepoOptions) (_ *Repository, err error) { +func GenerateRepository(ctx DBContext, doer, owner *User, templateRepo *Repository, opts GenerateRepoOptions) (_ *Repository, err error) { generateRepo := &Repository{ OwnerID: owner.ID, Owner: owner, @@ -62,13 +62,7 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera TemplateID: templateRepo.ID, } - sess := x.NewSession() - defer sess.Close() - if err = sess.Begin(); err != nil { - return nil, err - } - - if err = createRepository(sess, doer, owner, generateRepo); err != nil { + if err = createRepository(ctx.e, doer, owner, generateRepo); err != nil { return nil, err } @@ -77,7 +71,7 @@ func GenerateRepository(doer, owner *User, templateRepo *Repository, opts Genera return generateRepo, err } - return generateRepo, sess.Commit() + return generateRepo, nil } // GenerateGitContent generates git content from a template repository diff --git a/services/repository/generate.go b/services/repository/generate.go index 82c4e23794ba..b4314c70c1a0 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -12,7 +12,12 @@ import ( // GenerateRepository generates a repository from a template func GenerateRepository(doer, owner *models.User, templateRepo *models.Repository, opts models.GenerateRepoOptions) (*models.Repository, error) { - generateRepo, err := models.GenerateRepository(doer, owner, templateRepo, opts) + ctx, sess, err := models.TxDBContext() + if err != nil { + return nil, err + } + + generateRepo, err := models.GenerateRepository(ctx, doer, owner, templateRepo, opts) if err != nil { if generateRepo != nil { if errDelete := models.DeleteRepository(doer, owner.ID, generateRepo.ID); errDelete != nil { @@ -22,11 +27,6 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor return nil, err } - ctx, sess, err := models.TxDBContext() - if err != nil { - return generateRepo, err - } - // Git Content if opts.GitContent && !templateRepo.IsEmpty { if err := models.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil { @@ -55,7 +55,11 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor } } + if err := sess.Commit(); err != nil { + return generateRepo, err + } + notification.NotifyCreateRepository(doer, owner, generateRepo) - return generateRepo, sess.Commit() + return generateRepo, nil } From ecc4559b42fad58678b899f2a7656d1c8697be0b Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 22 Nov 2019 19:38:43 -0600 Subject: [PATCH 09/12] Wrap with models.WithTx Signed-off-by: jolheiser --- services/repository/generate.go | 67 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/services/repository/generate.go b/services/repository/generate.go index b4314c70c1a0..382d12af374c 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -11,53 +11,52 @@ import ( ) // GenerateRepository generates a repository from a template -func GenerateRepository(doer, owner *models.User, templateRepo *models.Repository, opts models.GenerateRepoOptions) (*models.Repository, error) { - ctx, sess, err := models.TxDBContext() - if err != nil { - return nil, err - } - - generateRepo, err := models.GenerateRepository(ctx, doer, owner, templateRepo, opts) - if err != nil { - if generateRepo != nil { - if errDelete := models.DeleteRepository(doer, owner.ID, generateRepo.ID); errDelete != nil { - log.Error("Rollback deleteRepository: %v", errDelete) +func GenerateRepository(doer, owner *models.User, templateRepo *models.Repository, opts models.GenerateRepoOptions) (_ *models.Repository, err error) { + var generateRepo *models.Repository + if err = models.WithTx(func(ctx models.DBContext) error { + generateRepo, err = models.GenerateRepository(ctx, doer, owner, templateRepo, opts) + if err != nil { + if generateRepo != nil { + if errDelete := models.DeleteRepository(doer, owner.ID, generateRepo.ID); errDelete != nil { + log.Error("Rollback deleteRepository: %v", errDelete) + } } + return err } - return nil, err - } - // Git Content - if opts.GitContent && !templateRepo.IsEmpty { - if err := models.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, err + // Git Content + if opts.GitContent && !templateRepo.IsEmpty { + if err = models.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil { + return err + } } - } - // Topics - if opts.Topics { - if err := models.GenerateTopics(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, err + // Topics + if opts.Topics { + if err = models.GenerateTopics(ctx, templateRepo, generateRepo); err != nil { + return err + } } - } - // Git Hooks - if opts.GitHooks { - if err := models.GenerateGitHooks(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, err + // Git Hooks + if opts.GitHooks { + if err = models.GenerateGitHooks(ctx, templateRepo, generateRepo); err != nil { + return err + } } - } - // Webhooks - if opts.Webhooks { - if err := models.GenerateWebhooks(ctx, templateRepo, generateRepo); err != nil { - return generateRepo, err + // Webhooks + if opts.Webhooks { + if err = models.GenerateWebhooks(ctx, templateRepo, generateRepo); err != nil { + return err + } } - } - if err := sess.Commit(); err != nil { + return nil + }); err != nil { return generateRepo, err } + log.Error("%#v", generateRepo) notification.NotifyCreateRepository(doer, owner, generateRepo) From cc6646e5f65ccffd59bba75ee9372143c5fce168 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 22 Nov 2019 19:40:13 -0600 Subject: [PATCH 10/12] Remove debug print Signed-off-by: jolheiser --- services/repository/generate.go | 1 - 1 file changed, 1 deletion(-) diff --git a/services/repository/generate.go b/services/repository/generate.go index 382d12af374c..18aa58136f3c 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -56,7 +56,6 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor }); err != nil { return generateRepo, err } - log.Error("%#v", generateRepo) notification.NotifyCreateRepository(doer, owner, generateRepo) From 48f10a6a26495d620646b8a49d19b231f1f25f11 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Sat, 23 Nov 2019 13:18:55 -0600 Subject: [PATCH 11/12] Move if-error-delete-repo outside WithTx Signed-off-by: jolheiser --- services/repository/generate.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/repository/generate.go b/services/repository/generate.go index 18aa58136f3c..0e0faec0928c 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -16,11 +16,6 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor if err = models.WithTx(func(ctx models.DBContext) error { generateRepo, err = models.GenerateRepository(ctx, doer, owner, templateRepo, opts) if err != nil { - if generateRepo != nil { - if errDelete := models.DeleteRepository(doer, owner.ID, generateRepo.ID); errDelete != nil { - log.Error("Rollback deleteRepository: %v", errDelete) - } - } return err } @@ -54,6 +49,11 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor return nil }); err != nil { + if generateRepo != nil { + if errDelete := models.DeleteRepository(doer, owner.ID, generateRepo.ID); errDelete != nil { + log.Error("Rollback deleteRepository: %v", errDelete) + } + } return generateRepo, err } From 2b4d4fd574c55c6c543b89e674c2620d2bad9e3e Mon Sep 17 00:00:00 2001 From: jolheiser Date: Sat, 23 Nov 2019 13:43:10 -0600 Subject: [PATCH 12/12] Return nil if no repo generated Signed-off-by: jolheiser --- services/repository/generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/repository/generate.go b/services/repository/generate.go index 0e0faec0928c..bd7fd0ce1179 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -54,7 +54,7 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor log.Error("Rollback deleteRepository: %v", errDelete) } } - return generateRepo, err + return nil, err } notification.NotifyCreateRepository(doer, owner, generateRepo)