diff --git a/plugin/src/main/scala-2.10/coursier/FromSbt.scala b/plugin/src/main/scala-2.10/coursier/FromSbt.scala index 7968dfd66..db49a7943 100644 --- a/plugin/src/main/scala-2.10/coursier/FromSbt.scala +++ b/plugin/src/main/scala-2.10/coursier/FromSbt.scala @@ -133,6 +133,35 @@ object FromSbt { ) } + private def mavenCompatibleBaseOpt(patterns: sbt.Patterns): Option[String] = + if (patterns.isMavenCompatible) { + val baseIvyPattern = patterns.ivyPatterns.head.takeWhile(c => c != '[' && c != '(') + val baseArtifactPattern = patterns.ivyPatterns.head.takeWhile(c => c != '[' && c != '(') + + if (baseIvyPattern == baseArtifactPattern) + Some(baseIvyPattern) + else + None + } else + None + + private def mavenRepositoryOpt(root: String, log: sbt.Logger): Option[MavenRepository] = + try { + Cache.url(root) // ensure root is a URL whose protocol can be handled here + val root0 = if (root.endsWith("/")) root else root + "/" + Some(MavenRepository(root0, sbtAttrStub = true)) + } catch { + case e: MalformedURLException => + log.warn( + "Error parsing Maven repository base " + + root + + Option(e.getMessage).map(" (" + _ + ")").mkString + + ", ignoring it" + ) + + None + } + def repository( resolver: Resolver, ivyProperties: Map[String, String], @@ -140,45 +169,45 @@ object FromSbt { ): Option[Repository] = resolver match { case sbt.MavenRepository(_, root) => - try { - Cache.url(root) // ensure root is a URL whose protocol can be handled here - val root0 = if (root.endsWith("/")) root else root + "/" - Some(MavenRepository(root0, sbtAttrStub = true)) - } catch { - case e: MalformedURLException => - log.warn( - "Error parsing Maven repository base " + - root + - Option(e.getMessage).map(" (" + _ + ")").mkString + - ", ignoring it" - ) - - None - } + mavenRepositoryOpt(root, log) case sbt.FileRepository(_, _, patterns) if patterns.ivyPatterns.lengthCompare(1) == 0 && patterns.artifactPatterns.lengthCompare(1) == 0 => - Some(IvyRepository( - "file://" + patterns.artifactPatterns.head, - metadataPatternOpt = Some("file://" + patterns.ivyPatterns.head), - changing = Some(true), - properties = ivyProperties, - dropInfoAttributes = true - )) + val mavenCompatibleBaseOpt0 = mavenCompatibleBaseOpt(patterns) + + mavenCompatibleBaseOpt0 match { + case None => + Some(IvyRepository( + "file://" + patterns.artifactPatterns.head, + metadataPatternOpt = Some("file://" + patterns.ivyPatterns.head), + changing = Some(true), + properties = ivyProperties, + dropInfoAttributes = true + )) + case Some(mavenCompatibleBase) => + mavenRepositoryOpt("file://" + mavenCompatibleBase, log) + } case sbt.URLRepository(_, patterns) if patterns.ivyPatterns.lengthCompare(1) == 0 && patterns.artifactPatterns.lengthCompare(1) == 0 => - Some(IvyRepository( - patterns.artifactPatterns.head, - metadataPatternOpt = Some(patterns.ivyPatterns.head), - changing = None, - properties = ivyProperties, - dropInfoAttributes = true - )) + val mavenCompatibleBaseOpt0 = mavenCompatibleBaseOpt(patterns) + + mavenCompatibleBaseOpt0 match { + case None => + Some(IvyRepository( + patterns.artifactPatterns.head, + metadataPatternOpt = Some(patterns.ivyPatterns.head), + changing = None, + properties = ivyProperties, + dropInfoAttributes = true + )) + case Some(mavenCompatibleBase) => + mavenRepositoryOpt(mavenCompatibleBase, log) + } case other => log.warn(s"Unrecognized repository ${other.name}, ignoring it") diff --git a/plugin/src/sbt-test/sbt-coursier/maven-compatible/build.sbt b/plugin/src/sbt-test/sbt-coursier/maven-compatible/build.sbt new file mode 100644 index 000000000..58b00349c --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/maven-compatible/build.sbt @@ -0,0 +1,16 @@ +scalaVersion := "2.11.8" + +resolvers += Resolver.url( + "webjars-bintray", + new URL("https://dl.bintray.com/scalaz/releases/") +)( + // patterns should be ignored - and the repo be considered a maven one - because + // isMavenCompatible is true + Patterns( + Resolver.ivyStylePatterns.ivyPatterns, + Resolver.ivyStylePatterns.artifactPatterns, + isMavenCompatible = true + ) +) + +libraryDependencies += "org.scalaz.stream" %% "scalaz-stream" % "0.7.1" \ No newline at end of file diff --git a/plugin/src/sbt-test/sbt-coursier/maven-compatible/project/plugins.sbt b/plugin/src/sbt-test/sbt-coursier/maven-compatible/project/plugins.sbt new file mode 100644 index 000000000..152225a9e --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/maven-compatible/project/plugins.sbt @@ -0,0 +1,11 @@ +{ + val pluginVersion = sys.props.getOrElse( + "plugin.version", + throw new RuntimeException( + """|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin + ) + ) + + addSbtPlugin("io.get-coursier" % "sbt-coursier" % pluginVersion) +} diff --git a/plugin/src/sbt-test/sbt-coursier/maven-compatible/src/main/scala/Main.scala b/plugin/src/sbt-test/sbt-coursier/maven-compatible/src/main/scala/Main.scala new file mode 100644 index 000000000..3ebd25fca --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/maven-compatible/src/main/scala/Main.scala @@ -0,0 +1,14 @@ +import java.io.File +import java.nio.file.Files + +import scalaz.stream._ +import scalaz.concurrent.Task + +object Main extends App { + + val pch = Process.constant((i:Int) => Task.now(())).take(3) + val count = Process.constant(1).toSource.to(pch).runLog.run.size + assert(count == 3) + + Files.write(new File("output").toPath, "OK".getBytes("UTF-8")) +} diff --git a/plugin/src/sbt-test/sbt-coursier/maven-compatible/test b/plugin/src/sbt-test/sbt-coursier/maven-compatible/test new file mode 100644 index 000000000..2182f57b0 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/maven-compatible/test @@ -0,0 +1,3 @@ +$ delete output +> run +$ exists output