JAL-4111 Use ImageMagick to add commit and build time text to DMG and getdown splash...
authorBen Soares <b.soares@dundee.ac.uk>
Thu, 5 Jan 2023 20:07:00 +0000 (20:07 +0000)
committerBen Soares <b.soares@dundee.ac.uk>
Thu, 5 Jan 2023 20:07:00 +0000 (20:07 +0000)
build.gradle
gradle.properties
utils/channels/develop-SUFFIX/channel_gradle.properties
utils/fonts/FiraSans-Regular.otf [new file with mode: 0755]
utils/fonts/Roboto.ttf [new file with mode: 0644]

index e6b7e33..9b2fe27 100644 (file)
@@ -38,6 +38,7 @@ buildscript {
   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"
   }
 }
 
@@ -113,7 +114,6 @@ ext {
   // Import channel_properties
   if (getdownChannelName.startsWith("develop-")) {
     channelDirName = "develop-SUFFIX"
-    println("SET propertiesChannelName to '${propertiesChannelName}'")
   }
   channelDir = string("${jalviewDir}/${channel_properties_dir}/${channelDirName}")
   channelGradleProperties = string("${channelDir}/channel_gradle.properties")
@@ -204,7 +204,8 @@ ext {
   testSourceDir = useClover ? cloverTestInstrDir : testDir
   testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
 
-  channelSuffix = null
+  channelSuffix = ""
+  backgroundImageText = false
   getdownChannelDir = string("${getdown_website_dir}/${propertiesChannelName}")
   getdownAppBaseDir = string("${jalviewDir}/${getdownChannelDir}/${JAVA_VERSION}")
   getdownArchiveDir = string("${jalviewDir}/${getdown_archive_dir}")
@@ -222,12 +223,15 @@ ext {
   getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
   getdownAppDistDir = getdown_app_dir_alt
   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
   install4jDMGDSStore = "${install4j_images_dir}/${install4j_dmg_ds_store}"
-  install4jDMGBackgroundImage = "${install4j_images_dir}/${install4j_dmg_background}"
+  install4jDMGBackgroundImageDir = "${install4j_images_dir}"
+  install4jDMGBackgroundImageBuildDir = "build/imagemagick/install4j"
+  install4jDMGBackgroundImageFile = "${install4j_dmg_background}"
   install4jInstallerName = "${jalview_name} Non-Release Installer"
   install4jExecutableName = install4j_executable_name
   install4jExtraScheme = "jalviewx"
@@ -308,6 +312,7 @@ ext {
     getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
     getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
     channelSuffix = string(suffix)
+    backgroundImageText = true
     break
 
     case "DEVELOP":
@@ -537,6 +542,14 @@ ext {
   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")
@@ -1906,10 +1919,59 @@ shadowJar {
   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()
+          ]
+println("CMD=${commandLine}")
+        }
+      }
+    }
+  }
+}
+
+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
   }
@@ -1954,13 +2016,13 @@ task getdownWebsite() {
     if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
       props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
     }
-    if (getdownImagesDir != null && file(getdownImagesDir).exists()) {
-      props.put("getdown_txt_ui.background_image", "${getdownImagesDir}/${getdown_background_image}")
-      props.put("getdown_txt_ui.instant_background_image", "${getdownImagesDir}/${getdown_instant_background_image}")
-      props.put("getdown_txt_ui.error_background", "${getdownImagesDir}/${getdown_error_background}")
-      props.put("getdown_txt_ui.progress_image", "${getdownImagesDir}/${getdown_progress_image}")
-      props.put("getdown_txt_ui.icon", "${getdownImagesDir}/${getdown_icon}")
-      props.put("getdown_txt_ui.mac_dock_icon", "${getdownImagesDir}/${getdown_mac_dock_icon}")
+    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)
@@ -2416,12 +2478,59 @@ task cleanInstallersDataFiles {
   }
 }
 
+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
 
@@ -2464,7 +2573,7 @@ task installerFiles(type: com.install4j.gradle.Install4jTask) {
     'INTERNAL_ID': install4jInternalId,
     'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
     'MACOS_DMG_DS_STORE': install4jDMGDSStore,
-    'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
+    'MACOS_DMG_BG_IMAGE': "${install4jDMGBackgroundImageBuildDir}/${install4jDMGBackgroundImageFile}",
     'WRAPPER_LINK': getdownWrapperLink,
     'BASH_WRAPPER_SCRIPT': getdown_bash_wrapper_script,
     'POWERSHELL_WRAPPER_SCRIPT': getdown_powershell_wrapper_script,
index acb65e9..e84802f 100644 (file)
@@ -172,6 +172,8 @@ getdown_rsync_dest = /Volumes/jalview/docroot/getdown
 reportRsyncCommand =
 RUNRSYNC=false
 
+imagemagick_convert = ~/buildtools/imagemagick/bin/convert
+
 bamboo_channelbase = https://builds.jalview.org/browse
 bamboo_planKey = 
 bamboo_getdown_channel_suffix = /latest/artifact/shared/getdown-channel
index 6e239c4..d98d91b 100644 (file)
@@ -30,3 +30,16 @@ install4j_png_icon_file = jalview_develop_logo.png
 install4j_background = jalview_develop_logo_background_fade-640x480.png
 install4j_dmg_background = jalview_develop_dmg_background-72dpi.png
 install4j_dmg_ds_store = jalview_develop_dmg_DS_Store
+
+getdown_background_image_text_font = utils/fonts/Roboto.ttf
+getdown_background_image_text_colour = #b4b4b4
+getdown_background_image_text_suffix_cmd = scale 4,4 text 102,36.3 '%s'
+getdown_background_image_text_commit_cmd = text 408,168 '%s'
+getdown_background_image_text_date_cmd = text 408,188 '%s'
+
+install4j_background_image_text_font = utils/fonts/Roboto.ttf
+install4j_background_image_text_colour = #b4b4b4
+install4j_background_image_text_suffix_cmd = scale 2.4,2.4 text 81,91 '%s'
+install4j_background_image_text_commit_cmd = text 18,250 '%s'
+install4j_background_image_text_date_cmd = text 18,270 '%s'
+
diff --git a/utils/fonts/FiraSans-Regular.otf b/utils/fonts/FiraSans-Regular.otf
new file mode 100755 (executable)
index 0000000..fad0098
Binary files /dev/null and b/utils/fonts/FiraSans-Regular.otf differ
diff --git a/utils/fonts/Roboto.ttf b/utils/fonts/Roboto.ttf
new file mode 100644 (file)
index 0000000..0a1657d
Binary files /dev/null and b/utils/fonts/Roboto.ttf differ