add more webhooks

This commit is contained in:
Lunny Xiao 2018-05-22 19:37:18 +08:00
parent 81661c2b47
commit 9ee330c0c7
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
18 changed files with 261 additions and 99 deletions

View File

@ -10,7 +10,6 @@ import (
"strings" "strings"
"code.gitea.io/git" "code.gitea.io/git"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/process"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
@ -195,24 +194,6 @@ func CreateRelease(gitRepo *git.Repository, rel *Release, attachmentUUIDs []stri
return err return err
} }
if !rel.IsDraft {
if err := rel.LoadAttributes(); err != nil {
log.Error(2, "LoadAttributes: %v", err)
} else {
mode, _ := AccessLevel(rel.PublisherID, rel.Repo)
if err := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{
Action: api.HookReleasePublished,
Release: rel.APIFormat(),
Repository: rel.Repo.APIFormat(mode),
Sender: rel.Publisher.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks: %v", err)
} else {
go HookQueue.Add(rel.Repo.ID)
}
}
}
return nil return nil
} }
@ -391,38 +372,26 @@ func UpdateRelease(doer *User, gitRepo *git.Repository, rel *Release, attachment
err = addReleaseAttachments(rel.ID, attachmentUUIDs) err = addReleaseAttachments(rel.ID, attachmentUUIDs)
mode, _ := accessLevel(x, doer.ID, rel.Repo)
if err1 := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{
Action: api.HookReleaseUpdated,
Release: rel.APIFormat(),
Repository: rel.Repo.APIFormat(mode),
Sender: rel.Publisher.APIFormat(),
}); err1 != nil {
log.Error(2, "PrepareWebhooks: %v", err)
} else {
go HookQueue.Add(rel.Repo.ID)
}
return err return err
} }
// DeleteReleaseByID deletes a release and corresponding Git tag by given ID. // DeleteReleaseByID deletes a release and corresponding Git tag by given ID.
func DeleteReleaseByID(id int64, u *User, delTag bool) error { func DeleteReleaseByID(id int64, u *User, delTag bool) (*Release, error) {
rel, err := GetReleaseByID(id) rel, err := GetReleaseByID(id)
if err != nil { if err != nil {
return fmt.Errorf("GetReleaseByID: %v", err) return nil, fmt.Errorf("GetReleaseByID: %v", err)
} }
repo, err := GetRepositoryByID(rel.RepoID) repo, err := GetRepositoryByID(rel.RepoID)
if err != nil { if err != nil {
return fmt.Errorf("GetRepositoryByID: %v", err) return nil, fmt.Errorf("GetRepositoryByID: %v", err)
} }
has, err := HasAccess(u.ID, repo, AccessModeWrite) has, err := HasAccess(u.ID, repo, AccessModeWrite)
if err != nil { if err != nil {
return fmt.Errorf("HasAccess: %v", err) return nil, fmt.Errorf("HasAccess: %v", err)
} else if !has { } else if !has {
return fmt.Errorf("DeleteReleaseByID: permission denied") return nil, fmt.Errorf("DeleteReleaseByID: permission denied")
} }
if delTag { if delTag {
@ -430,11 +399,11 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error {
fmt.Sprintf("DeleteReleaseByID (git tag -d): %d", rel.ID), fmt.Sprintf("DeleteReleaseByID (git tag -d): %d", rel.ID),
"git", "tag", "-d", rel.TagName) "git", "tag", "-d", rel.TagName)
if err != nil && !strings.Contains(stderr, "not found") { if err != nil && !strings.Contains(stderr, "not found") {
return fmt.Errorf("git tag -d: %v - %s", err, stderr) return nil, fmt.Errorf("git tag -d: %v - %s", err, stderr)
} }
if _, err = x.ID(rel.ID).Delete(new(Release)); err != nil { if _, err = x.ID(rel.ID).Delete(new(Release)); err != nil {
return fmt.Errorf("Delete: %v", err) return nil, fmt.Errorf("Delete: %v", err)
} }
} else { } else {
rel.IsTag = true rel.IsTag = true
@ -444,28 +413,12 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error {
rel.Note = "" rel.Note = ""
if _, err = x.ID(rel.ID).AllCols().Update(rel); err != nil { if _, err = x.ID(rel.ID).AllCols().Update(rel); err != nil {
return fmt.Errorf("Update: %v", err) return nil, fmt.Errorf("Update: %v", err)
} }
} }
rel.Repo = repo rel.Repo = repo
if err = rel.LoadAttributes(); err != nil { return rel, nil
return fmt.Errorf("LoadAttributes: %v", err)
}
mode, _ := accessLevel(x, u.ID, rel.Repo)
if err := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{
Action: api.HookReleaseDeleted,
Release: rel.APIFormat(),
Repository: rel.Repo.APIFormat(mode),
Sender: rel.Publisher.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks: %v", err)
} else {
go HookQueue.Add(rel.Repo.ID)
}
return nil
} }
// SyncReleasesWithTags synchronizes release table with repository tags // SyncReleasesWithTags synchronizes release table with repository tags

