From 5e0189fa7e130e8a205865eb1674370e28f35f1f Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 9 Nov 2016 12:28:40 -0800 Subject: [PATCH] Allow to swap Scala mainline dependencies by Typelevel ones --- .../main/scala-2.11/coursier/cli/Helper.scala | 4 ++- .../scala-2.11/coursier/cli/Options.scala | 2 ++ .../coursier/cli/typelevel/Typelevel.scala | 32 +++++++++++++++++++ .../main/scala/coursier/core/Resolution.scala | 7 ++-- .../src/main/scala/coursier/package.scala | 6 ++-- 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 cli/src/main/scala-2.11/coursier/cli/typelevel/Typelevel.scala diff --git a/cli/src/main/scala-2.11/coursier/cli/Helper.scala b/cli/src/main/scala-2.11/coursier/cli/Helper.scala index f952ccaf2..b45667187 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Helper.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Helper.scala @@ -6,6 +6,7 @@ import java.net.{ URL, URLClassLoader } import java.util.jar.{ Manifest => JManifest } import java.util.concurrent.Executors +import coursier.cli.typelevel.Typelevel import coursier.ivy.IvyRepository import coursier.util.{Print, Parse} @@ -287,7 +288,8 @@ class Helper( filter = Some(dep => keepOptional || !dep.optional), userActivations = if (userEnabledProfiles.isEmpty) None - else Some(userEnabledProfiles.iterator.map(_ -> true).toMap) + else Some(userEnabledProfiles.iterator.map(_ -> true).toMap), + mapDependencies = if (typelevel) Some(Typelevel.swap(_)) else None ) val loggerFallbackMode = diff --git a/cli/src/main/scala-2.11/coursier/cli/Options.scala b/cli/src/main/scala-2.11/coursier/cli/Options.scala index 35666de99..d4ac91e7f 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Options.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Options.scala @@ -85,6 +85,8 @@ case class CommonOptions( @Value("profile") @Short("F") profile: List[String], + @Help("Swap the mainline Scala JARs by Typelevel ones") + typelevel: Boolean = false, @Recurse cacheOptions: CacheOptions ) { diff --git a/cli/src/main/scala-2.11/coursier/cli/typelevel/Typelevel.scala b/cli/src/main/scala-2.11/coursier/cli/typelevel/Typelevel.scala new file mode 100644 index 000000000..72c290077 --- /dev/null +++ b/cli/src/main/scala-2.11/coursier/cli/typelevel/Typelevel.scala @@ -0,0 +1,32 @@ +package coursier.cli.typelevel + +import coursier.{Dependency, Module} + +object Typelevel { + + val mainLineOrg = "org.scala-lang" + val typelevelOrg = "org.typelevel" + + val modules = Set( + "scala-compiler", + "scala-library", + "scala-library-all", + "scala-reflect", + "scalap" + // any other? + ) + + def swap(module: Module): Module = + if (module.organization == mainLineOrg && modules(module.name) && module.attributes.isEmpty) + module.copy( + organization = typelevelOrg + ) + else + module + + def swap(dependency: Dependency): Dependency = + dependency.copy( + module = swap(dependency.module) + ) + +} \ No newline at end of file diff --git a/core/shared/src/main/scala/coursier/core/Resolution.scala b/core/shared/src/main/scala/coursier/core/Resolution.scala index b97055a83..50de8d699 100644 --- a/core/shared/src/main/scala/coursier/core/Resolution.scala +++ b/core/shared/src/main/scala/coursier/core/Resolution.scala @@ -538,7 +538,8 @@ final case class Resolution( filter: Option[Dependency => Boolean], osInfo: Activation.Os, jdkVersion: Option[Version], - userActivations: Option[Map[String, Boolean]] + userActivations: Option[Map[String, Boolean]], + mapDependencies: Option[Dependency => Dependency] ) { def copyWithCache( @@ -552,6 +553,7 @@ final case class Resolution( osInfo: Activation.Os = osInfo, jdkVersion: Option[Version] = jdkVersion, userActivations: Option[Map[String, Boolean]] = userActivations + // don't allow changing mapDependencies here - that would invalidate finalDependenciesCache ): Resolution = copy( rootDependencies, @@ -578,7 +580,8 @@ final case class Resolution( if (deps == null) projectCache.get(dep.moduleVersion) match { case Some((_, proj)) => - val res = finalDependencies(dep, proj).filter(filter getOrElse defaultFilter) + val res0 = finalDependencies(dep, proj).filter(filter getOrElse defaultFilter) + val res = mapDependencies.fold(res0)(res0.map(_)) finalDependenciesCache0.put(dep, res) res case None => Nil diff --git a/core/shared/src/main/scala/coursier/package.scala b/core/shared/src/main/scala/coursier/package.scala index 20e767b62..0105f7853 100644 --- a/core/shared/src/main/scala/coursier/package.scala +++ b/core/shared/src/main/scala/coursier/package.scala @@ -75,7 +75,8 @@ package object coursier { filter: Option[Dependency => Boolean] = None, osInfo: Activation.Os = Activation.Os.fromProperties(sys.props.toMap), jdkVersion: Option[Version] = sys.props.get("java.version").flatMap(Parse.version), - userActivations: Option[Map[String, Boolean]] = None + userActivations: Option[Map[String, Boolean]] = None, + mapDependencies: Option[Dependency => Dependency] = None ): Resolution = core.Resolution( rootDependencies, @@ -88,7 +89,8 @@ package object coursier { filter, osInfo, jdkVersion, - userActivations + userActivations, + mapDependencies ) }