aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2017-07-03 16:51:54 -0700
committerJakob Odersky <jakob@odersky.com>2017-07-03 17:18:33 -0700
commit01be96399ae6cd84ce49525568bd6418bf52e26f (patch)
tree55e993d8124fe3c720b1244956388990ac994f2a
parent234b2617ff515414b80ee72933315ed5bf2b5c8b (diff)
downloadcbt-reproducible-builds.tar.gz
cbt-reproducible-builds.tar.bz2
cbt-reproducible-builds.zip
Add example of reproducible buildsreproducible-builds
-rw-r--r--examples/package-example/Main.scala6
-rw-r--r--examples/package-example/build/build.scala42
-rw-r--r--test/test.scala5
3 files changed, 53 insertions, 0 deletions
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