| @@ -43,4 +43,6 @@ type Notifier interface { | |||||
| NotifyDeleteRelease(doer *models.User, rel *models.Release) | NotifyDeleteRelease(doer *models.User, rel *models.Release) | ||||
| NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *models.PushCommits) | 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 | // NotifyPushCommits notifies commits pushed to notifiers | ||||
| func (*NullNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *models.PushCommits) { | 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) | 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 ( | import ( | ||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/git" | |||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/notification/base" | "code.gitea.io/gitea/modules/notification/base" | ||||
| "code.gitea.io/gitea/modules/setting" | "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) { | func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *models.PullRequest) { | ||||
| if err := pr.LoadIssue(); err != nil { | if err := pr.LoadIssue(); err != nil { | ||||
| log.Error("pr.LoadIssue: %v", err) | log.Error("pr.LoadIssue: %v", err) | ||||
| @@ -572,7 +601,7 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *m | |||||
| return | 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, | Action: api.HookIssueSynchronized, | ||||
| Index: pr.Issue.Index, | Index: pr.Issue.Index, | ||||
| PullRequest: pr.Issue.PullRequest.APIFormat(), | 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) | 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/log" | ||||
| "code.gitea.io/gitea/modules/notification" | "code.gitea.io/gitea/modules/notification" | ||||
| "code.gitea.io/gitea/modules/setting" | "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. | // CommitRepoActionOptions represent options of a new commit action. | ||||
| @@ -113,81 +111,23 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { | |||||
| return fmt.Errorf("NotifyWatchers: %v", err) | 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 { | switch opType { | ||||
| case models.ActionCommitRepo: // Push | case models.ActionCommitRepo: // Push | ||||
| isHookEventPush = true | |||||
| if isNewBranch { | 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 | 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 | 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 | 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 { | if isHookEventPush { | ||||