From b8b7eb93c8512b62dd7ea76a71b2b03a89d14080 Mon Sep 17 00:00:00 2001 From: TenSt Date: Thu, 9 Jul 2026 11:34:49 +0200 Subject: [PATCH] HMS-10986: fix maven counts --- .../foo.bar.1.2.3.rhlw-00001.jar | Bin 0 -> 212 bytes .../foo.bar.1.2.3.rhlw-00001.pom} | 2 +- .../foo.bar.1.2.3.rhlw-00002.jar | Bin 0 -> 212 bytes .../foo.bar.1.2.3.rhlw-00002.pom} | 2 +- .../bar/1.2.3/foo.bar.1.2.3.rhlw-00001.jar | Bin 212 -> 0 bytes .../bar/1.2.3/foo.bar.1.2.3.rhlw-00002.jar | Bin 212 -> 0 bytes .../foo.bar.2.0.1.rhlw-00001.jar | Bin 0 -> 212 bytes .../foo.bar.2.0.1.rhlw-00001.pom | 7 ++ .../bar/2.0.1/foo.bar.2.0.1.rhlw-00001.jar | Bin 212 -> 0 bytes internal/test/integration/maven_test.go | 46 ++++---- pkg/tangy/maven.go | 38 ++++-- pkg/tangy/maven_test.go | 109 ++++++++++++++++++ 12 files changed, 169 insertions(+), 35 deletions(-) create mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3.rhlw-00001/foo.bar.1.2.3.rhlw-00001.jar rename compose_files/pulp/assets/maven-fixture/foo/bar/{1.2.3/foo.bar.1.2.3.pom => 1.2.3.rhlw-00001/foo.bar.1.2.3.rhlw-00001.pom} (83%) create mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3.rhlw-00002/foo.bar.1.2.3.rhlw-00002.jar rename compose_files/pulp/assets/maven-fixture/foo/bar/{2.0.1/foo.bar.2.0.1.pom => 1.2.3.rhlw-00002/foo.bar.1.2.3.rhlw-00002.pom} (83%) delete mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3/foo.bar.1.2.3.rhlw-00001.jar delete mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3/foo.bar.1.2.3.rhlw-00002.jar create mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1.rhlw-00001/foo.bar.2.0.1.rhlw-00001.jar create mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1.rhlw-00001/foo.bar.2.0.1.rhlw-00001.pom delete mode 100644 compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1/foo.bar.2.0.1.rhlw-00001.jar diff --git a/compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3.rhlw-00001/foo.bar.1.2.3.rhlw-00001.jar b/compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3.rhlw-00001/foo.bar.1.2.3.rhlw-00001.jar new file mode 100644 index 0000000000000000000000000000000000000000..518a38a8cde599055654d2d1406cd6772e1d98ea GIT binary patch literal 212 zcmWIWW@h1H00G;$moZiMqZGt|Y!DV4.0.0 foo bar - 1.2.3 + 1.2.3.rhlw-00001 diff --git a/compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3.rhlw-00002/foo.bar.1.2.3.rhlw-00002.jar b/compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3.rhlw-00002/foo.bar.1.2.3.rhlw-00002.jar new file mode 100644 index 0000000000000000000000000000000000000000..518a38a8cde599055654d2d1406cd6772e1d98ea GIT binary patch literal 212 zcmWIWW@h1H00G;$moZiMqZGt|Y!DV4.0.0 foo bar - 2.0.1 + 1.2.3.rhlw-00002 diff --git a/compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3/foo.bar.1.2.3.rhlw-00001.jar b/compose_files/pulp/assets/maven-fixture/foo/bar/1.2.3/foo.bar.1.2.3.rhlw-00001.jar deleted file mode 100644 index e979a547be906e85eff6b0ace6fac4d384236731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmWIWW@h1H0D;1e7co`$qZGt|Y!DVh($ literal 0 HcmV?d00001 diff --git a/compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1.rhlw-00001/foo.bar.2.0.1.rhlw-00001.pom b/compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1.rhlw-00001/foo.bar.2.0.1.rhlw-00001.pom new file mode 100644 index 0000000..c82bb4b --- /dev/null +++ b/compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1.rhlw-00001/foo.bar.2.0.1.rhlw-00001.pom @@ -0,0 +1,7 @@ + + + 4.0.0 + foo + bar + 2.0.1.rhlw-00001 + diff --git a/compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1/foo.bar.2.0.1.rhlw-00001.jar b/compose_files/pulp/assets/maven-fixture/foo/bar/2.0.1/foo.bar.2.0.1.rhlw-00001.jar deleted file mode 100644 index e979a547be906e85eff6b0ace6fac4d384236731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmWIWW@h1H0D;1e7co`$qZGt|Y!DV 5.3.18 +func stripMavenReleaseVersion(version string) string { + return mavenReleaseVersionSuffixRegexp.ReplaceAllString(version, "") +} + // extractRelease extracts the release version from a filename // Example: smallrye-mutiny-vertx-core-3.16.0.rhlw-3002.pom -> rhlw-3002 func extractRelease(filename string) string { - // Pattern to match .rhlw-XXXX or similar release patterns before .pom - // Looks for a dot followed by alphanumeric+dash, then .pom - re := regexp.MustCompile(`\.([a-zA-Z]+-\d+)\.pom$`) - matches := re.FindStringSubmatch(filename) + matches := mavenReleaseFilenameRegexp.FindStringSubmatch(filename) if len(matches) > 1 { return matches[1] } @@ -411,7 +424,8 @@ func (t *tangyImpl) MavenBuildList(ctx context.Context, repositoryHref, groupID, } // MavenRepositoryMetrics returns package, build, and version counts for the latest version of a repository. -// Packages are distinct group_id/artifact_id pairs from .pom artifacts; builds and versions are counted from .jar artifacts. +// All counts are based on .jar artifacts. Builds are distinct full versions (e.g. 5.3.18.rhlw-00003); +// versions are distinct base versions with release qualifiers stripped (e.g. 5.3.18). func (t *tangyImpl) MavenRepositoryMetrics(ctx context.Context, repositoryHref string) (MavenRepositoryMetrics, error) { if repositoryHref == "" { return MavenRepositoryMetrics{}, nil @@ -444,11 +458,7 @@ func (t *tangyImpl) MavenRepositoryMetrics(ctx context.Context, repositoryHref s return MavenRepositoryMetrics{}, err } - pomFilter := ` AND rp.filename LIKE '%.pom'` jarFilter := ` AND rp.filename LIKE '%.jar'` - pomFrom := ` - FROM maven_mavenartifact rp - ` + innerUnion + pomFilter jarFrom := ` FROM maven_mavenartifact rp ` + innerUnion + jarFilter @@ -456,10 +466,14 @@ func (t *tangyImpl) MavenRepositoryMetrics(ctx context.Context, repositoryHref s metricsQuery := ` SELECT (SELECT COUNT(DISTINCT (rp.group_id, rp.artifact_id)) - ` + pomFrom + `) AS package_count, - (SELECT COUNT(*) - ` + jarFrom + `) AS build_count, + ` + jarFrom + `) AS package_count, (SELECT COUNT(DISTINCT (rp.group_id, rp.artifact_id, rp.version)) + ` + jarFrom + `) AS build_count, + (SELECT COUNT(DISTINCT ( + rp.group_id, + rp.artifact_id, + regexp_replace(rp.version, '` + mavenReleaseVersionSuffixPattern + `', '') + )) ` + jarFrom + `) AS version_count` var metrics MavenRepositoryMetrics diff --git a/pkg/tangy/maven_test.go b/pkg/tangy/maven_test.go index 40853bc..3bf5be3 100644 --- a/pkg/tangy/maven_test.go +++ b/pkg/tangy/maven_test.go @@ -50,6 +50,115 @@ func TestParseRepositoryHref(t *testing.T) { } } +func TestStripMavenReleaseVersion(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + version string + want string + }{ + { + name: "release suffix in version", + version: "5.3.18.rhlw-00003", + want: "5.3.18", + }, + { + name: "plain version", + version: "1.2.3", + want: "1.2.3", + }, + { + name: "final qualifier version", + version: "4.1.114.Final", + want: "4.1.114.Final", + }, + { + name: "empty version", + version: "", + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + assert.Equal(t, tt.want, stripMavenReleaseVersion(tt.version)) + }) + } +} + +func TestMavenRepositoryMetricsCounting(t *testing.T) { + t.Parallel() + + type artifact struct { + group string + artifact string + version string + } + + countMetrics := func(artifacts []artifact) (packageCount, buildCount, versionCount int) { + packages := make(map[[2]string]struct{}) + builds := make(map[[3]string]struct{}) + versions := make(map[[3]string]struct{}) + + for _, a := range artifacts { + packages[[2]string{a.group, a.artifact}] = struct{}{} + builds[[3]string{a.group, a.artifact, a.version}] = struct{}{} + baseVersion := stripMavenReleaseVersion(a.version) + versions[[3]string{a.group, a.artifact, baseVersion}] = struct{}{} + } + + return len(packages), len(builds), len(versions) + } + + springCoreVersions := []string{ + "5.3.18.rhlw-00003", + "5.3.18.rhlw-00004", + "5.3.18.rhlw-00005", + "5.3.18.rhlw-00006", + "5.3.18.rhlw-00007", + } + springCoreArtifacts := make([]artifact, 0, len(springCoreVersions)*3) + for _, version := range springCoreVersions { + for range 3 { + springCoreArtifacts = append(springCoreArtifacts, artifact{ + group: "org.springframework", + artifact: "spring-core", + version: version, + }) + } + } + + nettyVersions := []string{ + "4.1.114.Final", + "4.1.127.Final", + "4.1.128.Final", + "4.1.130.Final", + "4.1.133.Final", + } + nettyArtifacts := make([]artifact, 0, len(nettyVersions)*5) + for _, version := range nettyVersions { + for range 5 { + nettyArtifacts = append(nettyArtifacts, artifact{ + group: "io.netty", + artifact: "netty-codec", + version: version, + }) + } + } + + packageCount, buildCount, versionCount := countMetrics(springCoreArtifacts) + assert.Equal(t, 1, packageCount) + assert.Equal(t, 5, buildCount) + assert.Equal(t, 1, versionCount) + + packageCount, buildCount, versionCount = countMetrics(nettyArtifacts) + assert.Equal(t, 1, packageCount) + assert.Equal(t, 5, buildCount) + assert.Equal(t, 5, versionCount) +} + func TestExtractRelease(t *testing.T) { t.Parallel()