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"
@@ -31,6 +34,7 @@ import (
3134 "code.gitea.io/gitea/services/context"
3235 "code.gitea.io/gitea/services/forms"
3336 packages_service "code.gitea.io/gitea/services/packages"
37+ container_service "code.gitea.io/gitea/services/packages/container"
3438)
3539
3640const (
@@ -162,13 +166,32 @@ func RedirectToLastVersion(ctx *context.Context) {
162166 ctx .Redirect (pd .VersionWebLink ())
163167}
164168
169+ func viewPackageContainerImage (ctx gocontext.Context , pd * packages_model.PackageDescriptor , digest string ) (* container_module.Metadata , error ) {
170+ manifestBlob , err := container_model .GetContainerBlob (ctx , & container_model.BlobSearchOptions {
171+ OwnerID : pd .Owner .ID ,
172+ Image : pd .Package .LowerName ,
173+ Digest : digest ,
174+ })
175+ if err != nil {
176+ return nil , err
177+ }
178+ manifestReader , err := packages_service .OpenBlobStream (manifestBlob .Blob )
179+ if err != nil {
180+ return nil , err
181+ }
182+ defer manifestReader .Close ()
183+ _ , _ , metadata , err := container_service .ParseManifestMetadata (ctx , manifestReader , pd .Owner .ID , pd .Package .LowerName )
184+ return metadata , err
185+ }
186+
165187// ViewPackageVersion displays a single package version
166188func ViewPackageVersion (ctx * context.Context ) {
167189 if _ , err := shared_user .RenderUserOrgHeader (ctx ); err != nil {
168190 ctx .ServerError ("RenderUserOrgHeader" , err )
169191 return
170192 }
171193
194+ versionSub := ctx .PathParam ("version_sub" )
172195 pd := ctx .Package .Descriptor
173196 ctx .Data ["Title" ] = pd .Package .Name
174197 ctx .Data ["IsPackagesPage" ] = true
@@ -180,6 +203,9 @@ func ViewPackageVersion(ctx *context.Context) {
180203 }
181204 ctx .Data ["PackageRegistryHost" ] = registryHostURL .Host
182205
206+ var pvs []* packages_model.PackageVersion
207+ pvsTotal := int64 (0 )
208+
183209 switch pd .Package .Type {
184210 case packages_model .TypeAlpine :
185211 branches := make (container.Set [string ])
@@ -257,21 +283,26 @@ func ViewPackageVersion(ctx *context.Context) {
257283
258284 ctx .Data ["Groups" ] = util .Sorted (groups .Values ())
259285 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 {
267286 case packages_model .TypeContainer :
268- pvs , total , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
287+ pvs , pvsTotal , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
269288 Paginator : db .NewAbsoluteListOptions (0 , 5 ),
270289 PackageID : pd .Package .ID ,
271290 IsTagged : true ,
272291 })
292+ ctx .Data ["ContainerImageMetadata" ] = pd .Metadata
293+ if versionSub != "" {
294+ imageMeta , err := viewPackageContainerImage (ctx , pd , versionSub )
295+ if errors .Is (err , util .ErrNotExist ) {
296+ ctx .NotFound (nil )
297+ return
298+ } else if err != nil {
299+ ctx .ServerError ("viewPackageContainerImage" , err )
300+ return
301+ }
302+ ctx .Data ["ContainerImageMetadata" ] = imageMeta
303+ }
273304 default :
274- pvs , total , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
305+ pvs , pvsTotal , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
275306 Paginator : db .NewAbsoluteListOptions (0 , 5 ),
276307 PackageID : pd .Package .ID ,
277308 IsInternal : optional .Some (false ),
@@ -283,7 +314,7 @@ func ViewPackageVersion(ctx *context.Context) {
283314 }
284315
285316 ctx .Data ["LatestVersions" ] = pvs
286- ctx .Data ["TotalVersionCount" ] = total
317+ ctx .Data ["TotalVersionCount" ] = pvsTotal
287318
288319 ctx .Data ["CanWritePackages" ] = ctx .Package .AccessMode >= perm .AccessModeWrite || ctx .IsUserSiteAdmin ()
289320
0 commit comments