View File

@ -1934,19 +1934,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return fmt.Errorf("Commit: %v", err) return fmt.Errorf("Commit: %v", err)
} }
if org.IsOrganization() {
if err = PrepareWebhooks(repo, HookEventRepository, &api.RepositoryPayload{
Action: api.HookRepoDeleted,
Repository: repo.APIFormat(AccessModeOwner),
Organization: org.APIFormat(),
Sender: doer.APIFormat(),
}); err != nil {
return err
}
go HookQueue.Add(repo.ID)
}
DeleteRepoFromIndexer(repo)
return nil return nil
} }
@ -2145,7 +2132,7 @@ func gatherMissingRepoRecords() ([]*Repository, error) {
} }
// DeleteMissingRepositories deletes all repository records that lost Git files. // DeleteMissingRepositories deletes all repository records that lost Git files.
func DeleteMissingRepositories(doer *User) error { func DeleteMissingRepositories(doer *User, onDeleted func(doer *User, repo *Repository)) error {
repos, err := gatherMissingRepoRecords() repos, err := gatherMissingRepoRecords()
if err != nil { if err != nil {
return fmt.Errorf("gatherMissingRepoRecords: %v", err) return fmt.Errorf("gatherMissingRepoRecords: %v", err)
@ -2161,6 +2148,8 @@ func DeleteMissingRepositories(doer *User) error {
if err2 := CreateRepositoryNotice(fmt.Sprintf("DeleteRepository [%d]: %v", repo.ID, err)); err2 != nil { if err2 := CreateRepositoryNotice(fmt.Sprintf("DeleteRepository [%d]: %v", repo.ID, err)); err2 != nil {
return fmt.Errorf("CreateRepositoryNotice: %v", err) return fmt.Errorf("CreateRepositoryNotice: %v", err)
} }
} else {
onDeleted(doer, repo)
} }
} }
return nil return nil
@ -2462,19 +2451,6 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
return nil, err return nil, err
} }
oldMode, _ := AccessLevel(doer.ID, oldRepo)
mode, _ := AccessLevel(doer.ID, repo)
if err = PrepareWebhooks(oldRepo, HookEventFork, &api.ForkPayload{
Forkee: oldRepo.APIFormat(oldMode),
Repo: repo.APIFormat(mode),
Sender: doer.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
} else {
go HookQueue.Add(oldRepo.ID)
}
if err = repo.UpdateSize(); err != nil { if err = repo.UpdateSize(); err != nil {
log.Error(4, "Failed to update size for repository: %v", err) log.Error(4, "Failed to update size for repository: %v", err)
} }

View File

@ -21,7 +21,7 @@ var (
) )
// NewNotifier returns a new actionNotifier // NewNotifier returns a new actionNotifier
func NewNotifier() *actionNotifier { func NewNotifier() base.Notifier {
return &actionNotifier{} return &actionNotifier{}
} }
@ -79,3 +79,20 @@ func (r *actionNotifier) NotifyDeleteComment(doer *models.User, c *models.Commen
log.Error(4, "UpdateCommentAction [%d]: %v", c.ID, err) log.Error(4, "UpdateCommentAction [%d]: %v", c.ID, err)
} }
} }
func (r *actionNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
}
func (r *actionNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
}
func (r *actionNotifier) NotifyNewRelease(rel *models.Release) {
}
func (r *actionNotifier) NotifyUpdateRelease(doer *models.User, rel *models.Release) {
}
func (r *actionNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Release) {
}

View File

@ -20,4 +20,9 @@ type Notifier interface {
NotifyNewPullRequest(*models.PullRequest) NotifyNewPullRequest(*models.PullRequest)
NotifyUpdateComment(*models.User, *models.Comment, string) NotifyUpdateComment(*models.User, *models.Comment, string)
NotifyDeleteComment(*models.User, *models.Comment) NotifyDeleteComment(*models.User, *models.Comment)
NotifyDeleteRepository(doer *models.User, repo *models.Repository)
NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository)
NotifyNewRelease(rel *models.Release)
NotifyUpdateRelease(doer *models.User, rel *models.Release)
NotifyDeleteRelease(doer *models.User, rel *models.Release)
} }

