Skip to content

Commit 377c5ac

Browse files
committed
add token service support for docker registry
- repo name ruler <owner>/<repo_name>[/<image_name>] (note: if `<image_name>` not set, will use `<repo_name>` as default) - add a new repo permission unit named as `package`, it's not a real unit in gitea, just use for permission check. - add a small api `GET /repos/{owner}/{repo}/packages/{type}/{name}` for test, maybe can add more later ref: - https://docs.docker.com/registry/spec/auth/token/ - https://docs.docker.com/registry/notifications/ - https://github.com/cesanta/docker_auth Signed-off-by: a1012112796 <[email protected]>
1 parent 9b261f5 commit 377c5ac

File tree

144 files changed

+16427
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+16427
-1
lines changed

custom/conf/app.example.ini

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,3 +1262,36 @@ STORAGE_TYPE = local
12621262
;MINIO_LOCATION = us-east-1
12631263
; Minio enabled ssl only available when STORAGE_TYPE is `minio`
12641264
;MINIO_USE_SSL = false
1265+
1266+
; a auth plugin for docker image
1267+
; example docker registry config
1268+
; auth:
1269+
; token:
1270+
; autoredirect: false
1271+
; realm: http://127.0.0.1:3000/user/docker_token
1272+
; service: gitea-token-service
1273+
; issuer: gitea
1274+
; rootcertbundle: /path/to/server.pem
1275+
; ......
1276+
; notifications:
1277+
; endpoints:
1278+
; - name: gitea
1279+
; url: http://127.0.0.1:3000/user/docker_event
1280+
; headers:
1281+
; X-Token: ['xxxxxxxxx']
1282+
; ..............
1283+
1284+
[package.docker_registry_plugin]
1285+
; Enables docker registry plugin
1286+
ENABLED = false
1287+
; service name
1288+
SERVICE_NAME = gitea-token-service
1289+
; issuer name
1290+
ISSUER_NAME = gitea
1291+
; the path to key files
1292+
CERT_FILE = /path/to/server.pem
1293+
KEY_FILE = /path/to/server.key
1294+
; Expiration time for token, should biger than 60 (s)
1295+
EXPIRATION = 60
1296+
; notify token for notify check
1297+
NOTIFY_TOKEN = xxxxxxxxx

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ require (
2929
github.com/denisenkom/go-mssqldb v0.9.0
3030
github.com/dgrijalva/jwt-go v3.2.0+incompatible
3131
github.com/dlclark/regexp2 v1.4.0 // indirect
32+
github.com/docker/distribution v2.7.1+incompatible
33+
github.com/docker/go-metrics v0.0.1 // indirect
34+
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
3235
github.com/dustin/go-humanize v1.0.0
3336
github.com/editorconfig/editorconfig-core-go/v2 v2.4.1
3437
github.com/emirpasic/gods v1.12.0
@@ -98,6 +101,8 @@ require (
98101
github.com/olekukonko/tablewriter v0.0.5 // indirect
99102
github.com/oliamb/cutter v0.2.2
100103
github.com/olivere/elastic/v7 v7.0.22
104+
github.com/opencontainers/go-digest v1.0.0 // indirect
105+
github.com/opencontainers/image-spec v1.0.1 // indirect
101106
github.com/pelletier/go-toml v1.8.1
102107
github.com/pierrec/lz4/v4 v4.1.3 // indirect
103108
github.com/pkg/errors v0.9.1

go.sum

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,14 @@ github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k
259259
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
260260
github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
261261
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
262+
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
263+
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
264+
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
265+
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
262266
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
263267
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
268+
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
269+
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
264270
github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
265271
github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
266272
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
@@ -745,6 +751,7 @@ github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQ
745751
github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw=
746752
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
747753
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
754+
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
748755
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
749756
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
750757
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@@ -917,6 +924,10 @@ github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDs
917924
github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ=
918925
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
919926
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
927+
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
928+
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
929+
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
930+
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
920931
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
921932
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
922933
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
@@ -960,6 +971,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP
960971
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
961972
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
962973
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
974+
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
963975
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
964976
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
965977
github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU=
@@ -975,6 +987,7 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q
975987
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
976988
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
977989
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
990+
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
978991
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
979992
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
980993
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
@@ -984,6 +997,7 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
984997
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
985998
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
986999
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
1000+
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
9871001
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
9881002
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
9891003
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
@@ -1033,6 +1047,7 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
10331047
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
10341048
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
10351049
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
1050+
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
10361051
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
10371052
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
10381053
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -1371,6 +1386,7 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w
13711386
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13721387
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13731388
golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1389+
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13741390
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13751391
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13761392
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

models/error.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2139,3 +2139,22 @@ func IsErrOAuthApplicationNotFound(err error) bool {
21392139
func (err ErrOAuthApplicationNotFound) Error() string {
21402140
return fmt.Sprintf("OAuth application not found [ID: %d]", err.ID)
21412141
}
2142+
2143+
// Package
2144+
2145+
// ErrPackageNotExist response an requested package is not exist
2146+
type ErrPackageNotExist struct {
2147+
RepoID int64
2148+
Name string
2149+
Type PackageType
2150+
}
2151+
2152+
// IsErrPackageNotExist checks if an error is a ErrPackageNotExist.
2153+
func IsErrPackageNotExist(err error) bool {
2154+
_, ok := err.(ErrPackageNotExist)
2155+
return ok
2156+
}
2157+
2158+
func (err ErrPackageNotExist) Error() string {
2159+
return fmt.Sprintf("package does not exist [type: %s, repo_id: %d, name: %s]", err.Type.String(), err.RepoID, err.Name)
2160+
}

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ var migrations = []Migration{
296296
NewMigration("Add time_id column to Comment", addTimeIDCommentColumn),
297297
// v174 -> v175
298298
NewMigration("create repo transfer table", addRepoTransfer),
299+
// v155 -> v176
300+
NewMigration("create package table", addPackageTable),
299301
}
300302

301303
// GetCurrentDBVersion returns the current db version

models/migrations/v175.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"xorm.io/xorm"
9+
)
10+
11+
func addPackageTable(x *xorm.Engine) error {
12+
type PackageType int64
13+
14+
type Package struct {
15+
ID int64 `xorm:"pk autoincr"`
16+
Name string
17+
LowerName string `xorm:"INDEX"`
18+
19+
RepoID int64 `xorm:"INDEX"`
20+
21+
Type PackageType
22+
23+
CreatedUnix int64 `xorm:"INDEX created"`
24+
UpdatedUnix int64 `xorm:"INDEX updated"`
25+
}
26+
27+
return x.Sync(new(Package))
28+
}

models/models.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ func init() {
134134
new(ProjectIssue),
135135
new(Session),
136136
new(RepoTransfer),
137+
new(Package),
137138
)
138139

139140
gonicNames := []string{"SSL", "UID"}

models/package.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package models
6+
7+
import (
8+
"strings"
9+
10+
"code.gitea.io/gitea/modules/timeutil"
11+
)
12+
13+
// PackageType type of package
14+
type PackageType int64
15+
16+
const (
17+
// PackageTypeDockerImage a docker image (need docker_auth_port)
18+
PackageTypeDockerImage PackageType = iota
19+
)
20+
21+
func (t PackageType) String() string {
22+
if t == PackageTypeDockerImage {
23+
return "docker"
24+
}
25+
return ""
26+
}
27+
28+
// Package an image message tmp
29+
type Package struct {
30+
ID int64 `xorm:"pk autoincr"`
31+
Name string
32+
LowerName string `xorm:"INDEX"`
33+
34+
RepoID int64 `xorm:"INDEX"`
35+
Repo *Repository `xorm:"-"`
36+
37+
Type PackageType
38+
39+
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
40+
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
41+
}
42+
43+
// AddPackageOptions options for add package
44+
type AddPackageOptions struct {
45+
Repo *Repository
46+
Name string
47+
Type PackageType
48+
}
49+
50+
// AddPackage add a new package
51+
func AddPackage(option AddPackageOptions) error {
52+
pkg := &Package{
53+
Name: option.Name,
54+
Type: option.Type,
55+
RepoID: option.Repo.ID,
56+
}
57+
pkg.LowerName = strings.ToLower(pkg.Name)
58+
_, err := x.Insert(pkg)
59+
return err
60+
}
61+
62+
// GetPackage get an package
63+
func GetPackage(repoID int64, typ PackageType, name string) (*Package, error) {
64+
return getPackage(x, repoID, typ, name)
65+
}
66+
67+
func getPackage(e Engine, repoID int64, typ PackageType, name string) (*Package, error) {
68+
lowName := strings.ToLower(name)
69+
pkg := new(Package)
70+
has, err := e.Where("repo_id = ? AND type = ? AND lower_name = ?",
71+
repoID, typ, lowName).Get(pkg)
72+
73+
if err != nil {
74+
return nil, err
75+
}
76+
77+
if !has {
78+
return nil, ErrPackageNotExist{
79+
RepoID: repoID,
80+
Name: name,
81+
Type: typ,
82+
}
83+
}
84+
85+
return pkg, nil
86+
}
87+
88+
// UpdateCols updates some columns
89+
func (pkg *Package) UpdateCols(cols ...string) error {
90+
_, err := x.ID(pkg.ID).Cols(cols...).Update(pkg)
91+
return err
92+
}
93+
94+
// LoadRepo load package's repo
95+
func (pkg *Package) LoadRepo(cols ...string) (err error) {
96+
if pkg.Repo != nil {
97+
return nil
98+
}
99+
100+
pkg.Repo, err = GetRepositoryByID(pkg.RepoID)
101+
return err
102+
}

models/repo_unit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) {
149149
switch colName {
150150
case "type":
151151
switch UnitType(Cell2Int64(val)) {
152-
case UnitTypeCode, UnitTypeReleases, UnitTypeUncyclo, UnitTypeProjects:
152+
case UnitTypeCode, UnitTypeReleases, UnitTypeUncyclo, UnitTypeProjects, UnitTypePackages:
153153
r.Config = new(UnitConfig)
154154
case UnitTypeExternalUncyclo:
155155
r.Config = new(ExternalUncycloConfig)

models/unit.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const (
2525
UnitTypeExternalUncyclo // 6 ExternalUncyclo
2626
UnitTypeExternalTracker // 7 ExternalTracker
2727
UnitTypeProjects // 8 Kanban board
28+
UnitTypePackages // 9 packages
2829
)
2930

3031
// Value returns integer value for unit type
@@ -50,6 +51,8 @@ func (u UnitType) String() string {
5051
return "UnitTypeExternalTracker"
5152
case UnitTypeProjects:
5253
return "UnitTypeProjects"
54+
case UnitTypePackages:
55+
return "UnitTypePackages"
5356
}
5457
return fmt.Sprintf("Unknown UnitType %d", u)
5558
}
@@ -72,6 +75,7 @@ var (
7275
UnitTypeExternalUncyclo,
7376
UnitTypeExternalTracker,
7477
UnitTypeProjects,
78+
UnitTypePackages,
7579
}
7680

7781
// DefaultRepoUnits contains the default unit types
@@ -88,6 +92,7 @@ var (
8892
NotAllowedDefaultRepoUnits = []UnitType{
8993
UnitTypeExternalUncyclo,
9094
UnitTypeExternalTracker,
95+
UnitTypePackages,
9196
}
9297

9398
// MustRepoUnits contains the units could not be disabled currently
@@ -255,6 +260,14 @@ var (
255260
5,
256261
}
257262

263+
UnitPacages = Unit{
264+
UnitTypePackages,
265+
"repo.packages",
266+
"/packages",
267+
"repo.packages.desc",
268+
6,
269+
}
270+
258271
// Units contains all the units
259272
Units = map[UnitType]Unit{
260273
UnitTypeCode: UnitCode,
@@ -265,6 +278,7 @@ var (
265278
UnitTypeUncyclo: UnitUncyclo,
266279
UnitTypeExternalUncyclo: UnitExternalUncyclo,
267280
UnitTypeProjects: UnitProjects,
281+
UnitTypePackages: UnitPacages,
268282
}
269283
)
270284

modules/context/repo.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,7 @@ func UnitTypes() func(ctx *Context) {
878878
ctx.Data["UnitTypeExternalUncyclo"] = models.UnitTypeExternalUncyclo
879879
ctx.Data["UnitTypeExternalTracker"] = models.UnitTypeExternalTracker
880880
ctx.Data["UnitTypeProjects"] = models.UnitTypeProjects
881+
ctx.Data["UnitTypePackages"] = models.UnitTypePackages
881882
}
882883
}
883884

0 commit comments

Comments
 (0)