From 2f5d355763d062f1aed959217a6e99830ca78f63 Mon Sep 17 00:00:00 2001 From: "diana.strebkova@t-systems.com" Date: Fri, 21 Feb 2025 14:44:17 +0100 Subject: [PATCH 1/4] GetVersionsByPackageName witll throw ErrNotExist when no packages found --- models/packages/package_version.go | 5 +++++ routers/api/packages/chef/chef.go | 17 +++++++-------- routers/api/packages/composer/composer.go | 9 ++++---- routers/api/packages/goproxy/goproxy.go | 8 ++++---- routers/api/packages/maven/maven.go | 10 +++++---- routers/api/packages/npm/npm.go | 25 +++++++++++++++-------- routers/api/packages/nuget/nuget.go | 18 ++++++++-------- routers/api/packages/pub/pub.go | 9 ++++---- routers/api/packages/pypi/pypi.go | 10 +++++---- routers/api/packages/rubygems/rubygems.go | 17 +++++++-------- routers/api/packages/swift/swift.go | 9 ++++---- routers/api/packages/vagrant/vagrant.go | 21 +++++++++++-------- 12 files changed, 93 insertions(+), 65 deletions(-) diff --git a/models/packages/package_version.go b/models/packages/package_version.go index 278e8e3a86b0e..e318e299b597e 100644 --- a/models/packages/package_version.go +++ b/models/packages/package_version.go @@ -139,6 +139,11 @@ func GetVersionsByPackageName(ctx context.Context, ownerID int64, packageType Ty }, IsInternal: optional.Some(false), }) + + if len(pvs) == 0 { + return nil, util.ErrNotExist + } + return pvs, err } diff --git a/routers/api/packages/chef/chef.go b/routers/api/packages/chef/chef.go index a0c8c5696c6ff..ff70f14e01470 100644 --- a/routers/api/packages/chef/chef.go +++ b/routers/api/packages/chef/chef.go @@ -153,12 +153,13 @@ func PackageMetadata(ctx *context.Context) { packageName := ctx.PathParam("name") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeChef, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, nil) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, nil) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } @@ -382,13 +383,13 @@ func DeletePackageVersion(ctx *context.Context) { // https://github.com/chef/chef/blob/main/knife/lib/chef/knife/supermarket_unshare.rb func DeletePackage(ctx *context.Context) { pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeChef, ctx.PathParam("name")) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/composer/composer.go b/routers/api/packages/composer/composer.go index c6c14e5cf4fb0..ca5023bcb7acd 100644 --- a/routers/api/packages/composer/composer.go +++ b/routers/api/packages/composer/composer.go @@ -138,12 +138,13 @@ func PackageMetadata(ctx *context.Context) { projectName := ctx.PathParam("projectname") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeComposer, vendorName+"/"+projectName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/goproxy/goproxy.go b/routers/api/packages/goproxy/goproxy.go index bde29df73935e..e306a5af924b2 100644 --- a/routers/api/packages/goproxy/goproxy.go +++ b/routers/api/packages/goproxy/goproxy.go @@ -29,12 +29,12 @@ func apiError(ctx *context.Context, status int, obj any) { func EnumeratePackageVersions(ctx *context.Context) { pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeGo, ctx.PathParam("name")) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/maven/maven.go b/routers/api/packages/maven/maven.go index 4d04d4d1e9f32..0785fcb55b918 100644 --- a/routers/api/packages/maven/maven.go +++ b/routers/api/packages/maven/maven.go @@ -90,12 +90,14 @@ func serveMavenMetadata(ctx *context.Context, params parameters) { if errors.Is(err, util.ErrNotExist) { pvs, err = packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageNameLegacy()) } - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/npm/npm.go b/routers/api/packages/npm/npm.go index 6ec46bcb36573..9e50a8beda5eb 100644 --- a/routers/api/packages/npm/npm.go +++ b/routers/api/packages/npm/npm.go @@ -56,12 +56,13 @@ func PackageMetadata(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } @@ -283,13 +284,13 @@ func DeletePackage(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } @@ -308,6 +309,10 @@ func ListPackageTags(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) + return + } if err != nil { apiError(ctx, http.StatusInternalServerError, err) return @@ -364,6 +369,10 @@ func DeletePackageTag(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) + if errors.Is(err, util.ErrNotExist) { + return + } + if err != nil { apiError(ctx, http.StatusInternalServerError, err) return diff --git a/routers/api/packages/nuget/nuget.go b/routers/api/packages/nuget/nuget.go index 07a8de0a68458..f07b526e458d2 100644 --- a/routers/api/packages/nuget/nuget.go +++ b/routers/api/packages/nuget/nuget.go @@ -229,12 +229,13 @@ func RegistrationIndex(ctx *context.Context) { packageName := ctx.PathParam("id") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNuGet, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } @@ -384,12 +385,13 @@ func EnumeratePackageVersionsV3(ctx *context.Context) { packageName := ctx.PathParam("id") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNuGet, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/pub/pub.go b/routers/api/packages/pub/pub.go index e7b07aefd07ab..b487d6073ca91 100644 --- a/routers/api/packages/pub/pub.go +++ b/routers/api/packages/pub/pub.go @@ -84,12 +84,13 @@ func EnumeratePackageVersions(ctx *context.Context) { packageName := ctx.PathParam("id") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypePub, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/pypi/pypi.go b/routers/api/packages/pypi/pypi.go index 199f4e747871c..b01d7725f5eac 100644 --- a/routers/api/packages/pypi/pypi.go +++ b/routers/api/packages/pypi/pypi.go @@ -17,6 +17,7 @@ import ( packages_module "code.gitea.io/gitea/modules/packages" pypi_module "code.gitea.io/gitea/modules/packages/pypi" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/routers/api/packages/helper" "code.gitea.io/gitea/services/context" @@ -50,12 +51,13 @@ func PackageMetadata(ctx *context.Context) { packageName := normalizer.Replace(ctx.PathParam("id")) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypePyPI, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/rubygems/rubygems.go b/routers/api/packages/rubygems/rubygems.go index de8c7ef3ed009..0f01c43813a3a 100644 --- a/routers/api/packages/rubygems/rubygems.go +++ b/routers/api/packages/rubygems/rubygems.go @@ -301,14 +301,16 @@ func DeletePackage(ctx *context.Context) { func GetPackageInfo(ctx *context.Context) { packageName := ctx.PathParam("packagename") versions, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, packageName) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, nil) return } - if len(versions) == 0 { - apiError(ctx, http.StatusNotFound, nil) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } + infoContent, err := makePackageInfo(ctx, versions) if err != nil { apiError(ctx, http.StatusInternalServerError, err) @@ -330,13 +332,12 @@ func GetAllPackagesVersions(ctx *context.Context) { out.WriteString("---\n") for _, pkg := range packages { versions, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, pkg.Name) - if err != nil { + if errors.Is(err, util.ErrNotExist) { + continue + } else if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } - if len(versions) == 0 { - continue - } info, err := makePackageInfo(ctx, versions) if err != nil { diff --git a/routers/api/packages/swift/swift.go b/routers/api/packages/swift/swift.go index 4d7fb8b1a6992..86f9b53e6d24e 100644 --- a/routers/api/packages/swift/swift.go +++ b/routers/api/packages/swift/swift.go @@ -129,12 +129,13 @@ func EnumeratePackageVersions(ctx *context.Context) { packageName := ctx.PathParam("name") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeSwift, buildPackageID(packageScope, packageName)) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, nil) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, nil) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/routers/api/packages/vagrant/vagrant.go b/routers/api/packages/vagrant/vagrant.go index 3afaa5de1f3c3..ed9b0b17e46c8 100644 --- a/routers/api/packages/vagrant/vagrant.go +++ b/routers/api/packages/vagrant/vagrant.go @@ -16,6 +16,7 @@ import ( packages_module "code.gitea.io/gitea/modules/packages" vagrant_module "code.gitea.io/gitea/modules/packages/vagrant" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" @@ -45,13 +46,14 @@ func CheckAuthenticate(ctx *context.Context) { } func CheckBoxAvailable(ctx *context.Context) { - pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeVagrant, ctx.PathParam("name")) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + _, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeVagrant, ctx.PathParam("name")) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } @@ -103,12 +105,13 @@ func packageDescriptorToMetadata(baseURL string, pd *packages_model.PackageDescr func EnumeratePackageVersions(ctx *context.Context) { pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeVagrant, ctx.PathParam("name")) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if errors.Is(err, util.ErrNotExist) { + apiError(ctx, http.StatusNotFound, err) return } - if len(pvs) == 0 { - apiError(ctx, http.StatusNotFound, err) + + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } From 591a0f22b39fcc9bcf0d7961be34cc514aff8564 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 21 Feb 2025 22:45:17 +0800 Subject: [PATCH 2/4] make maven package search legacy package names --- models/packages/package_version.go | 5 ----- routers/api/packages/chef/chef.go | 17 ++++++++------- routers/api/packages/composer/composer.go | 9 ++++---- routers/api/packages/goproxy/goproxy.go | 8 ++++---- routers/api/packages/npm/npm.go | 25 ++++++++--------------- routers/api/packages/nuget/nuget.go | 18 ++++++++-------- routers/api/packages/pub/pub.go | 9 ++++---- routers/api/packages/pypi/pypi.go | 10 ++++----- routers/api/packages/rubygems/rubygems.go | 17 ++++++++------- routers/api/packages/swift/swift.go | 9 ++++---- routers/api/packages/vagrant/vagrant.go | 21 ++++++++----------- 11 files changed, 61 insertions(+), 87 deletions(-) diff --git a/models/packages/package_version.go b/models/packages/package_version.go index e318e299b597e..278e8e3a86b0e 100644 --- a/models/packages/package_version.go +++ b/models/packages/package_version.go @@ -139,11 +139,6 @@ func GetVersionsByPackageName(ctx context.Context, ownerID int64, packageType Ty }, IsInternal: optional.Some(false), }) - - if len(pvs) == 0 { - return nil, util.ErrNotExist - } - return pvs, err } diff --git a/routers/api/packages/chef/chef.go b/routers/api/packages/chef/chef.go index ff70f14e01470..a0c8c5696c6ff 100644 --- a/routers/api/packages/chef/chef.go +++ b/routers/api/packages/chef/chef.go @@ -153,15 +153,14 @@ func PackageMetadata(ctx *context.Context) { packageName := ctx.PathParam("name") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeChef, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, nil) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, nil) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { @@ -383,13 +382,13 @@ func DeletePackageVersion(ctx *context.Context) { // https://github.com/chef/chef/blob/main/knife/lib/chef/knife/supermarket_unshare.rb func DeletePackage(ctx *context.Context) { pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeChef, ctx.PathParam("name")) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) return } diff --git a/routers/api/packages/composer/composer.go b/routers/api/packages/composer/composer.go index ca5023bcb7acd..c6c14e5cf4fb0 100644 --- a/routers/api/packages/composer/composer.go +++ b/routers/api/packages/composer/composer.go @@ -138,15 +138,14 @@ func PackageMetadata(ctx *context.Context) { projectName := ctx.PathParam("projectname") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeComposer, vendorName+"/"+projectName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { diff --git a/routers/api/packages/goproxy/goproxy.go b/routers/api/packages/goproxy/goproxy.go index e306a5af924b2..bde29df73935e 100644 --- a/routers/api/packages/goproxy/goproxy.go +++ b/routers/api/packages/goproxy/goproxy.go @@ -29,14 +29,14 @@ func apiError(ctx *context.Context, status int, obj any) { func EnumeratePackageVersions(ctx *context.Context) { pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeGo, ctx.PathParam("name")) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } sort.Slice(pvs, func(i, j int) bool { return pvs[i].CreatedUnix < pvs[j].CreatedUnix diff --git a/routers/api/packages/npm/npm.go b/routers/api/packages/npm/npm.go index 9e50a8beda5eb..6ec46bcb36573 100644 --- a/routers/api/packages/npm/npm.go +++ b/routers/api/packages/npm/npm.go @@ -56,15 +56,14 @@ func PackageMetadata(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { @@ -284,13 +283,13 @@ func DeletePackage(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) return } @@ -309,10 +308,6 @@ func ListPackageTags(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } if err != nil { apiError(ctx, http.StatusInternalServerError, err) return @@ -369,10 +364,6 @@ func DeletePackageTag(ctx *context.Context) { packageName := packageNameFromParams(ctx) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNpm, packageName) - if errors.Is(err, util.ErrNotExist) { - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return diff --git a/routers/api/packages/nuget/nuget.go b/routers/api/packages/nuget/nuget.go index f07b526e458d2..07a8de0a68458 100644 --- a/routers/api/packages/nuget/nuget.go +++ b/routers/api/packages/nuget/nuget.go @@ -229,15 +229,14 @@ func RegistrationIndex(ctx *context.Context) { packageName := ctx.PathParam("id") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNuGet, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { @@ -385,15 +384,14 @@ func EnumeratePackageVersionsV3(ctx *context.Context) { packageName := ctx.PathParam("id") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeNuGet, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } resp := createPackageVersionsResponse(pvs) diff --git a/routers/api/packages/pub/pub.go b/routers/api/packages/pub/pub.go index b487d6073ca91..e7b07aefd07ab 100644 --- a/routers/api/packages/pub/pub.go +++ b/routers/api/packages/pub/pub.go @@ -84,15 +84,14 @@ func EnumeratePackageVersions(ctx *context.Context) { packageName := ctx.PathParam("id") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypePub, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { diff --git a/routers/api/packages/pypi/pypi.go b/routers/api/packages/pypi/pypi.go index b01d7725f5eac..199f4e747871c 100644 --- a/routers/api/packages/pypi/pypi.go +++ b/routers/api/packages/pypi/pypi.go @@ -17,7 +17,6 @@ import ( packages_module "code.gitea.io/gitea/modules/packages" pypi_module "code.gitea.io/gitea/modules/packages/pypi" "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/routers/api/packages/helper" "code.gitea.io/gitea/services/context" @@ -51,15 +50,14 @@ func PackageMetadata(ctx *context.Context) { packageName := normalizer.Replace(ctx.PathParam("id")) pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypePyPI, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { diff --git a/routers/api/packages/rubygems/rubygems.go b/routers/api/packages/rubygems/rubygems.go index 0f01c43813a3a..de8c7ef3ed009 100644 --- a/routers/api/packages/rubygems/rubygems.go +++ b/routers/api/packages/rubygems/rubygems.go @@ -301,16 +301,14 @@ func DeletePackage(ctx *context.Context) { func GetPackageInfo(ctx *context.Context) { packageName := ctx.PathParam("packagename") versions, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, packageName) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, nil) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } - + if len(versions) == 0 { + apiError(ctx, http.StatusNotFound, nil) + return + } infoContent, err := makePackageInfo(ctx, versions) if err != nil { apiError(ctx, http.StatusInternalServerError, err) @@ -332,12 +330,13 @@ func GetAllPackagesVersions(ctx *context.Context) { out.WriteString("---\n") for _, pkg := range packages { versions, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, pkg.Name) - if errors.Is(err, util.ErrNotExist) { - continue - } else if err != nil { + if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(versions) == 0 { + continue + } info, err := makePackageInfo(ctx, versions) if err != nil { diff --git a/routers/api/packages/swift/swift.go b/routers/api/packages/swift/swift.go index 86f9b53e6d24e..4d7fb8b1a6992 100644 --- a/routers/api/packages/swift/swift.go +++ b/routers/api/packages/swift/swift.go @@ -129,15 +129,14 @@ func EnumeratePackageVersions(ctx *context.Context) { packageName := ctx.PathParam("name") pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeSwift, buildPackageID(packageScope, packageName)) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, nil) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, nil) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { diff --git a/routers/api/packages/vagrant/vagrant.go b/routers/api/packages/vagrant/vagrant.go index ed9b0b17e46c8..3afaa5de1f3c3 100644 --- a/routers/api/packages/vagrant/vagrant.go +++ b/routers/api/packages/vagrant/vagrant.go @@ -16,7 +16,6 @@ import ( packages_module "code.gitea.io/gitea/modules/packages" vagrant_module "code.gitea.io/gitea/modules/packages/vagrant" "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" "code.gitea.io/gitea/services/context" packages_service "code.gitea.io/gitea/services/packages" @@ -46,16 +45,15 @@ func CheckAuthenticate(ctx *context.Context) { } func CheckBoxAvailable(ctx *context.Context) { - _, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeVagrant, ctx.PathParam("name")) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - + pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeVagrant, ctx.PathParam("name")) if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } ctx.JSON(http.StatusOK, nil) // needs to be Content-Type: application/json } @@ -105,15 +103,14 @@ func packageDescriptorToMetadata(baseURL string, pd *packages_model.PackageDescr func EnumeratePackageVersions(ctx *context.Context) { pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeVagrant, ctx.PathParam("name")) - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - return - } - if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + if len(pvs) == 0 { + apiError(ctx, http.StatusNotFound, err) + return + } pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { From 7fe5a36f797d937bab96073b2c1590758c5ff3ab Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 21 Feb 2025 22:49:18 +0800 Subject: [PATCH 3/4] search legacy maven package names when listing --- routers/api/packages/maven/maven.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/routers/api/packages/maven/maven.go b/routers/api/packages/maven/maven.go index 0785fcb55b918..df91794668263 100644 --- a/routers/api/packages/maven/maven.go +++ b/routers/api/packages/maven/maven.go @@ -84,22 +84,19 @@ func handlePackageFile(ctx *context.Context, serveContent bool) { } func serveMavenMetadata(ctx *context.Context, params parameters) { - // /com/foo/project/maven-metadata.xml[.md5/.sha1/.sha256/.sha512] - - pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageName()) - if errors.Is(err, util.ErrNotExist) { - pvs, err = packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageNameLegacy()) - } - - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist) + // path pattern: /com/foo/project/maven-metadata.xml[.md5/.sha1/.sha256/.sha512] + // in case there are legacy package names ("GroupID-ArtifactID") we need to check both, new packages always use ":" as separator("GroupID:ArtifactID") + pvsLegacy, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageNameLegacy()) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) return } - + pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageName()) if err != nil { apiError(ctx, http.StatusInternalServerError, err) return } + pvs = append(pvsLegacy, pvs...) pds, err := packages_model.GetPackageDescriptors(ctx, pvs) if err != nil { From 795b3f551e26c90cc073d81b4a341b530fb12d7f Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 21 Feb 2025 23:01:43 +0800 Subject: [PATCH 4/4] add test --- routers/api/packages/maven/api.go | 9 +++------ routers/api/packages/maven/maven.go | 2 +- tests/integration/api_packages_maven_test.go | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/routers/api/packages/maven/api.go b/routers/api/packages/maven/api.go index 167fe42b56d51..ec6b9cfb0e05b 100644 --- a/routers/api/packages/maven/api.go +++ b/routers/api/packages/maven/api.go @@ -8,7 +8,6 @@ import ( "strings" packages_model "code.gitea.io/gitea/models/packages" - maven_module "code.gitea.io/gitea/modules/packages/maven" ) // MetadataResponse https://maven.apache.org/ref/3.2.5/maven-repository-metadata/repository-metadata.html @@ -22,7 +21,7 @@ type MetadataResponse struct { } // pds is expected to be sorted ascending by CreatedUnix -func createMetadataResponse(pds []*packages_model.PackageDescriptor) *MetadataResponse { +func createMetadataResponse(pds []*packages_model.PackageDescriptor, groupID, artifactID string) *MetadataResponse { var release *packages_model.PackageDescriptor versions := make([]string, 0, len(pds)) @@ -35,11 +34,9 @@ func createMetadataResponse(pds []*packages_model.PackageDescriptor) *MetadataRe latest := pds[len(pds)-1] - metadata := latest.Metadata.(*maven_module.Metadata) - resp := &MetadataResponse{ - GroupID: metadata.GroupID, - ArtifactID: metadata.ArtifactID, + GroupID: groupID, + ArtifactID: artifactID, Latest: latest.Version.Version, Version: versions, } diff --git a/routers/api/packages/maven/maven.go b/routers/api/packages/maven/maven.go index df91794668263..4f9ced25b4bba 100644 --- a/routers/api/packages/maven/maven.go +++ b/routers/api/packages/maven/maven.go @@ -109,7 +109,7 @@ func serveMavenMetadata(ctx *context.Context, params parameters) { return pds[i].Version.CreatedUnix < pds[j].Version.CreatedUnix }) - xmlMetadata, err := xml.Marshal(createMetadataResponse(pds)) + xmlMetadata, err := xml.Marshal(createMetadataResponse(pds, params.GroupID, params.ArtifactID)) if err != nil { apiError(ctx, http.StatusInternalServerError, err) return diff --git a/tests/integration/api_packages_maven_test.go b/tests/integration/api_packages_maven_test.go index 486a5af93e17b..408c8805c2412 100644 --- a/tests/integration/api_packages_maven_test.go +++ b/tests/integration/api_packages_maven_test.go @@ -80,6 +80,7 @@ func TestPackageMaven(t *testing.T) { t.Run("UploadLegacy", func(t *testing.T) { defer tests.PrintCurrentTest(t)() + // try to upload a package with legacy package name (will be saved as "GroupID-ArtifactID") legacyRootLink := "/api/packages/user2/maven/com/gitea/legacy-project" req := NewRequestWithBody(t, "PUT", legacyRootLink+"/1.0.2/any-file-name?use_legacy_package_name=1", strings.NewReader("test-content")).AddBasicAuth(user.Name) MakeRequest(t, req, http.StatusCreated) @@ -97,6 +98,13 @@ func TestPackageMaven(t *testing.T) { req = NewRequest(t, "GET", "/user2/-/packages/maven/com.gitea%3Alegacy-project/1.0.2") MakeRequest(t, req, http.StatusNotFound) + // legacy package names should also be able to be listed + req = NewRequest(t, "GET", legacyRootLink+"/maven-metadata.xml").AddBasicAuth(user.Name) + resp := MakeRequest(t, req, http.StatusOK) + respBody := resp.Body.String() + assert.Contains(t, respBody, "1.0.2") + + // then upload a package with correct package name (will be saved as "GroupID:ArtifactID") req = NewRequestWithBody(t, "PUT", legacyRootLink+"/1.0.3/any-file-name", strings.NewReader("test-content")).AddBasicAuth(user.Name) MakeRequest(t, req, http.StatusCreated) _, err = packages.GetPackageByName(db.DefaultContext, user.ID, packages.TypeMaven, "com.gitea-legacy-project") @@ -114,6 +122,12 @@ func TestPackageMaven(t *testing.T) { req = NewRequest(t, "GET", "/user2/-/packages/maven/com.gitea%3Alegacy-project/1.0.2") MakeRequest(t, req, http.StatusOK) + // now 2 packages should be listed + req = NewRequest(t, "GET", legacyRootLink+"/maven-metadata.xml").AddBasicAuth(user.Name) + resp = MakeRequest(t, req, http.StatusOK) + respBody = resp.Body.String() + assert.Contains(t, respBody, "1.0.2") + assert.Contains(t, respBody, "1.0.3") require.NoError(t, packages.DeletePackageByID(db.DefaultContext, p.ID)) })