Merge pull request #221 from alexarchambault/topic/sbt-maven-compatible-repo

Take into account isMavenCompatible flag in SBT pattern based repositories
This commit is contained in:
Alexandre Archambault 2016-04-09 14:34:31 +02:00
commit c09db18afd
5 changed files with 102 additions and 29 deletions

View File

@ -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")

View File

@ -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"

View File

@ -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)
}

View File

@ -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"))
}

View File

@ -0,0 +1,3 @@
$ delete output
> run
$ exists output