From ebbe363954c92e4b4a69b67a5cf7b738145a8f07 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Tue, 8 Aug 2017 20:30:42 +0200 Subject: [PATCH] Allow for reproducible builds REPRODUCIBLE_BUILD=1 ./gradlew clean :build --- .gitignore | Bin 2495 -> 2534 bytes build.gradle | 4 +- .../fernflower/0001-Add-build.gradle.patch | 42 +++++ ...radle-to-build-reproducible-archives.patch | 28 +++ ...Manually-force-reproducible-archives.patch | 53 ++++++ ...-Remove-all-buildscript-dependencies.patch | 161 ++++++++++++++++++ ...ings-because-we-don-t-include-deps-a.patch | 57 +++++++ .../forgegradle/0005-Add-witness-plugin.patch | 90 ++++++++++ ...radle-to-build-reproducible-archives.patch | 25 +++ ...radle-to-build-reproducible-archives.patch | 28 +++ ...replace-all-buildscript-dependencies.patch | 59 +++++++ .../patches/mixin/0003-Fix-for-Gradle-3.patch | 25 +++ .../mixin/0004-Disable-checkstyle.patch | 42 +++++ ...place-fernflower-SNAPSHOT-depencency.patch | 27 +++ ...-ReferenceMapper-for-reproducibility.patch | 56 ++++++ .../mixin/0007-Add-witness-plugin.patch | 71 ++++++++ ...radle-to-build-reproducible-archives.patch | 28 +++ ...-Remove-all-buildscript-dependencies.patch | 125 ++++++++++++++ .../mixingradle/0003-Add-witness-plugin.patch | 44 +++++ ...ipt-dependencies-with-manually-built.patch | 43 +++++ ...ce-mixin-dep-with-manually-built-one.patch | 27 +++ .../replaymod/0003-Add-witness-plugin.patch | 41 +++++ ...004-Add-checksums-for-witness-plugin.patch | 109 ++++++++++++ ...radle-to-build-reproducible-archives.patch | 28 +++ ...radle-to-build-reproducible-archives.patch | 28 +++ ...-non-essential-parts-of-build.gradle.patch | 117 +++++++++++++ .../shadow/0003-Add-witness-plugin.patch | 49 ++++++ .../shadow/0004-Manually-shade-deps.patch | 54 ++++++ gradle/reprod/setup.sh | 77 +++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 51017 -> 53638 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 16 +- gradlew.bat | 2 +- settings.gradle | 6 +- 34 files changed, 1553 insertions(+), 13 deletions(-) create mode 100644 gradle/reprod/patches/fernflower/0001-Add-build.gradle.patch create mode 100644 gradle/reprod/patches/forgegradle/0001-Configure-gradle-to-build-reproducible-archives.patch create mode 100644 gradle/reprod/patches/forgegradle/0002-Manually-force-reproducible-archives.patch create mode 100644 gradle/reprod/patches/forgegradle/0003-Remove-all-buildscript-dependencies.patch create mode 100644 gradle/reprod/patches/forgegradle/0004-Shade-all-the-things-because-we-don-t-include-deps-a.patch create mode 100644 gradle/reprod/patches/forgegradle/0005-Add-witness-plugin.patch create mode 100644 gradle/reprod/patches/gradle-witness/0001-Configure-gradle-to-build-reproducible-archives.patch create mode 100644 gradle/reprod/patches/mixin/0001-Configure-gradle-to-build-reproducible-archives.patch create mode 100644 gradle/reprod/patches/mixin/0002-Remove-replace-all-buildscript-dependencies.patch create mode 100644 gradle/reprod/patches/mixin/0003-Fix-for-Gradle-3.patch create mode 100644 gradle/reprod/patches/mixin/0004-Disable-checkstyle.patch create mode 100644 gradle/reprod/patches/mixin/0005-Replace-fernflower-SNAPSHOT-depencency.patch create mode 100644 gradle/reprod/patches/mixin/0006-Use-TreeMap-in-ReferenceMapper-for-reproducibility.patch create mode 100644 gradle/reprod/patches/mixin/0007-Add-witness-plugin.patch create mode 100644 gradle/reprod/patches/mixingradle/0001-Configure-gradle-to-build-reproducible-archives.patch create mode 100644 gradle/reprod/patches/mixingradle/0002-Remove-all-buildscript-dependencies.patch create mode 100644 gradle/reprod/patches/mixingradle/0003-Add-witness-plugin.patch create mode 100644 gradle/reprod/patches/replaymod/0001-Replace-buildscript-dependencies-with-manually-built.patch create mode 100644 gradle/reprod/patches/replaymod/0002-Replace-mixin-dep-with-manually-built-one.patch create mode 100644 gradle/reprod/patches/replaymod/0003-Add-witness-plugin.patch create mode 100644 gradle/reprod/patches/replaymod/0004-Add-checksums-for-witness-plugin.patch create mode 100644 gradle/reprod/patches/replaymod/0005-Configure-gradle-to-build-reproducible-archives.patch create mode 100644 gradle/reprod/patches/shadow/0001-Configure-gradle-to-build-reproducible-archives.patch create mode 100644 gradle/reprod/patches/shadow/0002-Remove-non-essential-parts-of-build.gradle.patch create mode 100644 gradle/reprod/patches/shadow/0003-Add-witness-plugin.patch create mode 100644 gradle/reprod/patches/shadow/0004-Manually-shade-deps.patch create mode 100755 gradle/reprod/setup.sh diff --git a/.gitignore b/.gitignore index a3093a918c0868e992cc755ac4d8ddcbd4083041..dfe6d6db9b8eba1c42d62377357ad8af64bc447d 100644 GIT binary patch delta 48 rcmdll{7hIay(lpyCsn^FwV)_JMZYAsfD2V5CAFZKi)+JvPDU;Ozt|B% delta 8 PcmaDRykB^u+I~&|5mN(e diff --git a/build.gradle b/build.gradle index 3ff6b6ed..39d5dd26 100755 --- a/build.gradle +++ b/build.gradle @@ -109,7 +109,7 @@ jar { exclude { new File(file('jGui/src/main/resources'), it.relativePath.pathString).exists() } eachFile { if (getName() == 'LICENSE.txt') { - setName(getFile().getParentFile().getName().split('-')[0] + '-LICENSE.txt') + setName(getFile().getParentFile().getName().split('.jar_')[0] + '-LICENSE.txt') } } } @@ -165,7 +165,7 @@ sourceSets { resources { srcDir 'jGui/src/main/resources' } - refMap = "mixins.replaymod.refmap.json" + ext.refMap = "mixins.replaymod.refmap.json" } integrationTest { compileClasspath += main.runtimeClasspath + main.output diff --git a/gradle/reprod/patches/fernflower/0001-Add-build.gradle.patch b/gradle/reprod/patches/fernflower/0001-Add-build.gradle.patch new file mode 100644 index 00000000..3eeb1920 --- /dev/null +++ b/gradle/reprod/patches/fernflower/0001-Add-build.gradle.patch @@ -0,0 +1,42 @@ +From a1b7d25752424f267f5e9d299babc0403dbf7752 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:44:44 +0200 +Subject: [PATCH] Add build.gradle + +--- + build.gradle | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + create mode 100644 build.gradle + +diff --git a/build.gradle b/build.gradle +new file mode 100644 +index 0000000..22fa679 +--- /dev/null ++++ b/build.gradle +@@ -0,0 +1,23 @@ ++apply plugin: 'java' ++ ++sourceCompatibility = 1.8 ++ ++sourceSets { ++ main { ++ java { ++ srcDirs = ['src'] ++ } ++ } ++} ++ ++jar { ++ manifest { ++ attributes 'Main-Class': 'org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler' ++ } ++} ++ ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ +-- +2.5.5 + diff --git a/gradle/reprod/patches/forgegradle/0001-Configure-gradle-to-build-reproducible-archives.patch b/gradle/reprod/patches/forgegradle/0001-Configure-gradle-to-build-reproducible-archives.patch new file mode 100644 index 00000000..ede5d050 --- /dev/null +++ b/gradle/reprod/patches/forgegradle/0001-Configure-gradle-to-build-reproducible-archives.patch @@ -0,0 +1,28 @@ +From 21caf62b4f60cce47a5d3b8c939cc7b177904e00 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 19:52:13 +0200 +Subject: [PATCH 1/5] Configure gradle to build reproducible archives + +--- + build.gradle | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 78a2be1..468733e 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -138,6 +138,11 @@ jar { + } + } + ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ + javadoc { + classpath += configurations.compileOnly + +-- +2.5.5 + diff --git a/gradle/reprod/patches/forgegradle/0002-Manually-force-reproducible-archives.patch b/gradle/reprod/patches/forgegradle/0002-Manually-force-reproducible-archives.patch new file mode 100644 index 00000000..3d104f7d --- /dev/null +++ b/gradle/reprod/patches/forgegradle/0002-Manually-force-reproducible-archives.patch @@ -0,0 +1,53 @@ +From 2f3f4c59239b66e4ce09d2bbef39d7ce4eda44e9 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 19:53:46 +0200 +Subject: [PATCH 2/5] Manually force reproducible archives + +For some reason shading one of the libs isn't done in an +reproducible way (produces different jar whenever jar task is run). +--- + build.gradle | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 468733e..91ea99a 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -122,6 +122,10 @@ processResources { + } + } + ++import java.util.jar.JarEntry ++import java.util.jar.JarFile ++import java.util.jar.JarOutputStream ++ + jar { + + configurations.shade.each { dep -> +@@ -136,6 +140,23 @@ jar { + attributes 'group':project.group + attributes 'Implementation-Version': project.version + getGitHash() + } ++ ++ // For some reason using gradle's reproducibleFileOrder and preserveFileTimestamps just isn't enough ++ doLast { ++ File newFile = new File(archivePath.parent, 'tmp-' + archiveName) ++ newFile.withOutputStream { fout -> ++ JarOutputStream out = new JarOutputStream(fout) ++ JarFile jf = new JarFile(archivePath) ++ jf.entries().unique {it.name}.sort {it.name}.each { ++ def copy = new JarEntry(it.name) ++ copy.time = 0 ++ out.putNextEntry(copy) ++ out << jf.getInputStream(it) ++ } ++ out.finish() ++ } ++ newFile.renameTo archivePath ++ } + } + + tasks.withType(AbstractArchiveTask) { +-- +2.5.5 + diff --git a/gradle/reprod/patches/forgegradle/0003-Remove-all-buildscript-dependencies.patch b/gradle/reprod/patches/forgegradle/0003-Remove-all-buildscript-dependencies.patch new file mode 100644 index 00000000..65920ac7 --- /dev/null +++ b/gradle/reprod/patches/forgegradle/0003-Remove-all-buildscript-dependencies.patch @@ -0,0 +1,161 @@ +From a4a52f38bd660caa61531ebecd2d11f764eb3691 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 19:52:46 +0200 +Subject: [PATCH 3/5] Remove all buildscript dependencies + +--- + build.gradle | 130 ----------------------------------------------------------- + 1 file changed, 130 deletions(-) + +diff --git a/build.gradle b/build.gradle +index 91ea99a..8959f8f 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,21 +1,7 @@ +-buildscript { +- repositories { +- maven { +- url "https://plugins.gradle.org/m2/" +- } +- } +- dependencies { +- classpath "com.gradle.publish:plugin-publish-plugin:0.9.1" +- classpath 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0' +- } +-} +- + apply plugin: 'java' + apply plugin: 'idea' + apply plugin: 'eclipse' + apply plugin: 'maven' +-apply plugin: "com.gradle.plugin-publish" +-apply plugin: 'license' + + group = 'net.minecraftforge.gradle' + version = '2.3-SNAPSHOT' +@@ -188,122 +174,6 @@ test { + exclude "**/ExtensionMcpMappingTest*" + } + +-license { +- ext { +- description = 'A Gradle plugin for the creation of Minecraft mods and MinecraftForge plugins.' +- year = '2013' +- fullname = 'Minecraft Forge' +- } +- header rootProject.file('HEADER') +- include '**net/minecraftforge/gradle/**/*.java' +- excludes ([ +- '**net/minecraftforge/gradle/util/ZipFileTree.java', +- '**net/minecraftforge/gradle/util/json/version/*', +- '**net/minecraftforge/gradle/util/patching/Base64.java', +- '**net/minecraftforge/gradle/util/patching/ContextualPatch.java' +- ]) +- ignoreFailures false +- strictCheck true +- mapping { +- java = 'SLASHSTAR_STYLE' +- } +-} +- +-pluginBundle { +- website = 'http://www.gradle.org/' +- vcsUrl = 'https://github.com/MinecraftForge/ForgeGradle' +- description = 'Gradle plugin for all Minecraft mod development needs' +- tags = ['forge', 'minecraft', 'minecraftforge', 'sponge', 'mcp'] +- +- plugins { +- patcher { +- id = 'net.minecraftforge.gradle.patcher' +- displayName = 'Minicraft Patcher Plugin' +- } +- tweakerClient { +- id = 'net.minecraftforge.gradle.tweaker-client' +- displayName = 'Mincraft Client Tweaker Plugin' +- } +- tweakerServer { +- id = 'net.minecraftforge.gradle.tweaker-server' +- displayName = 'Mincraft Server Tweaker Plugin' +- } +- forge { +- id = 'net.minecraftforge.gradle.forge' +- displayName = 'MincraftForge Mod Development Plugin' +- } +- +- launch4j { +- id = 'net.minecraftforge.gradle.launch4j' +- displayName = 'Specialized Launch4J Gradle Plugin' +- } +- } +-} +- +-uploadArchives { +- repositories.mavenDeployer { +- +- dependsOn 'build' +- +- if (project.hasProperty('forgeMavenPass')) +- { +- repository(url: "http://files.minecraftforge.net/maven/manage/upload") { +- authentication(userName: "forge", password: project.getProperty('forgeMavenPass')) +- } +- } +- else +- { +- // local repo folder. Might wanna juset use gradle install if you wanans end it to maven-local +- repository(url: 'file://localhost/' + project.file('repo').getAbsolutePath()) +- } +- +- +- pom { +- groupId = project.group +- version = project.version +- artifactId = project.archivesBaseName +- project { +- name project.archivesBaseName +- packaging 'jar' +- description 'Gradle plugin for Forge' +- url 'https://github.com/MinecraftForge/ForgeGradle' +- +- scm { +- url 'https://github.com/MinecraftForge/ForgeGradle' +- connection 'scm:git:git://github.com/MinecraftForge/ForgeGradle.git' +- developerConnection 'scm:git:git@github.com:MinecraftForge/ForgeGradle.git' +- } +- +- issueManagement { +- system 'github' +- url 'https://github.com/MinecraftForge/ForgeGradle/issues' +- } +- +- licenses { +- license { +- name 'Lesser GNU Public License, Version 2.1' +- url 'https://www.gnu.org/licenses/lgpl-2.1.html' +- distribution 'repo' +- } +- } +- +- developers { +- developer { +- id 'AbrarSyed' +- name 'Abrar Syed' +- roles { role 'developer' } +- } +- developer { +- id 'LexManos' +- name 'Lex Manos' +- roles { role 'developer' } +- } +- } +- } +- } +- } +-} +- + // write out version so its convenient for doc deployment + file('build').mkdirs() + file('build/version.txt').text = version; +-- +2.5.5 + diff --git a/gradle/reprod/patches/forgegradle/0004-Shade-all-the-things-because-we-don-t-include-deps-a.patch b/gradle/reprod/patches/forgegradle/0004-Shade-all-the-things-because-we-don-t-include-deps-a.patch new file mode 100644 index 00000000..5e0806d5 --- /dev/null +++ b/gradle/reprod/patches/forgegradle/0004-Shade-all-the-things-because-we-don-t-include-deps-a.patch @@ -0,0 +1,57 @@ +From 130d406cbe105303f9b14c342f02fc9a20782e32 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 19:54:54 +0200 +Subject: [PATCH 4/5] Shade all the things (because we don't include deps as + maven deps) + +--- + build.gradle | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +diff --git a/build.gradle b/build.gradle +index 8959f8f..0bf7941 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -48,26 +48,26 @@ dependencies { + compile gradleApi() + + // moved to the beginning to be the overrider +- compile 'org.ow2.asm:asm-debug-all:5.1' +- compile 'com.google.guava:guava:18.0' ++ shade 'org.ow2.asm:asm-debug-all:5.1' ++ shade 'com.google.guava:guava:18.0' + +- compile 'net.sf.opencsv:opencsv:2.3' // reading CSVs.. also used by SpecialSource +- compile 'com.cloudbees:diff4j:1.1' // for difing and patching +- compile 'com.github.abrarsyed.jastyle:jAstyle:1.3' // formatting +- compile 'net.sf.trove4j:trove4j:2.1.0' // because its awesome. ++ shade 'net.sf.opencsv:opencsv:2.3' // reading CSVs.. also used by SpecialSource ++ shade 'com.cloudbees:diff4j:1.1' // for difing and patching ++ shade 'com.github.abrarsyed.jastyle:jAstyle:1.3' // formatting ++ shade 'net.sf.trove4j:trove4j:2.1.0' // because its awesome. + +- compile 'com.github.jponge:lzma-java:1.3' // replaces the LZMA binary +- compile 'com.nothome:javaxdelta:2.0.1' // GDIFF implementation for BinPatches +- compile 'com.google.code.gson:gson:2.2.4' // Used instead of Argo for buuilding changelog. +- compile 'com.github.tony19:named-regexp:0.2.3' // 1.7 Named regexp features +- compile 'net.minecraftforge:forgeflower:1.0.342-SNAPSHOT' // Fernflower Forge edition ++ shade 'com.github.jponge:lzma-java:1.3' // replaces the LZMA binary ++ shade 'com.nothome:javaxdelta:2.0.1' // GDIFF implementation for BinPatches ++ shade 'com.google.code.gson:gson:2.2.4' // Used instead of Argo for buuilding changelog. ++ shade 'com.github.tony19:named-regexp:0.2.3' // 1.7 Named regexp features ++ shade 'net.minecraftforge:forgeflower:1.0.342-SNAPSHOT' // Fernflower Forge edition + + shade 'net.md-5:SpecialSource:1.7.4' // deobf and reobs + // compile 'net.md-5:SpecialSource:1.7.4' // when md5 publishes + + // because curse +- compile 'org.apache.httpcomponents:httpclient:4.3.3' +- compile 'org.apache.httpcomponents:httpmime:4.3.3' ++ shade 'org.apache.httpcomponents:httpclient:4.3.3' ++ shade 'org.apache.httpcomponents:httpmime:4.3.3' + + // mcp stuff + shade 'de.oceanlabs.mcp:RetroGuard:3.6.6' +-- +2.5.5 + diff --git a/gradle/reprod/patches/forgegradle/0005-Add-witness-plugin.patch b/gradle/reprod/patches/forgegradle/0005-Add-witness-plugin.patch new file mode 100644 index 00000000..d3f45939 --- /dev/null +++ b/gradle/reprod/patches/forgegradle/0005-Add-witness-plugin.patch @@ -0,0 +1,90 @@ +From ffd1f38113d2ec550ae23be13df35c678bea5543 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 19:53:15 +0200 +Subject: [PATCH 5/5] Add witness plugin + +--- + build.gradle | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 0bf7941..d1530fd 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,7 +1,14 @@ ++buildscript { ++ dependencies { ++ classpath files('../gradle-witness.jar') ++ } ++} ++ + apply plugin: 'java' + apply plugin: 'idea' + apply plugin: 'eclipse' + apply plugin: 'maven' ++apply plugin: 'witness' + + group = 'net.minecraftforge.gradle' + version = '2.3-SNAPSHOT' +@@ -81,6 +88,58 @@ dependencies { + testCompile 'junit:junit:4.12' + } + ++dependencyVerification { ++ includedConfigurations += [configurations.shade, configurations.testCompile] ++ verify = [ ++ 'org.ow2.asm:asm-debug-all:5.1:f7ac3f642c36c406543bb56ae3db3a53f263f71bd857b04709986e2d5798c8c4', ++ 'net.sf.opencsv:opencsv:2.3:dc0ba5bff6140dc92339973026a0ecbddc2a3b01bdd46ed9d16becc2f6d78de6', ++ 'com.cloudbees:diff4j:1.1:e6509db2167c983d254d3530c66a060443e91a6ca38df9fdc4ef2a88ad813fa5', ++ 'com.github.abrarsyed.jastyle:jAstyle:1.3:4cad4ee2f1c379fa1f6496912fe026d8a4f2febf0a140ff867206b00a22f988f', ++ 'net.sf.trove4j:trove4j:2.1.0:294fb88c272598b9a5dcae15f13d228e64134256de941fbc28917a994beeb075', ++ 'com.github.jponge:lzma-java:1.3:75ccc0e24d37ed5b8916e1bcffad1e067c2b1cfa21b635287f968db5c3c1963a', ++ 'com.nothome:javaxdelta:2.0.1:a661dfcb749053fc26eada2a0a8e619a8ead1ca9eda29e1698687aa2cdd80152', ++ 'com.google.code.gson:gson:2.2.4:c0328cd07ca9e363a5acd00c1cf4afe8cf554bd6d373834981ba05cebec687fb', ++ 'com.github.tony19:named-regexp:0.2.3:c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956', ++ 'net.minecraftforge:forgeflower:1.0.342-SNAPSHOT:ad7e63b8732da2c10d5923cc567386b8f172848259c3c2627298e6cd702df938', ++ 'net.md-5:SpecialSource:1.7.4:b47c5d5810643426a3147ddb2195ef2ab67c80b167e7c2ac64a5d0dee8c030dd', ++ 'org.apache.httpcomponents:httpclient:4.3.3:9844cc9b5440d65a88d28bcba9d771374d2dfdab898848cda164611091633013', ++ 'org.apache.httpcomponents:httpmime:4.3.3:61434dbb2314cbb8d28025feb6ae53bbc45d1042daa34371d8911e1e7f570b36', ++ 'de.oceanlabs.mcp:RetroGuard:3.6.6:22c45060f350fcaa94e503f4a420cf8237c26c0fcdb4ada4aa98389b75c7b231', ++ 'de.oceanlabs.mcp:mcinjector:3.4-SNAPSHOT:4ad11e0943fb343225dace0000215113c8cbdede6949fa8ba653bdcf770cb028', ++ 'net.minecraftforge.srg2source:Srg2Source:4.0-SNAPSHOT:99893440fe20bafc8193a790889239d4cc60dbe8b8be1e7698a31eaa3853e2fd', ++ 'org.jvnet.localizer:localizer:1.12:212f6eaa0491dd7359dc33c3a72e82a23b096e1890d984b4d92395abc9a6bf7f', ++ 'commons-io:commons-io:1.4:a7f713593007813bf07d19bd1df9f81c86c0719e9a0bb2ef1b98b78313fc940d', ++ 'trove:trove:1.0.2:ad68a86cfd0255a2bc0525ce11ec49640caea7e34ff91eb89c3193dcccd77f05', ++ 'net.sf.jopt-simple:jopt-simple:5.0.1:9f0c8d50fa4b79b6ff1502dbec8502179d6b9497cacbe17a13074001aed537ec', ++ 'org.apache.httpcomponents:httpcore:4.3.2:abd02320e2356f89d054dae4cf02306bef20a9cf7865b3ac94ec7552b4f1528b', ++ 'commons-logging:commons-logging:1.1.3:70903f6fc82e9908c8da9f20443f61d90f0870a312642991fe8462a0b9391784', ++ 'commons-codec:commons-codec:1.6:54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86', ++ 'org.eclipse.equinox:common:3.6.200-v20130402-1505:843414d0e457898b1615e4c9118f86ae0cf30dd5166b8b0a1d206fbdab5fbbae', ++ 'org.eclipse.text:org.eclipse.text:3.5.101:1bacf311ac3d39cc53b03f8de7a4ccffc89c208938f0004a90c652383e927f18', ++ 'org.eclipse.core:resources:3.2.1-R32x_v20060914:73f9a1a2403f7f9c44d11431c40be4641295f3620570bfef2168a66c5de68fee', ++ 'org.eclipse.jdt:org.eclipse.jdt.core:3.12.0.v20160315-2126:2082ffb0bb8f276ca164a6363e394f902163a81b7df44ede13aed33d84fdf27e', ++ 'fr.inria.gforge.spoon:spoon-core:5.1.0:08e0b3db3d116301f16142c88932daf954ac447427d609710c2a5ee8dfcfa1f7', ++ 'org.eclipse.equinox:registry:3.5.400-v20140428-1507:a6833a81795978d4ad8d2e54597171e2a3447fd6983b8e902710aa1dc946fa24', ++ 'org.eclipse.equinox:app:1.3.200-v20130910-1609:7b2ad6c43d922f3ba0d18d99879d1d56d6a994ba7b639d5d6276f1a167b6a7ac', ++ 'org.eclipse.core:org.eclipse.core.commands:3.6.0:e46a6444a6d7c0fe70f196ce42d9700c4514b68bf55bae296b2e3c287883ffdc', ++ 'org.eclipse.equinox:org.eclipse.equinox.common:3.6.0:32b046de57df2f4887fc5a2c343740d9d12c7fe17541e2cede73cfa4ccbc2436', ++ 'org.eclipse.core.runtime:compatibility:3.1.200-v20070502:ddf19054374a2617ba9c10d7a5ec8eeaeb8f62c2c6e430144e81da15718bb585', ++ 'org.eclipse.core:expressions:3.3.0-v20070606-0010:4a73a4a0ebf5ca5f7e9d5e8978b24cd72ebacd5b561de961517f4c976aa7e30f', ++ 'org.eclipse.core:filesystem:1.1.0-v20070606:b418d15acf94545248f4bd55b4a9b62fc49246488758729d6b3ff52ae149df24', ++ 'com.martiansoftware:jsap:2.1:331746fa62cfbc3368260c5a2e660936ad11be612308c120a044e120361d474e', ++ 'log4j:log4j:1.2.17:1d31696445697720527091754369082a6651bd49781b6005deb94e56753406f9', ++ 'org.eclipse.update:configurator:3.2.100-v20070615:88b506fa09a810b19517a2d45cb8f5eaa76c22b18abfbdcf36cd07aebfd56cb0', ++ 'com.google.guava:guava:19.0:58d4cc2e05ebb012bbac568b032f75623be1cb6fb096f3c60c72a86f7f057de4', ++ 'org.eclipse:osgi:3.10.0-v20140606-1445:fa1d59411d4d2667d8f15638af7c0ac44539234c0982c27a2b65ba06c32a0b3e', ++ 'org.eclipse.core:jobs:3.6.0-v20140424-0053:ef971ecb154fba0cc06d913448640fb2e5ab3f9079c1c7854385d1c30d81a94f', ++ 'org.eclipse.equinox:preferences:3.5.200-v20140224-1527:6498d32ab6503b49a44e0a0bfe1c2ac28ffb7e8f88acbdb4dda89d73092d8ca7', ++ 'org.eclipse.core:contenttype:3.4.200-v20140207-1251:4dd6ec1376693bd8ac4e2ceacc7be70880920978f3fef31db4968e6ade001c87', ++ 'org.eclipse.core:runtime:3.10.0-v20140318-2214:363ad8af4d8fc7f208b6fa640e490c7ba84b2aa78c26809e569bb1b0737ce9cb', ++ 'junit:junit:4.12:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', ++ 'org.hamcrest:hamcrest-core:1.3:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', ++ ] ++} ++ + task wrapper(type: Wrapper) { + gradleVersion = '2.14' + } +-- +2.5.5 + diff --git a/gradle/reprod/patches/gradle-witness/0001-Configure-gradle-to-build-reproducible-archives.patch b/gradle/reprod/patches/gradle-witness/0001-Configure-gradle-to-build-reproducible-archives.patch new file mode 100644 index 00000000..3548dc79 --- /dev/null +++ b/gradle/reprod/patches/gradle-witness/0001-Configure-gradle-to-build-reproducible-archives.patch @@ -0,0 +1,25 @@ +From e6caf7be3f8b7fbe6be79449b30a93c8a362997f Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:00:16 +0200 +Subject: [PATCH] Configure gradle to build reproducible archives + +--- + build.gradle | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 988a3bf..b75571c 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -8,3 +8,8 @@ dependencies { + sourceCompatibility = '1.7' + targetCompatibility = '1.7' + ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0001-Configure-gradle-to-build-reproducible-archives.patch b/gradle/reprod/patches/mixin/0001-Configure-gradle-to-build-reproducible-archives.patch new file mode 100644 index 00000000..8ef12d23 --- /dev/null +++ b/gradle/reprod/patches/mixin/0001-Configure-gradle-to-build-reproducible-archives.patch @@ -0,0 +1,28 @@ +From e60dd702c247692529a7cece94a475650623482e Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:05:14 +0200 +Subject: [PATCH 1/7] Configure gradle to build reproducible archives + +--- + build.gradle | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 4f0aa28..e0c46ea 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -170,6 +170,11 @@ processResources { + from 'LICENSE.txt' + } + ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ + // License header formatting + license { + ext { +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0002-Remove-replace-all-buildscript-dependencies.patch b/gradle/reprod/patches/mixin/0002-Remove-replace-all-buildscript-dependencies.patch new file mode 100644 index 00000000..bd7244d1 --- /dev/null +++ b/gradle/reprod/patches/mixin/0002-Remove-replace-all-buildscript-dependencies.patch @@ -0,0 +1,59 @@ +From c245b961e83176a1731a7eaf1f1f3ffbefa1afb7 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:08:56 +0200 +Subject: [PATCH 2/7] Remove/replace all buildscript dependencies + +--- + build.gradle | 24 +----------------------- + 1 file changed, 1 insertion(+), 23 deletions(-) + +diff --git a/build.gradle b/build.gradle +index e0c46ea..165dbe4 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,17 +1,12 @@ + // Gradle repositories and dependencies + buildscript { +- repositories { +- jcenter() +- } + dependencies { +- classpath 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0' +- classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' ++ classpath files('../shadow.jar') + } + } + + // Apply plugin + apply plugin: 'java' +-apply plugin: 'license' + apply plugin: 'checkstyle' + apply plugin: 'maven' + apply plugin: 'eclipse' +@@ -175,23 +170,6 @@ tasks.withType(AbstractArchiveTask) { + reproducibleFileOrder = true + } + +-// License header formatting +-license { +- ext { +- name = project.name +- organization = project.organization +- url = project.url +- } +- include '**/*.java' +- header file("HEADER.txt") +- sourceSets = project.sourceSets +- ignoreFailures false +- strictCheck true +- mapping { +- java = 'SLASHSTAR_STYLE' +- } +-} +- + checkstyle { + configProperties = [ + "name" : project.name, +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0003-Fix-for-Gradle-3.patch b/gradle/reprod/patches/mixin/0003-Fix-for-Gradle-3.patch new file mode 100644 index 00000000..0c79a7ed --- /dev/null +++ b/gradle/reprod/patches/mixin/0003-Fix-for-Gradle-3.patch @@ -0,0 +1,25 @@ +From 0f250141ba6515dbeffeb0722bf29976850bb323 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:13:17 +0200 +Subject: [PATCH 3/7] Fix for Gradle 3 + +--- + build.gradle | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/build.gradle b/build.gradle +index 165dbe4..0f189ec 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -92,7 +92,7 @@ dependencies { + + // Task to read ASM library and rename packages + task renamedASM { +- outputs.file files(configurations.asm.files.findAll{!it.name.contains("sources")}.collect { file -> ++ outputs.files files(configurations.asm.files.findAll{!it.name.contains("sources")}.collect { file -> + new File(project.repositories['renamed-packages'].dirs[0], "mixin-" + file.name).path + }) + doLast { +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0004-Disable-checkstyle.patch b/gradle/reprod/patches/mixin/0004-Disable-checkstyle.patch new file mode 100644 index 00000000..7bd3f932 --- /dev/null +++ b/gradle/reprod/patches/mixin/0004-Disable-checkstyle.patch @@ -0,0 +1,42 @@ +From eb4fa04cf82067b20caa7222c154f8b6f7ab95ac Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:13:45 +0200 +Subject: [PATCH 4/7] Disable checkstyle + +--- + build.gradle | 12 ------------ + 1 file changed, 12 deletions(-) + +diff --git a/build.gradle b/build.gradle +index 0f189ec..f8598a3 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -7,7 +7,6 @@ buildscript { + + // Apply plugin + apply plugin: 'java' +-apply plugin: 'checkstyle' + apply plugin: 'maven' + apply plugin: 'eclipse' + apply plugin: 'idea' +@@ -170,17 +169,6 @@ tasks.withType(AbstractArchiveTask) { + reproducibleFileOrder = true + } + +-checkstyle { +- configProperties = [ +- "name" : project.name, +- "organization": project.organization, +- "url" : project.url, +- "year" : project.inceptionYear +- ] +- configFile = file("checkstyle.xml") +- toolVersion = '6.19' +-} +- + // Source compiler configuration + tasks.withType(JavaCompile) { + options.compilerArgs += ['-Xlint:all', '-Xlint:-path'] +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0005-Replace-fernflower-SNAPSHOT-depencency.patch b/gradle/reprod/patches/mixin/0005-Replace-fernflower-SNAPSHOT-depencency.patch new file mode 100644 index 00000000..c78662d2 --- /dev/null +++ b/gradle/reprod/patches/mixin/0005-Replace-fernflower-SNAPSHOT-depencency.patch @@ -0,0 +1,27 @@ +From c66ba83e4b27f6f094c2dcdaaac095d3ca69b41c Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:35:08 +0200 +Subject: [PATCH 5/7] Replace fernflower SNAPSHOT depencency + +--- + build.gradle | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/build.gradle b/build.gradle +index f8598a3..e9a965b 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -143,8 +143,8 @@ dependencies { + fernflowerCompile 'commons-io:commons-io:2.4' + fernflowerCompile 'org.apache.logging.log4j:log4j-core:2.0-beta9' + fernflowerCompile 'com.google.guava:guava:17.0' +- fernflowerCompile 'org.jetbrains.java.decompiler:fernflower:sponge-SNAPSHOT' +- compile 'org.jetbrains.java.decompiler:fernflower:sponge-SNAPSHOT' ++ fernflowerCompile files('../fernflower.jar') ++ compile files('../fernflower.jar') + + compile('net.minecraft:launchwrapper:1.11') { + exclude module: 'lwjgl' +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0006-Use-TreeMap-in-ReferenceMapper-for-reproducibility.patch b/gradle/reprod/patches/mixin/0006-Use-TreeMap-in-ReferenceMapper-for-reproducibility.patch new file mode 100644 index 00000000..07bbca64 --- /dev/null +++ b/gradle/reprod/patches/mixin/0006-Use-TreeMap-in-ReferenceMapper-for-reproducibility.patch @@ -0,0 +1,56 @@ +From 6422d5985faeff394237a499e5529b765dd46b7e Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 21:40:59 +0200 +Subject: [PATCH 6/7] Use TreeMap in ReferenceMapper for reproducibility + +--- + .../java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java b/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java +index 2a368e7..082b5dd 100644 +--- a/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java ++++ b/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java +@@ -29,7 +29,6 @@ import java.io.InputStream; + import java.io.InputStreamReader; + import java.io.Reader; + import java.io.Serializable; +-import java.util.HashMap; + import java.util.Map; + + import org.apache.logging.log4j.LogManager; +@@ -71,13 +70,13 @@ public final class ReferenceMapper implements Serializable { + * by the AP. Each entry is keyed by the owning mixin, with the value map + * containing the actual remappings for each owner + */ +- private final Map> mappings = Maps.newHashMap(); ++ private final Map> mappings = Maps.newTreeMap(); + + /** + * All mapping sets, keyed by environment type, eg. "notch", "searge". The + * format of each map within this map is the same as for {@link #mappings} + */ +- private final Map>> data = Maps.newHashMap(); ++ private final Map>> data = Maps.newTreeMap(); + + /** + * True if this refmap cannot be written. Only true for the +@@ -191,13 +190,13 @@ public final class ReferenceMapper implements Serializable { + if (context != null) { + mappings = this.data.get(context); + if (mappings == null) { +- mappings = Maps.newHashMap(); ++ mappings = Maps.newTreeMap(); + this.data.put(context, mappings); + } + } + Map classMappings = mappings.get(className); + if (classMappings == null) { +- classMappings = new HashMap(); ++ classMappings = Maps.newTreeMap(); + mappings.put(className, classMappings); + } + return classMappings.put(reference, newReference); +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixin/0007-Add-witness-plugin.patch b/gradle/reprod/patches/mixin/0007-Add-witness-plugin.patch new file mode 100644 index 00000000..28d18a24 --- /dev/null +++ b/gradle/reprod/patches/mixin/0007-Add-witness-plugin.patch @@ -0,0 +1,71 @@ +From 6a90175bbe1a7cbb9d0eb6bb0bbb27ad451f4587 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:20:46 +0200 +Subject: [PATCH 7/7] Add witness plugin + +--- + build.gradle | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +diff --git a/build.gradle b/build.gradle +index e9a965b..737be9e 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -2,6 +2,7 @@ + buildscript { + dependencies { + classpath files('../shadow.jar') ++ classpath files('../gradle-witness.jar') + } + } + +@@ -11,6 +12,7 @@ apply plugin: 'maven' + apply plugin: 'eclipse' + apply plugin: 'idea' + apply plugin: 'com.github.johnrengelman.shadow' ++apply plugin: 'witness' + + // Default tasks + defaultTasks 'licenseFormat', 'check', 'build' +@@ -158,6 +160,38 @@ dependencies { + bridgeCompile 'org.apache.logging.log4j:log4j-core:2.0-beta9' + } + ++dependencyVerification { ++ includedConfigurations += [configurations.asm, configurations.jarjar, configurations.apCompile, configurations.agentCompile, configurations.fernflowerCompile, configurations.bridgeCompile] ++ verify = [ ++ 'com.googlecode.jarjar:jarjar:1.1:4838f4f29a027522363cef1bcda1b48808880b0de4953fab6db4121ee27b649b', ++ 'com.google.guava:guava:17.0:8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc', ++ 'com.google.code.gson:gson:2.2.4:c0328cd07ca9e363a5acd00c1cf4afe8cf554bd6d373834981ba05cebec687fb', ++ 'commons-io:commons-io:2.4:cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581', ++ 'net.minecraft:launchwrapper:1.11:e74b65b8948446982a506a96176dd8baf4688237ba4903f56ca6f667b6c7ee42', ++ 'org.apache.logging.log4j:log4j-core:2.0-beta9:dcde6033b205433d6e9855c93740f798951fa3a3f252035a768d9f356fde806d', ++ 'org.apache.logging.log4j:log4j-api:2.0-beta9:eb0ca9bdd938f80711152a758d6bc331a8b0d769199d457294dc67ed03f73498', ++ 'net.sf.jopt-simple:jopt-simple:4.5:64335a48be6b142a7d0c13ec5c82a707857aa58c0234e6eda3eaca0e96eea51b', ++ 'org.ow2.asm:asm-debug-all:5.0.3:2969356ac1e40fe4141948c563690238f5d79d76aec7fd873536867a331ede81', ++ 'org.ow2.asm:asm-debug-all:5.0.3-sources:1e9ee309d909b3dbf33291fcfd36c76adba4ed1215b8156c3ac61a774cc86bf1', ++ 'com.googlecode.jarjar:jarjar:1.1:4838f4f29a027522363cef1bcda1b48808880b0de4953fab6db4121ee27b649b', ++ 'com.google.guava:guava:17.0:8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc', ++ 'net.minecraft:launchwrapper:1.11:e74b65b8948446982a506a96176dd8baf4688237ba4903f56ca6f667b6c7ee42', ++ 'org.apache.logging.log4j:log4j-core:2.0-beta9:dcde6033b205433d6e9855c93740f798951fa3a3f252035a768d9f356fde806d', ++ 'org.ow2.asm:asm-debug-all:5.0.3:2969356ac1e40fe4141948c563690238f5d79d76aec7fd873536867a331ede81', ++ 'org.apache.logging.log4j:log4j-api:2.0-beta9:eb0ca9bdd938f80711152a758d6bc331a8b0d769199d457294dc67ed03f73498', ++ 'net.sf.jopt-simple:jopt-simple:4.5:64335a48be6b142a7d0c13ec5c82a707857aa58c0234e6eda3eaca0e96eea51b', ++ 'commons-io:commons-io:2.4:cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581', ++ 'org.apache.logging.log4j:log4j-core:2.0-beta9:dcde6033b205433d6e9855c93740f798951fa3a3f252035a768d9f356fde806d', ++ 'com.google.guava:guava:17.0:8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc', ++ 'org.apache.logging.log4j:log4j-api:2.0-beta9:eb0ca9bdd938f80711152a758d6bc331a8b0d769199d457294dc67ed03f73498', ++ 'org.ow2.asm:asm-commons:5.0.3:18c1e092230233c9d29e46f21943d769bdb48130cc279e4b0e663f423948c2da', ++ 'org.apache.logging.log4j:log4j-core:2.0-beta9:dcde6033b205433d6e9855c93740f798951fa3a3f252035a768d9f356fde806d', ++ 'org.ow2.asm:asm-tree:5.0.3:347a7a9400f9964e87c91d3980e48eebdc8d024bc3b36f7f22189c662853a51c', ++ 'org.apache.logging.log4j:log4j-api:2.0-beta9:eb0ca9bdd938f80711152a758d6bc331a8b0d769199d457294dc67ed03f73498', ++ 'org.ow2.asm:asm:5.0.3:71c4f78e437b8fdcd9cc0dfd2abea8c089eb677005a6a5cff320206cc52b46cc', ++ ] ++} ++ + // Filter, process, and include resources + processResources { + // Include in final JAR +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixingradle/0001-Configure-gradle-to-build-reproducible-archives.patch b/gradle/reprod/patches/mixingradle/0001-Configure-gradle-to-build-reproducible-archives.patch new file mode 100644 index 00000000..ad6e368a --- /dev/null +++ b/gradle/reprod/patches/mixingradle/0001-Configure-gradle-to-build-reproducible-archives.patch @@ -0,0 +1,28 @@ +From 34446d49be65c3a17e962c2e4053ed3e41aa2ab4 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:04:25 +0200 +Subject: [PATCH 1/3] Configure gradle to build reproducible archives + +--- + build.gradle | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 3127c7f..c34a8a2 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -71,6 +71,11 @@ task groovydocJar(type: Jar, dependsOn: groovydoc) { + classifier = 'groovydoc' + } + ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ + artifacts { + archives jar + archives groovydocJar +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixingradle/0002-Remove-all-buildscript-dependencies.patch b/gradle/reprod/patches/mixingradle/0002-Remove-all-buildscript-dependencies.patch new file mode 100644 index 00000000..c9c2749e --- /dev/null +++ b/gradle/reprod/patches/mixingradle/0002-Remove-all-buildscript-dependencies.patch @@ -0,0 +1,125 @@ +From f1130f071e67235b27e2bca95584dec25a8dec37 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:04:56 +0200 +Subject: [PATCH 2/3] Remove all buildscript dependencies + +--- + build.gradle | 91 ------------------------------------------------------------ + 1 file changed, 91 deletions(-) + +diff --git a/build.gradle b/build.gradle +index c34a8a2..40169df 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,22 +1,6 @@ +-buildscript { +- repositories { +- maven { +- url "https://plugins.gradle.org/m2/" +- } +- } +- dependencies { +- classpath 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0' +- classpath "com.gradle.publish:plugin-publish-plugin:0.9.1" +- } +-} +- + apply plugin: 'groovy' +-apply plugin: 'license' + apply plugin: 'maven' + apply plugin: 'eclipse' +-apply plugin: "com.gradle.plugin-publish" +- +-defaultTasks 'licenseFormat', 'build' + + group = 'org.spongepowered' + version = '0.4-SNAPSHOT' +@@ -43,22 +27,6 @@ processResources { + from 'LICENSE.txt' + } + +-license { +- ext { +- name = project.name +- organization = project.organization +- url = project.url +- } +- include '**/*.groovy' +- header file("HEADER.txt") +- sourceSets = project.sourceSets +- ignoreFailures false +- strictCheck true +- mapping { +- java = 'SLASHSTAR_STYLE' +- } +-} +- + jar.manifest.mainAttributes ( + "Built-By": System.properties['user.name'], + "Created-By": System.properties['java.vm.version'] + " (" + System.properties['java.vm.vendor'] + ")", +@@ -81,62 +49,3 @@ artifacts { + archives groovydocJar + } + +-pluginBundle { +- website = 'http://www.gradle.org/' +- vcsUrl = 'https://github.com/SpongePowered/MixinGradle' +- description = 'Gradle plugin for SpongePowered Mixin' +- tags = ['spongepowered', 'sponge', 'mixin'] +- plugins { +- patcher { +- id = 'org.spongepowered.mixin' +- displayName = 'SpongePowered Mixin Gradle Plugin' +- } +- } +-} +- +-uploadArchives { +- repositories { +- +- mavenDeployer { +- configuration = configurations.deployerJars +- +- if (project.hasProperty("chRepo")) +- { +- repository(url: project.chRepo) { +- authentication(userName: project.chUsername, password: project.chPassword) +- } +- } +- +- pom { +- groupId = project.group +- version = project.version +- artifactId = project.archivesBaseName +- project { +- name project.archivesBaseName +- packaging 'jar' +- description 'MixinGradle' +- url 'http://www.spongepowered.org/' +- +- scm { +- url 'https://github.com/SpongePowered/Mixin' +- connection 'scm:git:git://github.com/SpongePowered/Mixin.git' +- developerConnection 'scm:git:git@github.com:SpongePowered/Mixin.git' +- } +- +- issueManagement { +- system 'GitHub Issues' +- url 'https://github.com/SpongePowered/MixinGradle/issues' +- } +- +- licenses { +- license { +- name 'MIT license' +- url 'http://opensource.org/licenses/MIT' +- distribution 'repo' +- } +- } +- } +- } +- } +- } +-} +-- +2.5.5 + diff --git a/gradle/reprod/patches/mixingradle/0003-Add-witness-plugin.patch b/gradle/reprod/patches/mixingradle/0003-Add-witness-plugin.patch new file mode 100644 index 00000000..94d5b1d8 --- /dev/null +++ b/gradle/reprod/patches/mixingradle/0003-Add-witness-plugin.patch @@ -0,0 +1,44 @@ +From 7c2f6c0d86940142671615402ba758185448e3cf Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:05:30 +0200 +Subject: [PATCH 3/3] Add witness plugin + +--- + build.gradle | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 40169df..93f9764 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,6 +1,13 @@ ++buildscript { ++ dependencies { ++ classpath files('../gradle-witness.jar') ++ } ++} ++ + apply plugin: 'groovy' + apply plugin: 'maven' + apply plugin: 'eclipse' ++apply plugin: 'witness' + + group = 'org.spongepowered' + version = '0.4-SNAPSHOT' +@@ -23,6 +30,13 @@ dependencies { + deployerJars 'org.apache.maven.wagon:wagon-ftp:2.7' + } + ++dependencyVerification { ++ verify = [ ++ 'com.google.guava:guava:17.0:8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc', ++ 'org.ow2.asm:asm-debug-all:5.0.3:2969356ac1e40fe4141948c563690238f5d79d76aec7fd873536867a331ede81', ++ ] ++} ++ + processResources { + from 'LICENSE.txt' + } +-- +2.5.5 + diff --git a/gradle/reprod/patches/replaymod/0001-Replace-buildscript-dependencies-with-manually-built.patch b/gradle/reprod/patches/replaymod/0001-Replace-buildscript-dependencies-with-manually-built.patch new file mode 100644 index 00000000..c7d6dc84 --- /dev/null +++ b/gradle/reprod/patches/replaymod/0001-Replace-buildscript-dependencies-with-manually-built.patch @@ -0,0 +1,43 @@ +From 493dbd8ed387d661eef3e33ee614c79d7487f1bd Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:41:05 +0200 +Subject: [PATCH 1/5] Replace buildscript dependencies with manually built ones + +--- + build.gradle | 19 ++----------------- + 1 file changed, 2 insertions(+), 17 deletions(-) + +diff --git a/build.gradle b/build.gradle +index ee24828..42d0607 100755 +--- a/build.gradle ++++ b/build.gradle +@@ -1,24 +1,9 @@ + import groovy.json.JsonOutput + + buildscript { +- repositories { +- mavenCentral() +- maven { +- name = "forge" +- url = "http://files.minecraftforge.net/maven" +- } +- maven { +- name = "sponge" +- url = "https://repo.spongepowered.org/maven" +- } +- maven { +- name = "sonatype" +- url = "https://oss.sonatype.org/content/repositories/snapshots/" +- } +- } + dependencies { +- classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' +- classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT' ++ classpath files('gradle/reprod/deps/forgegradle.jar') ++ classpath files('gradle/reprod/deps/mixingradle.jar') + } + } + +-- +2.5.5 + diff --git a/gradle/reprod/patches/replaymod/0002-Replace-mixin-dep-with-manually-built-one.patch b/gradle/reprod/patches/replaymod/0002-Replace-mixin-dep-with-manually-built-one.patch new file mode 100644 index 00000000..d9c21ef2 --- /dev/null +++ b/gradle/reprod/patches/replaymod/0002-Replace-mixin-dep-with-manually-built-one.patch @@ -0,0 +1,27 @@ +From 9e4e7ac3f8ee5508939cf71e731189e4c0e1c7b5 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 20:06:39 +0200 +Subject: [PATCH 2/5] Replace mixin dep with manually built one + +--- + build.gradle | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/build.gradle b/build.gradle +index 42d0607..bfa3914 100755 +--- a/build.gradle ++++ b/build.gradle +@@ -41,9 +41,7 @@ configurations { + dependencies { + compile 'org.projectlombok:lombok:1.16.4' + +- compile('org.spongepowered:mixin:0.6.11-SNAPSHOT') { +- exclude group: 'org.apache.logging.log4j' +- } ++ shade files('gradle/reprod/deps/mixin.jar') + shade 'com.googlecode.mp4parser:isoparser:1.1.7' + shade 'org.apache.commons:commons-exec:1.3' + shade 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0' +-- +2.5.5 + diff --git a/gradle/reprod/patches/replaymod/0003-Add-witness-plugin.patch b/gradle/reprod/patches/replaymod/0003-Add-witness-plugin.patch new file mode 100644 index 00000000..79686aff --- /dev/null +++ b/gradle/reprod/patches/replaymod/0003-Add-witness-plugin.patch @@ -0,0 +1,41 @@ +From 9baa28ace59f2036e93fff379438c2553f02b6a8 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:41:46 +0200 +Subject: [PATCH 3/5] Add witness plugin + +--- + build.gradle | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/build.gradle b/build.gradle +index bfa3914..bee78ee 100755 +--- a/build.gradle ++++ b/build.gradle +@@ -4,11 +4,13 @@ buildscript { + dependencies { + classpath files('gradle/reprod/deps/forgegradle.jar') + classpath files('gradle/reprod/deps/mixingradle.jar') ++ classpath files('gradle/reprod/deps/gradle-witness.jar') + } + } + + apply plugin: 'net.minecraftforge.gradle.forge' + apply plugin: 'org.spongepowered.mixin' ++apply plugin: 'witness' + + sourceCompatibility = 1.8 + targetCompatibility = 1.8 +@@ -56,6 +58,10 @@ dependencies { + testCompile 'junit:junit:4.11' + } + ++dependencyVerification { ++ includedConfigurations += [configurations.shade, configurations.testCompile] ++} ++ + tasks['idea'].dependsOn ':ReplayStudio:preshadowJar' + + jar { +-- +2.5.5 + diff --git a/gradle/reprod/patches/replaymod/0004-Add-checksums-for-witness-plugin.patch b/gradle/reprod/patches/replaymod/0004-Add-checksums-for-witness-plugin.patch new file mode 100644 index 00000000..ebc5f586 --- /dev/null +++ b/gradle/reprod/patches/replaymod/0004-Add-checksums-for-witness-plugin.patch @@ -0,0 +1,109 @@ +From cbba1bbb1010408adb5227b5a928ca00cc19699a Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Mon, 7 Aug 2017 20:42:06 +0200 +Subject: [PATCH 4/5] Add checksums for witness plugin + +--- + build.gradle | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +diff --git a/build.gradle b/build.gradle +index bee78ee..bda297b 100755 +--- a/build.gradle ++++ b/build.gradle +@@ -60,6 +60,92 @@ dependencies { + + dependencyVerification { + includedConfigurations += [configurations.shade, configurations.testCompile] ++ verify = [ ++ 'com.googlecode.mp4parser:isoparser:1.1.7:ddbbf392f8e61f770a509a49aed5f32ead19768283b4b512c626e09e1ba5cc46', ++ 'org.apache.commons:commons-exec:1.3:cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b', ++ 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0:88debb16c533600c3b0290a088f2de3b3a8318ff86ebe0bdbcefeab0a0eafb9e', ++ 'com.google.api-client:google-api-client-gson:1.20.0:d68647ba10cfa33e0b6e538c704723229932795d5ee495288cec46a6156c5891', ++ 'com.google.api-client:google-api-client-java6:1.20.0:df4f423f33f467d248e51deb555404771f7bc41430b2d4d1e49966c79c0b207b', ++ 'com.google.oauth-client:google-oauth-client-jetty:1.20.0:daabf9d4e35d4015c2c917982463572856a5c8d7fa718e94edb2b6b114a2a8a2', ++ 'org.aspectj:aspectjrt:1.8.2:c7964f00c3d3889c5223e8fcb7476610c59453c86bccc68ef493a56d171bf655', ++ 'org.apache.commons:commons-lang3:3.3.2:6b81d10754dadf184d386011486e6509c2cc0c3d33565ced4fb4402b9413d47d', ++ 'org.apache.commons:commons-collections4:4.0:93f8dfcd20831a28d092427723f696bceb70b28e7fb89d7914f14d5ea492ce5a', ++ 'commons-cli:commons-cli:1.2:e7cd8951956d349b568b7ccfd4f5b2529a8c113e67c32b028f52ffda371259d9', ++ 'com.google.guava:guava:21.0:972139718abc8a4893fa78cba8cf7b2c903f35c97aaf44fa3031b0669948b480', ++ 'com.google.api-client:google-api-client:1.22.0:47c625c83a8cf97b8bbdff2acde923ff8fd3174e62aabcfc5d1b86692594ffba', ++ 'com.google.http-client:google-http-client-gson:1.20.0:cc144c70d40acf7c6e6f773ac19a2ac6e3ed9830d8e33e32421ff21a91450994', ++ 'com.google.oauth-client:google-oauth-client-java6:1.20.0:3149ae4fa222c7e804c5b7bc0d044702bc6bb8309b5ed94f6d350a5d4d657fc9', ++ 'org.mortbay.jetty:jetty:6.1.26:21091d3a9c1349f640fdc421504a604c040ed89087ecc12afbe32353326ed4e5', ++ 'com.google.code.gson:gson:2.1:35c94198255e95f6f11501eb4b3d43a5276bfdd142ab7c904722e69bff51f69e', ++ 'org.mortbay.jetty:jetty-util:6.1.26:9b974ce2b99f48254b76126337dc45b21226f383aaed616f59780adaf167c047', ++ 'org.mortbay.jetty:servlet-api:2.5-20081211:068756096996fe00f604ac3b6672d6f663dc777ea4a83056e240d0456e77e472', ++ 'com.google.code.findbugs:jsr305:1.3.9:905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed', ++ 'org.apache.httpcomponents:httpclient:4.0.1:752596ebdc7c9ae5d9a655de3bb06d078734679a9de23321dbf284ee44563c03', ++ 'org.apache.httpcomponents:httpcore:4.0.1:3b6bf92affa85d4169a91547ce3c7093ed993b41ad2df80469fc768ad01e6b6b', ++ 'commons-logging:commons-logging:1.1.1:ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f', ++ 'commons-codec:commons-codec:1.3:1bafd2ece2e88db4cdf835a7f8f0de65fab5b1147977a5dcc59b7c1b8c6f5080', ++ 'org.projectlombok:lombok:1.16.6:e0a471be03e1e6b02bf019480cec7a3ac9801702bf7bf62f15d077ad4df8dd5d', ++ 'com.google.http-client:google-http-client-jackson2:1.22.0:45b1e34b2dcef5cb496ef25a1223d19cf102b8c2ea4abf96491631b2faf4611c', ++ 'com.google.guava:guava-jdk5:17.0:59bf456547b6dda3ced968cb56f7f2d3e14474e2de2960a32c47e31c1e456c61', ++ 'com.fasterxml.jackson.core:jackson-core:2.1.3:754184022345800c2d066eceeaf2f7a88a7c2aaeae23eb1c76ef598854aa9157', ++ 'com.google.oauth-client:google-oauth-client:1.22.0:a4c56168b3e042105d68cf136e40e74f6e27f63ed0a948df966b332678e19022', ++ 'com.google.http-client:google-http-client:1.22.0:f88ffa329ac52fb4f2ff0eb877ef7318423ac9b791a107f886ed5c7a00e77e11', ++ 'com.googlecode.mp4parser:isoparser:1.1.7:ddbbf392f8e61f770a509a49aed5f32ead19768283b4b512c626e09e1ba5cc46', ++ 'org.apache.commons:commons-exec:1.3:cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b', ++ 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0:88debb16c533600c3b0290a088f2de3b3a8318ff86ebe0bdbcefeab0a0eafb9e', ++ 'com.google.api-client:google-api-client-gson:1.20.0:d68647ba10cfa33e0b6e538c704723229932795d5ee495288cec46a6156c5891', ++ 'com.google.api-client:google-api-client-java6:1.20.0:df4f423f33f467d248e51deb555404771f7bc41430b2d4d1e49966c79c0b207b', ++ 'com.google.oauth-client:google-oauth-client-jetty:1.20.0:daabf9d4e35d4015c2c917982463572856a5c8d7fa718e94edb2b6b114a2a8a2', ++ 'org.aspectj:aspectjrt:1.8.2:c7964f00c3d3889c5223e8fcb7476610c59453c86bccc68ef493a56d171bf655', ++ 'com.google.api-client:google-api-client:1.22.0:47c625c83a8cf97b8bbdff2acde923ff8fd3174e62aabcfc5d1b86692594ffba', ++ 'com.google.http-client:google-http-client-gson:1.20.0:cc144c70d40acf7c6e6f773ac19a2ac6e3ed9830d8e33e32421ff21a91450994', ++ 'com.google.oauth-client:google-oauth-client-java6:1.20.0:3149ae4fa222c7e804c5b7bc0d044702bc6bb8309b5ed94f6d350a5d4d657fc9', ++ 'org.mortbay.jetty:jetty:6.1.26:21091d3a9c1349f640fdc421504a604c040ed89087ecc12afbe32353326ed4e5', ++ 'com.google.code.gson:gson:2.1:35c94198255e95f6f11501eb4b3d43a5276bfdd142ab7c904722e69bff51f69e', ++ 'org.mortbay.jetty:jetty-util:6.1.26:9b974ce2b99f48254b76126337dc45b21226f383aaed616f59780adaf167c047', ++ 'org.mortbay.jetty:servlet-api:2.5-20081211:068756096996fe00f604ac3b6672d6f663dc777ea4a83056e240d0456e77e472', ++ 'com.google.code.findbugs:jsr305:1.3.9:905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed', ++ 'org.apache.httpcomponents:httpclient:4.0.1:752596ebdc7c9ae5d9a655de3bb06d078734679a9de23321dbf284ee44563c03', ++ 'org.apache.httpcomponents:httpcore:4.0.1:3b6bf92affa85d4169a91547ce3c7093ed993b41ad2df80469fc768ad01e6b6b', ++ 'commons-logging:commons-logging:1.1.1:ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f', ++ 'commons-codec:commons-codec:1.3:1bafd2ece2e88db4cdf835a7f8f0de65fab5b1147977a5dcc59b7c1b8c6f5080', ++ 'com.google.http-client:google-http-client-jackson2:1.22.0:45b1e34b2dcef5cb496ef25a1223d19cf102b8c2ea4abf96491631b2faf4611c', ++ 'com.google.guava:guava-jdk5:17.0:59bf456547b6dda3ced968cb56f7f2d3e14474e2de2960a32c47e31c1e456c61', ++ 'com.fasterxml.jackson.core:jackson-core:2.1.3:754184022345800c2d066eceeaf2f7a88a7c2aaeae23eb1c76ef598854aa9157', ++ 'com.google.oauth-client:google-oauth-client:1.22.0:a4c56168b3e042105d68cf136e40e74f6e27f63ed0a948df966b332678e19022', ++ 'com.google.http-client:google-http-client:1.22.0:f88ffa329ac52fb4f2ff0eb877ef7318423ac9b791a107f886ed5c7a00e77e11', ++ 'com.googlecode.mp4parser:isoparser:1.1.7:ddbbf392f8e61f770a509a49aed5f32ead19768283b4b512c626e09e1ba5cc46', ++ 'org.apache.commons:commons-exec:1.3:cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b', ++ 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0:88debb16c533600c3b0290a088f2de3b3a8318ff86ebe0bdbcefeab0a0eafb9e', ++ 'com.google.api-client:google-api-client-gson:1.20.0:d68647ba10cfa33e0b6e538c704723229932795d5ee495288cec46a6156c5891', ++ 'com.google.api-client:google-api-client-java6:1.20.0:df4f423f33f467d248e51deb555404771f7bc41430b2d4d1e49966c79c0b207b', ++ 'com.google.oauth-client:google-oauth-client-jetty:1.20.0:daabf9d4e35d4015c2c917982463572856a5c8d7fa718e94edb2b6b114a2a8a2', ++ 'org.aspectj:aspectjrt:1.8.2:c7964f00c3d3889c5223e8fcb7476610c59453c86bccc68ef493a56d171bf655', ++ 'junit:junit:4.11:90a8e1603eeca48e7e879f3afbc9560715322985f39a274f6f6070b43f9d06fe', ++ 'org.apache.commons:commons-lang3:3.3.2:6b81d10754dadf184d386011486e6509c2cc0c3d33565ced4fb4402b9413d47d', ++ 'org.apache.commons:commons-collections4:4.0:93f8dfcd20831a28d092427723f696bceb70b28e7fb89d7914f14d5ea492ce5a', ++ 'commons-cli:commons-cli:1.2:e7cd8951956d349b568b7ccfd4f5b2529a8c113e67c32b028f52ffda371259d9', ++ 'com.google.guava:guava:21.0:972139718abc8a4893fa78cba8cf7b2c903f35c97aaf44fa3031b0669948b480', ++ 'com.google.api-client:google-api-client:1.22.0:47c625c83a8cf97b8bbdff2acde923ff8fd3174e62aabcfc5d1b86692594ffba', ++ 'com.google.http-client:google-http-client-gson:1.20.0:cc144c70d40acf7c6e6f773ac19a2ac6e3ed9830d8e33e32421ff21a91450994', ++ 'com.google.oauth-client:google-oauth-client-java6:1.20.0:3149ae4fa222c7e804c5b7bc0d044702bc6bb8309b5ed94f6d350a5d4d657fc9', ++ 'org.mortbay.jetty:jetty:6.1.26:21091d3a9c1349f640fdc421504a604c040ed89087ecc12afbe32353326ed4e5', ++ 'org.hamcrest:hamcrest-core:1.3:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', ++ 'com.google.code.gson:gson:2.1:35c94198255e95f6f11501eb4b3d43a5276bfdd142ab7c904722e69bff51f69e', ++ 'org.mortbay.jetty:jetty-util:6.1.26:9b974ce2b99f48254b76126337dc45b21226f383aaed616f59780adaf167c047', ++ 'org.mortbay.jetty:servlet-api:2.5-20081211:068756096996fe00f604ac3b6672d6f663dc777ea4a83056e240d0456e77e472', ++ 'com.google.code.findbugs:jsr305:1.3.9:905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed', ++ 'org.apache.httpcomponents:httpclient:4.0.1:752596ebdc7c9ae5d9a655de3bb06d078734679a9de23321dbf284ee44563c03', ++ 'org.apache.httpcomponents:httpcore:4.0.1:3b6bf92affa85d4169a91547ce3c7093ed993b41ad2df80469fc768ad01e6b6b', ++ 'commons-logging:commons-logging:1.1.1:ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f', ++ 'commons-codec:commons-codec:1.3:1bafd2ece2e88db4cdf835a7f8f0de65fab5b1147977a5dcc59b7c1b8c6f5080', ++ 'org.projectlombok:lombok:1.16.6:e0a471be03e1e6b02bf019480cec7a3ac9801702bf7bf62f15d077ad4df8dd5d', ++ 'com.google.http-client:google-http-client-jackson2:1.22.0:45b1e34b2dcef5cb496ef25a1223d19cf102b8c2ea4abf96491631b2faf4611c', ++ 'com.google.guava:guava-jdk5:17.0:59bf456547b6dda3ced968cb56f7f2d3e14474e2de2960a32c47e31c1e456c61', ++ 'com.fasterxml.jackson.core:jackson-core:2.1.3:754184022345800c2d066eceeaf2f7a88a7c2aaeae23eb1c76ef598854aa9157', ++ 'com.google.oauth-client:google-oauth-client:1.22.0:a4c56168b3e042105d68cf136e40e74f6e27f63ed0a948df966b332678e19022', ++ 'com.google.http-client:google-http-client:1.22.0:f88ffa329ac52fb4f2ff0eb877ef7318423ac9b791a107f886ed5c7a00e77e11', ++ ] + } + + tasks['idea'].dependsOn ':ReplayStudio:preshadowJar' +-- +2.5.5 + diff --git a/gradle/reprod/patches/replaymod/0005-Configure-gradle-to-build-reproducible-archives.patch b/gradle/reprod/patches/replaymod/0005-Configure-gradle-to-build-reproducible-archives.patch new file mode 100644 index 00000000..6bee4a7e --- /dev/null +++ b/gradle/reprod/patches/replaymod/0005-Configure-gradle-to-build-reproducible-archives.patch @@ -0,0 +1,28 @@ +From 07de60f9e430063f398bcc86e15397afb8a00413 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 21:29:01 +0200 +Subject: [PATCH 5/5] Configure gradle to build reproducible archives + +--- + build.gradle | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/build.gradle b/build.gradle +index bda297b..7ed5cfe 100755 +--- a/build.gradle ++++ b/build.gradle +@@ -194,6 +194,11 @@ jar { + } + } + ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ + def gitDescribe() { + try { + def stdout = new ByteArrayOutputStream() +-- +2.5.5 + diff --git a/gradle/reprod/patches/shadow/0001-Configure-gradle-to-build-reproducible-archives.patch b/gradle/reprod/patches/shadow/0001-Configure-gradle-to-build-reproducible-archives.patch new file mode 100644 index 00000000..364ec08a --- /dev/null +++ b/gradle/reprod/patches/shadow/0001-Configure-gradle-to-build-reproducible-archives.patch @@ -0,0 +1,28 @@ +From 66c234d97042d31771df1c3633e1c7cb662e4882 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:00:22 +0200 +Subject: [PATCH 1/4] Configure gradle to build reproducible archives + +--- + build.gradle | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 3d2095e..2292a4d 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -91,6 +91,11 @@ idea { + } + } + ++tasks.withType(AbstractArchiveTask) { ++ preserveFileTimestamps = false ++ reproducibleFileOrder = true ++} ++ + sourceCompatibility = '1.6' + targetCompatibility = '1.6' + +-- +2.5.5 + diff --git a/gradle/reprod/patches/shadow/0002-Remove-non-essential-parts-of-build.gradle.patch b/gradle/reprod/patches/shadow/0002-Remove-non-essential-parts-of-build.gradle.patch new file mode 100644 index 00000000..ffd98261 --- /dev/null +++ b/gradle/reprod/patches/shadow/0002-Remove-non-essential-parts-of-build.gradle.patch @@ -0,0 +1,117 @@ +From 8105c498cb064c102197cf13d7efe4ebb1da65a7 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 18:51:27 +0200 +Subject: [PATCH 2/4] Remove non-essential parts of build.gradle + +--- + build.gradle | 78 ------------------------------------------------------------ + 1 file changed, 78 deletions(-) + +diff --git a/build.gradle b/build.gradle +index 2292a4d..1b06411 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,48 +1,4 @@ +-import org.gradle.wrapper.Download +-import org.gradle.wrapper.GradleUserHomeLookup +-import org.gradle.wrapper.Install +-import org.gradle.wrapper.PathAssembler +-import org.gradle.wrapper.WrapperConfiguration +-import org.gradle.wrapper.WrapperExecutor +-import org.gradle.wrapper.Logger +- +-buildscript { +- repositories { +- jcenter() +- maven { +- url "https://plugins.gradle.org/m2/" +- } +- } +- dependencies { +- classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.5' +- classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.0" +- classpath "com.gradle.publish:plugin-publish-plugin:0.9.1" +- classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.3' +- classpath 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.11' +- classpath 'org.asciidoctor:asciidoctorj-groovy-dsl:1.0.0.preview2' +- classpath "com.bluepapa32:gradle-watch-plugin:0.1.5" +- classpath "org.kordamp.gradle:livereload-gradle-plugin:0.2.1" +- classpath 'org.ajoberstar:gradle-git:1.5.0' +- } +-} +- +-plugins { +- id 'com.gradle.build-scan' version '1.0' +-} +- +-buildScan { +- licenseAgreementUrl = 'https://gradle.com/terms-of-service' +- licenseAgree = 'yes' +-} +- + apply plugin: 'groovy' +-apply plugin: 'idea' +-apply plugin: 'project-report' +- +-apply from: file('gradle/docs.gradle') +-apply from: file('gradle/publish.gradle') +-apply from: file('gradle/asciidoc.gradle') +-apply from: file('gradle/ghPages.gradle') + + repositories { + mavenLocal() +@@ -60,24 +16,6 @@ dependencies { + compile 'org.apache.ant:ant:1.9.4' + compile 'org.codehaus.plexus:plexus-utils:2.0.6' + compile 'org.codehaus.groovy:groovy-backports-compat23:2.4.4' +- +- +- testCompile gradleTestKit() +- testCompile("org.spockframework:spock-core:1.0-groovy-2.4") { +- exclude module: 'groovy-all' +- } +- testCompile 'xmlunit:xmlunit:1.3' +- testCompile 'commons-lang:commons-lang:2.6' +- testCompile 'com.google.guava:guava:17.0' +-} +- +-test { +- dependsOn publishToMavenLocal +- if (System.env.CI == 'true') { +- testLogging.showStandardStreams = true +- minHeapSize "1g" +- maxHeapSize "1g" +- } + } + + jar { +@@ -85,12 +23,6 @@ jar { + from rootProject.file('NOTICE') + } + +-idea { +- project { +- languageLevel = '1.6' +- } +-} +- + tasks.withType(AbstractArchiveTask) { + preserveFileTimestamps = false + reproducibleFileOrder = true +@@ -99,13 +31,3 @@ tasks.withType(AbstractArchiveTask) { + sourceCompatibility = '1.6' + targetCompatibility = '1.6' + +-task installWrappers << { +- WrapperExecutor wrapperExecutor = WrapperExecutor.forWrapperPropertiesFile(file('gradle/wrapper/gradle-wrapper.properties'), System.out) +- ['1.12', '2.0', '2.5', '2.11', '2.12', '2.13', '2.14', '3.0'].each { +- WrapperConfiguration config = wrapperExecutor.config +- config.setDistribution(new URI("https://services.gradle.org/distributions/gradle-$it-bin.zip")) +- Install install = new Install(new Logger(true), new Download(new Logger(true), "gradlew", it), +- new PathAssembler(GradleUserHomeLookup.gradleUserHome())) +- install.createDist(config) +- } +-} +-- +2.5.5 + diff --git a/gradle/reprod/patches/shadow/0003-Add-witness-plugin.patch b/gradle/reprod/patches/shadow/0003-Add-witness-plugin.patch new file mode 100644 index 00000000..5a720606 --- /dev/null +++ b/gradle/reprod/patches/shadow/0003-Add-witness-plugin.patch @@ -0,0 +1,49 @@ +From d06cec4bfa5981965faf2dad510d14e000d61ade Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 18:53:57 +0200 +Subject: [PATCH 3/4] Add witness plugin + +--- + build.gradle | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/build.gradle b/build.gradle +index 1b06411..a0d350b 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -1,4 +1,11 @@ ++buildscript { ++ dependencies { ++ classpath files('../gradle-witness.jar') ++ } ++} ++ + apply plugin: 'groovy' ++apply plugin: 'witness' + + repositories { + mavenLocal() +@@ -18,6 +25,20 @@ dependencies { + compile 'org.codehaus.groovy:groovy-backports-compat23:2.4.4' + } + ++dependencyVerification { ++ verify = [ ++ 'org.jdom:jdom2:2.0.5:32ed093f39c46a8d99f801240069478eac93b35f07351c001f2cef4330e97b4a', ++ 'org.ow2.asm:asm:5.0.3:71c4f78e437b8fdcd9cc0dfd2abea8c089eb677005a6a5cff320206cc52b46cc', ++ 'org.ow2.asm:asm-commons:5.0.3:18c1e092230233c9d29e46f21943d769bdb48130cc279e4b0e663f423948c2da', ++ 'commons-io:commons-io:2.4:cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581', ++ 'org.apache.ant:ant:1.9.4:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', ++ 'org.codehaus.plexus:plexus-utils:2.0.6:8b909f4ca9788647942f883d4e559bcc642123f7c6bcd3846983a2e465469c33', ++ 'org.codehaus.groovy:groovy-backports-compat23:2.4.4:f07694998acb204782c72cc8067b237a04097a2170f07d440614883f14a67630', ++ 'org.ow2.asm:asm-tree:5.0.3:347a7a9400f9964e87c91d3980e48eebdc8d024bc3b36f7f22189c662853a51c', ++ 'org.apache.ant:ant-launcher:1.9.4:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', ++ ] ++} ++ + jar { + from rootProject.file('LICENSE') + from rootProject.file('NOTICE') +-- +2.5.5 + diff --git a/gradle/reprod/patches/shadow/0004-Manually-shade-deps.patch b/gradle/reprod/patches/shadow/0004-Manually-shade-deps.patch new file mode 100644 index 00000000..d4656cd9 --- /dev/null +++ b/gradle/reprod/patches/shadow/0004-Manually-shade-deps.patch @@ -0,0 +1,54 @@ +From cfca21accce1fb3fbd32b81fb79f0363dd7b61f4 Mon Sep 17 00:00:00 2001 +From: Jonas Herzig +Date: Tue, 8 Aug 2017 19:59:34 +0200 +Subject: [PATCH 4/4] Manually shade deps + +--- + build.gradle | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +diff --git a/build.gradle b/build.gradle +index a0d350b..b12a46d 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -12,17 +12,22 @@ repositories { + jcenter() + } + ++configurations { ++ shade ++ compile.extendsFrom shade ++} ++ + dependencies { + + compile localGroovy() + compile gradleApi() +- compile 'org.jdom:jdom2:2.0.5' +- compile 'org.ow2.asm:asm:5.0.3' +- compile 'org.ow2.asm:asm-commons:5.0.3' +- compile 'commons-io:commons-io:2.4' +- compile 'org.apache.ant:ant:1.9.4' +- compile 'org.codehaus.plexus:plexus-utils:2.0.6' +- compile 'org.codehaus.groovy:groovy-backports-compat23:2.4.4' ++ shade 'org.jdom:jdom2:2.0.5' ++ shade 'org.ow2.asm:asm:5.0.3' ++ shade 'org.ow2.asm:asm-commons:5.0.3' ++ shade 'commons-io:commons-io:2.4' ++ shade 'org.apache.ant:ant:1.9.4' ++ shade 'org.codehaus.plexus:plexus-utils:2.0.6' ++ shade 'org.codehaus.groovy:groovy-backports-compat23:2.4.4' + } + + dependencyVerification { +@@ -42,6 +47,7 @@ dependencyVerification { + jar { + from rootProject.file('LICENSE') + from rootProject.file('NOTICE') ++ from (files(configurations.shade).collect {it.isDirectory() ? filesTree(it) : zipTree(it)}) + } + + tasks.withType(AbstractArchiveTask) { +-- +2.5.5 + diff --git a/gradle/reprod/setup.sh b/gradle/reprod/setup.sh new file mode 100755 index 00000000..dc61e9ba --- /dev/null +++ b/gradle/reprod/setup.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +set -e +set -x + +cd gradle/reprod + +sha256val () { + sha256sum $1 | cut -d' ' -f1 +} + +setup_dep () { + dep=$1 + url=$2 + commit=$3 + jar=$4 + jarhash=$5 + + [ -f "deps/$dep.jar" ] && [ "$(sha256val "deps/$dep.jar")" == "$jarhash" ] && return + rm -rf "deps/$dep.jar" + + if [ ! -d "deps/$dep" ] || [ "$(git -C "deps/$dep" rev-parse $commit^{commit})" != "$commit" ]; then + rm -rf "deps/$dep" + mkdir -p "deps/$dep" + pushd "deps/$dep" + git clone "$url" . + git fetch origin $commit + git checkout "$commit" + popd + fi + + pushd "deps/$dep" + git reset --hard "$commit" + find ../../patches/$dep/ -name *.patch | sort | xargs -r git am + git reset --soft "$commit" # Because forgegradle includes the commit hash in the jar + + rm -rf gradle/wrapper gradlew + [ ! -d gradle ] && mkdir gradle + cp -r ../../../wrapper gradle/ + cp ../../../wrapper/gradle-wrapper.properties gradle/wrapper/ + cp ../../../../gradlew . + + chmod +x gradlew + ./gradlew build -x test + + actual_hash=$(sha256val "build/libs/$jar") + if [ "$actual_hash" != "$jarhash" ]; then + echo "Failed to verify checksum of build artifact of dependency: $dep" + echo "Expected: $jarhash" + echo "But was: $actual_hash" + exit 1 + fi + + cp "build/libs/$jar" "../$dep.jar" + popd +} + +# Required for all +setup_dep "gradle-witness" "https://github.com/ReplayMod/gradle-witness.git" "c162a15841c2eba54b182fa81733c0aa9227f023" "gradle-witness.jar" "5e9ce687248029bf6364010168a65a4ad66fcb712dbd5ba69c59697ef564964b" + +# Required for mixin +setup_dep "shadow" "https://github.com/johnrengelman/shadow.git" "60d0f28103be076dc991a624bf79ca7a13835973" "shadow.jar" "0a7a280d5f7c58ff513f448537ceb77eda788df6cbdeacd60f63f70142ff39b3" +setup_dep "fernflower" "https://github.com/fesh0r/fernflower.git" "85f61bee8194ab69afa746b965973a18eda67608" "fernflower.jar" "577c2c4e04f0026675cacb25ec525f2ccba5de2eecac525b28bed18f9ccfd790" + +# Required for RM +setup_dep "mixingradle" "https://github.com/SpongePowered/MixinGradle.git" "3d81c8e202ec435056fb2068fdc34cfefa99be2d" "mixingradle-0.4-SNAPSHOT.jar" "a2b23727ed920ef2b9098f55634ede8d2ae5d04d910c0d572e45c33cff1cd281" +setup_dep "forgegradle" "https://github.com/MinecraftForge/ForgeGradle.git" "a228a836a2dc5ce546d2d53c48760f52f082d7ad" "ForgeGradle-2.3-SNAPSHOT.jar" "c885787f66811bf8edf0ced326d20c56428b447e8f0d29f37679f381d3e1f7ff" +setup_dep "mixin" "https://github.com/SpongePowered/Mixin.git" "b558323da3bd6ce94aeb442bfd7357f6c40d2fd4" "mixin-0.6.11-SNAPSHOT.jar" "0563b206db37f2f22b024b1736084afa2f30b0193b1a14e89cf9d99a3db26e1d" + +rm -rf tmp +mkdir tmp +pushd tmp + cp ../../../build.gradle build.gradle + git init + git add build.gradle + git commit -m "Add build.gradle" + git am ../patches/replaymod/*.patch +popd diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index b7612167031001b7b84baf2a959e8ea8ad03c011..5ccda13e9cb94678ba179b32452cf3d60dc36353 100755 GIT binary patch delta 27881 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

p%j4H!s{H#RNi7UbTaQ_p1#0>@yQQqg4#Zp_- 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 delta 25459 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 Q;xN7w3-T)%HFuf+2RXCqK>z>% diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9f34c5b3..4d183535 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun May 10 21:57:58 CEST 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.11-all.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-3.5.1-all.zip +distributionSha256Sum=69d99ade952de3727b65a88f3188ee72231ff4e28c2d00aacfc96a42c6d6f303 diff --git a/gradlew b/gradlew index 91a7e269..34c4fe99 100755 --- a/gradlew +++ b/gradlew @@ -6,6 +6,12 @@ ## ############################################################################## +if [ "$REPRODUCIBLE_BUILD" == "1" ] && [ -f ./gradle/reprod/setup.sh ] && [ "$1" != "-Preprod" ]; then + ./gradle/reprod/setup.sh || exit + ./gradlew -Preprod "$@" + exit +fi + # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS="" @@ -42,11 +48,6 @@ case "`uname`" in ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -61,9 +62,9 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +115,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` diff --git a/gradlew.bat b/gradlew.bat index aec99730..72d362da 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -46,7 +46,7 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args if "%@eval[2+2]" == "4" goto 4NT_args diff --git a/settings.gradle b/settings.gradle index 28830758..bac5accf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,5 @@ -include 'ReplayStudio' \ No newline at end of file +include 'ReplayStudio' + +if (System.getenv('REPRODUCIBLE_BUILD') == '1') { + rootProject.buildFileName = 'gradle/reprod/tmp/build.gradle' +}