summaryrefslogtreecommitdiffstats
path: root/vespa-enforcer-extensions
diff options
context:
space:
mode:
authorgjoranv <gv@yahooinc.com>2023-07-21 15:58:04 +0200
committergjoranv <gv@yahooinc.com>2023-07-21 16:57:27 +0200
commit0e5e1df968e472f3d43615d26582da87350be8d6 (patch)
tree1a00a4545c12824db70f4133d66a83d1ee540523 /vespa-enforcer-extensions
parent7dcdf5a892a57f02df7edb53500133e9648d33c9 (diff)
Allow version ranges in enforcer rules.
Diffstat (limited to 'vespa-enforcer-extensions')
-rw-r--r--vespa-enforcer-extensions/pom.xml5
-rw-r--r--vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependencies.java22
-rw-r--r--vespa-enforcer-extensions/src/test/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependenciesTest.java28
3 files changed, 51 insertions, 4 deletions
diff --git a/vespa-enforcer-extensions/pom.xml b/vespa-enforcer-extensions/pom.xml
index 4c006cb393f..9d8e99156f3 100644
--- a/vespa-enforcer-extensions/pom.xml
+++ b/vespa-enforcer-extensions/pom.xml
@@ -26,6 +26,11 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.apache.maven.enforcer</groupId>
+ <artifactId>enforcer-rules</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<scope>provided</scope>
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);
}