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