diff options
author | gjoranv <gv@yahooinc.com> | 2023-07-21 15:58:04 +0200 |
---|---|---|
committer | gjoranv <gv@yahooinc.com> | 2023-07-21 16:57:27 +0200 |
commit | 0e5e1df968e472f3d43615d26582da87350be8d6 (patch) | |
tree | 1a00a4545c12824db70f4133d66a83d1ee540523 /vespa-enforcer-extensions/src | |
parent | 7dcdf5a892a57f02df7edb53500133e9648d33c9 (diff) |
Allow version ranges in enforcer rules.
Diffstat (limited to 'vespa-enforcer-extensions/src')
2 files changed, 46 insertions, 4 deletions
diff --git a/vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependencies.java b/vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependencies.java index 05ae7005c1f..bb70ebf73a3 100644 --- a/vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependencies.java +++ b/vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependencies.java @@ -3,9 +3,13 @@ package com.yahoo.vespa.maven.plugin.enforcer; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; +import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; +import org.apache.maven.enforcer.rules.utils.ArtifactMatcher; import org.apache.maven.execution.MavenSession; import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; @@ -130,13 +134,23 @@ public class EnforceDependencies implements EnforcerRule { /** Matches simple glob like patterns using '?' and '*' */ private static boolean segmentMatches(String value, String segmentPattern) { String regex = segmentPattern - .replace(".", "\\.").replace("*", ".*").replace(":", "\\:").replace('?', '.').replace("(", "\\(") - .replace(")", "\\)"); + .replace(".", "\\.").replace("*", ".*").replace(":", "\\:") + .replace('?', '.').replace("(", "\\(").replace(")", "\\)") + .replace("[", "\\[").replace("]", "\\]"); return Pattern.matches(regex, value); } - private static boolean versionMatches(String rawVersion, String segmentPattern) { - return segmentMatches(rawVersion, segmentPattern); + private static boolean versionMatches(String rawVersion, String segmentPattern) throws EnforcerRuleException { + if (segmentMatches(rawVersion, segmentPattern)) return true; + + // Handle version ranges. Note that ArtifactMatcher treats a single version without brackets as a minimum version. + if (! (segmentPattern.startsWith("[") || segmentPattern.startsWith("("))) return false; + try { + var range = VersionRange.createFromVersionSpec(segmentPattern); + return ArtifactMatcher.containsVersion(range, new DefaultArtifactVersion(rawVersion)); + } catch (InvalidVersionSpecificationException e) { + throw new EnforcerRuleException("Invalid version range: " + segmentPattern, e); + } } public void setAllowed(List<String> allowed) { this.allowedDependencies = allowed; } diff --git a/vespa-enforcer-extensions/src/test/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependenciesTest.java b/vespa-enforcer-extensions/src/test/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependenciesTest.java index c2e3bdaab56..fe372f74cb5 100644 --- a/vespa-enforcer-extensions/src/test/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependenciesTest.java +++ b/vespa-enforcer-extensions/src/test/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependenciesTest.java @@ -136,6 +136,34 @@ class EnforceDependenciesTest { assertEquals(expectedErrorMessage, exception.getMessage()); } + @Test + void matches_on_version_in_allowed_range() { + var dependencies = Set.of( + artifact("com.yahoo.testing", "test", "1.2.3", "compile")); + var rules = Set.of("com.yahoo.testing:test:jar:[1.0,2):compile"); + assertDoesNotThrow(() -> EnforceDependencies.validateDependencies(dependencies, rules, true)); + } + + @Test + void fails_on_version_outside_allowed_range() { + var dependencies = Set.of( + artifact("com.yahoo.testing", "test", "2", "compile")); + var rules = Set.of("com.yahoo.testing:test:jar:[1.0,2):compile"); + + var exception = assertThrows( + EnforcerRuleException.class, + () -> EnforceDependencies.validateDependencies(dependencies, rules, true)); + String expectedErrorMessage = + """ + Vespa dependency enforcer failed: + Dependencies not matching any rule: + - com.yahoo.testing:test:jar:2:compile + Rules not matching any dependency: + - com.yahoo.testing:test:jar:[1.0,2):compile + """; + assertEquals(expectedErrorMessage, exception.getMessage()); + } + private static Artifact artifact(String groupId, String artifactId, String version, String scope) { return artifact(groupId, artifactId, version, scope, null); } |