* Move some actions to notification/action * Fix test * fix testtags/v1.21.12.1
| @@ -283,49 +283,6 @@ func (a *Action) GetIssueContent() string { | |||||
| return issue.Content | return issue.Content | ||||
| } | } | ||||
| func newRepoAction(e Engine, u *User, repo *Repository) (err error) { | |||||
| if err = notifyWatchers(e, &Action{ | |||||
| ActUserID: u.ID, | |||||
| ActUser: u, | |||||
| OpType: ActionCreateRepo, | |||||
| RepoID: repo.ID, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("notify watchers '%d/%d': %v", u.ID, repo.ID, err) | |||||
| } | |||||
| log.Trace("action.newRepoAction: %s/%s", u.Name, repo.Name) | |||||
| return err | |||||
| } | |||||
| // NewRepoAction adds new action for creating repository. | |||||
| func NewRepoAction(u *User, repo *Repository) (err error) { | |||||
| return newRepoAction(x, u, repo) | |||||
| } | |||||
| func renameRepoAction(e Engine, actUser *User, oldRepoName string, repo *Repository) (err error) { | |||||
| if err = notifyWatchers(e, &Action{ | |||||
| ActUserID: actUser.ID, | |||||
| ActUser: actUser, | |||||
| OpType: ActionRenameRepo, | |||||
| RepoID: repo.ID, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| Content: oldRepoName, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("notify watchers: %v", err) | |||||
| } | |||||
| log.Trace("action.renameRepoAction: %s/%s", actUser.Name, repo.Name) | |||||
| return nil | |||||
| } | |||||
| // RenameRepoAction adds new action for renaming a repository. | |||||
| func RenameRepoAction(actUser *User, oldRepoName string, repo *Repository) error { | |||||
| return renameRepoAction(x, actUser, oldRepoName, repo) | |||||
| } | |||||
| // PushCommit represents a commit in a push operation. | // PushCommit represents a commit in a push operation. | ||||
| type PushCommit struct { | type PushCommit struct { | ||||
| Sha1 string | Sha1 string | ||||
| @@ -2,7 +2,6 @@ package models | |||||
| import ( | import ( | ||||
| "path" | "path" | ||||
| "strings" | |||||
| "testing" | "testing" | ||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| @@ -28,58 +27,6 @@ func TestAction_GetRepoLink(t *testing.T) { | |||||
| assert.Equal(t, expected, action.GetRepoLink()) | assert.Equal(t, expected, action.GetRepoLink()) | ||||
| } | } | ||||
| func TestNewRepoAction(t *testing.T) { | |||||
| assert.NoError(t, PrepareTestDatabase()) | |||||
| user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) | |||||
| repo := AssertExistsAndLoadBean(t, &Repository{OwnerID: user.ID}).(*Repository) | |||||
| repo.Owner = user | |||||
| actionBean := &Action{ | |||||
| OpType: ActionCreateRepo, | |||||
| ActUserID: user.ID, | |||||
| RepoID: repo.ID, | |||||
| ActUser: user, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| } | |||||
| AssertNotExistsBean(t, actionBean) | |||||
| assert.NoError(t, NewRepoAction(user, repo)) | |||||
| AssertExistsAndLoadBean(t, actionBean) | |||||
| CheckConsistencyFor(t, &Action{}) | |||||
| } | |||||
| func TestRenameRepoAction(t *testing.T) { | |||||
| assert.NoError(t, PrepareTestDatabase()) | |||||
| user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) | |||||
| repo := AssertExistsAndLoadBean(t, &Repository{OwnerID: user.ID}).(*Repository) | |||||
| repo.Owner = user | |||||
| oldRepoName := repo.Name | |||||
| const newRepoName = "newRepoName" | |||||
| repo.Name = newRepoName | |||||
| repo.LowerName = strings.ToLower(newRepoName) | |||||
| actionBean := &Action{ | |||||
| OpType: ActionRenameRepo, | |||||
| ActUserID: user.ID, | |||||
| ActUser: user, | |||||
| RepoID: repo.ID, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| Content: oldRepoName, | |||||
| } | |||||
| AssertNotExistsBean(t, actionBean) | |||||
| assert.NoError(t, RenameRepoAction(user, oldRepoName, repo)) | |||||
| AssertExistsAndLoadBean(t, actionBean) | |||||
| _, err := x.ID(repo.ID).Cols("name", "lower_name").Update(repo) | |||||
| assert.NoError(t, err) | |||||
| CheckConsistencyFor(t, &Action{}) | |||||
| } | |||||
| func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { | func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { | ||||
| pushCommits := NewPushCommits() | pushCommits := NewPushCommits() | ||||
| pushCommits.Commits = []*PushCommit{ | pushCommits.Commits = []*PushCommit{ | ||||
| @@ -1469,8 +1469,15 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err | |||||
| return fmt.Errorf("watchRepo: %v", err) | return fmt.Errorf("watchRepo: %v", err) | ||||
| } | } | ||||
| } | } | ||||
| if err = newRepoAction(e, doer, repo); err != nil { | |||||
| return fmt.Errorf("newRepoAction: %v", err) | |||||
| if err = notifyWatchers(e, &Action{ | |||||
| ActUserID: doer.ID, | |||||
| ActUser: doer, | |||||
| OpType: ActionCreateRepo, | |||||
| RepoID: repo.ID, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| }); err != nil { | |||||
| return fmt.Errorf("notify watchers '%d/%d': %v", doer.ID, repo.ID, err) | |||||
| } | } | ||||
| if err = copyDefaultWebhooksToRepo(e, repo.ID); err != nil { | if err = copyDefaultWebhooksToRepo(e, repo.ID); err != nil { | ||||
| @@ -20,7 +20,7 @@ var ( | |||||
| _ base.Notifier = &actionNotifier{} | _ base.Notifier = &actionNotifier{} | ||||
| ) | ) | ||||
| // NewNotifier create a new webhookNotifier notifier | |||||
| // NewNotifier create a new actionNotifier notifier | |||||
| func NewNotifier() base.Notifier { | func NewNotifier() base.Notifier { | ||||
| return &actionNotifier{} | return &actionNotifier{} | ||||
| } | } | ||||
| @@ -75,3 +75,19 @@ func (a *actionNotifier) NotifyNewPullRequest(pull *models.PullRequest) { | |||||
| log.Error("NotifyWatchers: %v", err) | log.Error("NotifyWatchers: %v", err) | ||||
| } | } | ||||
| } | } | ||||
| func (a *actionNotifier) NotifyRenameRepository(doer *models.User, repo *models.Repository, oldName string) { | |||||
| if err := models.NotifyWatchers(&models.Action{ | |||||
| ActUserID: doer.ID, | |||||
| ActUser: doer, | |||||
| OpType: models.ActionRenameRepo, | |||||
| RepoID: repo.ID, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| Content: oldName, | |||||
| }); err != nil { | |||||
| log.Error("notify watchers: %v", err) | |||||
| } else { | |||||
| log.Trace("action.renameRepoAction: %s/%s", doer.Name, repo.Name) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,47 @@ | |||||
| // 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 action | |||||
| import ( | |||||
| "path/filepath" | |||||
| "strings" | |||||
| "testing" | |||||
| "code.gitea.io/gitea/models" | |||||
| "github.com/stretchr/testify/assert" | |||||
| ) | |||||
| func TestMain(m *testing.M) { | |||||
| models.MainTest(m, filepath.Join("..", "..", "..")) | |||||
| } | |||||
| func TestRenameRepoAction(t *testing.T) { | |||||
| assert.NoError(t, models.PrepareTestDatabase()) | |||||
| user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) | |||||
| repo := models.AssertExistsAndLoadBean(t, &models.Repository{OwnerID: user.ID}).(*models.Repository) | |||||
| repo.Owner = user | |||||
| oldRepoName := repo.Name | |||||
| const newRepoName = "newRepoName" | |||||
| repo.Name = newRepoName | |||||
| repo.LowerName = strings.ToLower(newRepoName) | |||||
| actionBean := &models.Action{ | |||||
| OpType: models.ActionRenameRepo, | |||||
| ActUserID: user.ID, | |||||
| ActUser: user, | |||||
| RepoID: repo.ID, | |||||
| Repo: repo, | |||||
| IsPrivate: repo.IsPrivate, | |||||
| Content: oldRepoName, | |||||
| } | |||||
| models.AssertNotExistsBean(t, actionBean) | |||||
| NewNotifier().NotifyRenameRepository(user, repo, oldRepoName) | |||||
| models.AssertExistsAndLoadBean(t, actionBean) | |||||
| models.CheckConsistencyFor(t, &models.Action{}) | |||||
| } | |||||
| @@ -17,6 +17,7 @@ type Notifier interface { | |||||
| NotifyMigrateRepository(doer *models.User, u *models.User, repo *models.Repository) | NotifyMigrateRepository(doer *models.User, u *models.User, repo *models.Repository) | ||||
| NotifyDeleteRepository(doer *models.User, repo *models.Repository) | NotifyDeleteRepository(doer *models.User, repo *models.Repository) | ||||
| NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) | NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) | ||||
| NotifyRenameRepository(doer *models.User, repo *models.Repository, oldName string) | |||||
| NotifyNewIssue(*models.Issue) | NotifyNewIssue(*models.Issue) | ||||
| NotifyIssueChangeStatus(*models.User, *models.Issue, bool) | NotifyIssueChangeStatus(*models.User, *models.Issue, bool) | ||||
| @@ -66,6 +66,10 @@ func (*NullNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repo | |||||
| func (*NullNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) { | func (*NullNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) { | ||||
| } | } | ||||
| // NotifyRenameRepository places a place holder function | |||||
| func (*NullNotifier) NotifyRenameRepository(doer *models.User, repo *models.Repository, oldName string) { | |||||
| } | |||||
| // NotifyNewRelease places a place holder function | // NotifyNewRelease places a place holder function | ||||
| func (*NullNotifier) NotifyNewRelease(rel *models.Release) { | func (*NullNotifier) NotifyNewRelease(rel *models.Release) { | ||||
| } | } | ||||
| @@ -115,6 +115,13 @@ func NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) { | |||||
| } | } | ||||
| } | } | ||||
| // NotifyRenameRepository notifies repository renamed | |||||
| func NotifyRenameRepository(doer *models.User, repo *models.Repository, oldName string) { | |||||
| for _, notifier := range notifiers { | |||||
| notifier.NotifyRenameRepository(doer, repo, oldName) | |||||
| } | |||||
| } | |||||
| // NotifyNewRelease notifies new release to notifiers | // NotifyNewRelease notifies new release to notifiers | ||||
| func NotifyNewRelease(rel *models.Release) { | func NotifyNewRelease(rel *models.Release) { | ||||
| for _, notifier := range notifiers { | for _, notifier := range notifiers { | ||||
| @@ -603,11 +603,7 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err | |||||
| return err | return err | ||||
| } | } | ||||
| if err := models.RenameRepoAction(ctx.User, oldRepoName, repo); err != nil { | |||||
| log.Error("RenameRepoAction: %v", err) | |||||
| ctx.Error(http.StatusInternalServerError, "RenameRepoActions", err) | |||||
| return err | |||||
| } | |||||
| notification.NotifyRenameRepository(ctx.User, repo, oldRepoName) | |||||
| log.Trace("Repository name changed: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newRepoName) | log.Trace("Repository name changed: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newRepoName) | ||||
| } | } | ||||
| @@ -20,6 +20,7 @@ import ( | |||||
| "code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
| "code.gitea.io/gitea/modules/git" | "code.gitea.io/gitea/modules/git" | ||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/notification" | |||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| "code.gitea.io/gitea/modules/timeutil" | "code.gitea.io/gitea/modules/timeutil" | ||||
| "code.gitea.io/gitea/modules/validation" | "code.gitea.io/gitea/modules/validation" | ||||
| @@ -121,9 +122,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { | |||||
| log.Trace("Repository basic settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) | log.Trace("Repository basic settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) | ||||
| if isNameChanged { | if isNameChanged { | ||||
| if err := models.RenameRepoAction(ctx.User, oldRepoName, repo); err != nil { | |||||
| log.Error("RenameRepoAction: %v", err) | |||||
| } | |||||
| notification.NotifyRenameRepository(ctx.User, repo, oldRepoName) | |||||
| } | } | ||||
| ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success")) | ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success")) | ||||