44package user
55
66import (
7+ gocontext "context"
8+ "errors"
79 "net/http"
810 "net/url"
911
@@ -20,6 +22,7 @@ import (
2022 "code.gitea.io/gitea/modules/optional"
2123 alpine_module "code.gitea.io/gitea/modules/packages/alpine"
2224 arch_module "code.gitea.io/gitea/modules/packages/arch"
25+ container_module "code.gitea.io/gitea/modules/packages/container"
2326 debian_module "code.gitea.io/gitea/modules/packages/debian"
2427 rpm_module "code.gitea.io/gitea/modules/packages/rpm"
2528 "code.gitea.io/gitea/modules/setting"
@@ -162,13 +165,32 @@ func RedirectToLastVersion(ctx *context.Context) {
162165 ctx .Redirect (pd .VersionWebLink ())
163166}
164167
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+
165186// ViewPackageVersion displays a single package version
166187func ViewPackageVersion (ctx * context.Context ) {
167188 if _ , err := shared_user .RenderUserOrgHeader (ctx ); err != nil {
168189 ctx .ServerError ("RenderUserOrgHeader" , err )
169190 return
170191 }
171192
193+ versionSub := ctx .PathParam ("version_sub" )
172194 pd := ctx .Package .Descriptor
173195 ctx .Data ["Title" ] = pd .Package .Name
174196 ctx .Data ["IsPackagesPage" ] = true
@@ -180,6 +202,9 @@ func ViewPackageVersion(ctx *context.Context) {
180202 }
181203 ctx .Data ["PackageRegistryHost" ] = registryHostURL .Host
182204
205+ var pvs []* packages_model.PackageVersion
206+ pvsTotal := int64 (0 )
207+
183208 switch pd .Package .Type {
184209 case packages_model .TypeAlpine :
185210 branches := make (container.Set [string ])
@@ -257,21 +282,26 @@ func ViewPackageVersion(ctx *context.Context) {
257282
258283 ctx .Data ["Groups" ] = util .Sorted (groups .Values ())
259284 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 {
267285 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 {
269287 Paginator : db .NewAbsoluteListOptions (0 , 5 ),
270288 PackageID : pd .Package .ID ,
271289 IsTagged : true ,
272290 })
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+ }
273303 default :
274- pvs , total , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
304+ pvs , pvsTotal , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
275305 Paginator : db .NewAbsoluteListOptions (0 , 5 ),
276306 PackageID : pd .Package .ID ,
277307 IsInternal : optional .Some (false ),
@@ -283,7 +313,7 @@ func ViewPackageVersion(ctx *context.Context) {
283313 }
284314
285315 ctx .Data ["LatestVersions" ] = pvs
286- ctx .Data ["TotalVersionCount" ] = total
316+ ctx .Data ["TotalVersionCount" ] = pvsTotal
287317
288318 ctx .Data ["CanWritePackages" ] = ctx .Package .AccessMode >= perm .AccessModeWrite || ctx .IsUserSiteAdmin ()
289319
0 commit comments