@@ -103,6 +103,13 @@ class MuzzlePlugin implements Plugin<Project> {
103103 muzzleDirectiveToArtifacts(muzzleDirective, system, session). collect() { Artifact singleVersion ->
104104 runAfter = addMuzzleTask(muzzleDirective, singleVersion, project, runAfter, bootstrapProject, toolingProject)
105105 }
106+ if (muzzleDirective. assertInverse) {
107+ inverseOf(muzzleDirective, system, session). collect() { MuzzleDirective inverseDirective ->
108+ muzzleDirectiveToArtifacts(inverseDirective, system, session). collect() { Artifact singleVersion ->
109+ runAfter = addMuzzleTask(inverseDirective, singleVersion, project, runAfter, bootstrapProject, toolingProject)
110+ }
111+ }
112+ }
106113 }
107114 }
108115 }
@@ -179,6 +186,41 @@ class MuzzlePlugin implements Plugin<Project> {
179186 return allVersionArtifacts
180187 }
181188
189+ /**
190+ * Create a list of muzzle directives which assert the opposite of the given MuzzleDirective.
191+ */
192+ private static List<MuzzleDirective > inverseOf (MuzzleDirective muzzleDirective , RepositorySystem system , RepositorySystemSession session ) {
193+ List<MuzzleDirective > inverseDirectives = new ArrayList<> ()
194+
195+ final Artifact allVerisonsArtifact = new DefaultArtifact (muzzleDirective. group, muzzleDirective. module, " jar" , " [,)" )
196+ final Artifact directiveArtifact = new DefaultArtifact (muzzleDirective. group, muzzleDirective. module, " jar" , muzzleDirective. versions)
197+
198+
199+ final VersionRangeRequest allRangeRequest = new VersionRangeRequest ()
200+ allRangeRequest. setRepositories(MUZZLE_REPOS )
201+ allRangeRequest. setArtifact(allVerisonsArtifact)
202+ final VersionRangeResult allRangeResult = system. resolveVersionRange(session, allRangeRequest)
203+
204+ final VersionRangeRequest rangeRequest = new VersionRangeRequest ()
205+ rangeRequest. setRepositories(MUZZLE_REPOS )
206+ rangeRequest. setArtifact(directiveArtifact)
207+ final VersionRangeResult rangeResult = system. resolveVersionRange(session, rangeRequest)
208+
209+ filterVersion(allRangeResult. versions). collect { version ->
210+ if (! rangeResult. versions. contains(version)) {
211+ final MuzzleDirective inverseDirective = new MuzzleDirective ()
212+ inverseDirective. group = muzzleDirective. group
213+ inverseDirective. module = muzzleDirective. module
214+ inverseDirective. versions = " $version "
215+ inverseDirective. assertPass = ! muzzleDirective. assertPass
216+ inverseDirectives. add(inverseDirective)
217+ }
218+ }
219+
220+ return inverseDirectives
221+ }
222+
223+
182224 /**
183225 * Configure a muzzle task to pass or fail a given version.
184226 *
@@ -272,6 +314,7 @@ class MuzzleDirective {
272314 String versions
273315 List<String > additionalDependencies = new ArrayList<> ()
274316 boolean assertPass
317+ boolean assertInverse = false
275318 void extraDependency (String compileString ) {
276319 additionalDependencies. add(compileString)
277320 }
0 commit comments