From 01be96399ae6cd84ce49525568bd6418bf52e26f Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 3 Jul 2017 16:51:54 -0700 Subject: Add example of reproducible builds --- examples/package-example/Main.scala | 6 +++++ examples/package-example/build/build.scala | 42 ++++++++++++++++++++++++++++++ test/test.scala | 5 ++++ 3 files changed, 53 insertions(+) create mode 100644 examples/package-example/Main.scala create mode 100644 examples/package-example/build/build.scala diff --git a/examples/package-example/Main.scala b/examples/package-example/Main.scala new file mode 100644 index 0000000..61e6b63 --- /dev/null +++ b/examples/package-example/Main.scala @@ -0,0 +1,6 @@ +package package_example +object Main{ + def main( args: Array[String] ): Unit = { + println( Console.GREEN ++ "Hello World" ++ Console.RESET ) + } +} diff --git a/examples/package-example/build/build.scala b/examples/package-example/build/build.scala new file mode 100644 index 0000000..3874507 --- /dev/null +++ b/examples/package-example/build/build.scala @@ -0,0 +1,42 @@ +package package_example_build +import java.nio.file._ +import java.security.MessageDigest +import cbt._ +class Build(val context: Context) extends BaseBuild with PackageJars { + override def groupId = "org.example" + override def version = "1.0.0" + + def hash(file: Path): String = { + val digest = MessageDigest.getInstance("SHA-256"); + val in = Files.newInputStream(file) + try { + val chunk = new Array[Byte](4096) + while(in.read(chunk) > 0) { + digest.update(chunk) + } + } finally { + in.close + } + val bytes = digest.digest() + val builder = new StringBuilder(bytes.length * 2); + for(b <- bytes) { + builder.append(f"$b%02x") + } + builder.toString + } + + override def run = { + val pass1 = super.`package`.map(f => hash(f.toPath)) + lib.clean(cleanFiles, true, false, false, false) + transientCache.clear() + val pass2 = super.`package`.map(f => hash(f.toPath)) + + assert( + pass1 == pass2, + "The checksums of jars generated during two separate builds did not match. " + + "The build is not reproducible." + ) + ExitCode.Success + } + +} diff --git a/test/test.scala b/test/test.scala index 9cb7fd9..63bcabc 100644 --- a/test/test.scala +++ b/test/test.scala @@ -506,6 +506,11 @@ object Main{ assert(res.exit0) } + { + val res = runCbt("../examples/package-example", Seq("run")) + assert(res.exit0) + } + /* // currently fails with // java.lang.UnsupportedOperationException: scalafix.rewrite.ScalafixMirror.fromMirror $anon#typeSignature requires the semantic api -- cgit v1.2.3