mirror of
https://github.com/go-gitea/gitea.git
synced 2026-08-23 06:00:36 +00:00
enhance: refine repo watching (#38835)
Follow-up to https://github.com/go-gitea/gitea/pull/37571. "Participating and mentions" deleted the watch row, so choosing it dropped you out of the watcher count. It is a watch like the others, so it now keeps a row and simply subscribes to no events. The dashboard feed ignored the per-event options, so a "Custom: issues" watcher still got pull request activity there. It now gates on the same options as mail and notifications. That also closes a gap where pull request reviews bypassed the permission check. Also, address https://github.com/go-gitea/gitea/pull/37571#discussion_r3740487363 and reword a UI text for clarity. --------- Signed-off-by: silverwind <me@silverwind.io> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
@@ -17,29 +17,22 @@ func ActionWatch(ctx *context.Context) {
|
||||
action := ctx.PathParam("action")
|
||||
var err error
|
||||
if action == "ignore" {
|
||||
err = repo_model.IgnoreRepo(ctx, ctx.Doer, ctx.Repo.Repository)
|
||||
err = repo_model.WatchIgnoreRepo(ctx, ctx.Doer, ctx.Repo.Repository)
|
||||
} else {
|
||||
err = repo_model.WatchRepo(ctx, ctx.Doer, ctx.Repo.Repository, action == "watch")
|
||||
all := action == "watch" // "participate" is a watch that subscribes to no event on its own
|
||||
err = repo_model.WatchRepoWithOptions(ctx, ctx.Doer, ctx.Repo.Repository, repo_model.WatchOptions{PullRequests: all, Issues: all, Releases: all})
|
||||
}
|
||||
if err != nil {
|
||||
handleActionError(ctx, err)
|
||||
return
|
||||
}
|
||||
if action == "watch" { // watching again always restores every event, so "all activity" can undo a custom selection
|
||||
opts := repo_model.WatchOptions{PullRequests: true, Issues: true, Releases: true}
|
||||
if err := repo_model.SetWatchOptions(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, opts); err != nil {
|
||||
ctx.ServerError("SetWatchOptions", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
watch, err := repo_model.GetWatch(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetWatch", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Watch"] = watch
|
||||
ctx.Data["IsWatchingRepo"] = repo_model.IsWatchMode(watch.Mode)
|
||||
ctx.Data["RepoWatch"] = watch
|
||||
|
||||
ctx.Data["Repository"], err = repo_model.GetRepositoryByName(ctx, ctx.Repo.Repository.OwnerID, ctx.Repo.Repository.Name)
|
||||
if err != nil {
|
||||
@@ -51,22 +44,14 @@ func ActionWatch(ctx *context.Context) {
|
||||
|
||||
// ActionWatchOptions watches the repository with a custom selection of events
|
||||
func ActionWatchOptions(ctx *context.Context) {
|
||||
opts := repo_model.WatchOptions{
|
||||
opts := repo_model.WatchOptions{ // clearing every event is allowed, it leaves the participating state
|
||||
PullRequests: ctx.FormBool(string(repo_model.WatchPullRequests)),
|
||||
Issues: ctx.FormBool(string(repo_model.WatchIssues)),
|
||||
Releases: ctx.FormBool(string(repo_model.WatchReleases)),
|
||||
}
|
||||
if !opts.PullRequests && !opts.Issues && !opts.Releases {
|
||||
ctx.JSONError(ctx.Tr("repo.watch.options.required"))
|
||||
return
|
||||
}
|
||||
if err := repo_model.WatchRepo(ctx, ctx.Doer, ctx.Repo.Repository, true); err != nil {
|
||||
if err := repo_model.WatchRepoWithOptions(ctx, ctx.Doer, ctx.Repo.Repository, opts); err != nil {
|
||||
handleActionError(ctx, err)
|
||||
return
|
||||
}
|
||||
if err := repo_model.SetWatchOptions(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, opts); err != nil {
|
||||
ctx.ServerError("SetWatchOptions", err)
|
||||
return
|
||||
}
|
||||
ctx.JSONRedirect("")
|
||||
}
|
||||
|
||||
+1
-1
@@ -1739,7 +1739,7 @@ func registerWebRoutes(m *web.Router, webAuth *AuthMiddleware) {
|
||||
m.Get("/watchers", repo.Watchers)
|
||||
m.Get("/search", reqUnitCodeReader, repo.Search)
|
||||
m.Post("/action/{action:star|unstar}", reqSignIn, starsEnabled, repo.ActionStar)
|
||||
m.Post("/action/{action:watch|unwatch|ignore}", reqSignIn, repo.ActionWatch)
|
||||
m.Post("/action/{action:watch|participate|ignore}", reqSignIn, repo.ActionWatch)
|
||||
m.Post("/action/watch/options", reqSignIn, repo.ActionWatchOptions)
|
||||
m.Post("/action/{action:accept_transfer|reject_transfer}", reqSignIn, repo.ActionTransfer)
|
||||
}, optSignIn, context.RepoAssignment)
|
||||
|
||||
Reference in New Issue
Block a user