Skip to content

Commit

Permalink
feat: support dependencyManagement in Maven poms
Browse files Browse the repository at this point in the history
  • Loading branch information
G-Rath committed Mar 4, 2023
1 parent 8eb1a06 commit 1fac22c
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 15 deletions.
16 changes: 10 additions & 6 deletions pkg/lockfile/fixtures/maven/interpolation.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,15 @@
<artifactId>my.package</artifactId>
<version>${my.package.version}</version>
</dependency>

<dependency>
<groupId>org.mine</groupId>
<artifactId>ranged-package</artifactId>
<version>${version-range}</version>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mine</groupId>
<artifactId>ranged-package</artifactId>
<version>${version-range}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
33 changes: 33 additions & 0 deletions pkg/lockfile/fixtures/maven/with-dependency-management.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<project>
<properties>
<mavenVersion>3.0</mavenVersion>
</properties>

<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.9</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
33 changes: 24 additions & 9 deletions pkg/lockfile/parse-maven-lock.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,11 @@ func (mld MavenLockDependency) ResolveVersion(lockfile MavenLockFile) string {
}

type MavenLockFile struct {
XMLName xml.Name `xml:"project"`
ModelVersion string `xml:"modelVersion"`
Properties MavenLockProperties `xml:"properties"`
Dependencies []MavenLockDependency `xml:"dependencies>dependency"`
XMLName xml.Name `xml:"project"`
ModelVersion string `xml:"modelVersion"`
Properties MavenLockProperties `xml:"properties"`
Dependencies []MavenLockDependency `xml:"dependencies>dependency"`
ManagedDependencies []MavenLockDependency `xml:"dependencyManagement>dependencies>dependency"`
}

const MavenEcosystem Ecosystem = "Maven"
Expand Down Expand Up @@ -107,16 +108,30 @@ func ParseMavenLock(pathToLockfile string) ([]PackageDetails, error) {
return []PackageDetails{}, fmt.Errorf("could not parse %s: %w", pathToLockfile, err)
}

packages := make([]PackageDetails, 0, len(parsedLockfile.Dependencies))
details := map[string]PackageDetails{}

for _, lockPackage := range parsedLockfile.Dependencies {
packages = append(packages, PackageDetails{
Name: lockPackage.GroupID + ":" + lockPackage.ArtifactID,
finalName := lockPackage.GroupID + ":" + lockPackage.ArtifactID

details[finalName] = PackageDetails{
Name: finalName,
Version: lockPackage.ResolveVersion(*parsedLockfile),
Ecosystem: MavenEcosystem,
CompareAs: MavenEcosystem,
})
}
}

// managed dependencies take precedent over standard dependencies
for _, lockPackage := range parsedLockfile.ManagedDependencies {
finalName := lockPackage.GroupID + ":" + lockPackage.ArtifactID

details[finalName] = PackageDetails{
Name: finalName,
Version: lockPackage.ResolveVersion(*parsedLockfile),
Ecosystem: MavenEcosystem,
CompareAs: MavenEcosystem,
}
}

return packages, nil
return pkgDetailsMapToSlice(details), nil
}
31 changes: 31 additions & 0 deletions pkg/lockfile/parse-maven-lock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,37 @@ func TestParseMavenLock_TwoPackages(t *testing.T) {
})
}

func TestParseMavenLock_WithDependencyManagement(t *testing.T) {
t.Parallel()

packages, err := lockfile.ParseMavenLock("fixtures/maven/with-dependency-management.xml")

if err != nil {
t.Errorf("Got unexpected error: %v", err)
}

expectPackages(t, packages, []lockfile.PackageDetails{
{
Name: "io.netty:netty-all",
Version: "4.1.42.Final",
Ecosystem: lockfile.MavenEcosystem,
CompareAs: lockfile.MavenEcosystem,
},
{
Name: "org.slf4j:slf4j-log4j12",
Version: "1.7.25",
Ecosystem: lockfile.MavenEcosystem,
CompareAs: lockfile.MavenEcosystem,
},
{
Name: "com.google.code.findbugs:jsr305",
Version: "3.0.2",
Ecosystem: lockfile.MavenEcosystem,
CompareAs: lockfile.MavenEcosystem,
},
})
}

func TestParseMavenLock_Interpolation(t *testing.T) {
t.Parallel()

Expand Down

0 comments on commit 1fac22c

Please sign in to comment.