diff --git a/modules/notification/base/notifier.go b/modules/notification/base/notifier.go index 286ebe5d6..72bf52c93 100644 --- a/modules/notification/base/notifier.go +++ b/modules/notification/base/notifier.go @@ -43,4 +43,6 @@ type Notifier interface { NotifyDeleteRelease(doer *models.User, rel *models.Release) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *models.PushCommits) + NotifyCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) + NotifyDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) } diff --git a/modules/notification/base/null.go b/modules/notification/base/null.go index 5b6359cbd..a9d9d6a16 100644 --- a/modules/notification/base/null.go +++ b/modules/notification/base/null.go @@ -114,3 +114,11 @@ func (*NullNotifier) NotifyMigrateRepository(doer *models.User, u *models.User, // NotifyPushCommits notifies commits pushed to notifiers func (*NullNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *models.PushCommits) { } + +// NotifyCreateRef notifies branch or tag creation to notifiers +func (*NullNotifier) NotifyCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) { +} + +// NotifyDeleteRef notifies branch or tag deleteion to notifiers +func (*NullNotifier) NotifyDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) { +} diff --git a/modules/notification/notification.go b/modules/notification/notification.go index a5e450ee6..5ac09a72e 100644 --- a/modules/notification/notification.go +++ b/modules/notification/notification.go @@ -199,3 +199,17 @@ func NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, ol notifier.NotifyPushCommits(pusher, repo, refName, oldCommitID, newCommitID, commits) } } + +// NotifyCreateRef notifies branch or tag creation to notifiers +func NotifyCreateRef(pusher *models.User, repo *models.Repository, refType, refFullName string) { + for _, notifier := range notifiers { + notifier.NotifyCreateRef(pusher, repo, refType, refFullName) + } +} + +// NotifyDeleteRef notifies branch or tag deletion to notifiers +func NotifyDeleteRef(pusher *models.User, repo *models.Repository, refType, refFullName string) { + for _, notifier := range notifiers { + notifier.NotifyDeleteRef(pusher, repo, refType, refFullName) + } +} diff --git a/modules/notification/webhook/webhook.go b/modules/notification/webhook/webhook.go index 39c63edb0..6eb03d3eb 100644 --- a/modules/notification/webhook/webhook.go +++ b/modules/notification/webhook/webhook.go @@ -6,6 +6,7 @@ package webhook import ( "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification/base" "code.gitea.io/gitea/modules/setting" @@ -562,6 +563,34 @@ func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review } } +func (m *webhookNotifier) NotifyCreateRef(pusher *models.User, repo *models.Repository, refType, refFullName string) { + apiPusher := pusher.APIFormat() + apiRepo := repo.APIFormat(models.AccessModeNone) + refName := git.RefEndName(refFullName) + + gitRepo, err := git.OpenRepository(repo.RepoPath()) + if err != nil { + log.Error("OpenRepository[%s]: %v", repo.RepoPath(), err) + return + } + + shaSum, err := gitRepo.GetBranchCommitID(refName) + if err != nil { + log.Error("GetBranchCommitID[%s]: %v", refFullName, err) + return + } + + if err = webhook_module.PrepareWebhooks(repo, models.HookEventCreate, &api.CreatePayload{ + Ref: refName, + Sha: shaSum, + RefType: refType, + Repo: apiRepo, + Sender: apiPusher, + }); err != nil { + log.Error("PrepareWebhooks: %v", err) + } +} + func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *models.PullRequest) { if err := pr.LoadIssue(); err != nil { log.Error("pr.LoadIssue: %v", err) @@ -572,7 +601,7 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *m return } - if err := webhook.PrepareWebhooks(pr.Issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ + if err := webhook_module.PrepareWebhooks(pr.Issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueSynchronized, Index: pr.Issue.Index, PullRequest: pr.Issue.PullRequest.APIFormat(), @@ -582,3 +611,19 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *m log.Error("PrepareWebhooks [pull_id: %v]: %v", pr.ID, err) } } + +func (m *webhookNotifier) NotifyDeleteRef(pusher *models.User, repo *models.Repository, refType, refFullName string) { + apiPusher := pusher.APIFormat() + apiRepo := repo.APIFormat(models.AccessModeNone) + refName := git.RefEndName(refFullName) + + if err := webhook_module.PrepareWebhooks(repo, models.HookEventDelete, &api.DeletePayload{ + Ref: refName, + RefType: "branch", + PusherType: api.PusherTypeUser, + Repo: apiRepo, + Sender: apiPusher, + }); err != nil { + log.Error("PrepareWebhooks.(delete branch): %v", err) + } +} diff --git a/modules/repofiles/action.go b/modules/repofiles/action.go index e5f6bf871..996363863 100644 --- a/modules/repofiles/action.go +++ b/modules/repofiles/action.go @@ -14,8 +14,6 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/webhook" ) // CommitRepoActionOptions represent options of a new commit action. @@ -113,81 +111,23 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { return fmt.Errorf("NotifyWatchers: %v", err) } - apiPusher := pusher.APIFormat() - apiRepo := repo.APIFormat(models.AccessModeNone) - - var shaSum string - var isHookEventPush = false + var isHookEventPush = true switch opType { case models.ActionCommitRepo: // Push - isHookEventPush = true - if isNewBranch { - gitRepo, err := git.OpenRepository(repo.RepoPath()) - if err != nil { - log.Error("OpenRepository[%s]: %v", repo.RepoPath(), err) - } - - shaSum, err = gitRepo.GetBranchCommitID(refName) - if err != nil { - log.Error("GetBranchCommitID[%s]: %v", opts.RefFullName, err) - } - if err = webhook.PrepareWebhooks(repo, models.HookEventCreate, &api.CreatePayload{ - Ref: refName, - Sha: shaSum, - RefType: "branch", - Repo: apiRepo, - Sender: apiPusher, - }); err != nil { - return fmt.Errorf("PrepareWebhooks: %v", err) - } + notification.NotifyCreateRef(pusher, repo, "branch", opts.RefFullName) } case models.ActionDeleteBranch: // Delete Branch - isHookEventPush = true - - if err = webhook.PrepareWebhooks(repo, models.HookEventDelete, &api.DeletePayload{ - Ref: refName, - RefType: "branch", - PusherType: api.PusherTypeUser, - Repo: apiRepo, - Sender: apiPusher, - }); err != nil { - return fmt.Errorf("PrepareWebhooks.(delete branch): %v", err) - } + notification.NotifyDeleteRef(pusher, repo, "branch", opts.RefFullName) case models.ActionPushTag: // Create - isHookEventPush = true + notification.NotifyCreateRef(pusher, repo, "tag", opts.RefFullName) - gitRepo, err := git.OpenRepository(repo.RepoPath()) - if err != nil { - log.Error("OpenRepository[%s]: %v", repo.RepoPath(), err) - } - shaSum, err = gitRepo.GetTagCommitID(refName) - if err != nil { - log.Error("GetTagCommitID[%s]: %v", opts.RefFullName, err) - } - if err = webhook.PrepareWebhooks(repo, models.HookEventCreate, &api.CreatePayload{ - Ref: refName, - Sha: shaSum, - RefType: "tag", - Repo: apiRepo, - Sender: apiPusher, - }); err != nil { - return fmt.Errorf("PrepareWebhooks: %v", err) - } case models.ActionDeleteTag: // Delete Tag - isHookEventPush = true - - if err = webhook.PrepareWebhooks(repo, models.HookEventDelete, &api.DeletePayload{ - Ref: refName, - RefType: "tag", - PusherType: api.PusherTypeUser, - Repo: apiRepo, - Sender: apiPusher, - }); err != nil { - return fmt.Errorf("PrepareWebhooks.(delete tag): %v", err) - } + notification.NotifyDeleteRef(pusher, repo, "tag", opts.RefFullName) + default: + isHookEventPush = false } if isHookEventPush {