fix: maven fallback to parent groupId

This commit is contained in:
Julian Schlarb 2024-12-19 12:30:06 +01:00
parent 248977c518
commit b15352ceb0
2 changed files with 60 additions and 1 deletions

View file

@ -7,6 +7,7 @@ import (
"encoding/xml" "encoding/xml"
"io" "io"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/modules/validation"
"golang.org/x/net/html/charset" "golang.org/x/net/html/charset"
@ -49,8 +50,16 @@ type pomStruct struct {
Version string `xml:"version"` Version string `xml:"version"`
Scope string `xml:"scope"` Scope string `xml:"scope"`
} `xml:"dependencies>dependency"` } `xml:"dependencies>dependency"`
Parent struct {
GroupID string `xml:"groupId"`
ArtifactID string `xml:"artifactId"`
Version string `xml:"version"`
RelativePath string `xml:"relativePath"`
} `xml:"parent"`
} }
var ErrNoGroupID = util.NewInvalidArgumentErrorf("group ID is missing")
// ParsePackageMetaData parses the metadata of a pom file // ParsePackageMetaData parses the metadata of a pom file
func ParsePackageMetaData(r io.Reader) (*Metadata, error) { func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
var pom pomStruct var pom pomStruct
@ -65,6 +74,17 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
pom.URL = "" pom.URL = ""
} }
groupID := pom.GroupID
if groupID == "" {
// If a project inherits from a parent project, the groupId element is optional.
// Refer to: https://maven.apache.org/pom.html#Inheritance
if pom.Parent.GroupID == "" {
return nil, ErrNoGroupID
}
groupID = pom.Parent.GroupID
}
licenses := make([]string, 0, len(pom.Licenses)) licenses := make([]string, 0, len(pom.Licenses))
for _, l := range pom.Licenses { for _, l := range pom.Licenses {
if l.Name != "" { if l.Name != "" {
@ -82,7 +102,7 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
} }
return &Metadata{ return &Metadata{
GroupID: pom.GroupID, GroupID: groupID,
ArtifactID: pom.ArtifactID, ArtifactID: pom.ArtifactID,
Name: pom.Name, Name: pom.Name,
Description: pom.Description, Description: pom.Description,

View file

@ -14,6 +14,7 @@ import (
const ( const (
groupID = "org.gitea" groupID = "org.gitea"
parentGroupID = "org.gitea.parent"
artifactID = "my-project" artifactID = "my-project"
version = "1.0.1" version = "1.0.1"
name = "My Gitea Project" name = "My Gitea Project"
@ -27,6 +28,11 @@ const (
const pomContent = `<?xml version="1.0"?> const pomContent = `<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>` + parentGroupID + `</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<groupId>` + groupID + `</groupId> <groupId>` + groupID + `</groupId>
<artifactId>` + artifactID + `</artifactId> <artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version> <version>` + version + `</version>
@ -47,6 +53,24 @@ const pomContent = `<?xml version="1.0"?>
</dependencies> </dependencies>
</project>` </project>`
const pomWithParentGroupID = `<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>` + parentGroupID + `</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version>
</project>`
const pomWithMissingGroupID = `<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version>
</project>`
func TestParsePackageMetaData(t *testing.T) { func TestParsePackageMetaData(t *testing.T) {
t.Run("InvalidFile", func(t *testing.T) { t.Run("InvalidFile", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader("")) m, err := ParsePackageMetaData(strings.NewReader(""))
@ -87,4 +111,19 @@ func TestParsePackageMetaData(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.NotNil(t, m) assert.NotNil(t, m)
}) })
t.Run("UseParentGroupID", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(pomWithParentGroupID))
require.NoError(t, err)
assert.NotNil(t, m)
assert.Equal(t, parentGroupID, m.GroupID)
})
t.Run("MissingGroupIDThrowsError", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(pomWithMissingGroupID))
assert.Nil(t, m)
require.Error(t, err)
assert.Equal(t, ErrNoGroupID, err)
})
} }