aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Zamarin <arthurzam@gentoo.org>2024-02-23 10:13:46 +0200
committerArthur Zamarin <arthurzam@gentoo.org>2024-02-23 10:13:46 +0200
commit8a90c495913466c04c39a7ea562b284f6e0182ee (patch)
tree754d3c882d6941bf649e15a9476bef73d26017e5
parentbump node dependencies (diff)
downloadsoko-8a90c495913466c04c39a7ea562b284f6e0182ee.tar.gz
soko-8a90c495913466c04c39a7ea562b284f6e0182ee.tar.bz2
soko-8a90c495913466c04c39a7ea562b284f6e0182ee.zip
use new go 1.22 mux for show maintainer
Signed-off-by: Arthur Zamarin <arthurzam@gentoo.org>
-rw-r--r--pkg/app/handler/maintainer/show.go344
-rw-r--r--pkg/app/serve.go118
2 files changed, 254 insertions, 208 deletions
diff --git a/pkg/app/handler/maintainer/show.go b/pkg/app/handler/maintainer/show.go
index ac19e71..8b66a18 100644
--- a/pkg/app/handler/maintainer/show.go
+++ b/pkg/app/handler/maintainer/show.go
@@ -12,27 +12,22 @@ import (
"github.com/go-pg/pg/v10"
)
-// Show renders a template to show a given maintainer page
-func Show(w http.ResponseWriter, r *http.Request) {
- maintainerEmail, pageName, _ := strings.Cut(r.URL.Path[len("/maintainer/"):], "/")
+func common(w http.ResponseWriter, r *http.Request) (maintainer models.Maintainer, packagesQuery *pg.Query, packagesCount int, err error) {
+ maintainerEmail := r.PathValue("email")
if !strings.Contains(maintainerEmail, "@") {
maintainerEmail += "@gentoo.org"
}
- var gpackages []*models.Package
- query := database.DBCon.Model(&gpackages).
- Column("atom")
+ packagesQuery = database.DBCon.Model((*models.Package)(nil)).Column("atom")
if maintainerEmail == "maintainer-needed@gentoo.org" {
- query = query.Where("NULLIF(maintainers, '[]') IS null")
+ packagesQuery = packagesQuery.Where("NULLIF(maintainers, '[]') IS null")
} else {
- query = query.Where("maintainers @> ?", `[{"Email": "`+maintainerEmail+`"}]`)
+ packagesQuery = packagesQuery.Where("maintainers @> ?", `[{"Email": "`+maintainerEmail+`"}]`)
}
- maintainer := models.Maintainer{
- Email: maintainerEmail,
- }
- err := database.DBCon.Model(&maintainer).WherePK().Relation("Project").Relation("Projects").Select()
+ maintainer = models.Maintainer{Email: maintainerEmail}
+ err = database.DBCon.Model(&maintainer).WherePK().Relation("Project").Relation("Projects").Select()
if err != nil {
http.NotFound(w, r)
return
@@ -43,156 +38,199 @@ func Show(w http.ResponseWriter, r *http.Request) {
excludeList := strings.Join(userPreferences.Maintainers.ExcludedProjects, ",")
for _, proj := range maintainer.Projects {
if !strings.Contains(excludeList, proj.Email) {
- query = query.WhereOr("maintainers @> ?", `[{"Email": "`+proj.Email+`"}]`)
+ packagesQuery = packagesQuery.WhereOr("maintainers @> ?", `[{"Email": "`+proj.Email+`"}]`)
}
}
}
- packagesCount, err := query.Clone().Count()
+ packagesCount, err = packagesQuery.Clone().Count()
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+
+ return
+}
+
+func ShowChangelog(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var commits []*models.Commit
+ err = database.DBCon.Model(&commits).
+ Join("JOIN commit_to_packages").JoinOn("commit.id = commit_to_packages.commit_id").
+ Where("commit_to_packages.package_atom IN (?)", query).
+ Order("preceding_commits DESC").
+ Limit(50).
+ Select()
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Changelog", components.Changelog("", commits)),
+ ).Render(r.Context(), w)
+}
+
+func ShowOutdated(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var outdated []components.OutdatedItem
+ descriptionQuery := database.DBCon.Model((*models.Version)(nil)).
+ Column("description").
+ Where("atom = outdated_packages.atom").
+ Limit(1)
+ err = database.DBCon.Model((*models.OutdatedPackages)(nil)).
+ Column("atom").ColumnExpr("(?) AS description", descriptionQuery).
+ Where("atom IN (?)", query).
+ Order("atom").
+ Select(&outdated)
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Outdated", components.Outdated(outdated)),
+ ).Render(r.Context(), w)
+}
+
+func ShowPullRequests(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var pullRequests []*models.GithubPullRequest
+ err = database.DBCon.Model(&pullRequests).
+ DistinctOn("github_pull_request.id").
+ OrderExpr("github_pull_request.id DESC").
+ Join("JOIN package_to_github_pull_requests").JoinOn("github_pull_request.id = package_to_github_pull_requests.github_pull_request_id").
+ Where("package_atom IN (?)", query).
+ Select()
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Pull requests", components.PullRequests(len(pullRequests) > 0, pullRequests)),
+ ).Render(r.Context(), w)
+}
+
+func ShowStabilization(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var results []*models.PkgCheckResult
+ err = database.DBCon.Model(&results).
+ Column("atom", "cpv", "message").
+ Where("class = ?", "StableRequest").
+ Where("atom IN (?)", query).
+ OrderExpr("cpv").
+ Select()
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Stabilization", components.Stabilizations(len(results) > 0, results)),
+ ).Render(r.Context(), w)
+}
+
+func ShowBugs(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var bugs []*models.Bug
+ err = database.DBCon.Model(&bugs).
+ DistinctOn("id::INT").
+ Column("id", "summary", "component", "assignee").
+ OrderExpr("id::INT").
+ With("wanted", query).
+ Where("id IN (?)",
+ database.DBCon.Model((*models.PackageToBug)(nil)).
+ Column("bug_id").
+ Join("JOIN wanted").JoinOn("package_atom = wanted.atom")).
+ WhereOr("id IN (?)",
+ database.DBCon.Model((*models.VersionToBug)(nil)).
+ Column("bug_id").
+ Join("JOIN versions").JoinOn("version_id = versions.id").
+ Join("JOIN wanted").JoinOn("versions.atom = wanted.atom")).
+ Select()
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+ generalCount, stabilizationCount, keywordingCount := countBugsCategories(bugs)
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Bugs", components.Bugs(generalCount, stabilizationCount, keywordingCount, bugs)),
+ ).Render(r.Context(), w)
+}
+
+func ShowSecurity(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var bugs []*models.Bug
+ err = database.DBCon.Model(&bugs).
+ DistinctOn("id::INT").
+ Column("id", "summary", "component", "assignee").
+ OrderExpr("id::INT").
+ With("wanted", query).
+ Where("component = ?", "Vulnerabilities").
+ Where("id IN (?)",
+ database.DBCon.Model((*models.PackageToBug)(nil)).
+ Column("bug_id").
+ Join("JOIN wanted").JoinOn("package_atom = wanted.atom")).
+ Select()
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+ return
+ }
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Security", components.SecurityBugs(len(bugs) > 0, bugs)),
+ ).Render(r.Context(), w)
+}
+
+func ShowStabilizationFile(w http.ResponseWriter, r *http.Request) {
+ _, query, _, err := common(w, r)
+ if err != nil {
+ return
+ }
+ pageName := r.URL.Path[strings.LastIndexByte(r.URL.Path, '/')+1:]
+
+ var gpackages []*models.Package
+ err = query.Model(&gpackages).
+ Relation("Versions").
+ Relation("Versions.PkgCheckResults", func(q *pg.Query) (*pg.Query, error) {
+ return q.Where("class = ?", "StableRequest"), nil
+ }).Select()
if err != nil {
http.NotFound(w, r)
return
}
+ utils.StabilizationExport(w, pageName, gpackages)
+}
- switch pageName {
- case "changelog":
- var commits []*models.Commit
- err = database.DBCon.Model(&commits).
- Join("JOIN commit_to_packages").JoinOn("commit.id = commit_to_packages.commit_id").
- Where("commit_to_packages.package_atom IN (?)", query).
- Order("preceding_commits DESC").
- Limit(50).
- Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Changelog", components.Changelog("", commits)),
- ).Render(r.Context(), w)
- return
- case "outdated":
- var outdated []components.OutdatedItem
- descriptionQuery := database.DBCon.Model((*models.Version)(nil)).
- Column("description").
- Where("atom = outdated_packages.atom").
- Limit(1)
- err := database.DBCon.Model((*models.OutdatedPackages)(nil)).
- Column("atom").ColumnExpr("(?) AS description", descriptionQuery).
- Where("atom IN (?)", query).
- Order("atom").
- Select(&outdated)
- if err != nil {
- http.NotFound(w, r)
- return
- }
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Outdated", components.Outdated(outdated)),
- ).Render(r.Context(), w)
- return
- case "pull-requests":
- var pullRequests []*models.GithubPullRequest
- err = database.DBCon.Model(&pullRequests).
- DistinctOn("github_pull_request.id").
- OrderExpr("github_pull_request.id DESC").
- Join("JOIN package_to_github_pull_requests").JoinOn("github_pull_request.id = package_to_github_pull_requests.github_pull_request_id").
- Where("package_atom IN (?)", query).
- Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Pull requests", components.PullRequests(len(pullRequests) > 0, pullRequests)),
- ).Render(r.Context(), w)
- return
- case "stabilization":
- var results []*models.PkgCheckResult
- err = database.DBCon.Model(&results).
- Column("atom", "cpv", "message").
- Where("class = ?", "StableRequest").
- Where("atom IN (?)", query).
- OrderExpr("cpv").
- Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Stabilization", components.Stabilizations(len(results) > 0, results)),
- ).Render(r.Context(), w)
- return
- case "bugs":
- var bugs []*models.Bug
- err = database.DBCon.Model(&bugs).
- DistinctOn("id::INT").
- Column("id", "summary", "component", "assignee").
- OrderExpr("id::INT").
- With("wanted", query).
- Where("id IN (?)",
- database.DBCon.Model((*models.PackageToBug)(nil)).
- Column("bug_id").
- Join("JOIN wanted").JoinOn("package_atom = wanted.atom")).
- WhereOr("id IN (?)",
- database.DBCon.Model((*models.VersionToBug)(nil)).
- Column("bug_id").
- Join("JOIN versions").JoinOn("version_id = versions.id").
- Join("JOIN wanted").JoinOn("versions.atom = wanted.atom")).
- Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- generalCount, stabilizationCount, keywordingCount := countBugsCategories(bugs)
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Bugs", components.Bugs(generalCount, stabilizationCount, keywordingCount, bugs)),
- ).Render(r.Context(), w)
- return
- case "security":
- var bugs []*models.Bug
- err = database.DBCon.Model(&bugs).
- DistinctOn("id::INT").
- Column("id", "summary", "component", "assignee").
- OrderExpr("id::INT").
- With("wanted", query).
- Where("component = ?", "Vulnerabilities").
- Where("id IN (?)",
- database.DBCon.Model((*models.PackageToBug)(nil)).
- Column("bug_id").
- Join("JOIN wanted").JoinOn("package_atom = wanted.atom")).
- Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Security", components.SecurityBugs(len(bugs) > 0, bugs)),
- ).Render(r.Context(), w)
- return
- case "stabilization.json", "stabilization.xml", "stabilization.list":
- err = query.
- Relation("Versions").
- Relation("Versions.PkgCheckResults", func(q *pg.Query) (*pg.Query, error) {
- return q.Where("class = ?", "StableRequest"), nil
- }).Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- utils.StabilizationExport(w, pageName, gpackages)
- return
- default:
- pageName = "packages"
- err = query.Column("category").
- Order("category", "name").
- Relation("Versions").Select()
- if err != nil {
- http.NotFound(w, r)
- return
- }
- layout.Layout(maintainer.Name, "maintainers",
- show(packagesCount, &maintainer, "Packages", showPackages(gpackages, &maintainer)),
- ).Render(r.Context(), w)
+func ShowPackages(w http.ResponseWriter, r *http.Request) {
+ maintainer, query, packagesCount, err := common(w, r)
+ if err != nil {
+ return
+ }
+ var gpackages []*models.Package
+ err = query.Model(&gpackages).
+ Column("category").
+ Order("category", "name").
+ Relation("Versions").Select()
+ if err != nil {
+ http.NotFound(w, r)
return
}
+ layout.Layout(maintainer.Name, "maintainers",
+ show(packagesCount, &maintainer, "Packages", showPackages(gpackages, &maintainer)),
+ ).Render(r.Context(), w)
}
diff --git a/pkg/app/serve.go b/pkg/app/serve.go
index 66bd220..f9d964b 100644
--- a/pkg/app/serve.go
+++ b/pkg/app/serve.go
@@ -31,60 +31,69 @@ func Serve() {
database.Connect()
defer database.DBCon.Close()
- setRoute("/categories", categories.Index)
- setRoute("/categories.json", categories.JSONCategories)
- setRoute("/categories/", categories.Show)
-
- setRoute("/useflags/popular.json", useflags.Popular)
- setRoute("/useflags/suggest.json", useflags.Suggest)
- setRoute("/useflags/search", useflags.Search)
- setRoute("/useflags/global", useflags.Global)
- setRoute("/useflags/local", useflags.Local)
- setRoute("/useflags/expand", useflags.Expand)
- setRoute("/useflags/popular", useflags.PopularPage)
- setRoute("/useflags", useflags.Default)
- setRoute("/useflags/", useflags.Show)
-
- setRoute("/arches", arches.Index)
- setRoute("/arches/", arches.Show)
-
- setRoute("/about", about.Index)
- setRoute("/about/help", about.Help)
- setRoute("/about/feedback", about.Feedback)
- setRoute("/about/feeds", about.Feeds)
- setRoute("/about/status", about.Status)
-
- setRoute("/maintainers", maintainer.BrowseProjects)
- redirect("/maintainers/gentoo-projects", "/maintainers")
- setRoute("/maintainers/gentoo-developers", maintainer.BrowseDevs)
- setRoute("/maintainers/proxied-maintainers", maintainer.BrowseProxyDevs)
- setRoute("/maintainer/", maintainer.Show)
-
- setRoute("/packages/search", packages.Search)
- setRoute("/packages/suggest.json", packages.Suggest)
- setRoute("/packages/resolve.json", packages.Resolve)
- setRoute("/packages/added", packages.Added)
- setRoute("/packages/updated", packages.Updated)
- setRoute("/packages/stable", packages.Stabilized)
- setRoute("/packages/keyworded", packages.Keyworded)
- setRoute("/packages/", packages.Show)
- setRoute("/", index.Show)
-
- setRoute("/packages/added.atom", packages.AddedFeed)
- setRoute("/packages/updated.atom", packages.UpdatedFeed)
- setRoute("/packages/keyworded.atom", packages.KeywordedFeed)
- setRoute("/packages/stable.atom", packages.StabilizedFeed)
- // Added for backwards compability
- redirect("/packages/stabilized.atom", "/packages/stable.atom")
- setRoute("/packages/search.atom", packages.SearchFeed)
-
- setRoute("/user", user.Preferences("General"))
- setRoute("/user/preferences", user.Preferences("General"))
- setRoute("/user/preferences/general", user.Preferences("General"))
- setRoute("/user/preferences/packages", user.Preferences("Packages"))
- setRoute("/user/preferences/maintainers", user.Preferences("Maintainers"))
- setRoute("/user/preferences/useflags", user.Preferences("USE flags"))
- setRoute("/user/preferences/arches", user.Preferences("Architectures"))
+ setRoute("GET /categories", categories.Index)
+ setRoute("GET /categories.json", categories.JSONCategories)
+ setRoute("GET /categories/", categories.Show)
+
+ setRoute("GET /useflags/popular.json", useflags.Popular)
+ setRoute("GET /useflags/suggest.json", useflags.Suggest)
+ setRoute("GET /useflags/search", useflags.Search)
+ setRoute("GET /useflags/global", useflags.Global)
+ setRoute("GET /useflags/local", useflags.Local)
+ setRoute("GET /useflags/expand", useflags.Expand)
+ setRoute("GET /useflags/popular", useflags.PopularPage)
+ setRoute("GET /useflags", useflags.Default)
+ setRoute("GET /useflags/", useflags.Show)
+
+ setRoute("GET /arches", arches.Index)
+ setRoute("GET /arches/", arches.Show)
+
+ setRoute("GET /about", about.Index)
+ setRoute("GET /about/help", about.Help)
+ setRoute("GET /about/feedback", about.Feedback)
+ setRoute("GET /about/feeds", about.Feeds)
+ setRoute("GET /about/status", about.Status)
+
+ setRoute("GET /maintainers", maintainer.BrowseProjects)
+ redirect("GET /maintainers/gentoo-projects", "/maintainers")
+ setRoute("GET /maintainers/gentoo-developers", maintainer.BrowseDevs)
+ setRoute("GET /maintainers/proxied-maintainers", maintainer.BrowseProxyDevs)
+ setRoute("GET /maintainer/{email}", maintainer.ShowPackages)
+ setRoute("GET /maintainer/{email}/bugs", maintainer.ShowBugs)
+ setRoute("GET /maintainer/{email}/changelog", maintainer.ShowChangelog)
+ setRoute("GET /maintainer/{email}/outdated", maintainer.ShowOutdated)
+ setRoute("GET /maintainer/{email}/pull-requests", maintainer.ShowPullRequests)
+ setRoute("GET /maintainer/{email}/security", maintainer.ShowSecurity)
+ setRoute("GET /maintainer/{email}/stabilization", maintainer.ShowStabilization)
+ setRoute("GET /maintainer/{email}/stabilization.json", maintainer.ShowStabilizationFile)
+ setRoute("GET /maintainer/{email}/stabilization.list", maintainer.ShowStabilizationFile)
+ setRoute("GET /maintainer/{email}/stabilization.xml", maintainer.ShowStabilizationFile)
+
+ setRoute("GET /packages/search", packages.Search)
+ setRoute("GET /packages/suggest.json", packages.Suggest)
+ setRoute("GET /packages/resolve.json", packages.Resolve)
+ setRoute("GET /packages/added", packages.Added)
+ setRoute("GET /packages/updated", packages.Updated)
+ setRoute("GET /packages/stable", packages.Stabilized)
+ setRoute("GET /packages/keyworded", packages.Keyworded)
+ setRoute("GET /packages/", packages.Show)
+ setRoute("GET /{$}", index.Show)
+
+ setRoute("GET /packages/added.atom", packages.AddedFeed)
+ setRoute("GET /packages/updated.atom", packages.UpdatedFeed)
+ setRoute("GET /packages/keyworded.atom", packages.KeywordedFeed)
+ setRoute("GET /packages/stable.atom", packages.StabilizedFeed)
+ // Added for backwards compatibility
+ redirect("GET /packages/stabilized.atom", "/packages/stable.atom")
+ setRoute("GET /packages/search.atom", packages.SearchFeed)
+
+ redirect("GET /user", "/user/preferences/general")
+ redirect("GET /user/preferences", "/user/preferences/general")
+ setRoute("GET /user/preferences/general", user.Preferences("General"))
+ setRoute("GET /user/preferences/packages", user.Preferences("Packages"))
+ setRoute("GET /user/preferences/maintainers", user.Preferences("Maintainers"))
+ setRoute("GET /user/preferences/useflags", user.Preferences("USE flags"))
+ setRoute("GET /user/preferences/arches", user.Preferences("Architectures"))
setRoute("/user/preferences/general/layout", user.General)
setRoute("/user/preferences/general/reset", user.ResetGeneral)
@@ -119,7 +128,6 @@ func Serve() {
logger.Info.Println("Serving on port: " + config.Port())
log.Fatal(http.ListenAndServe(":"+config.Port(), nil))
-
}
// define a route using the default middleware and the given handler