| @@ -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) | |||
| } | |||
| @@ -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) { | |||
| } | |||
| @@ -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) | |||
| } | |||
| } | |||
| @@ -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) | |||
| } | |||
| } | |||
| @@ -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 { | |||