From 18be2e2dd26f0264251819d3a0e3985e0e5e47e6 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 30 May 2017 16:59:46 +0200 Subject: [PATCH] Add support for binary checksum files --- cache/src/main/scala/coursier/Cache.scala | 16 +++++++++++++--- cache/src/main/scala/coursier/Platform.scala | 5 ++++- .../coursier/cli/spark/Assembly.scala | 4 +--- tests/jvm/src/test/resources/empty.md5 | Bin 0 -> 16 bytes tests/jvm/src/test/resources/empty.sha1 | 1 + .../scala/coursier/test/ChecksumTests.scala | 16 ++++++++++++++-- 6 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 tests/jvm/src/test/resources/empty.md5 create mode 100644 tests/jvm/src/test/resources/empty.sha1 diff --git a/cache/src/main/scala/coursier/Cache.scala b/cache/src/main/scala/coursier/Cache.scala index 8ffee2f7d..1cc86e997 100644 --- a/cache/src/main/scala/coursier/Cache.scala +++ b/cache/src/main/scala/coursier/Cache.scala @@ -838,6 +838,18 @@ object Cache { parseChecksumLine(lines) orElse parseChecksumAlternative(lines) } + def parseRawChecksum(content: Array[Byte]): Option[BigInteger] = + if (content.length == 16 || content.length == 20) + Some(new BigInteger(content)) + else { + val s = new String(content, UTF_8) + val lines = s + .lines + .toVector + + parseChecksumLine(lines) orElse parseChecksumAlternative(lines) + } + // matches md5 or sha1 private val checksumPattern = Pattern.compile("^[0-9a-f]{32}([0-9a-f]{8})?") @@ -870,9 +882,7 @@ object Cache { val sumFile = localFile(sumUrl, cache, artifact.authentication.map(_.user)) Task { - val sumOpt = parseChecksum( - new String(FileUtil.readAllBytes(sumFile), UTF_8) - ) + val sumOpt = parseRawChecksum(FileUtil.readAllBytes(sumFile)) sumOpt match { case None => diff --git a/cache/src/main/scala/coursier/Platform.scala b/cache/src/main/scala/coursier/Platform.scala index b97b333ab..7fcee2193 100644 --- a/cache/src/main/scala/coursier/Platform.scala +++ b/cache/src/main/scala/coursier/Platform.scala @@ -1,6 +1,7 @@ package coursier import java.io._ +import java.nio.charset.Charset import scala.language.implicitConversions @@ -23,6 +24,8 @@ object Platform { buffer.toByteArray } + private lazy val UTF_8 = Charset.forName("UTF-8") + def readFully(is: => InputStream) = Task { \/.fromTryCatchNonFatal { @@ -31,7 +34,7 @@ object Platform { try readFullySync(is0) finally is0.close() - new String(b, "UTF-8") + new String(b, UTF_8) } .leftMap{ case e: java.io.FileNotFoundException if e.getMessage != null => s"Not found: ${e.getMessage}" diff --git a/cli/src/main/scala-2.11/coursier/cli/spark/Assembly.scala b/cli/src/main/scala-2.11/coursier/cli/spark/Assembly.scala index 9d73bf57c..a40bbd873 100644 --- a/cli/src/main/scala-2.11/coursier/cli/spark/Assembly.scala +++ b/cli/src/main/scala-2.11/coursier/cli/spark/Assembly.scala @@ -223,9 +223,7 @@ object Assembly { throw new Exception(s"SHA-1 file not found for ${a.url}") } - val sumOpt = Cache.parseChecksum( - new String(FileUtil.readAllBytes(f), "UTF-8") - ) + val sumOpt = Cache.parseRawChecksum(FileUtil.readAllBytes(f)) sumOpt match { case Some(sum) => diff --git a/tests/jvm/src/test/resources/empty.md5 b/tests/jvm/src/test/resources/empty.md5 new file mode 100644 index 0000000000000000000000000000000000000000..5656351c69862cdda01b144e3c18360ca713ad7a GIT binary patch literal 16 Ycmca2+jFy@VH3;C2F@98emK