44package user
55
66import (
7+ "code.gitea.io/gitea/modules/json"
8+ packages_module "code.gitea.io/gitea/modules/packages"
9+ container_module "code.gitea.io/gitea/modules/packages/container"
10+ gocontext "context"
11+ "errors"
12+ oci "github.com/opencontainers/image-spec/specs-go/v1"
713 "net/http"
814 "net/url"
915
@@ -162,13 +168,51 @@ func RedirectToLastVersion(ctx *context.Context) {
162168 ctx .Redirect (pd .VersionWebLink ())
163169}
164170
171+ func viewPackageContainerImage (ctx gocontext.Context , pd * packages_model.PackageDescriptor , digest string ) (* container_module.Metadata , error ) {
172+ manifestBlob , err := container_model .GetContainerBlob (ctx , & container_model.BlobSearchOptions {
173+ OwnerID : pd .Owner .ID ,
174+ Image : pd .Package .LowerName ,
175+ Digest : digest ,
176+ })
177+ if err != nil {
178+ return nil , err
179+ }
180+ subManifestStream , err := packages_service .OpenPackageBlobStream (manifestBlob .Blob )
181+ if err != nil {
182+ return nil , err
183+ }
184+ defer subManifestStream .Close ()
185+
186+ var manifest oci.Manifest
187+ if err = json .NewDecoder (subManifestStream ).Decode (& manifest ); err != nil {
188+ return nil , err
189+ }
190+ configDescriptor , err := container_model .GetContainerBlob (ctx , & container_model.BlobSearchOptions {
191+ OwnerID : pd .Owner .ID ,
192+ Image : pd .Package .LowerName ,
193+ Digest : string (manifest .Config .Digest ),
194+ })
195+ if err != nil {
196+ return nil , err
197+ }
198+
199+ configReader , err := packages_module .NewContentStore ().OpenBlob (packages_module .BlobHash256Key (configDescriptor .Blob .HashSHA256 ))
200+ if err != nil {
201+ return nil , err
202+ }
203+ defer configReader .Close ()
204+
205+ return container_module .ParseImageConfig (manifest .Config .MediaType , configReader )
206+ }
207+
165208// ViewPackageVersion displays a single package version
166209func ViewPackageVersion (ctx * context.Context ) {
167210 if _ , err := shared_user .RenderUserOrgHeader (ctx ); err != nil {
168211 ctx .ServerError ("RenderUserOrgHeader" , err )
169212 return
170213 }
171214
215+ versionSub := ctx .PathParam ("version_sub" )
172216 pd := ctx .Package .Descriptor
173217 ctx .Data ["Title" ] = pd .Package .Name
174218 ctx .Data ["IsPackagesPage" ] = true
@@ -180,6 +224,9 @@ func ViewPackageVersion(ctx *context.Context) {
180224 }
181225 ctx .Data ["PackageRegistryHost" ] = registryHostURL .Host
182226
227+ var pvs []* packages_model.PackageVersion
228+ pvsTotal := int64 (0 )
229+
183230 switch pd .Package .Type {
184231 case packages_model .TypeAlpine :
185232 branches := make (container.Set [string ])
@@ -257,21 +304,26 @@ func ViewPackageVersion(ctx *context.Context) {
257304
258305 ctx .Data ["Groups" ] = util .Sorted (groups .Values ())
259306 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 {
267307 case packages_model .TypeContainer :
268- pvs , total , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
308+ pvs , pvsTotal , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
269309 Paginator : db .NewAbsoluteListOptions (0 , 5 ),
270310 PackageID : pd .Package .ID ,
271311 IsTagged : true ,
272312 })
313+ ctx .Data ["ContainerImageMetadata" ] = pd .Metadata
314+ if versionSub != "" {
315+ imageMeta , err := viewPackageContainerImage (ctx , pd , versionSub )
316+ if errors .Is (err , util .ErrNotExist ) {
317+ ctx .NotFound (nil )
318+ return
319+ } else if err != nil {
320+ ctx .ServerError ("viewPackageContainerImage" , err )
321+ return
322+ }
323+ ctx .Data ["ContainerImageMetadata" ] = imageMeta
324+ }
273325 default :
274- pvs , total , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
326+ pvs , pvsTotal , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
275327 Paginator : db .NewAbsoluteListOptions (0 , 5 ),
276328 PackageID : pd .Package .ID ,
277329 IsInternal : optional .Some (false ),
@@ -283,7 +335,7 @@ func ViewPackageVersion(ctx *context.Context) {
283335 }
284336
285337 ctx .Data ["LatestVersions" ] = pvs
286- ctx .Data ["TotalVersionCount" ] = total
338+ ctx .Data ["TotalVersionCount" ] = pvsTotal
287339
288340 ctx .Data ["CanWritePackages" ] = ctx .Package .AccessMode >= perm .AccessModeWrite || ctx .IsUserSiteAdmin ()
289341
0 commit comments