From db39fb5c711f97b82998fdd77ca36aec43064d02 Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Mon, 24 Jun 2019 21:20:08 +0100 Subject: [PATCH] JAL-3289 implemented CHANNEL=LOCAL,RELEASE,TEST-RELEASE,SCRATCHH-...,DEVELOP,ARCHIVE. Added fallback install/getdown-launcher.jar and added to classpath in install4j_template.install4j --- build.gradle | 1688 ++++++++++---------- getdown/lib/getdown-core.jar | Bin 144599 -> 144600 bytes getdown/lib/getdown-launcher.jar | Bin 1494237 -> 1494239 bytes .../threerings/getdown/launcher/GetdownApp.java | 2 +- gradle.properties | 14 +- j11lib/getdown-core.jar | Bin 144599 -> 144600 bytes j8lib/getdown-core.jar | Bin 144599 -> 144600 bytes utils/install4j/install4j_template.install4j | 6 +- 8 files changed, 894 insertions(+), 816 deletions(-) diff --git a/build.gradle b/build.gradle index 980a4f7..5c6a36c 100644 --- a/build.gradle +++ b/build.gradle @@ -7,27 +7,27 @@ import org.gradle.plugins.ide.eclipse.model.* import groovy.transform.ExternalizeMethods buildscript { - dependencies { - classpath 'org.openclover:clover:4.3.1' - classpath 'org.apache.commons:commons-compress:1.18' - } + dependencies { + classpath 'org.openclover:clover:4.3.1' + classpath 'org.apache.commons:commons-compress:1.18' + } } plugins { - id 'java' - id 'application' - id 'eclipse' - id 'com.github.johnrengelman.shadow' version '4.0.3' - id 'com.install4j.gradle' version '7.0.9' + id 'java' + id 'application' + id 'eclipse' + id 'com.github.johnrengelman.shadow' version '4.0.3' + id 'com.install4j.gradle' version '7.0.9' } repositories { - jcenter() - mavenCentral() - mavenLocal() - flatDir { - dirs gradlePluginsDir - } + jcenter() + mavenCentral() + mavenLocal() + flatDir { + dirs gradlePluginsDir + } } mainClassName = launcherClass @@ -35,11 +35,11 @@ def cloverInstrDir = file("$buildDir/$cloverSourcesInstrDir") def classes = "$jalviewDir/$classesDir" if (clover.equals("true")) { - use_clover = true - classes = "$buildDir/$cloverClassesDir" + use_clover = true + classes = "$buildDir/$cloverClassesDir" } else { - use_clover = false - classes = "$jalviewDir/$classesDir" + use_clover = false + classes = "$jalviewDir/$classesDir" } // configure classpath/args for j8/j11 compilation @@ -51,26 +51,81 @@ def compile_source_compatibility def compile_target_compatibility ext { - if (getdown_local == "true") { - getdown_app_base = file(getdownWebsiteDir).toURI().toString() - getdown_channel_name = "local" - } else { - getdown_app_base = getdown_channel_base+"/"+getdown_channel_name+"/"+JAVA_VERSION+"/" - } - if (getdown_channel_name.equals("release") { - getdown_app_dir = getdown_channel_name - } - // where the getdown channel will be built. - getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir + '/' + JAVA_VERSION - getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir - //getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir - getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir - getdownLauncher = jalviewDir + '/' + getdown_launcher - getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/' - modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"]) - modules_runtimeClasspath = modules_compileClasspath - gitHash = "" - gitBranch = "" + + getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir + '/' + JAVA_VERSION + getdownDir = "" + reportRsyncCmd = false + switch (CHANNEL) { + + case "BUILD": + // TODO: get bamboo build artifact URL for getdown artifacts + getdown_app_dir = getdown_app_dir_alt + break + + case "RELEASE": + getdown_channel_name = CHANNEL.toLowerCase() + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_release + reportRsyncCommand = true + break + + case "ARCHIVE": + getdown_channel_name = CHANNEL.toLowerCase()+"/"+JALVIEW_VERSION + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + reportRsyncCommand = true + break + + case "DEVELOP": + getdown_channel_name = CHANNEL.toLowerCase() + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + reportRsyncCommand = true + break + + case "TEST-RELEASE": + getdown_channel_name = CHANNEL.toLowerCase() + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + reportRsyncCommand = true + break + + case ~/^SCRATCH(|-\w*)$/: + getdown_channel_name = CHANNEL + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + reportRsyncCommand = true + break + + case "LOCAL": + getdown_app_base = file(getdownWebsiteDir).toURI().toString() + getdown_app_dir = getdown_app_dir_alt + break + + default: // something wrong specified + print("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]") + exit(1) + break + + } + + println("Using a "+CHANNEL+" profile. appbase="+getdown_app_base) + getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir + //getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir + getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir + getdownInstallDir = getdownWebsiteDir + '/' + getdown_install_dir + getdownLauncher = jalviewDir + '/' + getdown_launcher + getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/' + getdownFilesInstallDir = getdownFilesDir+"/"+getdown_install_dir + modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"]) + modules_runtimeClasspath = modules_compileClasspath + gitHash = "" + gitBranch = "" } def JAVA_INTEGER_VERSION @@ -82,311 +137,311 @@ def getdown_alt_multi_java_location // this property is for the Java library used in eclipse def eclipse_java_runtime_name if (JAVA_VERSION.equals("1.8")) { - JAVA_INTEGER_VERSION = "8" - //libDir = j8libDir - libDir = j11libDir - libDistDir = j8libDir - compile_source_compatibility = 1.8 - compile_target_compatibility = 1.8 - getdown_alt_java_min_version = getdown_alt_java8_min_version - getdown_alt_multi_java_location = getdown_alt_java8_txt_multi_java_location - eclipse_java_runtime_name = "JavaSE-1.8" + JAVA_INTEGER_VERSION = "8" + //libDir = j8libDir + libDir = j11libDir + libDistDir = j8libDir + compile_source_compatibility = 1.8 + compile_target_compatibility = 1.8 + getdown_alt_java_min_version = getdown_alt_java8_min_version + getdown_alt_multi_java_location = getdown_alt_java8_txt_multi_java_location + eclipse_java_runtime_name = "JavaSE-1.8" } else if (JAVA_VERSION.equals("11")) { - JAVA_INTEGER_VERSION = "11" - libDir = j11libDir - libDistDir = j11libDir - compile_source_compatibility = 11 - compile_target_compatibility = 11 - getdown_alt_java_min_version = getdown_alt_java11_min_version - getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location - eclipse_java_runtime_name = "JavaSE-11" - additional_compiler_args += [ - '--module-path', ext.modules_compileClasspath.asPath, - '--add-modules', j11modules - ] + JAVA_INTEGER_VERSION = "11" + libDir = j11libDir + libDistDir = j11libDir + compile_source_compatibility = 11 + compile_target_compatibility = 11 + getdown_alt_java_min_version = getdown_alt_java11_min_version + getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location + eclipse_java_runtime_name = "JavaSE-11" + additional_compiler_args += [ + '--module-path', ext.modules_compileClasspath.asPath, + '--add-modules', j11modules + ] } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) { - JAVA_INTEGER_VERSION = JAVA_VERSION - libDir = j11libDir - libDistDir = j11libDir - compile_source_compatibility = JAVA_VERSION - compile_target_compatibility = JAVA_VERSION - getdown_alt_java_min_version = getdown_alt_java11_min_version - getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location - eclipse_java_runtime_name = "JavaSE-11" - additional_compiler_args += [ - '--module-path', ext.modules_compileClasspath.asPath, - '--add-modules', j11modules - ] + JAVA_INTEGER_VERSION = JAVA_VERSION + libDir = j11libDir + libDistDir = j11libDir + compile_source_compatibility = JAVA_VERSION + compile_target_compatibility = JAVA_VERSION + getdown_alt_java_min_version = getdown_alt_java11_min_version + getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location + eclipse_java_runtime_name = "JavaSE-11" + additional_compiler_args += [ + '--module-path', ext.modules_compileClasspath.asPath, + '--add-modules', j11modules + ] } else { - throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview") + throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview") } sourceSets { - main { - java { - srcDirs "$jalviewDir/$sourceDir" - outputDir = file("$classes") - } - - resources { - srcDirs "$jalviewDir/$resourceDir" - } - - jar.destinationDir = file("$jalviewDir/$packageDir") - - compileClasspath = files(sourceSets.main.java.outputDir) - compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) - - runtimeClasspath = compileClasspath - } - clover { - java { - srcDirs = [ cloverInstrDir ] - outputDir = file("${buildDir}/${cloverClassesDir}") - } - - resources { - srcDirs = sourceSets.main.resources.srcDirs - } - compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir ) - compileClasspath += files(sourceSets.main.java.outputDir) - compileClasspath += sourceSets.main.compileClasspath - compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) - compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) - - runtimeClasspath = compileClasspath - } - - test { - java { - srcDirs "$jalviewDir/$testSourceDir" - outputDir = file("$jalviewDir/$testOutputDir") - } - - resources { - srcDirs = sourceSets.main.resources.srcDirs - } - - compileClasspath = files( sourceSets.test.java.outputDir ) - - if (use_clover) { - compileClasspath += sourceSets.clover.compileClasspath - } else { - compileClasspath += files(sourceSets.main.java.outputDir) - } - - compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) - compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) - - runtimeClasspath = compileClasspath - } + main { + java { + srcDirs "$jalviewDir/$sourceDir" + outputDir = file("$classes") + } + + resources { + srcDirs "$jalviewDir/$resourceDir" + } + + jar.destinationDir = file("$jalviewDir/$packageDir") + + compileClasspath = files(sourceSets.main.java.outputDir) + compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) + + runtimeClasspath = compileClasspath + } + clover { + java { + srcDirs = [ cloverInstrDir ] + outputDir = file("${buildDir}/${cloverClassesDir}") + } + + resources { + srcDirs = sourceSets.main.resources.srcDirs + } + compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir ) + compileClasspath += files(sourceSets.main.java.outputDir) + compileClasspath += sourceSets.main.compileClasspath + compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) + compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) + + runtimeClasspath = compileClasspath + } + + test { + java { + srcDirs "$jalviewDir/$testSourceDir" + outputDir = file("$jalviewDir/$testOutputDir") + } + + resources { + srcDirs = sourceSets.main.resources.srcDirs + } + + compileClasspath = files( sourceSets.test.java.outputDir ) + + if (use_clover) { + compileClasspath += sourceSets.clover.compileClasspath + } else { + compileClasspath += files(sourceSets.main.java.outputDir) + } + + compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) + compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) + + runtimeClasspath = compileClasspath + } } // clover bits dependencies { - if (use_clover) { - cloverCompile 'org.openclover:clover:4.3.1' - testCompile 'org.openclover:clover:4.3.1' - } + if (use_clover) { + cloverCompile 'org.openclover:clover:4.3.1' + testCompile 'org.openclover:clover:4.3.1' + } } configurations { - cloverRuntime - cloverRuntime.extendsFrom cloverCompile + cloverRuntime + cloverRuntime.extendsFrom cloverCompile } eclipse { - project { - name = "Jalview with gradle build" - - natures 'org.eclipse.jdt.core.javanature', - 'org.eclipse.jdt.groovy.core.groovyNature', - 'org.eclipse.buildship.core.gradleprojectnature' - - buildCommand 'org.eclipse.jdt.core.javabuilder' - buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder' - } - - classpath { - //defaultOutputDir = sourceSets.main.java.outputDir - def removeThese = [] - configurations.each{ if (it.isCanBeResolved()) { - removeThese += it - } - } - - minusConfigurations += removeThese - plusConfigurations = [ ] - file { - - whenMerged { cp -> - def removeTheseToo = [] - HashMap addedSrcPath = new HashMap<>(); - cp.entries.each { entry -> - if (entry.kind == 'src') { - if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) { - removeTheseToo += entry - } else { - addedSrcPath.putAt(entry.path, true) - } - } - } - cp.entries.removeAll(removeTheseToo) - - print ("CP="+cp.inspect()) - - cp.entries += new Output("bin/main") - cp.entries += new Library(fileReference(helpParentDir)) - cp.entries += new Library(fileReference(resourceDir)) - - HashMap addedLibPath = new HashMap<>(); - - // changing from sourcesets.main.classpath to specific Java version lib - //sourceSets.main.compileClasspath.each{ - fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each { - //don't want to add outputDir as eclipse is using its own output dir in bin/main - if (it.isDirectory() || ! it.exists()) { - // don't add dirs to classpath - return - } - def itPath = it.toString() - if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { - itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) - } - if (addedLibPath.get(itPath)) { - //println("Not adding duplicate entry "+itPath) - } else { - //println("Adding entry "+itPath) - cp.entries += new Library(fileReference(itPath)) - addedLibPath.put(itPath, true) - } - } - - // changing from sourcesets.main.classpath to specific Java version lib - //sourceSets.test.compileClasspath.each{ - fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each { - //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) { - //no longer want to add outputDir as eclipse is using its own output dir in bin/main - if (it.isDirectory() || ! it.exists()) { - // don't add dirs to classpath - return false // groovy "break" in .each loop - } - def itPath = it.toString() - if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { - itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) - } - if (addedLibPath.get(itPath)) { - // don't duplicate - } else { - def lib = new Library(fileReference(itPath)) - // this doesn't work... yet. Adding test=true attribute using withXml below - //def attrs = new Node(null, 'attributes', ["test":"true"]) - //lib.appendNode(attrs) // - cp.entries += lib - addedLibPath.put(itPath, true) - } - } - } - - // withXml changes ignored by buildship, these add the "test=true" attribute - withXml { - def node = it.asNode() - - def srcTestAttributes - node.children().each{ cpe -> - def attributes = cpe.attributes() - if (attributes.get("kind") == "src" && attributes.get("path") == "test") { - srcTestAttributes = cpe.find { a -> a.name() == "attributes" } - return - } - } - def addTestAttribute = true - srcTestAttributes.each{a -> - if (a.name() == "attribute" && a.attributes().getAt("name") == "test") { - addTestAttribute = false - } - } - if (addTestAttribute) { - srcTestAttributes.append(new Node(null, "attribute", [name:"test", value:"true"])) - } - - node.children().each{ cpe -> - def attributes = cpe.attributes() - if (attributes.get("kind") == "lib" && attributes.get("path").startsWith("utils/")) { - cpe.appendNode('attributes') - .appendNode('attribute', [name:"test", value:"true"]) - } - } - } // withXML - } // file - - containers 'org.eclipse.buildship.core.gradleclasspathcontainer' - } // classpath - - jdt { - // for the IDE, use java 11 compatibility - sourceCompatibility = compile_source_compatibility - targetCompatibility = compile_target_compatibility - javaRuntimeName = eclipse_java_runtime_name - - file { - withProperties { props -> - def jalview_prefs = new Properties() - def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file) - jalview_prefs.load(ins) - ins.close() - jalview_prefs.forEach { t, v -> - if (props.getAt(t) == null) { - props.putAt(t, v) - } - } - } - } - } - - //synchronizationTasks eclipseClasspath - //autoBuildTasks eclipseClasspath -} + project { + name = "Jalview with gradle build" + + natures 'org.eclipse.jdt.core.javanature', + 'org.eclipse.jdt.groovy.core.groovyNature', + 'org.eclipse.buildship.core.gradleprojectnature' + + buildCommand 'org.eclipse.jdt.core.javabuilder' + buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder' + } + + classpath { + //defaultOutputDir = sourceSets.main.java.outputDir + def removeThese = [] + configurations.each{ if (it.isCanBeResolved()) { + removeThese += it + } + } + + minusConfigurations += removeThese + plusConfigurations = [ ] + file { + + whenMerged { cp -> + def removeTheseToo = [] + HashMap addedSrcPath = new HashMap<>(); + cp.entries.each { entry -> + if (entry.kind == 'src') { + if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) { + removeTheseToo += entry + } else { + addedSrcPath.putAt(entry.path, true) + } + } + } + cp.entries.removeAll(removeTheseToo) + + print ("CP="+cp.inspect()) + + cp.entries += new Output("bin/main") + cp.entries += new Library(fileReference(helpParentDir)) + cp.entries += new Library(fileReference(resourceDir)) + + HashMap addedLibPath = new HashMap<>(); + + // changing from sourcesets.main.classpath to specific Java version lib + //sourceSets.main.compileClasspath.each{ + fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each { + //don't want to add outputDir as eclipse is using its own output dir in bin/main + if (it.isDirectory() || ! it.exists()) { + // don't add dirs to classpath + return + } + def itPath = it.toString() + if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { + itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) + } + if (addedLibPath.get(itPath)) { + //println("Not adding duplicate entry "+itPath) + } else { + //println("Adding entry "+itPath) + cp.entries += new Library(fileReference(itPath)) + addedLibPath.put(itPath, true) + } + } + + // changing from sourcesets.main.classpath to specific Java version lib + //sourceSets.test.compileClasspath.each{ + fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each { + //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) { + //no longer want to add outputDir as eclipse is using its own output dir in bin/main + if (it.isDirectory() || ! it.exists()) { + // don't add dirs to classpath + return false // groovy "break" in .each loop + } + def itPath = it.toString() + if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { + itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) + } + if (addedLibPath.get(itPath)) { + // don't duplicate + } else { + def lib = new Library(fileReference(itPath)) + // this doesn't work... yet. Adding test=true attribute using withXml below + //def attrs = new Node(null, 'attributes', ["test":"true"]) + //lib.appendNode(attrs) // + cp.entries += lib + addedLibPath.put(itPath, true) + } + } + } + + // withXml changes ignored by buildship, these add the "test=true" attribute + withXml { + def node = it.asNode() + + def srcTestAttributes + node.children().each{ cpe -> + def attributes = cpe.attributes() + if (attributes.get("kind") == "src" && attributes.get("path") == "test") { + srcTestAttributes = cpe.find { a -> a.name() == "attributes" } + return + } + } + def addTestAttribute = true + srcTestAttributes.each{a -> + if (a.name() == "attribute" && a.attributes().getAt("name") == "test") { + addTestAttribute = false + } + } + if (addTestAttribute) { + srcTestAttributes.append(new Node(null, "attribute", [name:"test", value:"true"])) + } + + node.children().each{ cpe -> + def attributes = cpe.attributes() + if (attributes.get("kind") == "lib" && attributes.get("path").startsWith("utils/")) { + cpe.appendNode('attributes') + .appendNode('attribute', [name:"test", value:"true"]) + } + } + } // withXML + } // file + + containers 'org.eclipse.buildship.core.gradleclasspathcontainer' + } // classpath + + jdt { + // for the IDE, use java 11 compatibility + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + javaRuntimeName = eclipse_java_runtime_name + + file { + withProperties { props -> + def jalview_prefs = new Properties() + def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file) + jalview_prefs.load(ins) + ins.close() + jalview_prefs.forEach { t, v -> + if (props.getAt(t) == null) { + props.putAt(t, v) + } + } + } + } + } + + //synchronizationTasks eclipseClasspath + //autoBuildTasks eclipseClasspath +} task cloverInstr() { - // only instrument source, we build test classes as normal - inputs.files files (sourceSets.main.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"])) - outputs.dir cloverInstrDir - - doFirst { - delete cloverInstrDir - def argsList = ["--initstring", "${buildDir}/clover/clover.db", - "-d", "${buildDir}/${cloverSourcesInstrDir}"] - argsList.addAll(inputs.files.files.collect({ file -> - file.absolutePath - })) - String[] args = argsList.toArray() - println("About to instrument "+args.length +" files") - com.atlassian.clover.CloverInstr.mainImpl(args) - } -} - + // only instrument source, we build test classes as normal + inputs.files files (sourceSets.main.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"])) + outputs.dir cloverInstrDir + + doFirst { + delete cloverInstrDir + def argsList = ["--initstring", "${buildDir}/clover/clover.db", + "-d", "${buildDir}/${cloverSourcesInstrDir}"] + argsList.addAll(inputs.files.files.collect({ file -> + file.absolutePath + })) + String[] args = argsList.toArray() + println("About to instrument "+args.length +" files") + com.atlassian.clover.CloverInstr.mainImpl(args) + } +} + task cloverReport { - group = "Verification" - description = "Createst the Clover report" - inputs.dir "${buildDir}/clover" - outputs.dir "${reportsDir}/clover" - onlyIf { - file("${buildDir}/clover/clover.db").exists() - } - doFirst { - def argsList = ["--initstring", "${buildDir}/clover/clover.db", - "-o", "${reportsDir}/clover"] - String[] args = argsList.toArray() - com.atlassian.clover.reporters.html.HtmlReporter.runReport(args) - - // and generate ${reportsDir}/clover/clover.xml - args = ["--initstring", "${buildDir}/clover/clover.db", - "-o", "${reportsDir}/clover/clover.xml"].toArray() - com.atlassian.clover.reporters.xml.XMLReporter.runReport(args) - } + group = "Verification" + description = "Createst the Clover report" + inputs.dir "${buildDir}/clover" + outputs.dir "${reportsDir}/clover" + onlyIf { + file("${buildDir}/clover/clover.db").exists() + } + doFirst { + def argsList = ["--initstring", "${buildDir}/clover/clover.db", + "-o", "${reportsDir}/clover"] + String[] args = argsList.toArray() + com.atlassian.clover.reporters.html.HtmlReporter.runReport(args) + + // and generate ${reportsDir}/clover/clover.xml + args = ["--initstring", "${buildDir}/clover/clover.db", + "-o", "${reportsDir}/clover/clover.xml"].toArray() + com.atlassian.clover.reporters.xml.XMLReporter.runReport(args) + } } // end clover bits @@ -394,522 +449,535 @@ task cloverReport { compileJava { - doFirst { - sourceCompatibility = compile_source_compatibility - targetCompatibility = compile_target_compatibility - options.compilerArgs = additional_compiler_args - print ("Setting target compatibility to "+targetCompatibility+"\n") - } + doFirst { + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs = additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") + } } compileTestJava { - if (use_clover) { - dependsOn compileCloverJava - classpath += configurations.cloverRuntime - } else { - classpath += sourceSets.main.runtimeClasspath - } - doFirst { - sourceCompatibility = compile_source_compatibility - targetCompatibility = compile_target_compatibility - options.compilerArgs = additional_compiler_args - print ("Setting target compatibility to "+targetCompatibility+"\n") - } + if (use_clover) { + dependsOn compileCloverJava + classpath += configurations.cloverRuntime + } else { + classpath += sourceSets.main.runtimeClasspath + } + doFirst { + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs = additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") + } } compileCloverJava { - doFirst { - sourceCompatibility = compile_source_compatibility - targetCompatibility = compile_target_compatibility - options.compilerArgs += additional_compiler_args - print ("Setting target compatibility to "+targetCompatibility+"\n") - } - classpath += configurations.cloverRuntime + doFirst { + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs += additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") + } + classpath += configurations.cloverRuntime } clean { - delete sourceSets.main.java.outputDir + delete sourceSets.main.java.outputDir } cleanTest { - delete sourceSets.test.java.outputDir - delete cloverInstrDir + delete sourceSets.test.java.outputDir + delete cloverInstrDir } // format is a string like date.format("dd MMMM yyyy") def getDate(format) { - def date = new Date() - return date.format(format) + def date = new Date() + return date.format(format) } task setGitVals { - def hashStdOut = new ByteArrayOutputStream() - exec { - commandLine "git", "rev-parse", "--short", "HEAD" - standardOutput = hashStdOut - ignoreExitValue true - } - - def branchStdOut = new ByteArrayOutputStream() - exec { - commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" - standardOutput = branchStdOut - ignoreExitValue true - } - - project.ext.gitHash = hashStdOut.toString().trim() - project.ext.gitBranch = branchStdOut.toString().trim() - - outputs.upToDateWhen { false } + def hashStdOut = new ByteArrayOutputStream() + exec { + commandLine "git", "rev-parse", "--short", "HEAD" + standardOutput = hashStdOut + ignoreExitValue true + } + + def branchStdOut = new ByteArrayOutputStream() + exec { + commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" + standardOutput = branchStdOut + ignoreExitValue true + } + + project.ext.gitHash = hashStdOut.toString().trim() + project.ext.gitBranch = branchStdOut.toString().trim() + + outputs.upToDateWhen { false } } task createBuildProperties(type: WriteProperties) { - dependsOn setGitVals - inputs.dir("$jalviewDir/$sourceDir") - inputs.dir("$classes") - inputs.dir("$jalviewDir/$resourceDir") - outputFile "$classes/$buildPropertiesFile" - // taking time specific comment out to allow better incremental builds - comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss") - //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd") - property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy") - property "VERSION", JALVIEW_VERSION - property "INSTALLATION", INSTALLATION+" git-commit:"+project.ext.gitHash+" ["+project.ext.gitBranch+"]" - outputs.file(outputFile) + dependsOn setGitVals + inputs.dir("$jalviewDir/$sourceDir") + inputs.dir("$classes") + inputs.dir("$jalviewDir/$resourceDir") + outputFile "$classes/$buildPropertiesFile" + // taking time specific comment out to allow better incremental builds + comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss") + //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd") + property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy") + property "VERSION", JALVIEW_VERSION + property "INSTALLATION", INSTALLATION+" git-commit:"+project.ext.gitHash+" ["+project.ext.gitBranch+"]" + outputs.file(outputFile) } def buildingHTML = "$jalviewDir/$docDir/building.html" task deleteBuildingHTML(type: Delete) { - delete buildingHTML + delete buildingHTML } task convertBuildingMD(type: Exec) { - dependsOn deleteBuildingHTML - def buildingMD = "$jalviewDir/$docDir/building.md" - def css = "$jalviewDir/$docDir/github.css" - - def pandoc = null - pandoc_exec.split(",").each { - if (file(it.trim()).exists()) { - pandoc = it.trim() - return true - } - } - - def hostname = "hostname".execute().text.trim() - if ((pandoc == null || ! file(pandoc).exists()) && hostname.equals("jv-bamboo")) { - pandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc" - } - - if (pandoc != null && file(pandoc).exists()) { - commandLine pandoc, '-s', '-o', buildingHTML, '--metadata', 'pagetitle="Building Jalview from Source"', '--toc', '-H', css, buildingMD - } else { - commandLine "true" - } - - ignoreExitValue true - - inputs.file(buildingMD) - inputs.file(css) - outputs.file(buildingHTML) + dependsOn deleteBuildingHTML + def buildingMD = "$jalviewDir/$docDir/building.md" + def css = "$jalviewDir/$docDir/github.css" + + def pandoc = null + pandoc_exec.split(",").each { + if (file(it.trim()).exists()) { + pandoc = it.trim() + return true + } + } + + def hostname = "hostname".execute().text.trim() + if ((pandoc == null || ! file(pandoc).exists()) && hostname.equals("jv-bamboo")) { + pandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc" + } + + if (pandoc != null && file(pandoc).exists()) { + commandLine pandoc, '-s', '-o', buildingHTML, '--metadata', 'pagetitle="Building Jalview from Source"', '--toc', '-H', css, buildingMD + } else { + commandLine "true" + } + + ignoreExitValue true + + inputs.file(buildingMD) + inputs.file(css) + outputs.file(buildingHTML) } clean { - delete buildingHTML + delete buildingHTML } task syncDocs(type: Sync) { - dependsOn convertBuildingMD - def syncDir = "$classes/$docDir" - from fileTree("$jalviewDir/$docDir") - into syncDir + dependsOn convertBuildingMD + def syncDir = "$classes/$docDir" + from fileTree("$jalviewDir/$docDir") + into syncDir } def helpFile = "$classes/$helpDir/help.jhm" task copyHelp(type: Copy) { - def inputDir = "$jalviewDir/$helpParentDir/$helpDir" - def outputDir = "$classes/$helpDir" - from(inputDir) { - exclude '**/*.gif' - exclude '**/*.jpg' - exclude '**/*.png' - filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION]) - } - from(inputDir) { - include '**/*.gif' - include '**/*.jpg' - include '**/*.png' - } - into outputDir - - inputs.dir(inputDir) - outputs.files(helpFile) - outputs.dir(outputDir) + def inputDir = "$jalviewDir/$helpParentDir/$helpDir" + def outputDir = "$classes/$helpDir" + from(inputDir) { + exclude '**/*.gif' + exclude '**/*.jpg' + exclude '**/*.png' + filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION]) + } + from(inputDir) { + include '**/*.gif' + include '**/*.jpg' + include '**/*.png' + } + into outputDir + + inputs.dir(inputDir) + outputs.files(helpFile) + outputs.dir(outputDir) } task syncLib(type: Sync) { - def syncDir = "$classes/$libDistDir" - from fileTree("$jalviewDir/$libDistDir") - into syncDir + def syncDir = "$classes/$libDistDir" + from fileTree("$jalviewDir/$libDistDir") + into syncDir } task syncResources(type: Sync) { - from "$jalviewDir/$resourceDir" - include "**/*.*" - exclude "install4j" - into "$classes" - preserve { - include "**" - } + from "$jalviewDir/$resourceDir" + include "**/*.*" + exclude "install4j" + into "$classes" + preserve { + include "**" + } } task prepare { - dependsOn syncResources - dependsOn syncDocs - dependsOn copyHelp + dependsOn syncResources + dependsOn syncDocs + dependsOn copyHelp } //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir test { - dependsOn prepare - dependsOn compileJava - if (use_clover) { - dependsOn cloverInstr - } - - print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n") - - useTestNG() { - includeGroups testngGroups - preserveOrder true - useDefaultListeners=true - } - - workingDir = jalviewDir - //systemProperties 'clover.jar' System.properties.clover.jar - sourceCompatibility = compile_source_compatibility - targetCompatibility = compile_target_compatibility - jvmArgs += additional_compiler_args - print ("Setting target compatibility to "+targetCompatibility+"\n") + dependsOn prepare + dependsOn compileJava + if (use_clover) { + dependsOn cloverInstr + } + + print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n") + + useTestNG() { + includeGroups testngGroups + preserveOrder true + useDefaultListeners=true + } + + workingDir = jalviewDir + //systemProperties 'clover.jar' System.properties.clover.jar + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + jvmArgs += additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") } task buildIndices(type: JavaExec) { - dependsOn copyHelp - classpath = sourceSets.main.compileClasspath - main = "com.sun.java.help.search.Indexer" - workingDir = "$classes/$helpDir" - def argDir = "html" - args = [ argDir ] - inputs.dir("$workingDir/$argDir") - - outputs.dir("$classes/doc") - outputs.dir("$classes/help") - outputs.file("$workingDir/JavaHelpSearch/DOCS") - outputs.file("$workingDir/JavaHelpSearch/DOCS.TAB") - outputs.file("$workingDir/JavaHelpSearch/OFFSETS") - outputs.file("$workingDir/JavaHelpSearch/POSITIONS") - outputs.file("$workingDir/JavaHelpSearch/SCHEMA") - outputs.file("$workingDir/JavaHelpSearch/TMAP") + dependsOn copyHelp + classpath = sourceSets.main.compileClasspath + main = "com.sun.java.help.search.Indexer" + workingDir = "$classes/$helpDir" + def argDir = "html" + args = [ argDir ] + inputs.dir("$workingDir/$argDir") + + outputs.dir("$classes/doc") + outputs.dir("$classes/help") + outputs.file("$workingDir/JavaHelpSearch/DOCS") + outputs.file("$workingDir/JavaHelpSearch/DOCS.TAB") + outputs.file("$workingDir/JavaHelpSearch/OFFSETS") + outputs.file("$workingDir/JavaHelpSearch/POSITIONS") + outputs.file("$workingDir/JavaHelpSearch/SCHEMA") + outputs.file("$workingDir/JavaHelpSearch/TMAP") } task compileLinkCheck(type: JavaCompile) { - options.fork = true - classpath = files("$jalviewDir/$utilsDir") - destinationDir = file("$jalviewDir/$utilsDir") - source = fileTree(dir: "$jalviewDir/$utilsDir", include: ["HelpLinksChecker.java", "BufferedLineReader.java"]) - - inputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.java") - inputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.java") - outputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.class") - outputs.file("$jalviewDir/$utilsDir/BufferedLineReader.class") + options.fork = true + classpath = files("$jalviewDir/$utilsDir") + destinationDir = file("$jalviewDir/$utilsDir") + source = fileTree(dir: "$jalviewDir/$utilsDir", include: ["HelpLinksChecker.java", "BufferedLineReader.java"]) + + inputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.java") + inputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.java") + outputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.class") + outputs.file("$jalviewDir/$utilsDir/BufferedLineReader.class") } def helplinkscheckeroutputfile = file("$jalviewDir/$utilsDir/HelpLinksChecker.out") task linkCheck(type: JavaExec) { - dependsOn prepare, compileLinkCheck - classpath = files("$jalviewDir/$utilsDir") - main = "HelpLinksChecker" - workingDir = jalviewDir - def help = "$classes/$helpDir" - args = [ "$classes/$helpDir", "-nointernet" ] - - doFirst { - helplinkscheckeroutputfile.createNewFile() - standardOutput new FileOutputStream(helplinkscheckeroutputfile, false) - } - - outputs.file(helplinkscheckeroutputfile) + dependsOn prepare, compileLinkCheck + classpath = files("$jalviewDir/$utilsDir") + main = "HelpLinksChecker" + workingDir = jalviewDir + def help = "$classes/$helpDir" + args = [ "$classes/$helpDir", "-nointernet" ] + + doFirst { + helplinkscheckeroutputfile.createNewFile() + standardOutput new FileOutputStream(helplinkscheckeroutputfile, false) + } + + outputs.file(helplinkscheckeroutputfile) } task cleanPackageDir(type: Delete) { - delete fileTree("$jalviewDir/$packageDir").include("*.jar") + delete fileTree("$jalviewDir/$packageDir").include("*.jar") } jar { - dependsOn linkCheck - dependsOn buildIndices - dependsOn createBuildProperties - - manifest { - attributes "Main-Class": mainClass, - "Permissions": "all-permissions", - "Application-Name": "Jalview Desktop", - "Codebase": application_codebase - } - - destinationDir = file("$jalviewDir/$packageDir") - archiveName = rootProject.name+".jar" - - exclude "cache*/**" - exclude "*.jar" - exclude "*.jar.*" - exclude "**/*.jar" - exclude "**/*.jar.*" - - inputs.dir("$classes") - outputs.file("$jalviewDir/$packageDir/$archiveName") + dependsOn linkCheck + dependsOn buildIndices + dependsOn createBuildProperties + + manifest { + attributes "Main-Class": mainClass, + "Permissions": "all-permissions", + "Application-Name": "Jalview Desktop", + "Codebase": application_codebase + } + + destinationDir = file("$jalviewDir/$packageDir") + archiveName = rootProject.name+".jar" + + exclude "cache*/**" + exclude "*.jar" + exclude "*.jar.*" + exclude "**/*.jar" + exclude "**/*.jar.*" + + inputs.dir("$classes") + outputs.file("$jalviewDir/$packageDir/$archiveName") } task copyJars(type: Copy) { - from fileTree("$classes").include("**/*.jar").include("*.jar").files - into "$jalviewDir/$packageDir" + from fileTree("$classes").include("**/*.jar").include("*.jar").files + into "$jalviewDir/$packageDir" } // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well task syncJars(type: Sync) { - from fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").files - into "$jalviewDir/$packageDir" - preserve { - include jar.archiveName - } + from fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").files + into "$jalviewDir/$packageDir" + preserve { + include jar.archiveName + } } task makeDist { - group = "build" - description = "Put all required libraries in dist" - // order of "cleanPackageDir", "copyJars", "jar" important! - jar.mustRunAfter cleanPackageDir - syncJars.mustRunAfter cleanPackageDir - dependsOn cleanPackageDir - dependsOn syncJars - dependsOn jar - outputs.dir("$jalviewDir/$packageDir") + group = "build" + description = "Put all required libraries in dist" + // order of "cleanPackageDir", "copyJars", "jar" important! + jar.mustRunAfter cleanPackageDir + syncJars.mustRunAfter cleanPackageDir + dependsOn cleanPackageDir + dependsOn syncJars + dependsOn jar + outputs.dir("$jalviewDir/$packageDir") } task cleanDist { - dependsOn cleanPackageDir - dependsOn cleanTest - dependsOn clean + dependsOn cleanPackageDir + dependsOn cleanTest + dependsOn clean } shadowJar { - group = "distribution" - dependsOn makeDist - from ("$jalviewDir/$libDistDir") { - include("*.jar") - } - mainClassName = shadowJarMainClass - mergeServiceFiles() - classifier = "all-"+JAVA_VERSION - minimize() + group = "distribution" + dependsOn makeDist + from ("$jalviewDir/$libDistDir") { + include("*.jar") + } + mainClassName = shadowJarMainClass + mergeServiceFiles() + classifier = "all-"+JAVA_VERSION + minimize() } task getdownWebsite() { - group = "distribution" - description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer" - dependsOn makeDist - def getdownWebsiteResourceFilenames = [] - def getdownTextString = "" - def getdownResourceDir = project.ext.getdownResourceDir - def getdownAppDir = project.ext.getdownAppDir - def getdownResourceFilenames = [] - - copy { - from "$classes/$buildPropertiesFile" - rename(buildPropertiesFile, getdown_install_build_properties) - into project.ext.getdownWebsiteDir - } - getdownResourceFilenames += getdown_current_build_properties - - doFirst { - // go through properties looking for getdown_txt_... - def props = project.properties.sort { it.key } - props.put("getdown_txt_java_min_version", getdown_alt_java_min_version) - props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location) - props.put("getdown_txt_resource", "$classes/$buildPropertiesFile") - - props.put("getdown_txt_appbase", getdown_app_base) - props.each{ prop, val -> - if (prop.startsWith("getdown_txt_") && val != null) { - if (prop.startsWith("getdown_txt_multi_")) { - def key = prop.substring(18) - val.split(",").each{ v -> - def line = key + " = " + v + "\n" - getdownTextString += line - } - } else { - // file values rationalised - if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) { - def r = null - if (val.indexOf('/') == 0) { - // absolute path - r = file(val) - } else if (val.indexOf('/') > 0) { - // relative path (relative to jalviewDir) - r = file( jalviewDir + '/' + val ) - } - if (r.exists()) { - val = getdown_resource_dir + '/' + r.getName() - getdownWebsiteResourceFilenames += val - getdownResourceFilenames += r.getPath() - } - } - if (! prop.startsWith("getdown_txt_resource")) { - def line = prop.substring(12) + " = " + val + "\n" - getdownTextString += line - } - } - } - } - - getdownWebsiteResourceFilenames.each{ filename -> - getdownTextString += "resource = "+filename+"\n" - } - getdownResourceFilenames.each{ filename -> - copy { - from filename - into project.ext.getdownResourceDir - } - } - - def codeFiles = [] - makeDist.outputs.files.each{ f -> - if (f.isDirectory()) { - def files = fileTree(dir: f, include: ["*"]).getFiles() - codeFiles += files - } else if (f.exists()) { - codeFiles += f - } - } - codeFiles.sort().each{f -> - def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n" - getdownTextString += line - copy { - from f.getPath() - into project.ext.getdownAppDir - } - } - - // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist - /* - if (JAVA_VERSION.equals("11")) { - def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles() - j11libFiles.sort().each{f -> - def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n" - getdownTextString += line - copy { - from f.getPath() - into project.ext.getdownJ11libDir - } - } - } - */ - - // getdown-launcher.jar should not be in main application class path so the main application can move it when updated. Listed as a resource so it gets updated. - //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n" - getdownTextString += "resource = " + getdown_launcher_new + "\n" - getdownTextString += "class = " + mainClass + "\n" - - def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt") - getdown_txt.write(getdownTextString) - - def launch_jvl = file(project.ext.getdownWebsiteDir + "/" + getdown_launch_jvl) - launch_jvl.write("appbase="+props.get("getdown_txt_appbase")) - - copy { - from getdown_txt - from launch_jvl - from project.ext.getdownWebsiteDir+"/"+getdown_current_build_properties - from project.ext.getdownWebsiteDir+"/"+getdown_install_build_properties - into project.ext.getdownFilesDir - } - - copy { - from getdownLauncher - into project.ext.getdownWebsiteDir - rename(file(getdownLauncher).getName(), getdown_launcher_new) - } - - copy { - from getdownLauncher - into project.ext.getdownFilesDir - } - - copy { - from getdownLauncher - into project.ext.getdownWebsiteDir - } - - copy { - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.background_image') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.error_background') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.progress_image') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.icon') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.mac_dock_icon') - into project.ext.getdownFilesDir + '/' + getdown_resource_dir - } - } - - inputs.dir(jalviewDir + '/' + packageDir) - outputs.dir(project.ext.getdownWebsiteDir) - outputs.dir(project.ext.getdownFilesDir) + group = "distribution" + description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer" + dependsOn makeDist + def getdownWebsiteResourceFilenames = [] + def getdownTextString = "" + def getdownResourceDir = project.ext.getdownResourceDir + def getdownAppDir = project.ext.getdownAppDir + def getdownResourceFilenames = [] + + doFirst { + copy { + from "$classes/$buildPropertiesFile" + rename(buildPropertiesFile, getdown_build_properties) + into project.ext.getdownWebsiteDir + } + getdownWebsiteResourceFilenames += getdown_build_properties + + // go through properties looking for getdown_txt_... + def props = project.properties.sort { it.key } + props.put("getdown_txt_java_min_version", getdown_alt_java_min_version) + props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location) + + props.put("getdown_txt_appbase", getdown_app_base) + props.each{ prop, val -> + if (prop.startsWith("getdown_txt_") && val != null) { + if (prop.startsWith("getdown_txt_multi_")) { + def key = prop.substring(18) + val.split(",").each{ v -> + def line = key + " = " + v + "\n" + getdownTextString += line + } + } else { + // file values rationalised + if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) { + def r = null + if (val.indexOf('/') == 0) { + // absolute path + r = file(val) + } else if (val.indexOf('/') > 0) { + // relative path (relative to jalviewDir) + r = file( jalviewDir + '/' + val ) + } + if (r.exists()) { + val = getdown_resource_dir + '/' + r.getName() + getdownWebsiteResourceFilenames += val + getdownResourceFilenames += r.getPath() + } + } + if (! prop.startsWith("getdown_txt_resource")) { + def line = prop.substring(12) + " = " + val + "\n" + getdownTextString += line + } + } + } + } + + getdownWebsiteResourceFilenames.each{ filename -> + getdownTextString += "resource = "+filename+"\n" + } + getdownResourceFilenames.each{ filename -> + copy { + from filename + into project.ext.getdownResourceDir + } + } + + def codeFiles = [] + makeDist.outputs.files.each{ f -> + if (f.isDirectory()) { + def files = fileTree(dir: f, include: ["*"]).getFiles() + codeFiles += files + } else if (f.exists()) { + codeFiles += f + } + } + codeFiles.sort().each{f -> + def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n" + getdownTextString += line + copy { + from f.getPath() + into project.ext.getdownAppDir + } + } + + // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist + /* + if (JAVA_VERSION.equals("11")) { + def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles() + j11libFiles.sort().each{f -> + def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n" + getdownTextString += line + copy { + from f.getPath() + into project.ext.getdownJ11libDir + } + } + } + */ + + // getdown-launcher.jar should not be in main application class path so the main application can move it when updated. Listed as a resource so it gets updated. + //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n" + getdownTextString += "resource = " + getdown_launcher_new + "\n" + getdownTextString += "class = " + mainClass + "\n" + + def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt") + getdown_txt.write(getdownTextString) + + def launch_jvl = file(project.ext.getdownWebsiteDir + "/" + getdown_launch_jvl) + launch_jvl.write("appbase="+props.get("getdown_txt_appbase")) + + copy { + from getdownLauncher + rename(file(getdownLauncher).getName(), getdown_launcher_new) + into project.ext.getdownWebsiteDir + } + + copy { + from getdownLauncher + into project.ext.getdownWebsiteDir + } + + copy { + from getdown_txt + from getdownLauncher + from getdownWebsiteDir+"/"+getdown_build_properties + into getdownInstallDir + } + + copy { + from getdown_txt + from launch_jvl + from getdownLauncher + from getdownWebsiteDir+"/"+getdown_build_properties + into getdownFilesDir + } + + copy { + from getdownInstallDir + into getdownFilesInstallDir + } + + copy { + from jalviewDir + '/' + project.getProperty('getdown_txt_ui.background_image') + from jalviewDir + '/' + project.getProperty('getdown_txt_ui.error_background') + from jalviewDir + '/' + project.getProperty('getdown_txt_ui.progress_image') + from jalviewDir + '/' + project.getProperty('getdown_txt_ui.icon') + from jalviewDir + '/' + project.getProperty('getdown_txt_ui.mac_dock_icon') + into project.ext.getdownFilesDir + '/' + getdown_resource_dir + } + } + + inputs.dir(jalviewDir + '/' + packageDir) + outputs.dir(project.ext.getdownWebsiteDir) + outputs.dir(project.ext.getdownFilesDir) } task getdownDigest(type: JavaExec) { - group = "distribution" - description = "Digest the getdown website folder" - dependsOn getdownWebsite - classpath = files(jalviewDir + '/' + getdown_core, jalviewDir+'/'+getdown_launcher) - main = "com.threerings.getdown.tools.Digester" - args project.ext.getdownWebsiteDir - inputs.dir(project.ext.getdownWebsiteDir) - outputs.file(project.ext.getdownWebsiteDir + '/' + "digest2.txt") + group = "distribution" + description = "Digest the getdown website folder" + dependsOn getdownWebsite + classpath = files(jalviewDir + '/' + getdown_core, jalviewDir+'/'+getdown_launcher) + main = "com.threerings.getdown.tools.Digester" + args project.ext.getdownWebsiteDir + inputs.dir(project.ext.getdownWebsiteDir) + outputs.file(project.ext.getdownWebsiteDir + '/' + "digest2.txt") } task getdown() { - group = "distribution" - description = "Create the minimal and full getdown app folder for installers and website and create digest file" - dependsOn getdownDigest + group = "distribution" + description = "Create the minimal and full getdown app folder for installers and website and create digest file" + dependsOn getdownDigest + doLast { + if (reportRsyncCommand) { + def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith("/")?"":"/") + def toDir = getdown_smb_mount + "/" + getdownDir + (getdownDir.endsWith("/")?"":"/") + println "rsync -avh --delete '$fromDir' '$toDir'" + } + } } clean { - delete project.ext.getdownWebsiteDir - delete project.ext.getdownFilesDir + delete project.ext.getdownWebsiteDir + delete project.ext.getdownFilesDir } install4j { - def install4jHomeDir = "/opt/install4j" - def hostname = "hostname".execute().text.trim() - if (hostname.equals("jv-bamboo")) { - install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" - } else if (OperatingSystem.current().isMacOsX()) { - install4jHomeDir = '/Applications/install4j.app/Contents/Resources/app' - if (! file(install4jHomeDir).exists()) { - install4jHomeDir = System.getProperty("user.home")+install4jHomeDir - } - } else if (OperatingSystem.current().isLinux()) { - install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" - } - installDir = file(install4jHomeDir) - mediaTypes = Arrays.asList(install4jMediaTypes.split(",")) - if (install4jFaster.equals("true")) { - faster = true - } + def install4jHomeDir = "/opt/install4j" + def hostname = "hostname".execute().text.trim() + if (hostname.equals("jv-bamboo")) { + install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" + } else if (OperatingSystem.current().isMacOsX()) { + install4jHomeDir = '/Applications/install4j.app/Contents/Resources/app' + if (! file(install4jHomeDir).exists()) { + install4jHomeDir = System.getProperty("user.home")+install4jHomeDir + } + } else if (OperatingSystem.current().isLinux()) { + install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" + } + installDir = file(install4jHomeDir) + mediaTypes = Arrays.asList(install4jMediaTypes.split(",")) + if (install4jFaster.equals("true")) { + faster = true + } } def install4jConf @@ -922,83 +990,87 @@ def install4jConfFile = "jalview-installers-java"+JAVA_VERSION+".install4j" install4jConf = "$install4jDir/$install4jConfFile" task copyInstall4jTemplate(type: Copy) { - macosJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/macos-jre"+JAVA_VERSION+"/jre" - macosJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/macos-jre"+JAVA_VERSION+".tar.gz" - windowsJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/windows-jre"+JAVA_VERSION+"/jre" - windowsJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/windows-jre"+JAVA_VERSION+".tar.gz" - from (install4jDir) { - include install4jTemplate - rename (install4jTemplate, install4jConfFile) - filter(ReplaceTokens, beginToken: '', endToken: '', tokens: ['9999999999': JAVA_VERSION]) - filter(ReplaceTokens, beginToken: '$$', endToken: '$$', - tokens: [ - 'JAVA_VERSION': JAVA_VERSION, - 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION, - 'VERSION': JALVIEW_VERSION, - 'MACOS_JAVA_VM_DIR': macosJavaVMDir, - 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz, - 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir, - 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz, - 'INSTALL4JINFOPLISTFILEASSOCIATIONS': install4jInfoPlistFileAssociations, - 'COPYRIGHT_MESSAGE': install4jCopyrightMessage, - 'MACOS_BUNDLE_ID': install4jMacOSBundleId - ] - ) - if (OSX_KEYPASS=="") { - filter(ReplaceTokens, beginToken: 'codeSigning macEnabled="', endToken: '"', tokens: ['true':'codeSigning macEnabled="false"']) - filter(ReplaceTokens, beginToken: 'runPostProcessor="true" ',endToken: 'Processor', tokens: ['post':'runPostProcessor="false" postProcessor']) - } - } - into install4jDir - outputs.files(install4jConf) - - doLast { - // include file associations in installer - def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text - ant.replaceregexp( - byline: false, - flags: "s", - match: '', - replace: installerFileAssociationsXml, - file: install4jConf - ) - /* - // include uninstaller applescript app files in dmg - def installerDMGUninstallerXml = file("$install4jDir/$install4jDMGUninstallerAppFiles").text - ant.replaceregexp( - byline: false, - flags: "s", - match: '', - replace: installerDMGUninstallerXml, - file: install4jConf - ) - */ - } + macosJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/macos-jre"+JAVA_VERSION+"/jre" + macosJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/macos-jre"+JAVA_VERSION+".tar.gz" + windowsJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/windows-jre"+JAVA_VERSION+"/jre" + windowsJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/windows-jre"+JAVA_VERSION+".tar.gz" + from (install4jDir) { + include install4jTemplate + rename (install4jTemplate, install4jConfFile) + filter(ReplaceTokens, beginToken: '', endToken: '', tokens: ['9999999999': JAVA_VERSION]) + filter(ReplaceTokens, beginToken: '$$', endToken: '$$', + tokens: [ + 'JAVA_VERSION': JAVA_VERSION, + 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION, + 'VERSION': JALVIEW_VERSION, + 'MACOS_JAVA_VM_DIR': macosJavaVMDir, + 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz, + 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir, + 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz, + 'INSTALL4JINFOPLISTFILEASSOCIATIONS': install4jInfoPlistFileAssociations, + 'COPYRIGHT_MESSAGE': install4jCopyrightMessage, + 'MACOS_BUNDLE_ID': install4jMacOSBundleId, + 'GETDOWN_DIST_DIR': getdown_app_dir, + 'GETDOWN_INSTALL_DIR': getdown_install_dir + ] + ) + if (OSX_KEYPASS=="") { + filter(ReplaceTokens, beginToken: 'codeSigning macEnabled="', endToken: '"', tokens: ['true':'codeSigning macEnabled="false"']) + filter(ReplaceTokens, beginToken: 'runPostProcessor="true" ',endToken: 'Processor', tokens: ['post':'runPostProcessor="false" postProcessor']) + } + } + into install4jDir + outputs.files(install4jConf) + + doLast { + // include file associations in installer + def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text + ant.replaceregexp( + byline: false, + flags: "s", + match: '', + replace: installerFileAssociationsXml, + file: install4jConf + ) + /* + // include uninstaller applescript app files in dmg + def installerDMGUninstallerXml = file("$install4jDir/$install4jDMGUninstallerAppFiles").text + ant.replaceregexp( + byline: false, + flags: "s", + match: '', + replace: installerDMGUninstallerXml, + file: install4jConf + ) + */ + } } task installers(type: com.install4j.gradle.Install4jTask) { - group = "distribution" - description = "Create the install4j installers" - dependsOn getdown - dependsOn copyInstall4jTemplate - projectFile = file(install4jConf) - println("Using projectFile "+projectFile) - variables = [majorVersion: version.substring(2, 11), build: 001, OSX_KEYSTORE: OSX_KEYSTORE, JSIGN_SH: JSIGN_SH] - destination = "$jalviewDir/$install4jBuildDir/$JAVA_VERSION" - buildSelected = true - - if (OSX_KEYPASS) { - macKeystorePassword=OSX_KEYPASS - - } - - inputs.dir(project.ext.getdownWebsiteDir) - inputs.file(install4jConf) - inputs.dir(macosJavaVMDir) - inputs.dir(windowsJavaVMDir) - outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION") + group = "distribution" + description = "Create the install4j installers" + dependsOn getdown + dependsOn copyInstall4jTemplate + projectFile = file(install4jConf) + println("Using projectFile "+projectFile) + variables = [majorVersion: version.substring(2, 11), build: 001, OSX_KEYSTORE: OSX_KEYSTORE, JSIGN_SH: JSIGN_SH] + destination = "$jalviewDir/$install4jBuildDir/$JAVA_VERSION" + buildSelected = true + + if (OSX_KEYPASS) { + macKeystorePassword=OSX_KEYPASS + + } + + inputs.dir(project.ext.getdownWebsiteDir) + inputs.file(install4jConf) + inputs.dir(macosJavaVMDir) + inputs.dir(windowsJavaVMDir) + outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION") + } clean { - delete install4jConf + delete install4jConf } + diff --git a/getdown/lib/getdown-core.jar b/getdown/lib/getdown-core.jar index ced530430030797f91469601fee5e1820dd0f40e..c03431369a7214e2f3e92869d6fce3da1e17bd8f 100644 GIT binary patch delta 4879 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 delta 4629 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 diff --git a/getdown/lib/getdown-launcher.jar b/getdown/lib/getdown-launcher.jar index 8a383e79348118bc6d243aafa2a73974a46df2b1..62e87f44fe18342bffc8fe9a47eca808ed8031ef 100644 GIT binary patch delta 59146 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 yJyg_6H+4uY4d`(=HDDr>LQT5LN delta 59543 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 delta 4629 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 diff --git a/j8lib/getdown-core.jar b/j8lib/getdown-core.jar index ced530430030797f91469601fee5e1820dd0f40e..c03431369a7214e2f3e92869d6fce3da1e17bd8f 100644 GIT binary patch delta 4879 zcmaJ^2~<vzL-bl^+TpUXtw&99nY z#k5NSy!e`jfP1|65vaG;X}wt`c@AOyxozznHk3RSD4aa+v%cDc$l9>yi~Bhtb4#NU zoWOY$CS(|Hb)W4)VCRvqHtnjg%~*5pt^U4nj)2poHx)D>4yRw6HcCtudBJn(qVFsl zdxANee8!TzdJ~z%S_3$K=dP?#2r*2KVC`Y7AGN@aTU7R( z&F&`zm8Fx}8blZ-er-MZTQi0!vDRuDTyTj$l2&e=$`+duiD!%0iMOf zG})vI$WE+7i_nU*rlu*qb}2+*2WAoS!2J%hyKT7re=O-!@P#>8X%8;JZiiWAWnK$A z$DF8ma+qDplGPi8##jr9Un-LivWMty>QnZa1$jUGE*nT?8c(qkrDQL+h8=Ipt?+9W zwURCM4)!-G;n{G-@`CMl|)x&{d4g_gS(_HY~CRT_~1|sXqkHxIYfj|^@aw}$; zFw8=8;s^rC3`BO7(aYFe69TcU&iMCB@OF$)J7S4}rCx=^l|NLlt;9{0iypE)>FPie zt1}_T4_faYUc)lXN)Yv-#}}Vu|DeY!-OK(&5A~{yoksPfPP5px5=^;hu1&3X!4(0> zsnTRIyTODzpMHpQIT6*j$mMjAV(|ryMEKR)G+L^=Khwq8q6HMQ;8kC`bMMbJwuDDk z7mkR1Jv7g!oq({(!N%U&=fz5#=7~hwm>>QmxZu)O%3fQOZb|a6`t^T^&-Dv-B$6=b zlk1fApO$9K16F}W(FHZ&7a$_Pe8o+6sH@)9|vXqJ}@pP zy+@AbilzEIV<+AFc*BiRP9N8dy)plu_}O6D#h`Vo68{=|zGdBmTM-Y=zkmDTFQ5Fc z|A@0s@Vgt&Itv@ZW{O|O^*Op-Q>IZBzAqK&`i?tY|0-y}lR4oM(bN*r@tgCn*yS~S z_OxZS-@^3G?^4P$Y%gjfK3iq;+y3ifpK^tt+iFo^ac}z^Nr~x`{HaflEZG(rJ|r!| z?Lu|R>yx=>Q#P9osN8BNY<5a2b(finc5e;7;^VQaKk>mv74lNBp|fB|>yy zxxH9V{?&z7aqBOLzHF-&rPx5br7uNRANW1y#fXC9Eqv{GSBz$<9@bL7DUUy!d z+%mlRTB}>k#*JYwG-IwTYV^0&pO4x0#<4JEVb$}ur_P;B>7^W5wr%wJ7pG&)j*M3i zn>fcM@D^K^7yK~GE7dx1z3ZMYd}o~r-5ap*&aorKT21uSzHw`R8n!!3knJ!vW9jO{ zJsfA~diUGEsbyH9YRGkqz*IC*z1RU&*p&=D)+7&HJA2Z|hyktcV^1yHcY34!tzn06 z=Cw6qQu*;~mJhjo(1KyG9mA*~E62~sQfuE7OZBPeu8}^VuV`(g-Oo1f^Q!)kY!*V2 zY|B<8k!1U29b2AGQa5DV00eCqrUD*igZu^DqR<9Kk;PdX6faOgTXeQX^Mn@gF23cR zZp3`N(Gex(<=^{k_{>XHr9C{xyQ^` zs6~sS60aUL`4F4dGi~Fw>7yUq&8{j>|L>Hj^`S|VUdA7+f7p2YPOZPi#ivP+QO#E} z;fT;}Lwy2^BXx&XzkgZ!ntjLV$PgTWZ$kwXVE{5WzcbO$aL z9f>ZdaC(+9w@zvy66DG{coIXi4n`-xcH@mQ_OncY!2@8Qk{M zX|hcjCU)q6==h}Qc9Up*-5)r_B=K6>dnx%>dlTm7FHL5BCbs zcSTOb%lS&OZ8F4YiB{Fm64xq0ii>13mHKihybi)s0+5Ipxu7Paf31jNWDvq`Jk{G{ z3`AYA%t&&J>Nqjdr~|tKEg{-(HR*A-CBxW4E(P$2qNV{_hEr#=_E>DxyEU<4&}{I3 z6Qp_w5B_!@fk*lyZ$jLDO#%n;kcV;z5-v`j$(A_x3HnOZ>WLi`L~xiP~_xJGyHv8 z^^Y@vU=W0cZ%o-<4(y6o1R+=AiY+-K&g}$m7TVHjVN|KpWbUK97ekN>fgX8rCiWgw znFCZqun`AOoo37tYTEu_@Hyu#1uURcm!72BMhBy=WPiGv?7zHCsduT73)zpONBQzT z-7gA7?nGs{vtZ^|5GXgO=I%U|qZ=s{ylRfURY*?o8U2gCRRDG&q_8g!@7Bbb=!s>4 zhWuC>NK7esMtR^eOA9cF?mrXa;$Wn}aD!D66E~{}zM>1=hij`dQ5kjIQrZZ<-UDX# z;Hi9UMWMt*hY+M7_}J$C14lu*e@#cIfP2dHO$b9o=cK^58wSMBgRFGKAqe2C^-A@rSOm4$YAolraZ zuILjZ-?SGoifr19dy5d@J1zorHX@!9gRzHXoi{`!;dVFrqBh zi&%5DgeprtXG4Yx$*miMG9ots!#Su0zN>ETq{_GtQ+(MMIS{ULcQPZ7<8&3w$fLf< zM!Rf<8Gi3>$fUgIp1UTdLt0^;ZLFToTMoSokmO~i1! z+tw53cp`3;bDtDu-B2&`Ninb+8bKE8x}mYI@NE&_`_1JBcYuwxVVGV#r&!zK^lr!( u_w5d&tnK3iAbIc~#e)_(wn1(1El1R)YeI|=a+YC|;BUN~VN#{wGUk6bvFrl? delta 4629 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 diff --git a/utils/install4j/install4j_template.install4j b/utils/install4j/install4j_template.install4j index 65261d8..02fdf8e 100644 --- a/utils/install4j/install4j_template.install4j +++ b/utils/install4j/install4j_template.install4j @@ -58,7 +58,7 @@ - + @@ -124,6 +124,7 @@ + @@ -157,6 +158,7 @@ + @@ -189,7 +191,7 @@ - + -- 1.7.10.2