mirror of https://github.com/sbt/sbt.git
Remove dependency on http4s
This commit is contained in:
parent
0e230e042d
commit
60a7d3796f
|
|
@ -4,8 +4,6 @@ package core
|
||||||
import java.io._
|
import java.io._
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
import org.http4s.{EntityDecoder, Status, Uri}
|
|
||||||
|
|
||||||
import scala.annotation.tailrec
|
import scala.annotation.tailrec
|
||||||
import scala.io.Codec
|
import scala.io.Codec
|
||||||
import scalaz._, Scalaz._
|
import scalaz._, Scalaz._
|
||||||
|
|
@ -18,7 +16,7 @@ trait ArtifactDownloaderLogger {
|
||||||
def downloadedArtifact(url: String, success: Boolean): Unit
|
def downloadedArtifact(url: String, success: Boolean): Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
case class ArtifactDownloader(root: Uri, cache: File, logger: Option[ArtifactDownloaderLogger] = None) {
|
case class ArtifactDownloader(root: String, cache: File, logger: Option[ArtifactDownloaderLogger] = None) {
|
||||||
var bufferSize = 1024*1024
|
var bufferSize = 1024*1024
|
||||||
|
|
||||||
def artifact(module: Module,
|
def artifact(module: Module,
|
||||||
|
|
@ -52,7 +50,7 @@ case class ArtifactDownloader(root: Uri, cache: File, logger: Option[ArtifactDow
|
||||||
// - what if someone is trying to write this file at the same time? (no locking of any kind yet)
|
// - what if someone is trying to write this file at the same time? (no locking of any kind yet)
|
||||||
// - ...
|
// - ...
|
||||||
|
|
||||||
val urlStr = (root resolve Uri(path = relPath.mkString("./", "/", ""))).renderString
|
val urlStr = root + relPath.mkString("/")
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
try {
|
try {
|
||||||
|
|
@ -107,8 +105,39 @@ trait RemoteLogger {
|
||||||
def puttingInCache(f: File): Unit
|
def puttingInCache(f: File): Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
case class Remote(root: Uri, cache: Option[File] = None, logger: Option[RemoteLogger] = None) extends Repository {
|
object Remote {
|
||||||
lazy val client = org.http4s.client.blaze.defaultClient
|
|
||||||
|
def readFullySync(is: InputStream) = {
|
||||||
|
val buffer = new ByteArrayOutputStream()
|
||||||
|
val data = Array.ofDim[Byte](16384)
|
||||||
|
|
||||||
|
var nRead = is.read(data, 0, data.length)
|
||||||
|
while (nRead != -1) {
|
||||||
|
buffer.write(data, 0, nRead)
|
||||||
|
nRead = is.read(data, 0, data.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.flush()
|
||||||
|
buffer.toByteArray
|
||||||
|
}
|
||||||
|
|
||||||
|
def readFully(is: => InputStream) =
|
||||||
|
Task {
|
||||||
|
\/.fromTryCatchNonFatal {
|
||||||
|
val is0 = is
|
||||||
|
val b =
|
||||||
|
try readFullySync(is)
|
||||||
|
finally is0.close()
|
||||||
|
|
||||||
|
new String(b, "UTF-8")
|
||||||
|
} .leftMap(_.getMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case class Remote(root: String,
|
||||||
|
cache: Option[File] = None,
|
||||||
|
logger: Option[RemoteLogger] = None) extends Repository {
|
||||||
|
|
||||||
def find(module: Module,
|
def find(module: Module,
|
||||||
cachePolicy: CachePolicy): EitherT[Task, String, Project] = {
|
cachePolicy: CachePolicy): EitherT[Task, String, Project] = {
|
||||||
|
|
@ -141,19 +170,13 @@ case class Remote(root: Uri, cache: Option[File] = None, logger: Option[RemoteLo
|
||||||
}
|
}
|
||||||
|
|
||||||
def remote = {
|
def remote = {
|
||||||
val uri = root resolve Uri(path = relPath.mkString("./", "/", ""))
|
val urlStr = root + relPath.mkString("/")
|
||||||
val log = Task(logger.foreach(_.downloading(uri.renderString)))
|
val url = new URL(urlStr)
|
||||||
val get = log.flatMap(_ => client(uri))
|
|
||||||
|
|
||||||
get.flatMap{ resp =>
|
def log = Task(logger.foreach(_.downloading(urlStr)))
|
||||||
val success = resp.status == Status.Ok
|
def get = Remote.readFully(url.openStream())
|
||||||
logger.foreach(_.downloaded(uri.renderString, success))
|
|
||||||
|
|
||||||
if (success)
|
log.flatMap(_ => get)
|
||||||
EntityDecoder.text.decode(resp).run.map(_.leftMap(_.sanitized))
|
|
||||||
else
|
|
||||||
Task.now(-\/(s"Unhandled or bad status ${resp.status.code} from repository (${resp.status.code} ${resp.status.reason})"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def save(s: String) = {
|
def save(s: String) = {
|
||||||
|
|
@ -199,14 +222,10 @@ case class Remote(root: Uri, cache: Option[File] = None, logger: Option[RemoteLo
|
||||||
}
|
}
|
||||||
|
|
||||||
def remote = {
|
def remote = {
|
||||||
val respTask = client(root resolve Uri(path = relPath.mkString("./", "/", "")))
|
val urlStr = root + relPath.mkString("/")
|
||||||
|
val url = new URL(urlStr)
|
||||||
|
|
||||||
respTask.flatMap{ resp =>
|
Remote.readFully(url.openStream())
|
||||||
if (resp.status == Status.Ok)
|
|
||||||
EntityDecoder.text.decode(resp).run.map(_.leftMap(_.sanitized))
|
|
||||||
else
|
|
||||||
Task.now(-\/(s"Unhandled or bad status ${resp.status.code} from repository (${resp.status.code} ${resp.status.reason})"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def save(s: String) = {
|
def save(s: String) = {
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ package coursier.core
|
||||||
|
|
||||||
package object compatibility {
|
package object compatibility {
|
||||||
|
|
||||||
type DateTime = org.http4s.DateTime
|
|
||||||
val DateTime: org.http4s.DateTime.type = org.http4s.DateTime
|
|
||||||
|
|
||||||
implicit class RichChar(val c: Char) extends AnyVal {
|
implicit class RichChar(val c: Char) extends AnyVal {
|
||||||
def letterOrDigit = c.isLetterOrDigit
|
def letterOrDigit = c.isLetterOrDigit
|
||||||
def letter = c.isLetter
|
def letter = c.isLetter
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
package coursier
|
package coursier
|
||||||
|
|
||||||
import org.http4s.Http4s._
|
|
||||||
|
|
||||||
package object repository {
|
package object repository {
|
||||||
|
|
||||||
type Remote = core.Remote
|
type Remote = core.Remote
|
||||||
val Remote: core.Remote.type = core.Remote
|
val Remote: core.Remote.type = core.Remote
|
||||||
|
|
||||||
val mavenCentral = Remote(uri("https://repo1.maven.org/maven2/"))
|
val mavenCentral = Remote("https://repo1.maven.org/maven2/")
|
||||||
|
|
||||||
val sonatypeReleases = Remote(uri("https://oss.sonatype.org/content/repositories/releases/"))
|
val sonatypeReleases = Remote("https://oss.sonatype.org/content/repositories/releases/")
|
||||||
val sonatypeSnapshots = Remote(uri("https://oss.sonatype.org/content/repositories/snapshots/"))
|
val sonatypeSnapshots = Remote("https://oss.sonatype.org/content/repositories/snapshots/")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ object CoursierBuild extends Build {
|
||||||
.settings(commonSettings ++ commonCoreSettings: _*)
|
.settings(commonSettings ++ commonCoreSettings: _*)
|
||||||
.settings(
|
.settings(
|
||||||
libraryDependencies ++= Seq(
|
libraryDependencies ++= Seq(
|
||||||
"org.http4s" %% "http4s-blazeclient" % "0.7.0",
|
"org.scalaz" %% "scalaz-concurrent" % "7.1.2",
|
||||||
"com.lihaoyi" %% "utest" % "0.3.0" % "test"
|
"com.lihaoyi" %% "utest" % "0.3.0" % "test"
|
||||||
) ++ {
|
) ++ {
|
||||||
if (scalaVersion.value.startsWith("2.10.")) Seq()
|
if (scalaVersion.value.startsWith("2.10.")) Seq()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue