|
|
|
|
@ -4,6 +4,8 @@
@@ -4,6 +4,8 @@
|
|
|
|
|
package user |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
gocontext "context" |
|
|
|
|
"errors" |
|
|
|
|
"net/http" |
|
|
|
|
"net/url" |
|
|
|
|
|
|
|
|
|
@ -20,6 +22,7 @@ import (
@@ -20,6 +22,7 @@ import (
|
|
|
|
|
"code.gitea.io/gitea/modules/optional" |
|
|
|
|
alpine_module "code.gitea.io/gitea/modules/packages/alpine" |
|
|
|
|
arch_module "code.gitea.io/gitea/modules/packages/arch" |
|
|
|
|
container_module "code.gitea.io/gitea/modules/packages/container" |
|
|
|
|
debian_module "code.gitea.io/gitea/modules/packages/debian" |
|
|
|
|
rpm_module "code.gitea.io/gitea/modules/packages/rpm" |
|
|
|
|
"code.gitea.io/gitea/modules/setting" |
|
|
|
|
@ -31,6 +34,7 @@ import (
@@ -31,6 +34,7 @@ import (
|
|
|
|
|
"code.gitea.io/gitea/services/context" |
|
|
|
|
"code.gitea.io/gitea/services/forms" |
|
|
|
|
packages_service "code.gitea.io/gitea/services/packages" |
|
|
|
|
container_service "code.gitea.io/gitea/services/packages/container" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|
@ -162,6 +166,24 @@ func RedirectToLastVersion(ctx *context.Context) {
@@ -162,6 +166,24 @@ func RedirectToLastVersion(ctx *context.Context) {
|
|
|
|
|
ctx.Redirect(pd.VersionWebLink()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func viewPackageContainerImage(ctx gocontext.Context, pd *packages_model.PackageDescriptor, digest string) (*container_module.Metadata, error) { |
|
|
|
|
manifestBlob, err := container_model.GetContainerBlob(ctx, &container_model.BlobSearchOptions{ |
|
|
|
|
OwnerID: pd.Owner.ID, |
|
|
|
|
Image: pd.Package.LowerName, |
|
|
|
|
Digest: digest, |
|
|
|
|
}) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
manifestReader, err := packages_service.OpenBlobStream(manifestBlob.Blob) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
defer manifestReader.Close() |
|
|
|
|
_, _, metadata, err := container_service.ParseManifestMetadata(ctx, manifestReader, pd.Owner.ID, pd.Package.LowerName) |
|
|
|
|
return metadata, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ViewPackageVersion displays a single package version
|
|
|
|
|
func ViewPackageVersion(ctx *context.Context) { |
|
|
|
|
if _, err := shared_user.RenderUserOrgHeader(ctx); err != nil { |
|
|
|
|
@ -169,6 +191,7 @@ func ViewPackageVersion(ctx *context.Context) {
@@ -169,6 +191,7 @@ func ViewPackageVersion(ctx *context.Context) {
|
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
versionSub := ctx.PathParam("version_sub") |
|
|
|
|
pd := ctx.Package.Descriptor |
|
|
|
|
ctx.Data["Title"] = pd.Package.Name |
|
|
|
|
ctx.Data["IsPackagesPage"] = true |
|
|
|
|
@ -180,6 +203,9 @@ func ViewPackageVersion(ctx *context.Context) {
@@ -180,6 +203,9 @@ func ViewPackageVersion(ctx *context.Context) {
|
|
|
|
|
} |
|
|
|
|
ctx.Data["PackageRegistryHost"] = registryHostURL.Host |
|
|
|
|
|
|
|
|
|
var pvs []*packages_model.PackageVersion |
|
|
|
|
pvsTotal := int64(0) |
|
|
|
|
|
|
|
|
|
switch pd.Package.Type { |
|
|
|
|
case packages_model.TypeAlpine: |
|
|
|
|
branches := make(container.Set[string]) |
|
|
|
|
@ -257,21 +283,26 @@ func ViewPackageVersion(ctx *context.Context) {
@@ -257,21 +283,26 @@ func ViewPackageVersion(ctx *context.Context) {
|
|
|
|
|
|
|
|
|
|
ctx.Data["Groups"] = util.Sorted(groups.Values()) |
|
|
|
|
ctx.Data["Architectures"] = util.Sorted(architectures.Values()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
total int64 |
|
|
|
|
pvs []*packages_model.PackageVersion |
|
|
|
|
) |
|
|
|
|
switch pd.Package.Type { |
|
|
|
|
case packages_model.TypeContainer: |
|
|
|
|
pvs, total, err = container_model.SearchImageTags(ctx, &container_model.ImageTagsSearchOptions{ |
|
|
|
|
imageMetadata := pd.Metadata |
|
|
|
|
if versionSub != "" { |
|
|
|
|
imageMetadata, err = viewPackageContainerImage(ctx, pd, versionSub) |
|
|
|
|
if errors.Is(err, util.ErrNotExist) { |
|
|
|
|
ctx.NotFound(nil) |
|
|
|
|
return |
|
|
|
|
} else if err != nil { |
|
|
|
|
ctx.ServerError("viewPackageContainerImage", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
ctx.Data["ContainerImageMetadata"] = imageMetadata |
|
|
|
|
pvs, pvsTotal, err = container_model.SearchImageTags(ctx, &container_model.ImageTagsSearchOptions{ |
|
|
|
|
Paginator: db.NewAbsoluteListOptions(0, 5), |
|
|
|
|
PackageID: pd.Package.ID, |
|
|
|
|
IsTagged: true, |
|
|
|
|
}) |
|
|
|
|
default: |
|
|
|
|
pvs, total, err = packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{ |
|
|
|
|
pvs, pvsTotal, err = packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{ |
|
|
|
|
Paginator: db.NewAbsoluteListOptions(0, 5), |
|
|
|
|
PackageID: pd.Package.ID, |
|
|
|
|
IsInternal: optional.Some(false), |
|
|
|
|
@ -283,7 +314,7 @@ func ViewPackageVersion(ctx *context.Context) {
@@ -283,7 +314,7 @@ func ViewPackageVersion(ctx *context.Context) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx.Data["LatestVersions"] = pvs |
|
|
|
|
ctx.Data["TotalVersionCount"] = total |
|
|
|
|
ctx.Data["TotalVersionCount"] = pvsTotal |
|
|
|
|
|
|
|
|
|
ctx.Data["CanWritePackages"] = ctx.Package.AccessMode >= perm.AccessModeWrite || ctx.IsUserSiteAdmin() |
|
|
|
|
|
|
|
|
|
|