Skip to content

Commit a61014e

Browse files
dianaStr7diana.strebkova@t-systems.comwxiaoguang
authored
Fix for Maven Package Naming Convention Handling (#33678)
Make legacy package names could be listed and add tests --------- Co-authored-by: [email protected] <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
1 parent 4adb7ca commit a61014e

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

routers/api/packages/maven/api.go

+3-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"strings"
99

1010
packages_model "code.gitea.io/gitea/models/packages"
11-
maven_module "code.gitea.io/gitea/modules/packages/maven"
1211
)
1312

1413
// MetadataResponse https://maven.apache.org/ref/3.2.5/maven-repository-metadata/repository-metadata.html
@@ -22,7 +21,7 @@ type MetadataResponse struct {
2221
}
2322

2423
// pds is expected to be sorted ascending by CreatedUnix
25-
func createMetadataResponse(pds []*packages_model.PackageDescriptor) *MetadataResponse {
24+
func createMetadataResponse(pds []*packages_model.PackageDescriptor, groupID, artifactID string) *MetadataResponse {
2625
var release *packages_model.PackageDescriptor
2726

2827
versions := make([]string, 0, len(pds))
@@ -35,11 +34,9 @@ func createMetadataResponse(pds []*packages_model.PackageDescriptor) *MetadataRe
3534

3635
latest := pds[len(pds)-1]
3736

38-
metadata := latest.Metadata.(*maven_module.Metadata)
39-
4037
resp := &MetadataResponse{
41-
GroupID: metadata.GroupID,
42-
ArtifactID: metadata.ArtifactID,
38+
GroupID: groupID,
39+
ArtifactID: artifactID,
4340
Latest: latest.Version.Version,
4441
Version: versions,
4542
}

routers/api/packages/maven/maven.go

+8-9
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,19 @@ func handlePackageFile(ctx *context.Context, serveContent bool) {
8484
}
8585

8686
func serveMavenMetadata(ctx *context.Context, params parameters) {
87-
// /com/foo/project/maven-metadata.xml[.md5/.sha1/.sha256/.sha512]
88-
89-
pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageName())
90-
if errors.Is(err, util.ErrNotExist) {
91-
pvs, err = packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageNameLegacy())
92-
}
87+
// path pattern: /com/foo/project/maven-metadata.xml[.md5/.sha1/.sha256/.sha512]
88+
// in case there are legacy package names ("GroupID-ArtifactID") we need to check both, new packages always use ":" as separator("GroupID:ArtifactID")
89+
pvsLegacy, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageNameLegacy())
9390
if err != nil {
9491
apiError(ctx, http.StatusInternalServerError, err)
9592
return
9693
}
97-
if len(pvs) == 0 {
98-
apiError(ctx, http.StatusNotFound, packages_model.ErrPackageNotExist)
94+
pvs, err := packages_model.GetVersionsByPackageName(ctx, ctx.Package.Owner.ID, packages_model.TypeMaven, params.toInternalPackageName())
95+
if err != nil {
96+
apiError(ctx, http.StatusInternalServerError, err)
9997
return
10098
}
99+
pvs = append(pvsLegacy, pvs...)
101100

102101
pds, err := packages_model.GetPackageDescriptors(ctx, pvs)
103102
if err != nil {
@@ -110,7 +109,7 @@ func serveMavenMetadata(ctx *context.Context, params parameters) {
110109
return pds[i].Version.CreatedUnix < pds[j].Version.CreatedUnix
111110
})
112111

113-
xmlMetadata, err := xml.Marshal(createMetadataResponse(pds))
112+
xmlMetadata, err := xml.Marshal(createMetadataResponse(pds, params.GroupID, params.ArtifactID))
114113
if err != nil {
115114
apiError(ctx, http.StatusInternalServerError, err)
116115
return

tests/integration/api_packages_maven_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ func TestPackageMaven(t *testing.T) {
8080
t.Run("UploadLegacy", func(t *testing.T) {
8181
defer tests.PrintCurrentTest(t)()
8282

83+
// try to upload a package with legacy package name (will be saved as "GroupID-ArtifactID")
8384
legacyRootLink := "/api/packages/user2/maven/com/gitea/legacy-project"
8485
req := NewRequestWithBody(t, "PUT", legacyRootLink+"/1.0.2/any-file-name?use_legacy_package_name=1", strings.NewReader("test-content")).AddBasicAuth(user.Name)
8586
MakeRequest(t, req, http.StatusCreated)
@@ -97,6 +98,13 @@ func TestPackageMaven(t *testing.T) {
9798
req = NewRequest(t, "GET", "/user2/-/packages/maven/com.gitea%3Alegacy-project/1.0.2")
9899
MakeRequest(t, req, http.StatusNotFound)
99100

101+
// legacy package names should also be able to be listed
102+
req = NewRequest(t, "GET", legacyRootLink+"/maven-metadata.xml").AddBasicAuth(user.Name)
103+
resp := MakeRequest(t, req, http.StatusOK)
104+
respBody := resp.Body.String()
105+
assert.Contains(t, respBody, "<version>1.0.2</version>")
106+
107+
// then upload a package with correct package name (will be saved as "GroupID:ArtifactID")
100108
req = NewRequestWithBody(t, "PUT", legacyRootLink+"/1.0.3/any-file-name", strings.NewReader("test-content")).AddBasicAuth(user.Name)
101109
MakeRequest(t, req, http.StatusCreated)
102110
_, err = packages.GetPackageByName(db.DefaultContext, user.ID, packages.TypeMaven, "com.gitea-legacy-project")
@@ -114,6 +122,12 @@ func TestPackageMaven(t *testing.T) {
114122
req = NewRequest(t, "GET", "/user2/-/packages/maven/com.gitea%3Alegacy-project/1.0.2")
115123
MakeRequest(t, req, http.StatusOK)
116124

125+
// now 2 packages should be listed
126+
req = NewRequest(t, "GET", legacyRootLink+"/maven-metadata.xml").AddBasicAuth(user.Name)
127+
resp = MakeRequest(t, req, http.StatusOK)
128+
respBody = resp.Body.String()
129+
assert.Contains(t, respBody, "<version>1.0.2</version>")
130+
assert.Contains(t, respBody, "<version>1.0.3</version>")
117131
require.NoError(t, packages.DeletePackageByID(db.DefaultContext, p.ID))
118132
})
119133

0 commit comments

Comments
 (0)