import org.gradle.plugins.ide.eclipse.model.Output
import org.gradle.plugins.ide.eclipse.model.Library
import java.security.MessageDigest
+import java.util.regex.Matcher
import groovy.transform.ExternalizeMethods
import groovy.util.XmlParser
import groovy.xml.XmlUtil
+import groovy.json.JsonBuilder
import com.vladsch.flexmark.util.ast.Node
import com.vladsch.flexmark.html.HtmlRenderer
import com.vladsch.flexmark.parser.Parser
import com.vladsch.flexmark.ext.autolink.AutolinkExtension
import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension
import com.vladsch.flexmark.ext.toc.TocExtension
+import com.google.common.hash.HashCode
+import com.google.common.hash.Hashing
+import com.google.common.io.Files
+import org.jsoup.Jsoup
+import org.jsoup.nodes.Element
buildscript {
repositories {
}
dependencies {
classpath "com.vladsch.flexmark:flexmark-all:0.62.0"
+ classpath "org.jsoup:jsoup:1.14.3"
+ classpath "com.eowise:gradle-imagemagick:0.5.1"
}
}
id 'eclipse'
id "com.diffplug.gradle.spotless" version "3.28.0"
id 'com.github.johnrengelman.shadow' version '4.0.3'
- id 'com.install4j.gradle' version '8.0.4'
- id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
- id 'com.palantir.git-version' version '0.12.3'
+ id 'com.install4j.gradle' version '9.0.6'
+ id 'com.dorongold.task-tree' version '2.1.0' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
+ id 'com.palantir.git-version' version '0.13.0' apply false
}
repositories {
}
+
// in ext the values are cast to Object. Ensure string values are cast as String (and not GStringImpl) for later use
def string(Object o) {
return o == null ? "" : o.toString()
}
-
-ext {
- jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
- jalviewDirRelativePath = jalviewDir
-
- // local build environment properties
- // can be "projectDir/local.properties"
- def localProps = "${projectDir}/local.properties"
- def propsFile = null;
- if (file(localProps).exists()) {
- propsFile = localProps
+def overrideProperties(String propsFileName, boolean output = false) {
+ if (propsFileName == null) {
+ return
}
- // or "../projectDir_local.properties"
- def dirLocalProps = projectDir.getParent() + "/" + projectDir.getName() + "_local.properties"
- if (file(dirLocalProps).exists()) {
- propsFile = dirLocalProps
- }
- if (propsFile != null) {
+ def propsFile = file(propsFileName)
+ if (propsFile != null && propsFile.exists()) {
+ println("Using properties from file '${propsFileName}'")
try {
def p = new Properties()
def localPropsFIS = new FileInputStream(propsFile)
localPropsFIS.close()
p.each {
key, val ->
- def oldval = findProperty(key)
- setProperty(key, val)
- if (oldval != null) {
- println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
+ def oldval
+ if (project.hasProperty(key)) {
+ oldval = project.findProperty(key)
+ project.setProperty(key, val)
+ if (output) {
+ println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
+ }
} else {
- println("Setting unknown property '${key}' with ${file(propsFile).getName()}s value '${val}'")
+ ext.setProperty(key, val)
+ if (output) {
+ println("Setting ext property '${key}' with ${file(propsFile).getName()}s value '${val}'")
+ }
}
}
} catch (Exception e) {
- System.out.println("Exception reading local.properties")
+ println("Exception reading local.properties")
+ e.printStackTrace()
}
}
+}
+
+ext {
+ jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
+ jalviewDirRelativePath = jalviewDir
+ date = new Date()
+
+ getdownChannelName = CHANNEL.toLowerCase()
+ // default to "default". Currently only has different cosmetics for "develop", "release", "default"
+ propertiesChannelName = ["develop", "release", "test-release", "jalviewjs", "jalviewjs-release" ].contains(getdownChannelName) ? getdownChannelName : "default"
+ channelDirName = propertiesChannelName
+ // Import channel_properties
+ if (getdownChannelName.startsWith("develop-")) {
+ channelDirName = "develop-SUFFIX"
+ }
+ channelDir = string("${jalviewDir}/${channel_properties_dir}/${channelDirName}")
+ channelGradleProperties = string("${channelDir}/channel_gradle.properties")
+ channelPropsFile = string("${channelDir}/${resource_dir}/${channel_props}")
+ overrideProperties(channelGradleProperties, false)
+ // local build environment properties
+ // can be "projectDir/local.properties"
+ overrideProperties("${projectDir}/local.properties", true)
+ // or "../projectDir_local.properties"
+ overrideProperties(projectDir.getParent() + "/" + projectDir.getName() + "_local.properties", true)
////
// Import releaseProps from the RELEASE file
// or a file specified via JALVIEW_RELEASE_FILE if defined
// Expect jalview.version and target release branch in jalview.release
- def releaseProps = new Properties();
+ releaseProps = new Properties();
def releasePropFile = findProperty("JALVIEW_RELEASE_FILE");
def defaultReleasePropFile = "${jalviewDirAbsolutePath}/RELEASE";
try {
}
////
// Set JALVIEW_VERSION if it is not already set
- if (findProperty(JALVIEW_VERSION)==null || "".equals(JALVIEW_VERSION)) {
+ if (findProperty("JALVIEW_VERSION")==null || "".equals(JALVIEW_VERSION)) {
JALVIEW_VERSION = releaseProps.get("jalview.version")
}
+ println("JALVIEW_VERSION is set to '${JALVIEW_VERSION}'")
// this property set when running Eclipse headlessly
j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild")
}
*/
+ // datestamp
+ buildDate = new Date().format("yyyyMMdd")
+
// essentials
bareSourceDir = string(source_dir)
sourceDir = string("${jalviewDir}/${bareSourceDir}")
//cloverTestClassesDir = cloverClassesDir
cloverDb = string("${cloverBuildDir}/clover.db")
- resourceClassesDir = useClover ? cloverClassesDir : classesDir
-
testSourceDir = useClover ? cloverTestInstrDir : testDir
testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
- getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
+ channelSuffix = ""
+ backgroundImageText = BACKGROUNDIMAGETEXT
+ getdownChannelDir = string("${getdown_website_dir}/${propertiesChannelName}")
+ getdownAppBaseDir = string("${jalviewDir}/${getdownChannelDir}/${JAVA_VERSION}")
+ getdownArchiveDir = string("${jalviewDir}/${getdown_archive_dir}")
+ getdownFullArchiveDir = null
+ getdownTextLines = []
+ getdownLaunchJvl = null
+ getdownVersionLaunchJvl = null
buildDist = true
+ buildProperties = null
// the following values might be overridden by the CHANNEL switch
- getdownChannelName = CHANNEL.toLowerCase()
getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
+ getdownArchiveAppBase = getdown_archive_base
getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
getdownAppDistDir = getdown_app_dir_alt
- buildProperties = string("${resourceDir}/${build_properties_file}")
+ getdownImagesDir = string("${jalviewDir}/${getdown_images_dir}")
+ getdownImagesBuildDir = string("${buildDir}/imagemagick/getdown")
+ getdownSetAppBaseProperty = false // whether to pass the appbase and appdistdir to the application
reportRsyncCommand = false
jvlChannelName = CHANNEL.toLowerCase()
install4jSuffix = CHANNEL.substring(0, 1).toUpperCase() + CHANNEL.substring(1).toLowerCase(); // BUILD -> Build
- install4jDSStore = "DS_Store-NON-RELEASE"
- install4jDMGBackgroundImage = "jalview_dmg_background-NON-RELEASE.png"
+ install4jDMGDSStore = "${install4j_images_dir}/${install4j_dmg_ds_store}"
+ install4jDMGBackgroundImageDir = "${install4j_images_dir}"
+ install4jDMGBackgroundImageBuildDir = "build/imagemagick/install4j"
+ install4jDMGBackgroundImageFile = "${install4j_dmg_background}"
install4jInstallerName = "${jalview_name} Non-Release Installer"
- install4jExecutableName = jalview_name.replaceAll("[^\\w]+", "_").toLowerCase()
+ install4jExecutableName = install4j_executable_name
install4jExtraScheme = "jalviewx"
+ install4jMacIconsFile = string("${install4j_images_dir}/${install4j_mac_icons_file}")
+ install4jWindowsIconsFile = string("${install4j_images_dir}/${install4j_windows_icons_file}")
+ install4jPngIconFile = string("${install4j_images_dir}/${install4j_png_icon_file}")
+ install4jBackground = string("${install4j_images_dir}/${install4j_background}")
+ install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
+ install4jCheckSums = true
+
+ applicationName = "${jalview_name}"
switch (CHANNEL) {
case "BUILD":
testng_excluded_groups = "Not-bamboo"
}
install4jExtraScheme = "jalviewb"
+ backgroundImageText = true
break
- case "RELEASE":
+ case [ "RELEASE", "JALVIEWJS-RELEASE" ]:
getdownAppDistDir = getdown_app_dir_release
+ getdownSetAppBaseProperty = true
reportRsyncCommand = true
install4jSuffix = ""
- install4jDSStore = "DS_Store"
- install4jDMGBackgroundImage = "jalview_dmg_background.png"
install4jInstallerName = "${jalview_name} Installer"
break
case "ARCHIVELOCAL":
getdownChannelName = string("archive/${JALVIEW_VERSION}")
getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
- getdownAppBase = file(getdownWebsiteDir).toURI().toString()
+ getdownAppBase = file(getdownAppBaseDir).toURI().toString()
if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
- throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
+ throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution [did not find '${ARCHIVEDIR}/${package_dir}']")
} else {
package_dir = string("${ARCHIVEDIR}/${package_dir}")
buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
install4jExtraScheme = "jalviewa"
break
+ case ~/^DEVELOP-([\.\-\w]*)$/:
+ def suffix = Matcher.lastMatcher[0][1]
+ reportRsyncCommand = true
+ getdownSetAppBaseProperty = true
+ JALVIEW_VERSION=JALVIEW_VERSION+"-d${suffix}-${buildDate}"
+ install4jSuffix = "Develop ${suffix}"
+ install4jExtraScheme = "jalviewd"
+ install4jInstallerName = "${jalview_name} Develop ${suffix} Installer"
+ getdownChannelName = string("develop-${suffix}")
+ getdownChannelDir = string("${getdown_website_dir}/${getdownChannelName}")
+ getdownAppBaseDir = string("${jalviewDir}/${getdownChannelDir}/${JAVA_VERSION}")
+ getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
+ getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
+ channelSuffix = string(suffix)
+ backgroundImageText = true
+ break
+
case "DEVELOP":
reportRsyncCommand = true
-
+ getdownSetAppBaseProperty = true
// DEVELOP-RELEASE is usually associated with a Jalview release series so set the version
- JALVIEW_VERSION=JALVIEW_VERSION+"-develop"
+ JALVIEW_VERSION=JALVIEW_VERSION+"-d${buildDate}"
install4jSuffix = "Develop"
- install4jDSStore = "DS_Store-DEVELOP"
- install4jDMGBackgroundImage = "jalview_dmg_background-DEVELOP.png"
install4jExtraScheme = "jalviewd"
install4jInstallerName = "${jalview_name} Develop Installer"
+ backgroundImageText = true
break
case "TEST-RELEASE":
reportRsyncCommand = true
+ getdownSetAppBaseProperty = true
// Don't ignore transpile errors for release build
if (jalviewjs_ignore_transpile_errors.equals("true")) {
jalviewjs_ignore_transpile_errors = "false"
}
JALVIEW_VERSION = JALVIEW_VERSION+"-test"
install4jSuffix = "Test"
- install4jDSStore = "DS_Store-TEST-RELEASE"
- install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png"
install4jExtraScheme = "jalviewt"
install4jInstallerName = "${jalview_name} Test Installer"
+ backgroundImageText = true
break
case ~/^SCRATCH(|-[-\w]*)$/:
}
JALVIEW_VERSION = "TEST"
install4jSuffix = "Test-Local"
- install4jDSStore = "DS_Store-TEST-RELEASE"
- install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png"
install4jExtraScheme = "jalviewt"
install4jInstallerName = "${jalview_name} Test Installer"
+ backgroundImageText = true
break
- case "LOCAL":
+ case [ "LOCAL", "JALVIEWJS" ]:
JALVIEW_VERSION = "TEST"
- getdownAppBase = file(getdownWebsiteDir).toURI().toString()
+ getdownAppBase = file(getdownAppBaseDir).toURI().toString()
+ getdownArchiveAppBase = file("${jalviewDir}/${getdown_archive_dir}").toURI().toString()
getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
install4jExtraScheme = "jalviewl"
+ install4jCheckSums = false
break
default: // something wrong specified
break
}
+ JALVIEW_VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
+ hugoDataJsonFile = file("${jalviewDir}/${hugo_build_dir}/${hugo_data_installers_dir}/installers-${JALVIEW_VERSION_UNDERSCORES}.json")
+ hugoArchiveMdFile = file("${jalviewDir}/${hugo_build_dir}/${hugo_version_archive_dir}/Version-${JALVIEW_VERSION_UNDERSCORES}/_index.md")
// override getdownAppBase if requested
if (findProperty("getdown_appbase_override") != null) {
- getdownAppBase = string(getProperty("getdown_appbase_override"))
+ // revert to LOCAL if empty string
+ if (string(getdown_appbase_override) == "") {
+ getdownAppBase = file(getdownAppBaseDir).toURI().toString()
+ getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
+ } else if (string(getdown_appbase_override).startsWith("file://")) {
+ getdownAppBase = string(getdown_appbase_override)
+ getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
+ } else {
+ getdownAppBase = string(getdown_appbase_override)
+ }
println("Overriding getdown appbase with '${getdownAppBase}'")
}
// sanitise file name for jalview launcher file for this channel
jvlChannelName = jvlChannelName.replaceAll("[^\\w\\-]+", "_")
// install4j application and folder names
if (install4jSuffix == "") {
- install4jApplicationName = "${jalview_name}"
install4jBundleId = "${install4j_bundle_id}"
install4jWinApplicationId = install4j_release_win_application_id
} else {
- install4jApplicationName = "${jalview_name} ${install4jSuffix}"
+ applicationName = "${jalview_name} ${install4jSuffix}"
install4jBundleId = "${install4j_bundle_id}-" + install4jSuffix.toLowerCase()
// add int hash of install4jSuffix to the last part of the application_id
def id = install4j_release_win_application_id
}
// sanitise folder and id names
// install4jApplicationFolder = e.g. "Jalview Build"
- install4jApplicationFolder = install4jApplicationName
+ install4jApplicationFolder = applicationName
.replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \
.replaceAll("_+", "_") // collapse __
- install4jInternalId = install4jApplicationName
+ install4jInternalId = applicationName
.replaceAll(" ","_")
.replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
.replaceAll("_+", "") // collapse __
//.replaceAll("_*-_*", "-") // collapse _-_
- install4jUnixApplicationFolder = install4jApplicationName
+ install4jUnixApplicationFolder = applicationName
.replaceAll(" ","_")
.replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
.replaceAll("_+", "_") // collapse __
.replaceAll("_*-_*", "-") // collapse _-_
.toLowerCase()
- getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
- //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
- getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
- getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
+ getdownWrapperLink = install4jUnixApplicationFolder // e.g. "jalview_local"
+ getdownAppDir = string("${getdownAppBaseDir}/${getdownAppDistDir}")
+ //getdownJ11libDir = "${getdownAppBaseDir}/${getdown_j11lib_dir}"
+ getdownResourceDir = string("${getdownAppBaseDir}/${getdown_resource_dir}")
+ getdownInstallDir = string("${getdownAppBaseDir}/${getdown_install_dir}")
getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/")
getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}")
/* compile without modules -- using classpath libraries
modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"])
modules_runtimeClasspath = modules_compileClasspath
*/
- def details = versionDetails()
- gitHash = details.gitHash
- gitBranch = details.branchName
+ gitHash = "SOURCE"
+ gitBranch = "Source"
+ try {
+ apply plugin: "com.palantir.git-version"
+ def details = versionDetails()
+ gitHash = details.gitHash
+ gitBranch = details.branchName
+ } catch(org.gradle.api.internal.plugins.PluginApplicationException e) {
+ println("Not in a git repository. Using git values from RELEASE properties file.")
+ gitHash = releaseProps.getProperty("git.hash")
+ gitBranch = releaseProps.getProperty("git.branch")
+ } catch(java.lang.RuntimeException e1) {
+ throw new GradleException("Error with git-version plugin. Directory '.git' exists but versionDetails() cannot be found.")
+ }
println("Using a ${CHANNEL} profile.")
'--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
+ } else if (JAVA_VERSION.equals("17")) {
+ JAVA_INTEGER_VERSION = string("17")
+ libDir = j17libDir
+ libDistDir = j17libDir
+ compile_source_compatibility = 17
+ compile_target_compatibility = 17
getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
- eclipseJavaRuntimeName = string("JavaSE-11")
+ eclipseJavaRuntimeName = string("JavaSE-17")
/* compile without modules -- using classpath libraries
additional_compiler_args += [
'--module-path', modules_compileClasspath.asPath,
jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
}
macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
- macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
- windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
- linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz")
+ macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_mac_x64.tar.gz")
+ windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_windows_x64.tar.gz")
+ linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_linux_x64.tar.gz")
install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
install4jConfFileName = string("jalview-install4j-conf.install4j")
install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1)
}
+ resourceBuildDir = string("${buildDir}/resources")
+ resourcesBuildDir = string("${resourceBuildDir}/resources_build")
+ helpBuildDir = string("${resourceBuildDir}/help_build")
+ docBuildDir = string("${resourceBuildDir}/doc_build")
-
+ if (buildProperties == null) {
+ buildProperties = string("${resourcesBuildDir}/${build_properties_file}")
+ }
buildingHTML = string("${jalviewDir}/${doc_dir}/building.html")
- helpFile = string("${resourceClassesDir}/${help_dir}/help.jhm")
helpParentDir = string("${jalviewDir}/${help_parent_dir}")
helpSourceDir = string("${helpParentDir}/${help_dir}")
+ helpFile = string("${helpBuildDir}/${help_dir}/help.jhm")
+ convertBinary = null
+ convertBinaryExpectedLocation = imagemagick_convert
+ if (convertBinaryExpectedLocation.startsWith("~/")) {
+ convertBinaryExpectedLocation = System.getProperty("user.home") + convertBinaryExpectedLocation.substring(1)
+ }
+ if (file(convertBinaryExpectedLocation).exists()) {
+ convertBinary = convertBinaryExpectedLocation
+ }
relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
jalviewjsCoreClasslists = []
jalviewjsJalviewTemplateName = string(jalviewjs_name)
jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
+ jalviewjsJ2sAltSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_alt_settings}")
jalviewjsJ2sProps = null
jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
}
resources {
- srcDirs resourceDir
- srcDirs += helpParentDir
+ srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ]
}
- jar.destinationDir = file("${jalviewDir}/${package_dir}")
-
compileClasspath = files(sourceSets.main.java.outputDir)
compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
runtimeClasspath = compileClasspath
+ runtimeClasspath += files(sourceSets.main.resources.srcDirs)
}
clover {
compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
runtimeClasspath = compileClasspath
+ runtimeClasspath += files(sourceSets.test.resources.srcDirs)
}
}
classpath {
//defaultOutputDir = sourceSets.main.java.outputDir
- def removeThese = []
- configurations.each{
- if (it.isCanBeResolved()) {
- removeThese += it
+ configurations.each{ c->
+ if (c.isCanBeResolved()) {
+ minusConfigurations += [c]
}
}
- minusConfigurations += removeThese
plusConfigurations = [ ]
file {
// format is a string like date.format("dd MMMM yyyy")
def getDate(format) {
- def date = new Date()
return date.format(format)
}
-task createBuildProperties(type: WriteProperties) {
- group = "build"
- description = "Create the ${buildProperties} file"
-
- inputs.dir(sourceDir)
- inputs.dir(resourceDir)
- file(buildProperties).getParentFile().mkdirs()
- outputFile (buildProperties)
- // 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:"+gitHash+" ["+gitBranch+"]"
- outputs.file(outputFile)
-}
-
-
-clean {
- doFirst {
- delete buildProperties
- }
-}
-
-
-task cleanBuildingHTML(type: Delete) {
- doFirst {
- delete buildingHTML
- }
-}
-
-
def convertMdToHtml (FileTree mdFiles, File cssFile) {
MutableDataSet options = new MutableDataSet()
def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
def htmlFile = file(htmlFilePath)
+ println("Creating ${htmlFilePath}")
htmlFile.text = htmlText
}
}
+task copyDocs(type: Copy) {
+ def inputDir = "${jalviewDir}/${doc_dir}"
+ def outputDir = "${docBuildDir}/${doc_dir}"
+ from(inputDir) {
+ include('**/*.txt')
+ include('**/*.md')
+ include('**/*.html')
+ include('**/*.xml')
+ filter(ReplaceTokens,
+ beginToken: '$$',
+ endToken: '$$',
+ tokens: [
+ 'Version-Rel': JALVIEW_VERSION,
+ 'Year-Rel': getDate("yyyy")
+ ]
+ )
+ }
+ from(inputDir) {
+ exclude('**/*.txt')
+ exclude('**/*.md')
+ exclude('**/*.html')
+ exclude('**/*.xml')
+ }
+ into outputDir
+
+ inputs.dir(inputDir)
+ outputs.dir(outputDir)
+}
+
+
task convertMdFiles {
- dependsOn cleanBuildingHTML
- def mdFiles = fileTree(dir: "${jalviewDir}/${doc_dir}", include: "*.md")
+ dependsOn copyDocs
+ def mdFiles = fileTree(dir: docBuildDir, include: "**/*.md")
def cssFile = file("${jalviewDir}/${flexmark_css}")
doLast {
}
-task syncDocs(type: Sync) {
- dependsOn convertMdFiles
- def syncDir = "${classesDir}/${doc_dir}"
- from fileTree("${jalviewDir}/${doc_dir}")
- into syncDir
+def hugoTemplateSubstitutions(String input, Map extras=null) {
+ def replacements = [
+ DATE: getDate("yyyy-MM-dd"),
+ CHANNEL: propertiesChannelName,
+ APPLICATION_NAME: applicationName,
+ GIT_HASH: gitHash,
+ GIT_BRANCH: gitBranch,
+ VERSION: JALVIEW_VERSION,
+ JAVA_VERSION: JAVA_VERSION,
+ VERSION_UNDERSCORES: JALVIEW_VERSION_UNDERSCORES,
+ DRAFT: "false",
+ JVL_HEADER: ""
+ ]
+ def output = input
+ if (extras != null) {
+ extras.each{ k, v ->
+ output = output.replaceAll("__${k}__", ((v == null)?"":v))
+ }
+ }
+ replacements.each{ k, v ->
+ output = output.replaceAll("__${k}__", ((v == null)?"":v))
+ }
+ return output
+}
+
+def mdFileComponents(File mdFile, def dateOnly=false) {
+ def map = [:]
+ def content = ""
+ if (mdFile.exists()) {
+ def inFrontMatter = false
+ def firstLine = true
+ mdFile.eachLine { line ->
+ if (line.matches("---")) {
+ def prev = inFrontMatter
+ inFrontMatter = firstLine
+ if (inFrontMatter != prev)
+ return false
+ }
+ if (inFrontMatter) {
+ def m = null
+ if (m = line =~ /^date:\s*(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/) {
+ map["date"] = new Date().parse("yyyy-MM-dd HH:mm:ss", m[0][1])
+ } else if (m = line =~ /^date:\s*(\d{4}-\d{2}-\d{2})/) {
+ map["date"] = new Date().parse("yyyy-MM-dd", m[0][1])
+ } else if (m = line =~ /^channel:\s*(\S+)/) {
+ map["channel"] = m[0][1]
+ } else if (m = line =~ /^version:\s*(\S+)/) {
+ map["version"] = m[0][1]
+ } else if (m = line =~ /^\s*([^:]+)\s*:\s*(\S.*)/) {
+ map[ m[0][1] ] = m[0][2]
+ }
+ if (dateOnly && map["date"] != null) {
+ return false
+ }
+ } else {
+ if (dateOnly)
+ return false
+ content += line+"\n"
+ }
+ firstLine = false
+ }
+ }
+ return dateOnly ? map["date"] : [map, content]
}
+task hugoTemplates {
+ group "website"
+ description "Create partially populated md pages for hugo website build"
+
+ def hugoTemplatesDir = file("${jalviewDir}/${hugo_templates_dir}")
+ def hugoBuildDir = "${jalviewDir}/${hugo_build_dir}"
+ def templateFiles = fileTree(dir: hugoTemplatesDir)
+ def releaseMdFile = file("${jalviewDir}/${releases_dir}/release-${JALVIEW_VERSION_UNDERSCORES}.md")
+ def whatsnewMdFile = file("${jalviewDir}/${whatsnew_dir}/whatsnew-${JALVIEW_VERSION_UNDERSCORES}.md")
+ def oldJvlFile = file("${jalviewDir}/${hugo_old_jvl}")
+ def jalviewjsFile = file("${jalviewDir}/${hugo_jalviewjs}")
+
+ doFirst {
+ // specific release template for version archive
+ def changes = ""
+ def whatsnew = null
+ def givenDate = null
+ def givenChannel = null
+ def givenVersion = null
+ if (CHANNEL == "RELEASE") {
+ def (map, content) = mdFileComponents(releaseMdFile)
+ givenDate = map.date
+ givenChannel = map.channel
+ givenVersion = map.version
+ changes = content
+ if (givenVersion != null && givenVersion != JALVIEW_VERSION) {
+ throw new GradleException("'version' header (${givenVersion}) found in ${releaseMdFile} does not match JALVIEW_VERSION (${JALVIEW_VERSION})")
+ }
+
+ if (whatsnewMdFile.exists())
+ whatsnew = whatsnewMdFile.text
+ }
+
+ def oldJvl = oldJvlFile.exists() ? oldJvlFile.collect{it} : []
+ def jalviewjsLink = jalviewjsFile.exists() ? jalviewjsFile.collect{it} : []
+ def changesHugo = null
+ if (changes != null) {
+ changesHugo = '<div class="release_notes">\n\n'
+ def inSection = false
+ changes.eachLine { line ->
+ def m = null
+ if (m = line =~ /^##([^#].*)$/) {
+ if (inSection) {
+ changesHugo += "</div>\n\n"
+ }
+ def section = m[0][1].trim()
+ section = section.toLowerCase()
+ section = section.replaceAll(/ +/, "_")
+ section = section.replaceAll(/[^a-z0-9_\-]/, "")
+ changesHugo += "<div class=\"${section}\">\n\n"
+ inSection = true
+ } else if (m = line =~ /^(\s*-\s*)<!--([^>]+)-->(.*?)(<br\/?>)?\s*$/) {
+ def comment = m[0][2].trim()
+ if (comment != "") {
+ comment = comment.replaceAll('"', """)
+ def issuekeys = []
+ comment.eachMatch(/JAL-\d+/) { jal -> issuekeys += jal }
+ def newline = m[0][1]
+ if (comment.trim() != "")
+ newline += "{{<comment>}}${comment}{{</comment>}} "
+ newline += m[0][3].trim()
+ if (issuekeys.size() > 0)
+ newline += " {{< jal issue=\"${issuekeys.join(",")}\" alt=\"${comment}\" >}}"
+ if (m[0][4] != null)
+ newline += m[0][4]
+ line = newline
+ }
+ }
+ changesHugo += line+"\n"
+ }
+ if (inSection) {
+ changesHugo += "\n</div>\n\n"
+ }
+ changesHugo += '</div>'
+ }
+
+ templateFiles.each{ templateFile ->
+ def newFileName = string(hugoTemplateSubstitutions(templateFile.getName()))
+ def relPath = hugoTemplatesDir.toPath().relativize(templateFile.toPath()).getParent()
+ def newRelPathName = hugoTemplateSubstitutions( relPath.toString() )
+
+ def outPathName = string("${hugoBuildDir}/$newRelPathName")
+
+ copy {
+ from templateFile
+ rename(templateFile.getName(), newFileName)
+ into outPathName
+ }
+
+ def newFile = file("${outPathName}/${newFileName}".toString())
+ def content = newFile.text
+ newFile.text = hugoTemplateSubstitutions(content,
+ [
+ WHATSNEW: whatsnew,
+ CHANGES: changesHugo,
+ DATE: givenDate == null ? "" : givenDate.format("yyyy-MM-dd"),
+ DRAFT: givenDate == null ? "true" : "false",
+ JALVIEWJSLINK: jalviewjsLink.contains(JALVIEW_VERSION) ? "true" : "false",
+ JVL_HEADER: oldJvl.contains(JALVIEW_VERSION) ? "jvl: true" : ""
+ ]
+ )
+ }
+
+ }
+
+ inputs.file(oldJvlFile)
+ inputs.dir(hugoTemplatesDir)
+ inputs.property("JALVIEW_VERSION", { JALVIEW_VERSION })
+ inputs.property("CHANNEL", { CHANNEL })
+}
+
+def getMdDate(File mdFile) {
+ return mdFileComponents(mdFile, true)
+}
+
+def getMdSections(String content) {
+ def sections = [:]
+ def sectionContent = ""
+ def sectionName = null
+ content.eachLine { line ->
+ def m = null
+ if (m = line =~ /^##([^#].*)$/) {
+ if (sectionName != null) {
+ sections[sectionName] = sectionContent
+ sectionName = null
+ sectionContent = ""
+ }
+ sectionName = m[0][1].trim()
+ sectionName = sectionName.toLowerCase()
+ sectionName = sectionName.replaceAll(/ +/, "_")
+ sectionName = sectionName.replaceAll(/[^a-z0-9_\-]/, "")
+ } else if (sectionName != null) {
+ sectionContent += line+"\n"
+ }
+ }
+ if (sectionContent != null) {
+ sections[sectionName] = sectionContent
+ }
+ return sections
+}
task copyHelp(type: Copy) {
def inputDir = helpSourceDir
- def outputDir = "${resourceClassesDir}/${help_dir}"
+ def outputDir = "${helpBuildDir}/${help_dir}"
from(inputDir) {
- exclude '**/*.gif'
- exclude '**/*.jpg'
- exclude '**/*.png'
+ include('**/*.txt')
+ include('**/*.md')
+ include('**/*.html')
+ include('**/*.hs')
+ include('**/*.xml')
+ include('**/*.jhm')
filter(ReplaceTokens,
beginToken: '$$',
endToken: '$$',
)
}
from(inputDir) {
- include '**/*.gif'
- include '**/*.jpg'
- include '**/*.png'
+ exclude('**/*.txt')
+ exclude('**/*.md')
+ exclude('**/*.html')
+ exclude('**/*.hs')
+ exclude('**/*.xml')
+ exclude('**/*.jhm')
}
into outputDir
}
-task syncLib(type: Sync) {
- def syncDir = "${resourceClassesDir}/${libDistDir}"
- from fileTree("${jalviewDir}/${libDistDir}")
- into syncDir
+task releasesTemplates {
+ group "help"
+ description "Recreate whatsNew.html and releases.html from markdown files and templates in help"
+
+ dependsOn copyHelp
+
+ def releasesTemplateFile = file("${jalviewDir}/${releases_template}")
+ def whatsnewTemplateFile = file("${jalviewDir}/${whatsnew_template}")
+ def releasesHtmlFile = file("${helpBuildDir}/${help_dir}/${releases_html}")
+ def whatsnewHtmlFile = file("${helpBuildDir}/${help_dir}/${whatsnew_html}")
+ def releasesMdDir = "${jalviewDir}/${releases_dir}"
+ def whatsnewMdDir = "${jalviewDir}/${whatsnew_dir}"
+
+ doFirst {
+ def releaseMdFile = file("${releasesMdDir}/release-${JALVIEW_VERSION_UNDERSCORES}.md")
+ def whatsnewMdFile = file("${whatsnewMdDir}/whatsnew-${JALVIEW_VERSION_UNDERSCORES}.md")
+
+ if (CHANNEL == "RELEASE") {
+ if (!releaseMdFile.exists()) {
+ throw new GradleException("File ${releaseMdFile} must be created for RELEASE")
+ }
+ if (!whatsnewMdFile.exists()) {
+ throw new GradleException("File ${whatsnewMdFile} must be created for RELEASE")
+ }
+ }
+
+ def releaseFiles = fileTree(dir: releasesMdDir, include: "release-*.md")
+ def releaseFilesDates = releaseFiles.collectEntries {
+ [(it): getMdDate(it)]
+ }
+ releaseFiles = releaseFiles.sort { a,b -> releaseFilesDates[a].compareTo(releaseFilesDates[b]) }
+
+ def releasesTemplate = releasesTemplateFile.text
+ def m = releasesTemplate =~ /(?s)__VERSION_LOOP_START__(.*)__VERSION_LOOP_END__/
+ def versionTemplate = m[0][1]
+
+ MutableDataSet options = new MutableDataSet()
+
+ def extensions = new ArrayList<>()
+ options.set(Parser.EXTENSIONS, extensions)
+ options.set(Parser.HTML_BLOCK_COMMENT_ONLY_FULL_LINE, true)
+
+ Parser parser = Parser.builder(options).build()
+ HtmlRenderer renderer = HtmlRenderer.builder(options).build()
+
+ def actualVersions = releaseFiles.collect { rf ->
+ def (rfMap, rfContent) = mdFileComponents(rf)
+ return rfMap.version
+ }
+ def versionsHtml = ""
+ def linkedVersions = []
+ releaseFiles.reverse().each { rFile ->
+ def (rMap, rContent) = mdFileComponents(rFile)
+
+ def versionLink = ""
+ def partialVersion = ""
+ def firstPart = true
+ rMap.version.split("\\.").each { part ->
+ def displayPart = ( firstPart ? "" : "." ) + part
+ partialVersion += displayPart
+ if (
+ linkedVersions.contains(partialVersion)
+ || ( actualVersions.contains(partialVersion) && partialVersion != rMap.version )
+ ) {
+ versionLink += displayPart
+ } else {
+ versionLink += "<a id=\"Jalview.${partialVersion}\">${displayPart}</a>"
+ linkedVersions += partialVersion
+ }
+ firstPart = false
+ }
+ def displayDate = releaseFilesDates[rFile].format("dd/MM/yyyy")
+
+ def lm = null
+ def rContentProcessed = ""
+ rContent.eachLine { line ->
+ if (lm = line =~ /^(\s*-)(\s*<!--[^>]*?-->)(.*)$/) {
+ line = "${lm[0][1]}${lm[0][3]}${lm[0][2]}"
+ } else if (lm = line =~ /^###([^#]+.*)$/) {
+ line = "_${lm[0][1].trim()}_"
+ }
+ rContentProcessed += line + "\n"
+ }
+
+ def rContentSections = getMdSections(rContentProcessed)
+ def rVersion = versionTemplate
+ if (rVersion != "") {
+ def rNewFeatures = rContentSections["new_features"]
+ def rIssuesResolved = rContentSections["issues_resolved"]
+ Node newFeaturesNode = parser.parse(rNewFeatures)
+ String newFeaturesHtml = renderer.render(newFeaturesNode)
+ Node issuesResolvedNode = parser.parse(rIssuesResolved)
+ String issuesResolvedHtml = renderer.render(issuesResolvedNode)
+ rVersion = hugoTemplateSubstitutions(rVersion,
+ [
+ VERSION: rMap.version,
+ VERSION_LINK: versionLink,
+ DISPLAY_DATE: displayDate,
+ NEW_FEATURES: newFeaturesHtml,
+ ISSUES_RESOLVED: issuesResolvedHtml
+ ]
+ )
+ versionsHtml += rVersion
+ }
+ }
+
+ releasesTemplate = releasesTemplate.replaceAll("(?s)__VERSION_LOOP_START__.*__VERSION_LOOP_END__", versionsHtml)
+ releasesTemplate = hugoTemplateSubstitutions(releasesTemplate)
+ releasesHtmlFile.text = releasesTemplate
+
+ if (whatsnewMdFile.exists()) {
+ def wnDisplayDate = releaseFilesDates[releaseMdFile] != null ? releaseFilesDates[releaseMdFile].format("dd MMMM yyyy") : ""
+ def whatsnewMd = hugoTemplateSubstitutions(whatsnewMdFile.text)
+ Node whatsnewNode = parser.parse(whatsnewMd)
+ String whatsnewHtml = renderer.render(whatsnewNode)
+ whatsnewHtml = whatsnewTemplateFile.text.replaceAll("__WHATS_NEW__", whatsnewHtml)
+ whatsnewHtmlFile.text = hugoTemplateSubstitutions(whatsnewHtml,
+ [
+ VERSION: JALVIEW_VERSION,
+ DISPLAY_DATE: wnDisplayDate
+ ]
+ )
+ } else if (gradle.taskGraph.hasTask(":linkCheck")) {
+ whatsnewHtmlFile.text = "Development build " + getDate("yyyy-MM-dd HH:mm:ss")
+ }
+
+ }
+
+ inputs.file(releasesTemplateFile)
+ inputs.file(whatsnewTemplateFile)
+ inputs.dir(releasesMdDir)
+ inputs.dir(whatsnewMdDir)
+ outputs.file(releasesHtmlFile)
+ outputs.file(whatsnewHtmlFile)
}
+task copyResources(type: Copy) {
+ group = "build"
+ description = "Copy (and make text substitutions in) the resources dir to the build area"
+ def inputDir = resourceDir
+ def outputDir = resourcesBuildDir
+ from(inputDir) {
+ include('**/*.txt')
+ include('**/*.md')
+ include('**/*.html')
+ include('**/*.xml')
+ filter(ReplaceTokens,
+ beginToken: '$$',
+ endToken: '$$',
+ tokens: [
+ 'Version-Rel': JALVIEW_VERSION,
+ 'Year-Rel': getDate("yyyy")
+ ]
+ )
+ }
+ from(inputDir) {
+ exclude('**/*.txt')
+ exclude('**/*.md')
+ exclude('**/*.html')
+ exclude('**/*.xml')
+ }
+ into outputDir
-task syncResources(type: Sync) {
- dependsOn createBuildProperties
- from resourceDir
- include "**/*.*"
- into "${resourceClassesDir}"
- preserve {
- include "**"
+ inputs.dir(inputDir)
+ outputs.dir(outputDir)
+}
+
+task copyChannelResources(type: Copy) {
+ dependsOn copyResources
+ group = "build"
+ description = "Copy the channel resources dir to the build resources area"
+
+ def inputDir = "${channelDir}/${resource_dir}"
+ def outputDir = resourcesBuildDir
+ from(inputDir) {
+ include(channel_props)
+ filter(ReplaceTokens,
+ beginToken: '__',
+ endToken: '__',
+ tokens: [
+ 'SUFFIX': channelSuffix
+ ]
+ )
+ }
+ from(inputDir) {
+ exclude(channel_props)
}
+ into outputDir
+
+ inputs.dir(inputDir)
+ outputs.dir(outputDir)
+}
+
+task createBuildProperties(type: WriteProperties) {
+ dependsOn copyResources
+ group = "build"
+ description = "Create the ${buildProperties} file"
+
+ inputs.dir(sourceDir)
+ inputs.dir(resourcesBuildDir)
+ outputFile (buildProperties)
+ // 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:"+gitHash+" ["+gitBranch+"]"
+ property "JAVA_COMPILE_VERSION", JAVA_INTEGER_VERSION
+ if (getdownSetAppBaseProperty) {
+ property "GETDOWNAPPBASE", getdownAppBase
+ property "GETDOWNAPPDISTDIR", getdownAppDistDir
+ }
+ outputs.file(outputFile)
}
+task buildIndices(type: JavaExec) {
+ dependsOn copyHelp
+ classpath = sourceSets.main.compileClasspath
+ main = "com.sun.java.help.search.Indexer"
+ workingDir = "${helpBuildDir}/${help_dir}"
+ def argDir = "html"
+ args = [ argDir ]
+ inputs.dir("${workingDir}/${argDir}")
+
+ outputs.dir("${classesDir}/doc")
+ outputs.dir("${classesDir}/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 buildResources {
+ dependsOn copyResources
+ dependsOn copyChannelResources
+ dependsOn createBuildProperties
+}
+
task prepare {
- dependsOn syncResources
- dependsOn syncDocs
+ dependsOn buildResources
+ dependsOn copyDocs
dependsOn copyHelp
+ dependsOn releasesTemplates
+ dependsOn convertMdFiles
+ dependsOn buildIndices
}
+compileJava.dependsOn prepare
+run.dependsOn compileJava
+//run.dependsOn prepare
+
+
//testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
test {
dependsOn prepare
- //dependsOn compileJava ////? DELETE
if (useClover) {
dependsOn cloverClasses
} else { //?
- dependsOn compileJava //?
+ dependsOn compileJava //?
}
useTestNG() {
excludeGroups testng_excluded_groups
preserveOrder true
useDefaultListeners=true
+ // Uncomment to show stdout and stderr for tests in gradle build output
+ // testLogging.showStandardStreams = true
}
maxHeapSize = "1024m"
workingDir = jalviewDir
- //systemProperties 'clover.jar' System.properties.clover.jar
def testLaf = project.findProperty("test_laf")
if (testLaf != null) {
println("Setting Test LaF to '${testLaf}'")
systemProperty "laf", testLaf
}
+ def testHiDPIScale = project.findProperty("test_HiDPIScale")
+ if (testHiDPIScale != null) {
+ println("Setting Test HiDPI Scale to '${testHiDPIScale}'")
+ systemProperty "sun.java2d.uiScale", testHiDPIScale
+ }
sourceCompatibility = compile_source_compatibility
targetCompatibility = compile_target_compatibility
jvmArgs += additional_compiler_args
}
-task buildIndices(type: JavaExec) {
- dependsOn copyHelp
- classpath = sourceSets.main.compileClasspath
- main = "com.sun.java.help.search.Indexer"
- workingDir = "${classesDir}/${help_dir}"
- def argDir = "html"
- args = [ argDir ]
- inputs.dir("${workingDir}/${argDir}")
-
- outputs.dir("${classesDir}/doc")
- outputs.dir("${classesDir}/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}/${utils_dir}")
task linkCheck(type: JavaExec) {
- dependsOn prepare, compileLinkCheck
+ dependsOn prepare
+ dependsOn compileLinkCheck
def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
classpath = files("${jalviewDir}/${utils_dir}")
main = "HelpLinksChecker"
- workingDir = jalviewDir
- args = [ "${classesDir}/${help_dir}", "-nointernet" ]
+ workingDir = "${helpBuildDir}"
+ args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
- def errFOS = outFOS
standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
outFOS,
- standardOutput)
+ System.out)
errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
outFOS,
- errorOutput)
+ System.err)
- inputs.dir("${classesDir}/${help_dir}")
+ inputs.dir(helpBuildDir)
outputs.file(helpLinksCheckerOutFile)
}
+
// import the pubhtmlhelp target
ant.properties.basedir = "${jalviewDir}"
-ant.properties.helpBuildDir = "${jalviewDirAbsolutePath}/${classes_dir}/${help_dir}"
+ant.properties.helpBuildDir = "${helpBuildDir}/${help_dir}"
ant.importBuild "${utils_dir}/publishHelp.xml"
jar {
+ dependsOn prepare
dependsOn linkCheck
- dependsOn buildIndices
- dependsOn createBuildProperties
manifest {
attributes "Main-Class": main_class,
"Permissions": "all-permissions",
- "Application-Name": "Jalview Desktop",
- "Codebase": application_codebase
+ "Application-Name": applicationName,
+ "Codebase": application_codebase,
+ "Implementation-Version": JALVIEW_VERSION
}
- destinationDir = file("${jalviewDir}/${package_dir}")
- archiveName = rootProject.name+".jar"
+ def outputDir = "${jalviewDir}/${package_dir}"
+ destinationDirectory = file(outputDir)
+ archiveFileName = rootProject.name+".jar"
+ duplicatesStrategy "EXCLUDE"
+
exclude "cache*/**"
exclude "*.jar"
exclude "**/*.jar"
exclude "**/*.jar.*"
- inputs.dir(classesDir)
- outputs.file("${jalviewDir}/${package_dir}/${archiveName}")
+ inputs.dir(sourceSets.main.java.outputDir)
+ sourceSets.main.resources.srcDirs.each{ dir ->
+ inputs.dir(dir)
+ }
+ outputs.file("${outputDir}/${archiveFileName}")
}
// doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
task syncJars(type: Sync) {
+ dependsOn jar
from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
into "${jalviewDir}/${package_dir}"
preserve {
- include jar.archiveName
+ include jar.archiveFileName.getOrNull()
}
}
dependsOn clean
}
+
shadowJar {
group = "distribution"
description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
include("*.jar")
}
manifest {
- attributes 'Implementation-Version': JALVIEW_VERSION
+ attributes "Implementation-Version": JALVIEW_VERSION,
+ "Application-Name": applicationName
}
+
+ duplicatesStrategy "INCLUDE"
+
mainClassName = shadow_jar_main_class
mergeServiceFiles()
classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
minimize()
}
+task getdownImagesCopy() {
+ inputs.dir getdownImagesDir
+ outputs.dir getdownImagesBuildDir
+
+ doFirst {
+ copy {
+ from(getdownImagesDir) {
+ include("*getdown*.png")
+ }
+ into getdownImagesBuildDir
+ }
+ }
+}
+
+task getdownImagesProcess() {
+ dependsOn getdownImagesCopy
+
+ doFirst {
+ if (backgroundImageText) {
+ if (convertBinary == null) {
+ throw new StopExecutionException("No ImageMagick convert binary installed at '${convertBinaryExpectedLocation}'")
+ }
+ if (!project.hasProperty("getdown_background_image_text_suffix_cmd")) {
+ throw new StopExecutionException("No property 'getdown_background_image_text_suffix_cmd' defined. See channel_gradle.properties for channel ${CHANNEL}")
+ }
+ fileTree(dir: getdownImagesBuildDir, include: "*background*.png").getFiles().each { file ->
+ exec {
+ executable convertBinary
+ args = [
+ file.getPath(),
+ '-font', getdown_background_image_text_font,
+ '-fill', getdown_background_image_text_colour,
+ '-draw', sprintf(getdown_background_image_text_suffix_cmd, channelSuffix),
+ '-draw', sprintf(getdown_background_image_text_commit_cmd, "git-commit: ${gitHash}"),
+ '-draw', sprintf(getdown_background_image_text_date_cmd, getDate("yyyy-MM-dd HH:mm:ss")),
+ file.getPath()
+ ]
+ }
+ }
+ }
+ }
+}
+
+task getdownImages() {
+ dependsOn getdownImagesProcess
+}
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 getdownImages
if (buildDist) {
dependsOn makeDist
}
def getdownWebsiteResourceFilenames = []
- def getdownTextString = ""
def getdownResourceDir = getdownResourceDir
def getdownResourceFilenames = []
doFirst {
// clean the getdown website and files dir before creating getdown folders
- delete getdownWebsiteDir
+ delete getdownAppBaseDir
delete getdownFilesDir
copy {
from buildProperties
- rename(build_properties_file, getdown_build_properties)
+ rename(file(buildProperties).getName(), getdown_build_properties)
into getdownAppDir
}
getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
- // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
+ copy {
+ from channelPropsFile
+ filter(ReplaceTokens,
+ beginToken: '__',
+ endToken: '__',
+ tokens: [
+ 'SUFFIX': channelSuffix
+ ]
+ )
+ into getdownAppBaseDir
+ }
+ getdownWebsiteResourceFilenames += file(channelPropsFile).getName()
+
+ // set some getdownTxt_ properties then go through all properties looking for getdownTxt_...
def props = project.properties.sort { it.key }
if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
}
+ if (getdownImagesBuildDir != null && file(getdownImagesBuildDir).exists()) {
+ props.put("getdown_txt_ui.background_image", "${getdownImagesBuildDir}/${getdown_background_image}")
+ props.put("getdown_txt_ui.instant_background_image", "${getdownImagesBuildDir}/${getdown_instant_background_image}")
+ props.put("getdown_txt_ui.error_background", "${getdownImagesBuildDir}/${getdown_error_background}")
+ props.put("getdown_txt_ui.progress_image", "${getdownImagesBuildDir}/${getdown_progress_image}")
+ props.put("getdown_txt_ui.icon", "${getdownImagesBuildDir}/${getdown_icon}")
+ props.put("getdown_txt_ui.mac_dock_icon", "${getdownImagesBuildDir}/${getdown_mac_dock_icon}")
+ }
props.put("getdown_txt_title", jalview_name)
- props.put("getdown_txt_ui.name", install4jApplicationName)
+ props.put("getdown_txt_ui.name", applicationName)
// start with appbase
- getdownTextString += "appbase = ${getdownAppBase}\n"
+ getdownTextLines += "appbase = ${getdownAppBase}"
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
+ def line = "${key} = ${v}"
+ getdownTextLines += line
}
} else {
// file values rationalised
}
}
if (! prop.startsWith("getdown_txt_resource")) {
- def line = prop.substring(12) + " = ${val}\n"
- getdownTextString += line
+ def line = prop.substring(12) + " = ${val}"
+ getdownTextLines += line
}
}
}
}
getdownWebsiteResourceFilenames.each{ filename ->
- getdownTextString += "resource = ${filename}\n"
+ getdownTextLines += "resource = ${filename}"
}
getdownResourceFilenames.each{ filename ->
copy {
into getdownResourceDir
}
}
+
+ def getdownWrapperScripts = [ getdown_bash_wrapper_script, getdown_powershell_wrapper_script, getdown_batch_wrapper_script ]
+ getdownWrapperScripts.each{ script ->
+ def s = file( "${jalviewDir}/utils/getdown/${getdown_wrapper_script_dir}/${script}" )
+ if (s.exists()) {
+ copy {
+ from s
+ into "${getdownAppBaseDir}/${getdown_wrapper_script_dir}"
+ }
+ getdownTextLines += "resource = ${getdown_wrapper_script_dir}/${script}"
+ }
+ }
def codeFiles = []
fileTree(file(package_dir)).each{ f ->
codeFiles += f
}
}
- codeFiles.sort().each{f ->
+ def jalviewJar = jar.archiveFileName.getOrNull()
+ // put jalview.jar first for CLASSPATH and .properties files reasons
+ codeFiles.sort{a, b -> ( a.getName() == jalviewJar ? -1 : ( b.getName() == jalviewJar ? 1 : a <=> b ) ) }.each{f ->
def name = f.getName()
- def line = "code = ${getdownAppDistDir}/${name}\n"
- getdownTextString += line
+ def line = "code = ${getdownAppDistDir}/${name}"
+ getdownTextLines += line
copy {
from f.getPath()
into getdownAppDir
def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
j11libFiles.sort().each{f ->
def name = f.getName()
- def line = "code = ${getdown_j11lib_dir}/${name}\n"
- getdownTextString += line
+ def line = "code = ${getdown_j11lib_dir}/${name}"
+ getdownTextLines += line
copy {
from f.getPath()
into 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 = ${main_class}\n"
+ //getdownTextLines += "class = " + file(getdownLauncher).getName()
+ getdownTextLines += "resource = ${getdown_launcher_new}"
+ getdownTextLines += "class = ${main_class}"
+ // Not setting these properties in general so that getdownappbase and getdowndistdir will default to release version in jalview.bin.Cache
+ if (getdownSetAppBaseProperty) {
+ getdownTextLines += "jvmarg = -Dgetdowndistdir=${getdownAppDistDir}"
+ getdownTextLines += "jvmarg = -Dgetdownappbase=${getdownAppBase}"
+ }
- def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
- getdown_txt.write(getdownTextString)
+ def getdownTxt = file("${getdownAppBaseDir}/getdown.txt")
+ getdownTxt.write(getdownTextLines.join("\n"))
- def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
- def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
+ getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
+ def launchJvl = file("${getdownAppBaseDir}/${getdownLaunchJvl}")
launchJvl.write("appbase=${getdownAppBase}")
+ // files going into the getdown website dir: getdown-launcher.jar
copy {
from getdownLauncher
rename(file(getdownLauncher).getName(), getdown_launcher_new)
- into getdownWebsiteDir
+ into getdownAppBaseDir
}
+ // files going into the getdown website dir: getdown-launcher(-local).jar
copy {
from getdownLauncher
if (file(getdownLauncher).getName() != getdown_launcher) {
rename(file(getdownLauncher).getName(), getdown_launcher)
}
- into getdownWebsiteDir
+ into getdownAppBaseDir
}
+ // files going into the getdown website dir: ./install dir and files
if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
copy {
- from getdown_txt
+ from getdownTxt
from getdownLauncher
- from "${getdownWebsiteDir}/${getdown_build_properties}"
+ from "${getdownAppDir}/${getdown_build_properties}"
if (file(getdownLauncher).getName() != getdown_launcher) {
rename(file(getdownLauncher).getName(), getdown_launcher)
}
into getdownInstallDir
}
+ // and make a copy in the getdown files dir (these are not downloaded by getdown)
copy {
from getdownInstallDir
into getdownFilesInstallDir
}
}
+ // files going into the getdown files dir: getdown.txt, getdown-launcher.jar, channel-launch.jvl, build_properties
copy {
- from getdown_txt
+ from getdownTxt
from launchJvl
from getdownLauncher
- from "${getdownWebsiteDir}/${getdown_build_properties}"
+ from "${getdownAppBaseDir}/${getdown_build_properties}"
+ from "${getdownAppBaseDir}/${channel_props}"
if (file(getdownLauncher).getName() != getdown_launcher) {
rename(file(getdownLauncher).getName(), getdown_launcher)
}
into getdownFilesDir
}
+ // and ./resource (not all downloaded by getdown)
copy {
from getdownResourceDir
into "${getdownFilesDir}/${getdown_resource_dir}"
if (buildDist) {
inputs.dir("${jalviewDir}/${package_dir}")
}
- outputs.dir(getdownWebsiteDir)
+ outputs.dir(getdownAppBaseDir)
outputs.dir(getdownFilesDir)
}
classpath = files(getdownLauncher)
}
main = "com.threerings.getdown.tools.Digester"
- args getdownWebsiteDir
- inputs.dir(getdownWebsiteDir)
- outputs.file("${getdownWebsiteDir}/digest2.txt")
+ args getdownAppBaseDir
+ inputs.dir(getdownAppBaseDir)
+ outputs.file("${getdownAppBaseDir}/digest2.txt")
}
dependsOn getdownDigest
doLast {
if (reportRsyncCommand) {
- def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
+ def fromDir = getdownAppBaseDir + (getdownAppBaseDir.endsWith('/')?'':'/')
def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
println "LIKELY RSYNC COMMAND:"
println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
}
+task getdownArchiveBuild() {
+ group = "distribution"
+ description = "Put files in the archive dir to go on the website"
+
+ dependsOn getdownWebsite
+
+ def v = "v${JALVIEW_VERSION_UNDERSCORES}"
+ def vDir = "${getdownArchiveDir}/${v}"
+ getdownFullArchiveDir = "${vDir}/getdown"
+ getdownVersionLaunchJvl = "${vDir}/jalview-${v}.jvl"
+
+ def vAltDir = "alt_${v}"
+ def archiveImagesDir = "${jalviewDir}/${channel_properties_dir}/old/images"
+
+ doFirst {
+ // cleanup old "old" dir
+ delete getdownArchiveDir
+
+ def getdownArchiveTxt = file("${getdownFullArchiveDir}/getdown.txt")
+ getdownArchiveTxt.getParentFile().mkdirs()
+ def getdownArchiveTextLines = []
+ def getdownFullArchiveAppBase = "${getdownArchiveAppBase}${getdownArchiveAppBase.endsWith("/")?"":"/"}${v}/getdown/"
+
+ // the libdir
+ copy {
+ from "${getdownAppBaseDir}/${getdownAppDistDir}"
+ into "${getdownFullArchiveDir}/${vAltDir}"
+ }
+
+ getdownTextLines.each { line ->
+ line = line.replaceAll("^(?<s>appbase\\s*=\\s*).*", '${s}'+getdownFullArchiveAppBase)
+ line = line.replaceAll("^(?<s>(resource|code)\\s*=\\s*)${getdownAppDistDir}/", '${s}'+vAltDir+"/")
+ line = line.replaceAll("^(?<s>ui.background_image\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_background.png")
+ line = line.replaceAll("^(?<s>ui.instant_background_image\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_background_initialising.png")
+ line = line.replaceAll("^(?<s>ui.error_background\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_background_error.png")
+ line = line.replaceAll("^(?<s>ui.progress_image\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_progress_bar.png")
+ // remove the existing resource = resource/ or bin/ lines
+ if (! line.matches("resource\\s*=\\s*(resource|bin)/.*")) {
+ getdownArchiveTextLines += line
+ }
+ }
+
+ // the resource dir -- add these files as resource lines in getdown.txt
+ copy {
+ from "${archiveImagesDir}"
+ into "${getdownFullArchiveDir}/${getdown_resource_dir}"
+ eachFile { file ->
+ getdownArchiveTextLines += "resource = ${getdown_resource_dir}/${file.getName()}"
+ }
+ }
+
+ getdownArchiveTxt.write(getdownArchiveTextLines.join("\n"))
+
+ def vLaunchJvl = file(getdownVersionLaunchJvl)
+ vLaunchJvl.getParentFile().mkdirs()
+ vLaunchJvl.write("appbase=${getdownFullArchiveAppBase}\n")
+ def vLaunchJvlPath = vLaunchJvl.toPath().toAbsolutePath()
+ def jvlLinkPath = file("${vDir}/jalview.jvl").toPath().toAbsolutePath()
+ // for some reason filepath.relativize(fileInSameDirPath) gives a path to "../" which is wrong
+ //java.nio.file.Files.createSymbolicLink(jvlLinkPath, jvlLinkPath.relativize(vLaunchJvlPath));
+ java.nio.file.Files.createSymbolicLink(jvlLinkPath, java.nio.file.Paths.get(".",vLaunchJvl.getName()));
+
+ // files going into the getdown files dir: getdown.txt, getdown-launcher.jar, channel-launch.jvl, build_properties
+ copy {
+ from getdownLauncher
+ from "${getdownAppBaseDir}/${getdownLaunchJvl}"
+ from "${getdownAppBaseDir}/${getdown_launcher_new}"
+ from "${getdownAppBaseDir}/${channel_props}"
+ if (file(getdownLauncher).getName() != getdown_launcher) {
+ rename(file(getdownLauncher).getName(), getdown_launcher)
+ }
+ into getdownFullArchiveDir
+ }
+
+ }
+}
+
+task getdownArchiveDigest(type: JavaExec) {
+ group = "distribution"
+ description = "Digest the getdown archive folder"
+
+ dependsOn getdownArchiveBuild
+
+ doFirst {
+ classpath = files(getdownLauncher)
+ args getdownFullArchiveDir
+ }
+ main = "com.threerings.getdown.tools.Digester"
+ inputs.dir(getdownFullArchiveDir)
+ outputs.file("${getdownFullArchiveDir}/digest2.txt")
+}
+
+task getdownArchive() {
+ group = "distribution"
+ description = "Build the website archive dir with getdown digest"
+
+ dependsOn getdownArchiveBuild
+ dependsOn getdownArchiveDigest
+}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
clean {
doFirst {
- delete getdownWebsiteDir
+ delete getdownAppBaseDir
delete getdownFilesDir
+ delete getdownArchiveDir
}
}
}
}
+ // disable install screen for OSX dmg (for 2.11.2.0)
+ install4jConfigXml.'**'.macosArchive.each { macosArchive ->
+ macosArchive.attributes().remove('executeSetupApp')
+ macosArchive.attributes().remove('setupAppId')
+ }
// turn off checksum creation for LOCAL channel
def e = install4jConfigXml.application[0]
- if (CHANNEL == "LOCAL") {
- e.'@createChecksums' = "false"
- } else {
- e.'@createChecksums' = "true"
- }
+ e.'@createChecksums' = string(install4jCheckSums)
// put file association actions where placeholder action is
def install4jFileAssociationsText = install4jFileAssociationsFile.text
}
}
- // remove the "Uninstall Old Jalview (optional)" symlink from DMG for non-release DS_Stores
- if (! (CHANNEL == "RELEASE" || CHANNEL == "TEST-RELEASE" ) ) {
- def symlink = install4jConfigXml.'**'.topLevelFiles.symlink.find { sl -> sl.'@name' == "Uninstall Old Jalview (optional).app" }
- symlink.parent().remove(symlink)
- }
-
// write install4j file
install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
}
}
}
+task cleanInstallersDataFiles {
+ def installersOutputTxt = file("${jalviewDir}/${install4jBuildDir}/output.txt")
+ def installersSha256 = file("${jalviewDir}/${install4jBuildDir}/sha256sums")
+ def hugoDataJsonFile = file("${jalviewDir}/${install4jBuildDir}/installers-${JALVIEW_VERSION_UNDERSCORES}.json")
+ doFirst {
+ delete installersOutputTxt
+ delete installersSha256
+ delete hugoDataJsonFile
+ }
+}
-task installers(type: com.install4j.gradle.Install4jTask) {
+task install4jDMGBackgroundImageCopy {
+ inputs.file "${install4jDMGBackgroundImageDir}/${install4jDMGBackgroundImageFile}"
+ outputs.dir "${install4jDMGBackgroundImageBuildDir}"
+ doFirst {
+ copy {
+ from(install4jDMGBackgroundImageDir) {
+ include(install4jDMGBackgroundImageFile)
+ }
+ into install4jDMGBackgroundImageBuildDir
+ }
+ }
+}
+
+task install4jDMGBackgroundImageProcess {
+ dependsOn install4jDMGBackgroundImageCopy
+
+ doFirst {
+ if (backgroundImageText) {
+ if (convertBinary == null) {
+ throw new StopExecutionException("No ImageMagick convert binary installed at '${convertBinaryExpectedLocation}'")
+ }
+ if (!project.hasProperty("install4j_background_image_text_suffix_cmd")) {
+ throw new StopExecutionException("No property 'install4j_background_image_text_suffix_cmd' defined. See channel_gradle.properties for channel ${CHANNEL}")
+ }
+ fileTree(dir: install4jDMGBackgroundImageBuildDir, include: "*.png").getFiles().each { file ->
+ exec {
+ executable convertBinary
+ args = [
+ file.getPath(),
+ '-font', install4j_background_image_text_font,
+ '-fill', install4j_background_image_text_colour,
+ '-draw', sprintf(install4j_background_image_text_suffix_cmd, channelSuffix),
+ '-draw', sprintf(install4j_background_image_text_commit_cmd, "git-commit: ${gitHash}"),
+ '-draw', sprintf(install4j_background_image_text_date_cmd, getDate("yyyy-MM-dd HH:mm:ss")),
+ file.getPath()
+ ]
+ }
+ }
+ }
+ }
+}
+
+task install4jDMGBackgroundImage {
+ dependsOn install4jDMGBackgroundImageProcess
+}
+
+task installerFiles(type: com.install4j.gradle.Install4jTask) {
group = "distribution"
description = "Create the install4j installers"
dependsOn getdown
dependsOn copyInstall4jTemplate
+ dependsOn cleanInstallersDataFiles
+ dependsOn install4jDMGBackgroundImage
projectFile = install4jConfFile
filesMd5 = filesMd5.substring(0,8)
}
def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
- // make install4jBuildDir relative to jalviewDir
- def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
variables = [
'JALVIEW_NAME': jalview_name,
- 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
+ 'JALVIEW_APPLICATION_NAME': applicationName,
'JALVIEW_DIR': "../..",
'OSX_KEYSTORE': OSX_KEYSTORE,
+ 'OSX_APPLEID': OSX_APPLEID,
+ 'OSX_ALTOOLPASS': OSX_ALTOOLPASS,
'JSIGN_SH': JSIGN_SH,
'JRE_DIR': getdown_app_dir_java,
'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
'BUNDLE_ID': install4jBundleId,
'INTERNAL_ID': install4jInternalId,
'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
- 'MACOS_DS_STORE': install4jDSStore,
- 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
+ 'MACOS_DMG_DS_STORE': install4jDMGDSStore,
+ 'MACOS_DMG_BG_IMAGE': "${install4jDMGBackgroundImageBuildDir}/${install4jDMGBackgroundImageFile}",
+ 'WRAPPER_LINK': getdownWrapperLink,
+ 'BASH_WRAPPER_SCRIPT': getdown_bash_wrapper_script,
+ 'POWERSHELL_WRAPPER_SCRIPT': getdown_powershell_wrapper_script,
+ 'WRAPPER_SCRIPT_BIN_DIR': getdown_wrapper_script_dir,
'INSTALLER_NAME': install4jInstallerName,
'INSTALL4J_UTILS_DIR': install4j_utils_dir,
- 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
+ 'GETDOWN_CHANNEL_DIR': getdownChannelDir,
'GETDOWN_FILES_DIR': getdown_files_dir,
'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
'GETDOWN_DIST_DIR': getdownAppDistDir,
'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
'EXECUTABLE_NAME': install4jExecutableName,
'EXTRA_SCHEME': install4jExtraScheme,
+ 'MAC_ICONS_FILE': install4jMacIconsFile,
+ 'WINDOWS_ICONS_FILE': install4jWindowsIconsFile,
+ 'PNG_ICON_FILE': install4jPngIconFile,
+ 'BACKGROUND': install4jBackground,
+
]
//println("INSTALL4J VARIABLES:")
if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
faster = true
disableSigning = true
+ disableNotarization = true
}
if (OSX_KEYPASS) {
macKeystorePassword = OSX_KEYPASS
+ }
+
+ if (OSX_ALTOOLPASS) {
+ appleIdPassword = OSX_ALTOOLPASS
+ disableNotarization = false
+ } else {
+ disableNotarization = true
}
doFirst {
println("Using projectFile "+projectFile)
+ if (!disableNotarization) { println("Will notarize OSX App DMG") }
}
+ //verbose=true
- inputs.dir(getdownWebsiteDir)
+ inputs.dir(getdownAppBaseDir)
inputs.file(install4jConfFile)
inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
inputs.dir(macosJavaVMDir)
outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
}
+def getDataHash(File myFile) {
+ HashCode hash = Files.asByteSource(myFile).hash(Hashing.sha256())
+ return myFile.exists()
+ ? [
+ "file" : myFile.getName(),
+ "filesize" : myFile.length(),
+ "sha256" : hash.toString()
+ ]
+ : null
+}
+
+def writeDataJsonFile(File installersOutputTxt, File installersSha256, File dataJsonFile) {
+ def hash = [
+ "channel" : getdownChannelName,
+ "date" : getDate("yyyy-MM-dd HH:mm:ss"),
+ "git-commit" : "${gitHash} [${gitBranch}]",
+ "version" : JALVIEW_VERSION
+ ]
+ // install4j installer files
+ if (installersOutputTxt.exists()) {
+ def idHash = [:]
+ installersOutputTxt.readLines().each { def line ->
+ if (line.startsWith("#")) {
+ return;
+ }
+ line.replaceAll("\n","")
+ def vals = line.split("\t")
+ def filename = vals[3]
+ def filesize = file(filename).length()
+ filename = filename.replaceAll(/^.*\//, "")
+ hash[vals[0]] = [ "id" : vals[0], "os" : vals[1], "name" : vals[2], "file" : filename, "filesize" : filesize ]
+ idHash."${filename}" = vals[0]
+ }
+ if (install4jCheckSums && installersSha256.exists()) {
+ installersSha256.readLines().each { def line ->
+ if (line.startsWith("#")) {
+ return;
+ }
+ line.replaceAll("\n","")
+ def vals = line.split(/\s+\*?/)
+ def filename = vals[1]
+ def innerHash = (hash.(idHash."${filename}"))."sha256" = vals[0]
+ }
+ }
+ }
+
+ [
+ "JAR": shadowJar.archiveFile, // executable JAR
+ "JVL": getdownVersionLaunchJvl, // version JVL
+ "SOURCE": sourceDist.archiveFile // source TGZ
+ ].each { key, value ->
+ def file = file(value)
+ if (file.exists()) {
+ def fileHash = getDataHash(file)
+ if (fileHash != null) {
+ hash."${key}" = fileHash;
+ }
+ }
+ }
+ return dataJsonFile.write(new JsonBuilder(hash).toPrettyString())
+}
+
+task staticMakeInstallersJsonFile {
+ doFirst {
+ def output = findProperty("i4j_output")
+ def sha256 = findProperty("i4j_sha256")
+ def json = findProperty("i4j_json")
+ if (output == null || sha256 == null || json == null) {
+ throw new GradleException("Must provide paths to all of output.txt, sha256sums, and output.json with '-Pi4j_output=... -Pi4j_sha256=... -Pi4j_json=...")
+ }
+ writeDataJsonFile(file(output), file(sha256), file(json))
+ }
+}
+
+task installers {
+ dependsOn installerFiles
+}
spotless {
java {
}
}
+task createSourceReleaseProperties(type: WriteProperties) {
+ group = "distribution"
+ description = "Create the source RELEASE properties file"
+
+ def sourceTarBuildDir = "${buildDir}/sourceTar"
+ def sourceReleasePropertiesFile = "${sourceTarBuildDir}/RELEASE"
+ outputFile (sourceReleasePropertiesFile)
+
+ doFirst {
+ releaseProps.each{ key, val -> property key, val }
+ property "git.branch", gitBranch
+ property "git.hash", gitHash
+ }
+
+ outputs.file(outputFile)
+}
task sourceDist(type: Tar) {
group "distribution"
description "Create a source .tar.gz file for distribution"
-
+
+ dependsOn createBuildProperties
dependsOn convertMdFiles
+ dependsOn eclipseAllPreferences
+ dependsOn createSourceReleaseProperties
- def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
- def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
- // cater for buildship < 3.1 [3.0.1 is max version in eclipse 2018-09]
- try {
- archiveFileName = outputFileName
- } catch (Exception e) {
- archiveName = outputFileName
- }
+
+ def outputFileName = "${project.name}_${JALVIEW_VERSION_UNDERSCORES}.tar.gz"
+ archiveFileName = outputFileName
compression Compression.GZIP
"*locales/**",
"utils/InstallAnywhere",
"**/*.log",
+ "RELEASE",
]
def PROCESS_FILES=[
"AUTHORS",
"FEATURETODO",
"LICENSE",
"**/README",
- "RELEASE",
"THIRDPARTYLIBS",
"TESTNG",
"build.gradle",
"**/*.sh",
]
def INCLUDE_FILES=[
- ".settings/org.eclipse.jdt.core.jalview.prefs",
+ ".classpath",
+ ".settings/org.eclipse.buildship.core.prefs",
+ ".settings/org.eclipse.jdt.core.prefs"
]
from(jalviewDir) {
exclude ("utils/InstallAnywhere")
exclude (getdown_files_dir)
- exclude (getdown_website_dir)
+ // getdown_website_dir and getdown_archive_dir moved to build/website/docroot/getdown
+ //exclude (getdown_website_dir)
+ //exclude (getdown_archive_dir)
// exluding these as not using jars as modules yet
exclude ("${j11modDir}/**/*.jar")
// exclude(EXCLUDE_FILES)
// exclude(PROCESS_FILES)
// }
+
+ from(file(buildProperties).getParent()) {
+ include(file(buildProperties).getName())
+ rename(file(buildProperties).getName(), "build_properties")
+ filter({ line ->
+ line.replaceAll("^INSTALLATION=.*\$","INSTALLATION=Source Release"+" git-commit\\\\:"+gitHash+" ["+gitBranch+"]")
+ })
+ }
+
+ def sourceTarBuildDir = "${buildDir}/sourceTar"
+ from(sourceTarBuildDir) {
+ // this includes the appended RELEASE properties file
+ }
}
+task dataInstallersJson {
+ group "website"
+ description "Create the installers-VERSION.json data file for installer files created"
+
+ mustRunAfter installers
+ mustRunAfter shadowJar
+ mustRunAfter sourceDist
+ mustRunAfter getdownArchive
+
+ def installersOutputTxt = file("${jalviewDir}/${install4jBuildDir}/output.txt")
+ def installersSha256 = file("${jalviewDir}/${install4jBuildDir}/sha256sums")
+
+ if (installersOutputTxt.exists()) {
+ inputs.file(installersOutputTxt)
+ }
+ if (install4jCheckSums && installersSha256.exists()) {
+ inputs.file(installersSha256)
+ }
+ [
+ shadowJar.archiveFile, // executable JAR
+ getdownVersionLaunchJvl, // version JVL
+ sourceDist.archiveFile // source TGZ
+ ].each { fileName ->
+ if (file(fileName).exists()) {
+ inputs.file(fileName)
+ }
+ }
+
+ outputs.file(hugoDataJsonFile)
+
+ doFirst {
+ writeDataJsonFile(installersOutputTxt, installersSha256, hugoDataJsonFile)
+ }
+}
task helppages {
+ group "help"
+ description "Copies all help pages to build dir. Runs ant task 'pubhtmlhelp'."
dependsOn copyHelp
dependsOn pubhtmlhelp
- inputs.dir("${classesDir}/${help_dir}")
+ inputs.dir("${helpBuildDir}/${help_dir}")
outputs.dir("${buildDir}/distributions/${help_dir}")
}
}
+task jalviewjsEnableAltFileProperty(type: WriteProperties) {
+ group "jalviewjs"
+ description "Enable the alternative J2S Config file for headless build"
+
+ outputFile = jalviewjsJ2sSettingsFileName
+ def j2sPropsFile = file(jalviewjsJ2sSettingsFileName)
+ def j2sProps = new Properties()
+ if (j2sPropsFile.exists()) {
+ try {
+ def j2sPropsFileFIS = new FileInputStream(j2sPropsFile)
+ j2sProps.load(j2sPropsFileFIS)
+ j2sPropsFileFIS.close()
+
+ j2sProps.each { prop, val ->
+ property(prop, val)
+ }
+ } catch (Exception e) {
+ println("Exception reading ${jalviewjsJ2sSettingsFileName}")
+ e.printStackTrace()
+ }
+ }
+ if (! j2sProps.stringPropertyNames().contains(jalviewjs_j2s_alt_file_property_config)) {
+ property(jalviewjs_j2s_alt_file_property_config, jalviewjs_j2s_alt_file_property)
+ }
+}
+
+
task jalviewjsSetEclipseWorkspace {
def propKey = "jalviewjs_eclipse_workspace"
def propVal = null
task jalviewjsCreateJ2sSettings(type: WriteProperties) {
group "JalviewJS"
- description "Create the .j2s file from the j2s.* properties"
+ description "Create the alternative j2s file from the j2s.* properties"
jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
def siteDirProperty = "j2s.site.directory"
property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
}
}
- outputFile = jalviewjsJ2sSettingsFileName
+ outputFile = jalviewjsJ2sAltSettingsFileName
if (! IN_ECLIPSE) {
inputs.properties(jalviewjsJ2sProps)
- outputs.file(jalviewjsJ2sSettingsFileName)
+ outputs.file(jalviewjsJ2sAltSettingsFileName)
}
}
preserve {
include "**"
}
+
+ // should this be exclude really ?
+ duplicatesStrategy "INCLUDE"
+
outputs.files outputFiles
inputs.files inputFiles
}
task jalviewjsSyncResources (type: Sync) {
- def inputFiles = fileTree(dir: resourceDir)
+ dependsOn buildResources
+
+ def inputFiles = fileTree(dir: resourcesBuildDir)
def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
from inputFiles
args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
if (!IN_ECLIPSE) {
args += [ "-D${j2sHeadlessBuildProperty}=true" ]
+ args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
}
inputs.file("${jalviewDir}/.project")
dependsOn jalviewjsEclipseSetup
dependsOn jalviewjsProjectImport
dependsOn jalviewjsEclipsePaths
+ if (!IN_ECLIPSE) {
+ dependsOn jalviewjsEnableAltFileProperty
+ }
doFirst {
// do not run a headless transpile when we claim to be in Eclipse
args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
if (!IN_ECLIPSE) {
args += [ "-D${j2sHeadlessBuildProperty}=true" ]
+ args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
}
def stdout
new org.apache.tools.ant.util.TeeOutputStream(
logOutFOS,
stdout),
- standardOutput)
+ System.out)
errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
new org.apache.tools.ant.util.TeeOutputStream(
logErrFOS,
stderr),
- errorOutput)
+ System.err)
} else {
standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
logOutFOS,
new org.apache.tools.ant.util.TeeOutputStream(
logErrFOS,
stderr),
- errorOutput)
+ System.err)
} else {
standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
logOutFOS,
description "Creates a tar.gz file for the website"
dependsOn jalviewjsBuildSite
def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
- try {
- archiveFileName = outputFilename
- } catch (Exception e) {
- archiveName = outputFilename
- }
+ archiveFileName = outputFilename
compression Compression.GZIP
def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
doLast {
- SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
+ def factory
+ try {
+ def f = Class.forName("org.gradle.plugins.javascript.envjs.http.simple.SimpleHttpFileServerFactory")
+ factory = f.newInstance()
+ } catch (ClassNotFoundException e) {
+ throw new GradleException("Unable to create SimpleHttpFileServerFactory")
+ }
def port = Integer.valueOf(jalviewjs_server_port)
def start = port
def running = false
if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
}
- delete "${jalviewDir}/${jalviewjs_j2s_settings}"
+ delete jalviewjsJ2sAltSettingsFileName
}
outputs.upToDateWhen( { false } )