View File

@ -18,7 +18,7 @@ var (
) )
// NewNotifier create a new indexerNotifier notifier // NewNotifier create a new indexerNotifier notifier
func NewNotifier() *indexerNotifier { func NewNotifier() base.Notifier {
return &indexerNotifier{} return &indexerNotifier{}
} }
@ -55,3 +55,20 @@ func (r *indexerNotifier) NotifyDeleteComment(doer *models.User, comment *models
models.UpdateIssueIndexer(comment.IssueID) models.UpdateIssueIndexer(comment.IssueID)
} }
} }
func (r *indexerNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
models.DeleteRepoFromIndexer(repo)
}
func (r *indexerNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
}
func (r *indexerNotifier) NotifyNewRelease(rel *models.Release) {
}
func (r *indexerNotifier) NotifyUpdateRelease(doer *models.User, rel *models.Release) {
}
func (r *indexerNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Release) {
}

View File

@ -19,7 +19,7 @@ var (
) )
// NewNotifier create a new mailNotifier notifier // NewNotifier create a new mailNotifier notifier
func NewNotifier() *mailNotifier { func NewNotifier() base.Notifier {
return &mailNotifier{} return &mailNotifier{}
} }
@ -57,3 +57,18 @@ func (m *mailNotifier) NotifyUpdateComment(doer *models.User, c *models.Comment,
func (m *mailNotifier) NotifyDeleteComment(doer *models.User, c *models.Comment) { func (m *mailNotifier) NotifyDeleteComment(doer *models.User, c *models.Comment) {
} }
func (m *mailNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
}
func (m *mailNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
}
func (m *mailNotifier) NotifyNewRelease(rel *models.Release) {
}
func (m *mailNotifier) NotifyUpdateRelease(doer *models.User, rel *models.Release) {
}
func (m *mailNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Release) {
}

View File

@ -76,9 +76,44 @@ func NotifyUpdateComment(doer *models.User, c *models.Comment, oldContent string
} }
} }
// NotifyDeleteComment notifies update comment to notifiers // NotifyDeleteComment notifies delete comment to notifiers
func NotifyDeleteComment(doer *models.User, c *models.Comment) { func NotifyDeleteComment(doer *models.User, c *models.Comment) {
for _, notifier := range notifiers { for _, notifier := range notifiers {
notifier.NotifyDeleteComment(doer, c) notifier.NotifyDeleteComment(doer, c)
} }
} }
// NotifyDeleteRepository notifies delete repository to notifiers
func NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
for _, notifier := range notifiers {
notifier.NotifyDeleteRepository(doer, repo)
}
}
// NotifyForkRepository notifies fork repository to notifiers
func NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
for _, notifier := range notifiers {
notifier.NotifyForkRepository(doer, oldRepo, repo)
}
}
// NotifyNewRelease notifies new release to notifiers
func NotifyNewRelease(rel *models.Release) {
for _, notifier := range notifiers {
notifier.NotifyNewRelease(rel)
}
}
// NotifyUpdateRelease notifies update release to notifiers
func NotifyUpdateRelease(doer *models.User, rel *models.Release) {
for _, notifier := range notifiers {
notifier.NotifyUpdateRelease(doer, rel)
}
}
// NotifyDeleteRelease notifies delete release to notifiers
func NotifyDeleteRelease(doer *models.User, rel *models.Release) {
for _, notifier := range notifiers {
notifier.NotifyDeleteRelease(doer, rel)
}
}

View File

