4
4
package user
5
5
6
6
import (
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"
13
+ "io"
7
14
"net/http"
8
15
"net/url"
9
16
@@ -162,13 +169,55 @@ func RedirectToLastVersion(ctx *context.Context) {
162
169
ctx .Redirect (pd .VersionWebLink ())
163
170
}
164
171
172
+ func viewPackageContainerImage (ctx gocontext.Context , pd * packages_model.PackageDescriptor , digest string ) (* container_module.Metadata , error ) {
173
+ manifestBlob , err := container_model .GetContainerBlob (ctx , & container_model.BlobSearchOptions {
174
+ OwnerID : pd .Owner .ID ,
175
+ Image : pd .Package .LowerName ,
176
+ Digest : digest ,
177
+ })
178
+ if err != nil {
179
+ return nil , err
180
+ }
181
+ subManifestStream , err := packages_service .OpenPackageBlobStream (manifestBlob .Blob )
182
+ if err != nil {
183
+ return nil , err
184
+ }
185
+ defer subManifestStream .Close ()
186
+
187
+ buf , err := io .ReadAll (subManifestStream )
188
+ if err != nil {
189
+ return nil , err
190
+ }
191
+ var manifest oci.Manifest
192
+ if err := json .Unmarshal (buf , & manifest ); err != nil {
193
+ return nil , err
194
+ }
195
+ configDescriptor , err := container_model .GetContainerBlob (ctx , & container_model.BlobSearchOptions {
196
+ OwnerID : pd .Owner .ID ,
197
+ Image : pd .Package .LowerName ,
198
+ Digest : string (manifest .Config .Digest ),
199
+ })
200
+ if err != nil {
201
+ return nil , err
202
+ }
203
+
204
+ configReader , err := packages_module .NewContentStore ().OpenBlob (packages_module .BlobHash256Key (configDescriptor .Blob .HashSHA256 ))
205
+ if err != nil {
206
+ return nil , err
207
+ }
208
+ defer configReader .Close ()
209
+
210
+ return container_module .ParseImageConfig (manifest .Config .MediaType , configReader )
211
+ }
212
+
165
213
// ViewPackageVersion displays a single package version
166
214
func ViewPackageVersion (ctx * context.Context ) {
167
215
if _ , err := shared_user .RenderUserOrgHeader (ctx ); err != nil {
168
216
ctx .ServerError ("RenderUserOrgHeader" , err )
169
217
return
170
218
}
171
219
220
+ versionSub := ctx .PathParam ("version_sub" )
172
221
pd := ctx .Package .Descriptor
173
222
ctx .Data ["Title" ] = pd .Package .Name
174
223
ctx .Data ["IsPackagesPage" ] = true
@@ -180,6 +229,9 @@ func ViewPackageVersion(ctx *context.Context) {
180
229
}
181
230
ctx .Data ["PackageRegistryHost" ] = registryHostURL .Host
182
231
232
+ var pvs []* packages_model.PackageVersion
233
+ pvsTotal := int64 (0 )
234
+
183
235
switch pd .Package .Type {
184
236
case packages_model .TypeAlpine :
185
237
branches := make (container.Set [string ])
@@ -257,21 +309,26 @@ func ViewPackageVersion(ctx *context.Context) {
257
309
258
310
ctx .Data ["Groups" ] = util .Sorted (groups .Values ())
259
311
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
312
case packages_model .TypeContainer :
268
- pvs , total , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
313
+ pvs , pvsTotal , err = container_model .SearchImageTags (ctx , & container_model.ImageTagsSearchOptions {
269
314
Paginator : db .NewAbsoluteListOptions (0 , 5 ),
270
315
PackageID : pd .Package .ID ,
271
316
IsTagged : true ,
272
317
})
318
+ ctx .Data ["ContainerImageMetadata" ] = pd .Metadata
319
+ if versionSub != "" {
320
+ imageMeta , err := viewPackageContainerImage (ctx , pd , versionSub )
321
+ if errors .Is (err , util .ErrNotExist ) {
322
+ ctx .NotFound (nil )
323
+ return
324
+ } else if err != nil {
325
+ ctx .ServerError ("viewPackageContainerImage" , err )
326
+ return
327
+ }
328
+ ctx .Data ["ContainerImageMetadata" ] = imageMeta
329
+ }
273
330
default :
274
- pvs , total , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
331
+ pvs , pvsTotal , err = packages_model .SearchVersions (ctx , & packages_model.PackageSearchOptions {
275
332
Paginator : db .NewAbsoluteListOptions (0 , 5 ),
276
333
PackageID : pd .Package .ID ,
277
334
IsInternal : optional .Some (false ),
@@ -283,7 +340,7 @@ func ViewPackageVersion(ctx *context.Context) {
283
340
}
284
341
285
342
ctx .Data ["LatestVersions" ] = pvs
286
- ctx .Data ["TotalVersionCount" ] = total
343
+ ctx .Data ["TotalVersionCount" ] = pvsTotal
287
344
288
345
ctx .Data ["CanWritePackages" ] = ctx .Package .AccessMode >= perm .AccessModeWrite || ctx .IsUserSiteAdmin ()
289
346
0 commit comments