From dee115c1b6fa12d925c2eba4de949a19cc24f38e Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sun, 6 Mar 2016 14:56:12 +0100 Subject: [PATCH] Add back support for some checksum format --- cache/src/main/scala/coursier/Cache.scala | 28 ++++++++----- .../scala/coursier/test/ChecksumTests.scala | 39 +++++++++++++------ 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/cache/src/main/scala/coursier/Cache.scala b/cache/src/main/scala/coursier/Cache.scala index dd8d1cbb3..674198841 100644 --- a/cache/src/main/scala/coursier/Cache.scala +++ b/cache/src/main/scala/coursier/Cache.scala @@ -444,18 +444,28 @@ object Cache { Nondeterminism[Task].gather(tasks) } + def parseChecksum(content: String): Option[BigInteger] = { + val lines = content + .linesIterator + .toVector + + parseChecksumLine(lines) orElse parseChecksumAlternative(lines) + } + // matches md5 or sha1 private val checksumPattern = Pattern.compile("^[0-9a-f]{32}([0-9a-f]{8})?") - def parseChecksum(content: String): Option[BigInteger] = - content - .linesIterator - .toStream - .map(_.toLowerCase.replaceAll("\\s", "")) - .collectFirst { - case rawSum if checksumPattern.matcher(rawSum).matches() => - new BigInteger(rawSum, 16) - } + private def findChecksum(elems: Seq[String]): Option[BigInteger] = + elems.collectFirst { + case rawSum if checksumPattern.matcher(rawSum).matches() => + new BigInteger(rawSum, 16) + } + + private def parseChecksumLine(lines: Seq[String]): Option[BigInteger] = + findChecksum(lines.map(_.toLowerCase.replaceAll("\\s", ""))) + + private def parseChecksumAlternative(lines: Seq[String]): Option[BigInteger] = + findChecksum(lines.flatMap(_.toLowerCase.split("\\s+"))) def validateChecksum( artifact: Artifact, diff --git a/tests/jvm/src/test/scala/coursier/test/ChecksumTests.scala b/tests/jvm/src/test/scala/coursier/test/ChecksumTests.scala index f48875a18..867de7b31 100644 --- a/tests/jvm/src/test/scala/coursier/test/ChecksumTests.scala +++ b/tests/jvm/src/test/scala/coursier/test/ChecksumTests.scala @@ -14,22 +14,37 @@ object ChecksumTests extends TestSuite { val tests = TestSuite { 'parse - { - // https://repo1.maven.org/maven2/org/apache/spark/spark-core_2.11/1.2.0/spark-core_2.11-1.2.0.pom.sha1 - // as of 2016-03-02 - val junkSha1 = - "./spark-core_2.11/1.2.0/spark-core_2.11-1.2.0.pom:\n" + - "5630 42A5 4B97 E31A F452 9EA0 DB79 BA2C 4C2B B6CC" - val cleanSha1 = "563042a54b97e31af4529ea0db79ba2c4c2bb6cc" + def sha1ParseTest(clean: String, others: String*): Unit = { + val expected = Some(new BigInteger(clean, 16)) - val checksum = Some(new BigInteger(cleanSha1, 16)) - - 'junk - { - assert(Cache.parseChecksum(junkSha1) == checksum) + assert(Cache.parseChecksum(clean) == expected) + for (other <- others) + assert(Cache.parseChecksum(other) == expected) } - 'clean - { - assert(Cache.parseChecksum(cleanSha1) == checksum) + * - { + // https://repo1.maven.org/maven2/org/apache/spark/spark-core_2.11/1.2.0/spark-core_2.11-1.2.0.pom.sha1 + // as of 2016-03-02 + val junkSha1 = + "./spark-core_2.11/1.2.0/spark-core_2.11-1.2.0.pom:\n" + + "5630 42A5 4B97 E31A F452 9EA0 DB79 BA2C 4C2B B6CC" + + val cleanSha1 = "563042a54b97e31af4529ea0db79ba2c4c2bb6cc" + + sha1ParseTest(cleanSha1, junkSha1) + } + + * - { + // https://repo1.maven.org/maven2/org/json/json/20080701/json-20080701.pom.sha1 + // as of 2016-03-05 + val dirtySha1 = + "4bf5daa95eb5c12d753a359a3e00621fdc73d187 " + // no CR here + "/home/maven/repository-staging/to-ibiblio/maven2/org/json/json/20080701/json-20080701.pom" + + val cleanSha1 = "4bf5daa95eb5c12d753a359a3e00621fdc73d187" + + sha1ParseTest(cleanSha1, dirtySha1) } }