aboutsummaryrefslogtreecommitdiff
blob: 5a476a0aee2b156bb9129bc6fb4adb00e2c2dbc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package packages

import "net/http"
import "strconv"
import "soko/pkg/database"
import "soko/pkg/models"
import "soko/pkg/app/handler/categories"

type eapiPackage struct {
	Category            string
	Package             string
	Version             string
	Maintainers         []*models.Maintainer
	ReverseDependencies uint64
	Bugs                uint64
	IsMasked            bool
	IsRedundant         bool
	HasStable           bool
}

templ eapiOverview(packages []eapiPackage) {
	<div class="container mb-5">
		<div class="row">
			<div class="col-12">
				<h3 class="mb-2">
					EAPI 6 Overview ({ strconv.Itoa(len(packages)) } packages)
					<a href="https://bugs.gentoo.org/770247" target="_blank"><i class="fa fa-bug"></i></a>
				</h3>
				<table class="table table-striped table-hover table-bordered kk-versions-table mb-0 overflow-hidden border-0">
					<thead class="sticky-top">
						<tr>
							<th>Version</th>
							<th>Rev-deps</th>
							<th>Bugs</th>
							<th>Maintainers</th>
						</tr>
					</thead>
					<tbody>
						for _, pkg := range packages {
							<tr>
								<td>
									<a class="kk-ebuild-link" href={ templ.URL("/packages/" + pkg.Category + "/" + pkg.Package) }>
										<strong>{ pkg.Category + "/" + pkg.Package }</strong>{ "-" + pkg.Version }
									</a>
									if pkg.IsMasked {
										<span class="badge badge-danger kk-eapi-label" title="Package is masked">M</span>
									} else if pkg.IsRedundant {
										<span class="badge badge-success kk-eapi-label" title="Version is redundant">R</span>
									} else if pkg.HasStable {
										<span class="badge badge-warning kk-eapi-label" title="Package has stabilization candidate">S</span>
									}
								</td>
								<td>
									<a href={ templ.URL("/packages/" + pkg.Category + "/" + pkg.Package + "/reverse-dependencies") }>
										{ strconv.FormatUint(pkg.ReverseDependencies, 10) }
									</a>
								</td>
								<td>
									<a href={ templ.URL("/packages/" + pkg.Category + "/" + pkg.Package + "/bugs") }>
										{ strconv.FormatUint(pkg.Bugs, 10) }
									</a>
								</td>
								<td>
									if len(pkg.Maintainers) > 0 {
										@maintainersList(pkg.Maintainers)
									} else {
										Maintainer-needed
									}
								</td>
							</tr>
						}
					</tbody>
				</table>
			</div>
		</div>
	</div>
}

func Eapi(w http.ResponseWriter, r *http.Request) {
	var result []eapiPackage
	err := database.DBCon.Model((*models.Version)(nil)).
		Column("version.category", "version.package", "version.version").
		ColumnExpr("(?) AS maintainers",
			database.DBCon.Model((*models.Package)(nil)).
				Column("maintainers").
				Where("atom = version.atom").
				Limit(1)).
		Join("LEFT JOIN reverse_dependencies").JoinOn("version.atom = reverse_dependencies.atom").
		ColumnExpr("COALESCE(COUNT(DISTINCT reverse_dependencies.reverse_dependency_atom),0) AS reverse_dependencies").
		Join("LEFT JOIN package_to_bugs").JoinOn("version.atom = package_to_bugs.package_atom").
		ColumnExpr("COALESCE(COUNT(DISTINCT package_to_bugs.id),0) AS bugs").
		ColumnExpr("EXISTS(?) AS is_masked",
			database.DBCon.Model((*models.MaskToVersion)(nil)).
				ColumnExpr("1").
				Where("version_id = version.id")).
		ColumnExpr("EXISTS(?) AS is_redundant",
			database.DBCon.Model((*models.PkgCheckResult)(nil)).
				ColumnExpr("1").
				Where("cpv = version.id").Where("class = ?", "RedundantVersion")).
		ColumnExpr("EXISTS(?) AS has_stable",
			database.DBCon.Model((*models.PkgCheckResult)(nil)).
				ColumnExpr("1").
				Where("atom = version.atom").Where("class = ?", "StableRequest")).
		Where("version.eapi = ?", "6").
		Group("version.id").
		Order("version.atom").
		Select(&result)
	if err != nil {
		http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
		return
	}
	categories.RenderPage(w, r, "EAPI 6 Overview", "EAPI cleanup", eapiOverview(result))
}