@ -27,7 +27,7 @@ var (
) )
// NewNotifier create a new notificationService notifier // NewNotifier create a new notificationService notifier
func NewNotifier() *notificationService { func NewNotifier() base.Notifier {
return &notificationService{ return &notificationService{
issueQueue: make(chan issueNotificationOpts, 100), issueQueue: make(chan issueNotificationOpts, 100),
} }
@ -81,3 +81,18 @@ func (ns *notificationService) NotifyUpdateComment(doer *models.User, c *models.
func (ns *notificationService) NotifyDeleteComment(doer *models.User, c *models.Comment) { func (ns *notificationService) NotifyDeleteComment(doer *models.User, c *models.Comment) {
} }
func (ns *notificationService) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
}
func (ns *notificationService) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
}
func (ns *notificationService) NotifyNewRelease(rel *models.Release) {
}
func (ns *notificationService) NotifyUpdateRelease(doer *models.User, rel *models.Release) {
}
func (ns *notificationService) NotifyDeleteRelease(doer *models.User, rel *models.Release) {
}

View File

@ -22,7 +22,7 @@ var (
) )
// NewNotifier returns a new webhookNotifier // NewNotifier returns a new webhookNotifier
func NewNotifier() *webhookNotifier { func NewNotifier() base.Notifier {
return &webhookNotifier{} return &webhookNotifier{}
} }
@ -171,3 +171,94 @@ func (w *webhookNotifier) NotifyDeleteComment(doer *models.User, comment *models
go models.HookQueue.Add(comment.Issue.Repo.ID) go models.HookQueue.Add(comment.Issue.Repo.ID)
} }
} }
func (w *webhookNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
org, err := models.GetUserByID(repo.OwnerID)
if err != nil {
log.Error(2, "GetUserByID [repo_id: %d]: %v", repo.ID, err)
return
}
if org.IsOrganization() {
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
Action: api.HookRepoDeleted,
Repository: repo.APIFormat(models.AccessModeOwner),
Organization: org.APIFormat(),
Sender: doer.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
} else {
go models.HookQueue.Add(repo.ID)
}
}
}
func (w *webhookNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
oldMode, _ := models.AccessLevel(doer.ID, oldRepo)
mode, _ := models.AccessLevel(doer.ID, repo)
if err := models.PrepareWebhooks(oldRepo, models.HookEventFork, &api.ForkPayload{
Forkee: oldRepo.APIFormat(oldMode),
Repo: repo.APIFormat(mode),
Sender: doer.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
} else {
go models.HookQueue.Add(oldRepo.ID)
}
}
func (w *webhookNotifier) NotifyNewRelease(rel *models.Release) {
if rel.IsDraft {
return
}
if err := rel.LoadAttributes(); err != nil {
log.Error(2, "LoadAttributes: %v", err)
} else {
mode, _ := models.AccessLevel(rel.PublisherID, rel.Repo)
if err := models.PrepareWebhooks(rel.Repo, models.HookEventRelease, &api.ReleasePayload{
Action: api.HookReleasePublished,
Release: rel.APIFormat(),
Repository: rel.Repo.APIFormat(mode),
Sender: rel.Publisher.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks: %v", err)
} else {
go models.HookQueue.Add(rel.Repo.ID)
}
}
}
func (w *webhookNotifier) NotifyUpdateRelease(doer *models.User, rel *models.Release) {
mode, _ := models.AccessLevel(doer.ID, rel.Repo)
if err := models.PrepareWebhooks(rel.Repo, models.HookEventRelease, &api.ReleasePayload{
Action: api.HookReleaseUpdated,
Release: rel.APIFormat(),
Repository: rel.Repo.APIFormat(mode),
Sender: rel.Publisher.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks: %v", err)
} else {
go models.HookQueue.Add(rel.Repo.ID)
}
}
func (w *webhookNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Release) {
if err := rel.LoadAttributes(); err != nil {
log.Error(2, "rel.LoadAttributes: %v", err)
return
}
mode, _ := models.AccessLevel(doer.ID, rel.Repo)
if err := models.PrepareWebhooks(rel.Repo, models.HookEventRelease, &api.ReleasePayload{
Action: api.HookReleaseDeleted,
Release: rel.APIFormat(),
Repository: rel.Repo.APIFormat(mode),
Sender: rel.Publisher.APIFormat(),
}); err != nil {
log.Error(2, "PrepareWebhooks: %v", err)
} else {
go models.HookQueue.Add(rel.Repo.ID)
}
}

View File

@ -10,15 +10,16 @@ import (
"strings" "strings"
"time" "time"
"github.com/Unknwon/com"
"gopkg.in/macaron.v1"
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/cron" "code.gitea.io/gitea/modules/cron"
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/process"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"github.com/Unknwon/com"
"gopkg.in/macaron.v1"
) )
const ( const (
@ -146,7 +147,7 @@ func Dashboard(ctx *context.Context) {
err = models.DeleteRepositoryArchives() err = models.DeleteRepositoryArchives()
case cleanMissingRepos: case cleanMissingRepos:
success = ctx.Tr("admin.dashboard.delete_missing_repos_success") success = ctx.Tr("admin.dashboard.delete_missing_repos_success")
err = models.DeleteMissingRepositories(ctx.User) err = models.DeleteMissingRepositories(ctx.User, notification.NotifyDeleteRepository)
case gitGCRepos: case gitGCRepos:
success = ctx.Tr("admin.dashboard.git_gc_repos_success") success = ctx.Tr("admin.dashboard.git_gc_repos_success")
err = models.GitGcRepos() err = models.GitGcRepos()

View File

@ -9,6 +9,7 @@ import (
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"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/routers" "code.gitea.io/gitea/routers"
) )
@ -42,6 +43,7 @@ func DeleteRepo(ctx *context.Context) {
ctx.ServerError("DeleteRepository", err) ctx.ServerError("DeleteRepository", err)
return return
} }
notification.NotifyDeleteRepository(ctx.User, repo)
log.Trace("Repository deleted: %s/%s", repo.MustOwner().Name, repo.Name) log.Trace("Repository deleted: %s/%s", repo.MustOwner().Name, repo.Name)
ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success")) ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success"))

View File

@ -7,6 +7,7 @@ package repo
import ( import (
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/routers/api/v1/utils"
api "code.gitea.io/sdk/gitea" api "code.gitea.io/sdk/gitea"
@ -104,5 +105,7 @@ func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
ctx.Error(500, "ForkRepository", err) ctx.Error(500, "ForkRepository", err)
return return
} }
notification.NotifyForkRepository(ctx.User, repo, fork)
ctx.JSON(202, fork.APIFormat(models.AccessModeOwner)) ctx.JSON(202, fork.APIFormat(models.AccessModeOwner))
} }

