4
4
package user
5
5
6
6
import (
7
+ gocontext "context"
8
+ "errors"
7
9
"net/http"
8
10
"net/url"
9
11
@@ -20,6 +22,7 @@ import (
20
22
"code.gitea.io/gitea/modules/optional"
21
23
alpine_module "code.gitea.io/gitea/modules/packages/alpine"
22
24
arch_module "code.gitea.io/gitea/modules/packages/arch"
25
+ container_module "code.gitea.io/gitea/modules/packages/container"
23
26
debian_module "code.gitea.io/gitea/modules/packages/debian"
24
27
rpm_module "code.gitea.io/gitea/modules/packages/rpm"
25
28
"code.gitea.io/gitea/modules/setting"
@@ -162,13 +165,32 @@ func RedirectToLastVersion(ctx *context.Context) {
162
165
ctx .Redirect (pd .VersionWebLink ())
163
166
}
164
167
168
+ func viewPackageContainerImage (ctx gocontext.Context , pd * packages_model.PackageDescriptor , digest string ) (* container_module.Metadata , error ) {
169
+ manifestBlob , err := container_model .GetContainerBlob (ctx , & container_model.BlobSearchOptions {
170
+ OwnerID : pd .Owner .ID ,
171
+ Image : pd .Package .LowerName ,
172
+ Digest : digest ,
173
+ })
174
+ if err != nil {
175
+ return nil , err
176
+ }
177
+ subManifestStream , err := packages_service .OpenBlobStream (manifestBlob .Blob )
178
+ if err != nil {
179
+ return nil , err
180
+ }
181
+ defer subManifestStream .Close ()
182
+ _ , _ , metadata , err := container_model .ParseManifestMetadata (ctx , subManifestStream , pd .Owner .ID , pd .Package .LowerName )
183
+ return metadata , err
184
+ }
185
+
165
186
// ViewPackageVersion displays a single package version
166
187
func ViewPackageVersion (ctx * context.Context ) {
167
188
if _ , err := shared_user .RenderUserOrgHeader (ctx ); err != nil {
168
189
ctx .ServerError ("RenderUserOrgHeader" , err )
169
190
return
170
191
}
171
192
193
+ versionSub := ctx .PathParam ("version_sub" )
172
194
pd := ctx .Package .Descriptor
173
195
ctx .Data ["Title" ] = pd .Package .Name
174
196
ctx .Data ["IsPackagesPage" ] = true
@@ -180,6 +202,9 @@ func ViewPackageVersion(ctx *context.Context) {
180
202
}
181
203
ctx .Data ["PackageRegistryHost" ] = registryHostURL .Host
182
204
205
+ var pvs []* packages_model.PackageVersion
206
+ pvsTotal := int64 (0 )
207
+
183
208
switch pd .Package .Type {
184
209
case packages_model .TypeAlpine :
185
210
branches := make (container.Set [string ])
@@ -257,21 +282,26 @@ func ViewPackageVersion(ctx *context.Context) {
257
282
258
283
ctx .Data ["Groups" ] = util .Sorted (groups .Values ())
259
284
ctx .Data ["Architectures" ] = util .Sorted (architectures .Values ())
260
- }
261
-
262
- var (
263
- total int64
264
- pvs []* packages_model.PackageVersion
265
- )
266
- switch pd .Package .Type {
267
285
case packages_model .TypeContainer :
268
- pvs , total , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
286
+ pvs , pvsTotal , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
269
287
Paginator : db .NewAbsoluteListOptions (0 , 5 ),
270
288
PackageID : pd .Package .ID ,
271
289
IsTagged : true ,
272
290
})
291
+ ctx .Data ["ContainerImageMetadata" ] = pd .Metadata
292
+ if versionSub != "" {
293
+ imageMeta , err := viewPackageContainerImage (ctx , pd , versionSub )
294
+ if errors .Is (err , util .ErrNotExist ) {
295
+ ctx .NotFound (nil )
296
+ return
297
+ } else if err != nil {
298
+ ctx .ServerError ("viewPackageContainerImage" , err )
299
+ return
300
+ }
301
+ ctx .Data ["ContainerImageMetadata" ] = imageMeta
302
+ }
273
303
default :
274
- pvs , total , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
304
+ pvs , pvsTotal , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
275
305
Paginator : db .NewAbsoluteListOptions (0 , 5 ),
276
306
PackageID : pd .Package .ID ,
277
307
IsInternal : optional .Some (false ),
@@ -283,7 +313,7 @@ func ViewPackageVersion(ctx *context.Context) {
283
313
}
284
314
285
315
ctx .Data ["LatestVersions" ] = pvs
286
- ctx .Data ["TotalVersionCount" ] = total
316
+ ctx .Data ["TotalVersionCount" ] = pvsTotal
287
317
288
318
ctx .Data ["CanWritePackages" ] = ctx .Package .AccessMode >= perm .AccessModeWrite || ctx .IsUserSiteAdmin ()
289
319
0 commit comments