X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=800fe42cdcd6ae4782642156fb8646c5e5cb020b;hb=f55d511de05a6b47542053778b19bc6c5dd40b4e;hp=679fb14d29d4939a5cd1983a5b474011ca2d1500;hpb=76d097b3838f90f842b90f3520d18fee0d86ac62;p=jalview.git diff --git a/build.gradle b/build.gradle index 679fb14..800fe42 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,10 @@ 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 java.util.concurrent.Executors +import java.util.concurrent.Future +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.TimeUnit import groovy.transform.ExternalizeMethods import groovy.util.XmlParser import groovy.xml.XmlUtil @@ -47,8 +51,8 @@ plugins { id 'java' id 'application' id 'eclipse' - id "com.diffplug.gradle.spotless" version "3.28.0" - id 'com.github.johnrengelman.shadow' version '4.0.3' + id "com.diffplug.spotless" version "6.18.0" //.gradle.spotless" "3.28.0" + id 'com.github.johnrengelman.shadow' version '8.1.1' // was 4.0.3 id 'com.install4j.gradle' version '10.0.3' id 'com.dorongold.task-tree' version '2.1.1' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree id 'com.palantir.git-version' version '0.13.0' apply false @@ -189,6 +193,7 @@ ext { testDir = string("${jalviewDir}/${bareTestSourceDir}") classesDir = string("${jalviewDir}/${classes_dir}") + destinationDirectory = file(classesDir) // clover useClover = clover.equals("true") @@ -574,7 +579,10 @@ ext { eclipseBinary = string("") eclipseVersion = string("") eclipseDebug = false - + + jalviewjsChromiumUserDir = "${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}" + jalviewjsChromiumProfileDir = "${ext.jalviewjsChromiumUserDir}/${jalviewjs_chromium_profile_name}" + // ENDEXT } @@ -583,14 +591,14 @@ sourceSets { main { java { srcDirs sourceDir - outputDir = file(classesDir) + destinationDirectory = file(classesDir) } resources { srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ] } - compileClasspath = files(sourceSets.main.java.outputDir) + compileClasspath = files(sourceSets.main.java.destinationDirectory) compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) runtimeClasspath = compileClasspath @@ -600,14 +608,14 @@ sourceSets { clover { java { srcDirs cloverInstrDir - outputDir = cloverClassesDir + destinationDirectory = cloverClassesDir } resources { srcDirs = sourceSets.main.resources.srcDirs } - compileClasspath = files( sourceSets.clover.java.outputDir ) + compileClasspath = files( sourceSets.clover.java.destinationDirectory ) //compileClasspath += files( testClassesDir ) compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"]) @@ -619,14 +627,14 @@ sourceSets { test { java { srcDirs testSourceDir - outputDir = file(testClassesDir) + destinationDirectory = file(testClassesDir) } resources { srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs } - compileClasspath = files( sourceSets.test.java.outputDir ) + compileClasspath = files( sourceSets.test.java.destinationDirectory ) compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"]) @@ -651,7 +659,7 @@ eclipse { } classpath { - //defaultOutputDir = sourceSets.main.java.outputDir + //defaultOutputDir = sourceSets.main.java.destinationDirectory configurations.each{ c-> if (c.isCanBeResolved()) { minusConfigurations += [c] @@ -690,7 +698,7 @@ eclipse { HashMap alreadyAddedLibPath = new HashMap<>(); sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any { - //don't want to add outputDir as eclipse is using its own output dir in bin/main + //don't want to add destinationDirectory as eclipse is using its own output dir in bin/main if (it.isDirectory() || ! it.exists()) { // don't add dirs to classpath, especially if they don't exist return false // groovy "continue" in .any closure @@ -710,7 +718,7 @@ eclipse { } sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any { - //no longer want to add outputDir as eclipse is using its own output dir in bin/main + //no longer want to add destinationDirectory as eclipse is using its own output dir in bin/main if (it.isDirectory() || ! it.exists()) { // don't add dirs to classpath return false // groovy "continue" in .any closure @@ -1087,7 +1095,7 @@ compileTestJava { clean { doFirst { - delete sourceSets.main.java.outputDir + delete sourceSets.main.java.destinationDirectory } } @@ -1095,7 +1103,7 @@ clean { cleanTest { dependsOn cleanClover doFirst { - delete sourceSets.test.java.outputDir + delete sourceSets.test.java.destinationDirectory } } @@ -1187,7 +1195,7 @@ def convertMdToHtml (FileTree mdFiles, File cssFile) { task copyDocs(type: Copy) { def inputDir = "${jalviewDir}/${doc_dir}" - def outputDir = "${docBuildDir}/${doc_dir}" + def destinationDirectory = "${docBuildDir}/${doc_dir}" from(inputDir) { include('**/*.txt') include('**/*.md') @@ -1208,10 +1216,10 @@ task copyDocs(type: Copy) { exclude('**/*.html') exclude('**/*.xml') } - into outputDir + into destinationDirectory inputs.dir(inputDir) - outputs.dir(outputDir) + outputs.dir(destinationDirectory) } @@ -1276,15 +1284,15 @@ def mdFileComponents(File mdFile, def dateOnly=false) { } if (inFrontMatter) { def m = null - if (m = line =~ /^date:\s*(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/) { + 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})/) { + } 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+)/) { + } else if (m == line =~ /^channel:\s*(\S+)/) { map["channel"] = m[0][1] - } else if (m = line =~ /^version:\s*(\S+)/) { + } else if (m == line =~ /^version:\s*(\S+)/) { map["version"] = m[0][1] - } else if (m = line =~ /^\s*([^:]+)\s*:\s*(\S.*)/) { + } else if (m == line =~ /^\s*([^:]+)\s*:\s*(\S.*)/) { map[ m[0][1] ] = m[0][2] } if (dateOnly && map["date"] != null) { @@ -1343,7 +1351,7 @@ task hugoTemplates { def inSection = false changes.eachLine { line -> def m = null - if (m = line =~ /^##([^#].*)$/) { + if (m == line =~ /^##([^#].*)$/) { if (inSection) { changesHugo += "\n\n" } @@ -1353,7 +1361,7 @@ task hugoTemplates { section = section.replaceAll(/[^a-z0-9_\-]/, "") changesHugo += "
\n\n" inSection = true - } else if (m = line =~ /^(\s*-\s*)(.*?)()?\s*$/) { + } else if (m == line =~ /^(\s*-\s*)(.*?)()?\s*$/) { def comment = m[0][2].trim() if (comment != "") { comment = comment.replaceAll('"', """) @@ -1423,7 +1431,7 @@ def getMdSections(String content) { def sectionName = null content.eachLine { line -> def m = null - if (m = line =~ /^##([^#].*)$/) { + if (m == line =~ /^##([^#].*)$/) { if (sectionName != null) { sections[sectionName] = sectionContent sectionName = null @@ -1446,7 +1454,7 @@ def getMdSections(String content) { task copyHelp(type: Copy) { def inputDir = helpSourceDir - def outputDir = "${helpBuildDir}/${help_dir}" + def destinationDirectory = "${helpBuildDir}/${help_dir}" from(inputDir) { include('**/*.txt') include('**/*.md') @@ -1471,14 +1479,15 @@ task copyHelp(type: Copy) { exclude('**/*.xml') exclude('**/*.jhm') } - into outputDir + into destinationDirectory inputs.dir(inputDir) outputs.files(helpFile) - outputs.dir(outputDir) + outputs.dir(destinationDirectory) } +/* task releasesTemplates { group "help" description "Recreate whatsNew.html and releases.html from markdown files and templates in help" @@ -1555,9 +1564,9 @@ task releasesTemplates { def lm = null def rContentProcessed = "" rContent.eachLine { line -> - if (lm = line =~ /^(\s*-)(\s*)(.*)$/) { + if (lm == line =~ /^(\s*-)(\s*)(.*)$/) { line = "${lm[0][1]}${lm[0][3]}${lm[0][2]}" - } else if (lm = line =~ /^###([^#]+.*)$/) { + } else if (lm == line =~ /^###([^#]+.*)$/) { line = "_${lm[0][1].trim()}_" } rContentProcessed += line + "\n" @@ -1615,13 +1624,14 @@ task releasesTemplates { 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 + def destinationDirectory = resourcesBuildDir from(inputDir) { include('**/*.txt') include('**/*.md') @@ -1642,10 +1652,10 @@ task copyResources(type: Copy) { exclude('**/*.html') exclude('**/*.xml') } - into outputDir + into destinationDirectory inputs.dir(inputDir) - outputs.dir(outputDir) + outputs.dir(destinationDirectory) } task copyChannelResources(type: Copy) { @@ -1654,7 +1664,7 @@ task copyChannelResources(type: Copy) { description = "Copy the channel resources dir to the build resources area" def inputDir = "${channelDir}/${resource_dir}" - def outputDir = resourcesBuildDir + def destinationDirectory = resourcesBuildDir from(inputDir) { include(channel_props) filter(ReplaceTokens, @@ -1668,14 +1678,15 @@ task copyChannelResources(type: Copy) { from(inputDir) { exclude(channel_props) } - into outputDir + into destinationDirectory inputs.dir(inputDir) - outputs.dir(outputDir) + outputs.dir(destinationDirectory) } task createBuildProperties(type: WriteProperties) { dependsOn copyResources + dependsOn copyChannelResources group = "build" description = "Create the ${buildProperties} file" @@ -1699,6 +1710,7 @@ task createBuildProperties(type: WriteProperties) { task buildIndices(type: JavaExec) { dependsOn copyHelp + //dependsOn releasesTemplates classpath = sourceSets.main.compileClasspath main = "com.sun.java.help.search.Indexer" workingDir = "${helpBuildDir}/${help_dir}" @@ -1726,18 +1738,25 @@ task prepare { dependsOn buildResources dependsOn copyDocs dependsOn copyHelp - dependsOn releasesTemplates + //dependsOn releasesTemplates dependsOn convertMdFiles dependsOn buildIndices } +// random block of dependencies compileJava.dependsOn prepare run.dependsOn compileJava -compileTestJava.dependsOn compileJava - - - +//run.dependsOn prepare +compileTestJava.dependsOn compileJava // +compileTestJava.dependsOn buildIndices // +processResources.dependsOn copyChannelResources // +processResources.dependsOn copyResources // +processResources.dependsOn createBuildProperties // +processResources.dependsOn copyDocs // +processResources.dependsOn convertMdFiles // +processResources.dependsOn copyHelp // +processResources.dependsOn buildIndices // test { group = "Verification" description = "Runs all testTaskN tasks)" @@ -1998,6 +2017,7 @@ private static void printResults(allResults) { /* END of test tasks results summary */ +/* task compileLinkCheck(type: JavaCompile) { options.fork = true classpath = files("${jalviewDir}/${utils_dir}") @@ -2032,6 +2052,7 @@ task linkCheck(type: JavaExec) { inputs.dir(helpBuildDir) outputs.file(helpLinksCheckerOutFile) } +*/ // import the pubhtmlhelp target @@ -2046,10 +2067,14 @@ task cleanPackageDir(type: Delete) { } } +// block of dependencies +//compileTestJava.dependsOn compileLinkCheck // +//copyChannelResources.dependsOn compileLinkCheck // +//convertMdFiles.dependsOn compileLinkCheck // jar { dependsOn prepare - dependsOn linkCheck + dependsOn //linkCheck manifest { attributes "Main-Class": main_class, @@ -2059,8 +2084,8 @@ jar { "Implementation-Version": JALVIEW_VERSION } - def outputDir = "${jalviewDir}/${package_dir}" - destinationDirectory = file(outputDir) + def destinationDirectory = "${jalviewDir}/${package_dir}" + destinationDirectory = file(destinationDirectory) archiveFileName = rootProject.name+".jar" duplicatesStrategy "EXCLUDE" @@ -2071,11 +2096,11 @@ jar { exclude "**/*.jar" exclude "**/*.jar.*" - inputs.dir(sourceSets.main.java.outputDir) + inputs.dir(sourceSets.main.java.destinationDirectory) sourceSets.main.resources.srcDirs.each{ dir -> inputs.dir(dir) } - outputs.file("${outputDir}/${archiveFileName}") + outputs.file("${destinationDirectory}/${archiveFileName}") } @@ -2134,7 +2159,7 @@ shadowJar { mainClassName = shadow_jar_main_class mergeServiceFiles() - classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION + archiveClassifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION minimize() } @@ -3305,10 +3330,10 @@ task jalviewjsEclipseCopyDropins(type: Copy) { def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar") inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}") - def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" from inputFiles - into outputDir + into destinationDirectory } @@ -3416,13 +3441,13 @@ task jalviewjsSyncAllLibs (type: Sync) { dependsOn jalviewjsTransferUnzipAllLibs def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}") inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}") - def outputDir = "${jalviewDir}/${jalviewjsSiteDir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsSiteDir}" from inputFiles - into outputDir + into destinationDirectory def outputFiles = [] rename { filename -> - outputFiles += "${outputDir}/${filename}" + outputFiles += "${destinationDirectory}/${filename}" null } preserve { @@ -3441,13 +3466,13 @@ task jalviewjsSyncResources (type: Sync) { dependsOn buildResources def inputFiles = fileTree(dir: resourcesBuildDir) - def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}" from inputFiles - into outputDir + into destinationDirectory def outputFiles = [] rename { filename -> - outputFiles += "${outputDir}/${filename}" + outputFiles += "${destinationDirectory}/${filename}" null } preserve { @@ -3460,13 +3485,13 @@ task jalviewjsSyncResources (type: Sync) { task jalviewjsSyncSiteResources (type: Sync) { def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}") - def outputDir = "${jalviewDir}/${jalviewjsSiteDir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsSiteDir}" from inputFiles - into outputDir + into destinationDirectory def outputFiles = [] rename { filename -> - outputFiles += "${outputDir}/${filename}" + outputFiles += "${destinationDirectory}/${filename}" null } preserve { @@ -3480,13 +3505,13 @@ task jalviewjsSyncSiteResources (type: Sync) { task jalviewjsSyncBuildProperties (type: Sync) { dependsOn createBuildProperties def inputFiles = [file(buildProperties)] - def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}" from inputFiles - into outputDir + into destinationDirectory def outputFiles = [] rename { filename -> - outputFiles += "${outputDir}/${filename}" + outputFiles += "${destinationDirectory}/${filename}" null } preserve { @@ -3705,7 +3730,7 @@ task jalviewjsBuildAllCores { def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}" def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}" def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}" - def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core" + def destinationDirectory = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core" def prefixFile = "${jsDir}/core/coretop2.js" def suffixFile = "${jsDir}/core/corebottom2.js" @@ -3749,8 +3774,8 @@ task jalviewjsBuildAllCores { } def list = fileTree(dir: j2sDir, includes: filelist) - def jsfile = "${outputDir}/core${name}.js" - def zjsfile = "${outputDir}/core${name}.z.js" + def jsfile = "${destinationDirectory}/core${name}.js" + def zjsfile = "${destinationDirectory}/core${name}.z.js" jalviewjsCoreClasslists += [ 'jsfile': jsfile, @@ -3768,8 +3793,8 @@ task jalviewjsBuildAllCores { // _stevesoft core. add any cores without a classlist here (and the inputs and outputs) def stevesoftClasslistName = "_stevesoft" def stevesoftClasslist = [ - 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js", - 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js", + 'jsfile': "${destinationDirectory}/core${stevesoftClasslistName}.js", + 'zjsfile': "${destinationDirectory}/core${stevesoftClasslistName}.z.js", 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"), 'name': stevesoftClasslistName ] @@ -3802,8 +3827,8 @@ task jalviewjsBuildAllCores { ] ) def allClasslist = [ - 'jsfile': "${outputDir}/core${allClasslistName}.js", - 'zjsfile': "${outputDir}/core${allClasslistName}.z.js", + 'jsfile': "${destinationDirectory}/core${allClasslistName}.js", + 'zjsfile': "${destinationDirectory}/core${allClasslistName}.z.js", 'list': allJsFiles, 'name': allClasslistName ] @@ -3856,11 +3881,11 @@ task jalviewjsPublishCoreTemplates { dependsOn jalviewjsBuildAllCores def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}" def inputFile = file(inputFileName) - def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}" def outputFiles = [] jalviewjsCoreClasslists.each { cl -> - def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html" + def outputFile = "${destinationDirectory}/${jalviewjsJalviewTemplateName}_${cl.name}.html" cl['outputfile'] = outputFile outputFiles += outputFile } @@ -3879,13 +3904,13 @@ task jalviewjsSyncCore (type: Sync) { dependsOn jalviewjsBuildAllCores dependsOn jalviewjsPublishCoreTemplates def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}") - def outputDir = "${jalviewDir}/${jalviewjsSiteDir}" + def destinationDirectory = "${jalviewDir}/${jalviewjsSiteDir}" from inputFiles - into outputDir + into destinationDirectory def outputFiles = [] rename { filename -> - outputFiles += "${outputDir}/${filename}" + outputFiles += "${destinationDirectory}/${filename}" null } preserve { @@ -4203,13 +4228,6 @@ task eclipseAutoBuildTask { } -task jalviewjs { - group "JalviewJS" - description "Build the site" - dependsOn jalviewjsBuildSite -} - - task jalviewjsCopyStderrLaunchFile(type: Copy) { from file(jalviewjs_stderr_launch) into jalviewjsSiteDir @@ -4218,26 +4236,37 @@ task jalviewjsCopyStderrLaunchFile(type: Copy) { outputs.file jalviewjsStderrLaunchFilename } +task cleanJalviewjsChromiumUserDir { + doFirst { + delete jalviewjsChromiumUserDir + } + outputs.dir jalviewjsChromiumUserDir + // always run when depended on + outputs.upToDateWhen { !file(jalviewjsChromiumUserDir).exists() } +} + task jalviewjsChromiumProfile { - def profileDir = "${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}/${jalviewjs_chromium_profile_name}" - def firstRun = file("${profileDir}/First Run") + dependsOn cleanJalviewjsChromiumUserDir + mustRunAfter cleanJalviewjsChromiumUserDir + + def firstRun = file("${jalviewjsChromiumUserDir}/First Run") doFirst { - mkdir profileDir + mkdir jalviewjsChromiumProfileDir firstRun.text = "" } - outputs.file firstRun } -task jalviewjsLaunchTest(type: Exec) { +task jalviewjsLaunchTest { group "Test" description "Check JalviewJS opens in a browser" dependsOn jalviewjsBuildSite dependsOn jalviewjsCopyStderrLaunchFile dependsOn jalviewjsChromiumProfile - def chromiumBinary = jalviewjs_chromium_binary + def macOS = OperatingSystem.current().isMacOsX() + def chromiumBinary = macOS ? jalviewjs_macos_chromium_binary : jalviewjs_chromium_binary if (chromiumBinary.startsWith("~/")) { chromiumBinary = System.getProperty("user.home") + chromiumBinary.substring(1) } @@ -4245,39 +4274,91 @@ task jalviewjsLaunchTest(type: Exec) { def stdout def stderr doFirst { - def exec = file(chromiumBinary) - if (!exec.exists()) { - throw new GradleException("Could not find chromium binary '${chromiumBinary}'. Cannot run task ${name}.") - } + def timeoutms = Integer.valueOf(jalviewjs_chromium_overall_timeout) * 1000 + def binary = file(chromiumBinary) + if (!binary.exists()) { + throw new StopExecutionException("Could not find chromium binary '${chromiumBinary}'. Cannot run task ${name}.") + } stdout = new ByteArrayOutputStream() stderr = new ByteArrayOutputStream() + def execStdout + def execStderr if (jalviewjs_j2s_to_console.equals("true")) { - standardOutput = new org.apache.tools.ant.util.TeeOutputStream( + execStdout = new org.apache.tools.ant.util.TeeOutputStream( stdout, System.out) - errorOutput = new org.apache.tools.ant.util.TeeOutputStream( + execStderr = new org.apache.tools.ant.util.TeeOutputStream( stderr, System.err) } else { - standardOutput = stdout - errorOutput = stderr + execStdout = stdout + execStderr = stderr } - } + def execArgs = [ + "--no-sandbox", // --no-sandbox IS USED BY THE THORIUM APPIMAGE ON THE BUILDSERVER + "--headless=new", + "--disable-gpu", + "--timeout=${timeoutms}", + "--virtual-time-budget=${timeoutms}", + "--user-data-dir=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}", + "--profile-directory=${jalviewjs_chromium_profile_name}", + "--allow-file-access-from-files", + "--enable-logging=stderr", + "file://${jalviewDirAbsolutePath}/${jalviewjsStderrLaunchFilename}" + ] + + if (true || macOS) { + ScheduledExecutorService executor = Executors.newScheduledThreadPool(3); + Future f1 = executor.submit( + () -> { + exec { + standardOutput = execStdout + errorOutput = execStderr + executable(chromiumBinary) + args(execArgs) + println "COMMAND: '"+commandLine.join(" ")+"'" + } + executor.shutdownNow() + } + ) - executable(chromiumBinary) - args([ - "--no-sandbox", - "--disable-gpu", - "--headless=new", - "--timeout=60000", - "--virtual-time-budget=60000", - "--user-data-dir=${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}", - "--profile-directory=${jalviewjs_chromium_profile_name}", - "--allow-file-access-from-files", - "--enable-logging=stderr", - jalviewjsStderrLaunchFilename - ]) + def noChangeBytes = 0 + def noChangeIterations = 0 + executor.scheduleAtFixedRate( + () -> { + String stderrString = stderr.toString() + // shutdown the task if we have a success string + if (stderrString.contains(jalviewjs_desktop_init_string)) { + f1.cancel() + Thread.sleep(1000) + executor.shutdownNow() + } + // if no change in stderr for 10s then also end + if (noChangeIterations >= jalviewjs_chromium_idle_timeout) { + executor.shutdownNow() + } + if (stderrString.length() == noChangeBytes) { + noChangeIterations++ + } else { + noChangeBytes = stderrString.length() + noChangeIterations = 0 + } + }, + 1, 1, TimeUnit.SECONDS) + + executor.schedule(new Runnable(){ + public void run(){ + f1.cancel() + executor.shutdownNow() + } + }, timeoutms, TimeUnit.MILLISECONDS) + + executor.awaitTermination(timeoutms+10000, TimeUnit.MILLISECONDS) + executor.shutdownNow() + } + + } doLast { def found = false @@ -4291,5 +4372,13 @@ task jalviewjsLaunchTest(type: Exec) { if (!found) { throw new GradleException("Could not find evidence of Desktop launch in JalviewJS.") } - } + } +} + + +task jalviewjs { + group "JalviewJS" + description "Build the JalviewJS site and run the launch test" + dependsOn jalviewjsBuildSite + dependsOn jalviewjsLaunchTest }