From 577496b1b609c4d756b8efb448d46b26953d65df Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Tue, 16 Sep 2014 00:03:36 -0400 Subject: [PATCH] Expose Ivy's circular dependency check via UpdateOptions --- .../scala/sbt/CircularDependencyLevel.scala | 27 +++++++++++++++++++ ivy/src/main/scala/sbt/Ivy.scala | 1 + ivy/src/main/scala/sbt/UpdateOptions.scala | 10 ++++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 ivy/src/main/scala/sbt/CircularDependencyLevel.scala diff --git a/ivy/src/main/scala/sbt/CircularDependencyLevel.scala b/ivy/src/main/scala/sbt/CircularDependencyLevel.scala new file mode 100644 index 000000000..3c2f62bc6 --- /dev/null +++ b/ivy/src/main/scala/sbt/CircularDependencyLevel.scala @@ -0,0 +1,27 @@ +package sbt + +import org.apache.ivy.plugins.circular.{ CircularDependencyStrategy, WarnCircularDependencyStrategy, IgnoreCircularDependencyStrategy, ErrorCircularDependencyStrategy } + +/** + * Wrapper around circular dependency strategy. + */ +sealed trait CircularDependencyLevel { + private[sbt] def ivyStrategy: CircularDependencyStrategy + private[sbt] def name: String + override def toString: String = name +} + +object CircularDependencyLevel { + val Warn: CircularDependencyLevel = new CircularDependencyLevel { + def ivyStrategy: CircularDependencyStrategy = WarnCircularDependencyStrategy.getInstance + def name: String = "warn" + } + val Ignore: CircularDependencyLevel = new CircularDependencyLevel { + def ivyStrategy: CircularDependencyStrategy = IgnoreCircularDependencyStrategy.getInstance + def name: String = "ignore" + } + val Error: CircularDependencyLevel = new CircularDependencyLevel { + def ivyStrategy: CircularDependencyStrategy = ErrorCircularDependencyStrategy.getInstance + def name: String = "error" + } +} diff --git a/ivy/src/main/scala/sbt/Ivy.scala b/ivy/src/main/scala/sbt/Ivy.scala index 55a596bbc..cc39ab42e 100644 --- a/ivy/src/main/scala/sbt/Ivy.scala +++ b/ivy/src/main/scala/sbt/Ivy.scala @@ -69,6 +69,7 @@ final class IvySbt(val configuration: IvyConfiguration) { { val is = new IvySettings is.setBaseDir(baseDirectory) + is.setCircularDependencyStrategy(configuration.updateOptions.circularDependencyLevel.ivyStrategy) CustomPomParser.registerDefault configuration match { case e: ExternalIvyConfiguration => diff --git a/ivy/src/main/scala/sbt/UpdateOptions.scala b/ivy/src/main/scala/sbt/UpdateOptions.scala index dd4c83f47..d3bf28bfc 100644 --- a/ivy/src/main/scala/sbt/UpdateOptions.scala +++ b/ivy/src/main/scala/sbt/UpdateOptions.scala @@ -10,25 +10,33 @@ import java.io.File * See also UpdateConfiguration in IvyActions.scala. */ final class UpdateOptions private[sbt] ( + /** If set to CircularDependencyLevel.Error, halt the dependency resolution. */ + val circularDependencyLevel: CircularDependencyLevel, /** If set to true, check all resolvers for snapshots. */ val latestSnapshots: Boolean, /** If set to true, use consolidated resolution. */ val consolidatedResolution: Boolean) { + def withCircularDependencyLevel(circularDependencyLevel: CircularDependencyLevel): UpdateOptions = + copy(circularDependencyLevel = circularDependencyLevel) def withLatestSnapshots(latestSnapshots: Boolean): UpdateOptions = copy(latestSnapshots = latestSnapshots) def withConsolidatedResolution(consolidatedResolution: Boolean): UpdateOptions = copy(consolidatedResolution = consolidatedResolution) private[sbt] def copy( + circularDependencyLevel: CircularDependencyLevel = this.circularDependencyLevel, latestSnapshots: Boolean = this.latestSnapshots, consolidatedResolution: Boolean = this.consolidatedResolution): UpdateOptions = - new UpdateOptions(latestSnapshots, consolidatedResolution) + new UpdateOptions(circularDependencyLevel, + latestSnapshots, + consolidatedResolution) } object UpdateOptions { def apply(): UpdateOptions = new UpdateOptions( + circularDependencyLevel = CircularDependencyLevel.Warn, latestSnapshots = true, consolidatedResolution = false) }