View File

@ -7,6 +7,7 @@ package repo
import ( import (
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/notification"
api "code.gitea.io/sdk/gitea" api "code.gitea.io/sdk/gitea"
) )
@ -156,6 +157,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
} }
return return
} }
notification.NotifyNewRelease(rel)
} else { } else {
if !rel.IsTag { if !rel.IsTag {
ctx.Status(409) ctx.Status(409)
@ -175,6 +177,8 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
ctx.ServerError("UpdateRelease", err) ctx.ServerError("UpdateRelease", err)
return return
} }
notification.NotifyUpdateRelease(ctx.User, rel)
} }
ctx.JSON(201, rel.APIFormat()) ctx.JSON(201, rel.APIFormat())
} }
@ -250,6 +254,8 @@ func EditRelease(ctx *context.APIContext, form api.EditReleaseOption) {
return return
} }
notification.NotifyUpdateRelease(ctx.User, rel)
rel, err = models.GetReleaseByID(id) rel, err = models.GetReleaseByID(id)
if err != nil { if err != nil {
ctx.Error(500, "GetReleaseByID", err) ctx.Error(500, "GetReleaseByID", err)
@ -301,9 +307,11 @@ func DeleteRelease(ctx *context.APIContext) {
ctx.Status(404) ctx.Status(404)
return return
} }
if err := models.DeleteReleaseByID(id, ctx.User, false); err != nil { rel, err = models.DeleteReleaseByID(id, ctx.User, false)
if err != nil {
ctx.Error(500, "DeleteReleaseByID", err) ctx.Error(500, "DeleteReleaseByID", err)
return return
} }
notification.NotifyDeleteRelease(ctx.User, rel)
ctx.Status(204) ctx.Status(204)
} }

View File

@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/auth" "code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"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/util" "code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/api/v1/convert" "code.gitea.io/gitea/routers/api/v1/convert"
@ -186,6 +187,8 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR
if repo != nil { if repo != nil {
if err = models.DeleteRepository(ctx.User, ctx.User.ID, repo.ID); err != nil { if err = models.DeleteRepository(ctx.User, ctx.User.ID, repo.ID); err != nil {
log.Error(4, "DeleteRepository: %v", err) log.Error(4, "DeleteRepository: %v", err)
} else {
notification.NotifyDeleteRepository(ctx.User, repo)
} }
} }
ctx.Error(500, "CreateRepository", err) ctx.Error(500, "CreateRepository", err)
@ -359,6 +362,8 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) {
if repo != nil { if repo != nil {
if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil { if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil {
log.Error(4, "DeleteRepository: %v", errDelete) log.Error(4, "DeleteRepository: %v", errDelete)
} else {
notification.NotifyDeleteRepository(ctx.User, repo)
} }
} }
ctx.Error(500, "MigrateRepository", err) ctx.Error(500, "MigrateRepository", err)
@ -476,6 +481,8 @@ func Delete(ctx *context.APIContext) {
return return
} }
notification.NotifyDeleteRepository(ctx.User, repo)
log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name) log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name)
ctx.Status(204) ctx.Status(204)
} }

