X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=1cccc682efca2f76cbd49541334eeab3aa790d99;hb=refs%2Fheads%2Fstory%2FJAL-3588_Examples_folder_in_macOS_DMG_Finder_window;hp=2b9cf4e54b7e045746ea4d2ecf4a753307619a3f;hpb=52b853bb28c1d410230b2044e50816362dc352c9;p=jalview.git diff --git a/build.gradle b/build.gradle index 2b9cf4e..1cccc68 100644 --- a/build.gradle +++ b/build.gradle @@ -46,11 +46,21 @@ ext { jalviewDirRelativePath = jalviewDir // local build environment properties - def localProps = "${jalviewDirAbsolutePath}/local.properties" + // can be "projectDir/local.properties" + def localProps = "${projectDir}/local.properties" + def propsFile = null; if (file(localProps).exists()) { + propsFile = localProps + } + // or "../projectDir_local.properties" + def dirLocalProps = projectDir.getParent() + "/" + projectDir.getName() + "_local.properties" + if (file(dirLocalProps).exists()) { + propsFile = dirLocalProps + } + if (propsFile != null) { try { def p = new Properties() - def localPropsFIS = new FileInputStream(localProps) + def localPropsFIS = new FileInputStream(propsFile) p.load(localPropsFIS) localPropsFIS.close() p.each { @@ -58,9 +68,9 @@ ext { def oldval = findProperty(key) setProperty(key, val) if (oldval != null) { - println("Overriding property '${key}' ('${oldval}') with local.properties value '${val}'") + println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'") } else { - println("Setting unknown property '${key}' with local.properties value '${val}'") + println("Setting unknown property '${key}' with ${file(propsFile).getName()}s value '${val}'") } } } catch (Exception e) { @@ -126,8 +136,14 @@ ext { getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}") getdownAppDistDir = getdown_app_dir_alt buildProperties = string("${classesDir}/${build_properties_file}") - reportRsyncCmd = false + 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" + install4jInstallerName = "${jalview_name} Non-Release Installer" + install4jExecutableName = jalview_name.replaceAll("[^\\w]+", "_").toLowerCase() + install4jExtraScheme = "jalviewx" switch (CHANNEL) { case "BUILD": @@ -140,11 +156,16 @@ ext { if ("".equals(testngExcludedGroups)) { testngExcludedGroups = "Not-bamboo" } + install4jExtraScheme = "jalviewb" break case "RELEASE": getdownAppDistDir = getdown_app_dir_release reportRsyncCommand = true + install4jSuffix = "" + install4jDSStore = "DS_Store" + install4jDMGBackgroundImage = "jalview_dmg_background.png" + install4jInstallerName = "${jalview_name} Installer" break case "ARCHIVE": @@ -159,6 +180,7 @@ ext { buildDist = false } reportRsyncCommand = true + install4jExtraScheme = "jalviewa" break case "ARCHIVELOCAL": @@ -174,14 +196,26 @@ ext { } reportRsyncCommand = true getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") + install4jSuffix = "Archive" + install4jExtraScheme = "jalviewa" break case "DEVELOP": reportRsyncCommand = true + install4jDSStore = "DS_Store-DEVELOP" + install4jDMGBackgroundImage = "jalview_dmg_background-DEVELOP.png" + install4jExtraScheme = "jalviewd" + install4jInstallerName = "${jalview_name} Develop Installer" break case "TEST-RELEASE": reportRsyncCommand = true + JALVIEW_VERSION = "TEST" + install4jSuffix = "Test" + install4jDSStore = "DS_Store-TEST-RELEASE" + install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png" + install4jExtraScheme = "jalviewt" + install4jInstallerName = "${jalview_name} Test Installer" break case ~/^SCRATCH(|-[-\w]*)$/: @@ -189,6 +223,7 @@ ext { getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") getdownAppBase = string("${getdown_channel_base}/${getdownDir}") reportRsyncCommand = true + install4jSuffix = "Scratch" break case "TEST-LOCAL": @@ -198,11 +233,18 @@ ext { getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString() getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") } + JALVIEW_VERSION = "TEST" + install4jSuffix = "Test-Local" + install4jDSStore = "DS_Store-TEST-RELEASE" + install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png" + install4jExtraScheme = "jalviewt" + install4jInstallerName = "${jalview_name} Test Installer" break case "LOCAL": getdownAppBase = file(getdownWebsiteDir).toURI().toString() getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") + install4jExtraScheme = "jalviewl" break default: // something wrong specified @@ -216,7 +258,37 @@ ext { println("Overriding getdown appbase with '${getdownAppBase}'") } // sanitise file name for jalview launcher file for this channel - jvlChannelName = jvlChannelName.replaceAll(/[^\w\-]/,"_") + 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}" + 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 + def idsplitreverse = id.split("-").reverse() + idsplitreverse[0] = idsplitreverse[0].toInteger() + install4jSuffix.hashCode() + install4jWinApplicationId = idsplitreverse.reverse().join("-") + } + // sanitise folder and id names + // install4jApplicationFolder = e.g. "Jalview Build" + install4jApplicationFolder = install4jApplicationName + .replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \ + .replaceAll("_+", "_") // collapse __ + install4jInternalId = install4jApplicationName + .replaceAll(" ","_") + .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.] + .replaceAll("_+", "") // collapse __ + //.replaceAll("_*-_*", "-") // collapse _-_ + install4jUnixApplicationFolder = install4jApplicationName + .replaceAll(" ","_") + .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.] + .replaceAll("_+", "_") // collapse __ + .replaceAll("_*-_*", "-") // collapse _-_ + .toLowerCase() getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}") //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}" @@ -1035,7 +1107,7 @@ task getdownWebsite() { } getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}" - // go through properties looking for getdown_txt_... + // set some getdown_txt_ properties then go through all properties looking for getdown_txt_... def props = project.properties.sort { it.key } if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) { props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion) @@ -1047,7 +1119,11 @@ task getdownWebsite() { props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation) } - props.put("getdown_txt_appbase", getdownAppBase) + props.put("getdown_txt_title", jalview_name) + props.put("getdown_txt_ui.name", install4jApplicationName) + + // start with appbase + getdownTextString += "appbase = ${getdownAppBase}\n" props.each{ prop, val -> if (prop.startsWith("getdown_txt_") && val != null) { if (prop.startsWith("getdown_txt_multi_")) { @@ -1136,7 +1212,7 @@ task getdownWebsite() { def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl" def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}") - launchJvl.write("appbase="+props.get("getdown_txt_appbase")) + launchJvl.write("appbase=${getdownAppBase}") copy { from getdownLauncher @@ -1274,6 +1350,7 @@ task copyInstall4jTemplate { def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}") inputs.file(install4jTemplateFile) inputs.file(install4jFileAssociationsFile) + inputs.property("CHANNEL", { CHANNEL }) outputs.file(install4jConfFile) doLast { @@ -1297,14 +1374,29 @@ task copyInstall4jTemplate { e.'@createChecksums' = "true" } + // find largest @id value + def maxId = 0 + /* NOT WORKING + install4jConfigXml.'**'.each { element -> + if ( element.'@id' != null && element.'@id'.toInteger() > maxId ) { + maxId = element.'@id'.toInteger() + } + } + */ + maxId = 10000 + def idCount = maxId + 1 + // put file association actions where placeholder action is def install4jFileAssociationsText = install4jFileAssociationsFile.text def fileAssociationActions = new XmlParser().parseText("${install4jFileAssociationsText}") - install4jConfigXml.'**'.action.any { a -> + install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') { def parent = a.parent() parent.remove(a) fileAssociationActions.each { faa -> + if ( faa.'@id' != null ) { + faa.'@id' = idCount++ + } parent.append(faa) } // don't need to continue in .any loop once replacements have been made @@ -1312,6 +1404,57 @@ task copyInstall4jTemplate { } } + // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else + // NB we're deleting the /other/ one! + // Also remove the examples subdir from non-release versions + def customizedIdToDelete = "PROGRAM_GROUP_RELEASE" + def macosArchive = install4jConfigXml.'**'.macosArchive.find { ma -> ma.'@customizedId' == "MACOS_DISK_IMAGE" } + def examplesFolderPlaceholder = macosArchive.topLevelFiles.file.find { f -> f.'@file' == "EXAMPLES_FOLDER_PLACEHOLDER" } + if (CHANNEL=="RELEASE") { + customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE" + + // add all of examples folder + def tlf = examplesFolderPlaceholder.parent() + tlf.remove(examplesFolderPlaceholder) + def examplesFiles = fileTree(file(examples_dir)).findAll { f -> f.isFile() } + examplesFiles.each { f -> + def relativeFile = file(examples_dir).toPath().relativize(f.toPath()) + tlf.append( new XmlParser().parseText( + "" + ) ) + } + // let's see if we can add the snazzy Jalview Folder icon and Volume icon. Note the weird filename + tlf.append( new XmlParser().parseText( + "" + ) ) + tlf.append( new XmlParser().parseText( + "" + ) ) + + } else { + // remove the examples subdir from Full File Set + def files = install4jConfigXml.files[0] + def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" } + def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' } + def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' } + def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" } + dirEntry.parent().remove(dirEntry) + // remove Examples folder from DMG + examplesFolderPlaceholder.parent().remove(examplesFolderPlaceholder) + } + install4jConfigXml.'**'.action.any { a -> + if (a.'@customizedId' == customizedIdToDelete) { + a.parent().remove(a) + return true + } + } + + // 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) } @@ -1349,7 +1492,8 @@ task installers(type: com.install4j.gradle.Install4jTask) { def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}" variables = [ - 'JALVIEW_NAME': getdown_txt_title, + 'JALVIEW_NAME': jalview_name, + 'JALVIEW_APPLICATION_NAME': install4jApplicationName, 'JALVIEW_DIR': "../..", 'OSX_KEYSTORE': OSX_KEYSTORE, 'JSIGN_SH': JSIGN_SH, @@ -1368,8 +1512,13 @@ task installers(type: com.install4j.gradle.Install4jTask) { 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz, 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz, 'COPYRIGHT_MESSAGE': install4j_copyright_message, - 'MACOS_BUNDLE_ID': install4j_macOS_bundle_id, - 'INSTALLER_NAME': install4j_installer_name, + 'BUNDLE_ID': install4jBundleId, + 'INTERNAL_ID': install4jInternalId, + 'WINDOWS_APPLICATION_ID': install4jWinApplicationId, + 'MACOS_DS_STORE': install4jDSStore, + 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage, + 'EXAMPLES_FOLDER': install4j_examples_folder, + 'INSTALLER_NAME': install4jInstallerName, 'INSTALL4J_UTILS_DIR': install4j_utils_dir, 'GETDOWN_WEBSITE_DIR': getdown_website_dir, 'GETDOWN_FILES_DIR': getdown_files_dir, @@ -1379,8 +1528,16 @@ task installers(type: com.install4j.gradle.Install4jTask) { 'GETDOWN_INSTALL_DIR': getdown_install_dir, 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations, 'BUILD_DIR': install4jBuildDir, + 'APPLICATION_CATEGORIES': install4j_application_categories, + 'APPLICATION_FOLDER': install4jApplicationFolder, + 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder, + 'EXECUTABLE_NAME': install4jExecutableName, + 'EXTRA_SCHEME': install4jExtraScheme, ] + //println("INSTALL4J VARIABLES:") + //variables.each{k,v->println("${k}=${v}")} + destination = "${jalviewDir}/${install4jBuildDir}" buildSelected = true