View File

@ -203,6 +203,8 @@ func ForkPost(ctx *context.Context, form auth.CreateRepoForm) {
return return
} }
notification.NotifyForkRepository(ctx.User, forkRepo, repo)
log.Trace("Repository forked[%d]: %s/%s", forkRepo.ID, ctxUser.Name, repo.Name) log.Trace("Repository forked[%d]: %s/%s", forkRepo.ID, ctxUser.Name, repo.Name)
ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name) ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name)
} }

View File

@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"github.com/Unknwon/paginater" "github.com/Unknwon/paginater"
@ -182,6 +183,7 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) {
} }
return return
} }
notification.NotifyNewRelease(rel)
} else { } else {
if !rel.IsTag { if !rel.IsTag {
ctx.Data["Err_TagName"] = true ctx.Data["Err_TagName"] = true
@ -202,6 +204,8 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) {
ctx.ServerError("UpdateRelease", err) ctx.ServerError("UpdateRelease", err)
return return
} }
notification.NotifyUpdateRelease(ctx.User, rel)
} }
log.Trace("Release created: %s/%s:%s", ctx.User.LowerName, ctx.Repo.Repository.Name, form.TagName) log.Trace("Release created: %s/%s:%s", ctx.User.LowerName, ctx.Repo.Repository.Name, form.TagName)
@ -280,14 +284,19 @@ func EditReleasePost(ctx *context.Context, form auth.EditReleaseForm) {
ctx.ServerError("UpdateRelease", err) ctx.ServerError("UpdateRelease", err)
return return
} }
notification.NotifyUpdateRelease(ctx.User, rel)
ctx.Redirect(ctx.Repo.RepoLink + "/releases") ctx.Redirect(ctx.Repo.RepoLink + "/releases")
} }
// DeleteRelease delete a release // DeleteRelease delete a release
func DeleteRelease(ctx *context.Context) { func DeleteRelease(ctx *context.Context) {
if err := models.DeleteReleaseByID(ctx.QueryInt64("id"), ctx.User, true); err != nil { rel, err := models.DeleteReleaseByID(ctx.QueryInt64("id"), ctx.User, true)
if err != nil {
ctx.Flash.Error("DeleteReleaseByID: " + err.Error()) ctx.Flash.Error("DeleteReleaseByID: " + err.Error())
} else { } else {
notification.NotifyDeleteRelease(ctx.User, rel)
ctx.Flash.Success(ctx.Tr("repo.release.deletion_success")) ctx.Flash.Success(ctx.Tr("repo.release.deletion_success"))
} }

View File

@ -10,17 +10,17 @@ import (
"path" "path"
"strings" "strings"
"github.com/Unknwon/com"
"code.gitea.io/git"
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth" "code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"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/util" "code.gitea.io/gitea/modules/util"
"code.gitea.io/git"
"github.com/Unknwon/com"
) )
const ( const (
@ -184,6 +184,8 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) {
if repo != nil { if repo != nil {
if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil { if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil {
log.Error(4, "DeleteRepository: %v", errDelete) log.Error(4, "DeleteRepository: %v", errDelete)
} else {
notification.NotifyDeleteRepository(ctx.User, repo)
} }
} }
@ -262,6 +264,8 @@ func MigratePost(ctx *context.Context, form auth.MigrateRepoForm) {
if repo != nil { if repo != nil {
if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil { if errDelete := models.DeleteRepository(ctx.User, ctxUser.ID, repo.ID); errDelete != nil {
log.Error(4, "DeleteRepository: %v", errDelete) log.Error(4, "DeleteRepository: %v", errDelete)
} else {
notification.NotifyDeleteRepository(ctx.User, repo)
} }
} }

View File

@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"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/util" "code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/utils" "code.gitea.io/gitea/routers/utils"
@ -320,6 +321,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
ctx.ServerError("DeleteRepository", err) ctx.ServerError("DeleteRepository", err)
return return
} }
notification.NotifyDeleteRepository(ctx.User, repo)
log.Trace("Repository deleted: %s/%s", ctx.Repo.Owner.Name, repo.Name) log.Trace("Repository deleted: %s/%s", ctx.Repo.Owner.Name, repo.Name)
ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success")) ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success"))