X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=0be087f0e18c3883ef9f7e18e1732aaf87d396ec;hb=b89316fdd962c0167820a469d830cfe986d84753;hp=985cc87d1fc549ea16cb561d9a60409f9517e17a;hpb=439d89cfdb49de11de73e31b2604672edcc5a45d;p=jalview.git diff --git a/build.gradle b/build.gradle index 985cc87..0be087f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,6 @@ +/* Convention for properties. Read from gradle.properties, use lower_case_underlines for property names. + * For properties set within build.gradle, use camelCaseNoSpace. + */ import org.apache.tools.ant.filters.ReplaceTokens import org.gradle.internal.os.OperatingSystem import org.gradle.plugins.ide.internal.generator.PropertiesPersistableConfigurationObject @@ -9,7 +12,16 @@ import java.security.MessageDigest import groovy.transform.ExternalizeMethods import groovy.util.XmlParser import groovy.xml.XmlUtil - +import com.vladsch.flexmark.util.ast.Node +import com.vladsch.flexmark.html.HtmlRenderer +import com.vladsch.flexmark.parser.Parser +import com.vladsch.flexmark.util.data.MutableDataSet +import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension +import com.vladsch.flexmark.ext.tables.TablesExtension +import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension +import com.vladsch.flexmark.ext.autolink.AutolinkExtension +import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension +import com.vladsch.flexmark.ext.toc.TocExtension buildscript { repositories { @@ -17,7 +29,7 @@ buildscript { mavenLocal() } dependencies { - classpath 'org.openclover:clover:4.4.1' + classpath "com.vladsch.flexmark:flexmark-all:0.62.0" } } @@ -82,6 +94,26 @@ ext { } } + //// + // 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(); + def releasePropFile = findProperty("JALVIEW_RELEASE_FILE"); + def defaultReleasePropFile = "${jalviewDirAbsolutePath}/RELEASE"; + try { + (new File(releasePropFile!=null ? releasePropFile : defaultReleasePropFile)).withInputStream { + releaseProps.load(it) + } + } catch (Exception fileLoadError) { + throw new Error("Couldn't load release properties file "+(releasePropFile==null ? defaultReleasePropFile : "from custom location: releasePropFile"),fileLoadError); + } + //// + // Set JALVIEW_VERSION if it is not already set + if (findProperty(JALVIEW_VERSION)==null || "".equals(JALVIEW_VERSION)) { + JALVIEW_VERSION = releaseProps.get("jalview.version") + } + // this property set when running Eclipse headlessly j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild") // this property set by Eclipse @@ -103,8 +135,7 @@ ext { J2S_ENABLED = (project.hasProperty('j2s.compiler.status') && project['j2s.compiler.status'] != null && project['j2s.compiler.status'] == "enable") if (J2S_ENABLED) { println("J2S ENABLED") - } - + } /* *-/ System.properties.sort { it.key }.each { key, val -> println("SYSTEM PROPERTY ${key}='${val}'") @@ -120,21 +151,25 @@ ext { sourceDir = string("${jalviewDir}/${bareSourceDir}") resourceDir = string("${jalviewDir}/${resource_dir}") bareTestSourceDir = string(test_source_dir) - testSourceDir = string("${jalviewDir}/${bareTestSourceDir}") + testDir = string("${jalviewDir}/${bareTestSourceDir}") - // clover - cloverInstrDir = file("${buildDir}/${cloverSourcesInstrDir}") - cloverDb = string("${buildDir}/clover/clover.db") classesDir = string("${jalviewDir}/${classes_dir}") - if (clover.equals("true")) { - use_clover = true - classesDir = string("${buildDir}/${cloverClassesDir}") - } else { - use_clover = false - classesDir = string("${jalviewDir}/${classes_dir}") - } - classes = classesDir + // clover + useClover = clover.equals("true") + cloverBuildDir = "${buildDir}/clover" + cloverInstrDir = file("${cloverBuildDir}/clover-instr") + cloverClassesDir = file("${cloverBuildDir}/clover-classes") + cloverReportDir = file("${buildDir}/reports/clover") + cloverTestInstrDir = file("${cloverBuildDir}/clover-test-instr") + cloverTestClassesDir = file("${cloverBuildDir}/clover-test-classes") + //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}") buildDist = true @@ -163,8 +198,8 @@ ext { getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}") jvlChannelName += "_${getdownChannelName}" // automatically add the test group Not-bamboo for exclusion - if ("".equals(testngExcludedGroups)) { - testngExcludedGroups = "Not-bamboo" + if ("".equals(testng_excluded_groups)) { + testng_excluded_groups = "Not-bamboo" } install4jExtraScheme = "jalviewb" break @@ -172,11 +207,6 @@ ext { case "RELEASE": getdownAppDistDir = getdown_app_dir_release reportRsyncCommand = true - // Don't ignore transpile errors for release build - if (jalviewjs_ignore_transpile_errors.equals("true")) { - jalviewjs_ignore_transpile_errors = "false" - println("Setting jalviewjs_ignore_transpile_errors to 'false'") - } install4jSuffix = "" install4jDSStore = "DS_Store" install4jDMGBackgroundImage = "jalview_dmg_background.png" @@ -187,11 +217,11 @@ ext { getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}" getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") getdownAppBase = string("${getdown_channel_base}/${getdownDir}") - if (!file("${ARCHIVEDIR}/${packageDir}").exists()) { + if (!file("${ARCHIVEDIR}/${package_dir}").exists()) { throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution") } else { - packageDir = string("${ARCHIVEDIR}/${packageDir}") - buildProperties = string("${buildDir}/archive/${build_properties_file}") + package_dir = string("${ARCHIVEDIR}/${package_dir}") + buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}") buildDist = false } reportRsyncCommand = true @@ -202,11 +232,11 @@ ext { getdownChannelName = string("archive/${JALVIEW_VERSION}") getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") getdownAppBase = file(getdownWebsiteDir).toURI().toString() - if (!file("${ARCHIVEDIR}/${packageDir}").exists()) { + if (!file("${ARCHIVEDIR}/${package_dir}").exists()) { throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution") } else { - packageDir = string("${ARCHIVEDIR}/${packageDir}") - buildProperties = string("${buildDir}/archive/${build_properties_file}") + package_dir = string("${ARCHIVEDIR}/${package_dir}") + buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}") buildDist = false } reportRsyncCommand = true @@ -217,6 +247,11 @@ ext { case "DEVELOP": reportRsyncCommand = true + + // DEVELOP-RELEASE is usually associated with a Jalview release series so set the version + JALVIEW_VERSION=JALVIEW_VERSION+"-develop" + + install4jSuffix = "Develop" install4jDSStore = "DS_Store-DEVELOP" install4jDMGBackgroundImage = "jalview_dmg_background-DEVELOP.png" install4jExtraScheme = "jalviewd" @@ -230,7 +265,7 @@ ext { jalviewjs_ignore_transpile_errors = "false" println("Setting jalviewjs_ignore_transpile_errors to 'false'") } - JALVIEW_VERSION = "TEST" + JALVIEW_VERSION = JALVIEW_VERSION+"-test" install4jSuffix = "Test" install4jDSStore = "DS_Store-TEST-RELEASE" install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png" @@ -240,6 +275,8 @@ ext { case ~/^SCRATCH(|-[-\w]*)$/: getdownChannelName = CHANNEL + JALVIEW_VERSION = JALVIEW_VERSION+"-"+CHANNEL + getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") getdownAppBase = string("${getdown_channel_base}/${getdownDir}") reportRsyncCommand = true @@ -262,6 +299,7 @@ ext { break case "LOCAL": + JALVIEW_VERSION = "TEST" getdownAppBase = file(getdownWebsiteDir).toURI().toString() getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") install4jExtraScheme = "jalviewl" @@ -401,8 +439,8 @@ ext { - buildingHTML = string("${jalviewDir}/${docDir}/building.html") - helpFile = string("${classesDir}/${help_dir}/help.jhm") + 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}") @@ -446,10 +484,9 @@ sourceSets { srcDirs += helpParentDir } - jar.destinationDir = file("${jalviewDir}/${packageDir}") + jar.destinationDir = file("${jalviewDir}/${package_dir}") compileClasspath = files(sourceSets.main.java.outputDir) - //compileClasspath += files(sourceSets.main.resources.srcDirs) compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) runtimeClasspath = compileClasspath @@ -457,18 +494,19 @@ sourceSets { clover { java { - srcDirs = [ cloverInstrDir ] - outputDir = file("${buildDir}/${cloverClassesDir}") + srcDirs cloverInstrDir + outputDir = cloverClassesDir } resources { srcDirs = sourceSets.main.resources.srcDirs } - compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir ) - compileClasspath += files(sourceSets.main.java.outputDir) - compileClasspath += sourceSets.main.compileClasspath - compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}", include: ["**/*.jar"]) + + compileClasspath = files( sourceSets.clover.java.outputDir ) + //compileClasspath += files( testClassesDir ) compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"]) runtimeClasspath = compileClasspath } @@ -476,42 +514,20 @@ sourceSets { test { java { srcDirs testSourceDir - outputDir = file("${jalviewDir}/${testOutputDir}") + outputDir = file(testClassesDir) } resources { - srcDirs = sourceSets.main.resources.srcDirs + srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs } compileClasspath = files( sourceSets.test.java.outputDir ) - - if (use_clover) { - compileClasspath = sourceSets.clover.compileClasspath - } else { - compileClasspath += files(sourceSets.main.java.outputDir) - } - - compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) - compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}/testnglibs", include: ["**/*.jar"]) - compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}/testlibs", include: ["**/*.jar"]) + compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath + compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"]) runtimeClasspath = compileClasspath } -} - -// clover bits -dependencies { - if (use_clover) { - cloverCompile 'org.openclover:clover:4.4.1' - testCompile 'org.openclover:clover:4.4.1' - } -} - - -configurations { - cloverRuntime - cloverRuntime.extendsFrom cloverCompile } @@ -625,7 +641,6 @@ eclipse { javaRuntimeName = eclipseJavaRuntimeName // add in jalview project specific properties/preferences into eclipse core preferences - // and also the codestyle XML file file { withProperties { props -> def jalview_prefs = new Properties() @@ -724,61 +739,209 @@ eclipseGroovyCorePreferences.mustRunAfter eclipseJdt /* end of eclipse preferences hack */ -task cloverInstr { - // only instrument source, we build test classes as normal - inputs.files files (sourceSets.main.allJava,sourceSets.test.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"])) - outputs.dir cloverInstrDir +// clover bits + +task cleanClover { doFirst { - delete cloverInstrDir - def argsList = [ - "--initstring", - cloverDb, - "-d", - cloverInstrDir.getPath(), - ] - argsList.addAll( - inputs.files.files.collect( - { file -> file.absolutePath } - ) + delete cloverBuildDir + delete cloverReportDir + } +} + + +task cloverInstrJava(type: JavaExec) { + group = "Verification" + description = "Create clover instrumented source java files" + + dependsOn cleanClover + + inputs.files(sourceSets.main.allJava) + outputs.dir(cloverInstrDir) + + //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"]) + classpath = sourceSets.clover.compileClasspath + main = "com.atlassian.clover.CloverInstr" + + def argsList = [ + "--encoding", + "UTF-8", + "--initstring", + cloverDb, + "--destdir", + cloverInstrDir.getPath(), + ] + def srcFiles = sourceSets.main.allJava.files + argsList.addAll( + srcFiles.collect( + { file -> file.absolutePath } ) - String[] args = argsList.toArray() - println("About to instrument "+args.length +" files") - com.atlassian.clover.CloverInstr.mainImpl(args) + ) + args argsList.toArray() + + doFirst { + delete cloverInstrDir + println("Clover: About to instrument "+srcFiles.size() +" files") } } +task cloverInstrTests(type: JavaExec) { + group = "Verification" + description = "Create clover instrumented source test files" + + dependsOn cleanClover + + inputs.files(testDir) + outputs.dir(cloverTestInstrDir) + + classpath = sourceSets.clover.compileClasspath + main = "com.atlassian.clover.CloverInstr" + + def argsList = [ + "--encoding", + "UTF-8", + "--initstring", + cloverDb, + "--srcdir", + testDir, + "--destdir", + cloverTestInstrDir.getPath(), + ] + args argsList.toArray() + + doFirst { + delete cloverTestInstrDir + println("Clover: About to instrument test files") + } +} + + +task cloverInstr { + group = "Verification" + description = "Create clover instrumented all source files" + + dependsOn cloverInstrJava + dependsOn cloverInstrTests +} + + cloverClasses.dependsOn cloverInstr -task cloverReport { +task cloverConsoleReport(type: JavaExec) { group = "Verification" - description = "Creates the Clover report" - inputs.dir "${buildDir}/clover" - outputs.dir "${reportsDir}/clover" + description = "Creates clover console report" + onlyIf { file(cloverDb).exists() } - doFirst { - def argsList = [ - "--initstring", - cloverDb, - "-o", - "${reportsDir}/clover" - ] - String[] args = argsList.toArray() - com.atlassian.clover.reporters.html.HtmlReporter.runReport(args) - // and generate ${reportsDir}/clover/clover.xml - args = [ - "--initstring", - cloverDb, - "-o", - "${reportsDir}/clover/clover.xml" - ].toArray() - com.atlassian.clover.reporters.xml.XMLReporter.runReport(args) + inputs.dir cloverClassesDir + + classpath = sourceSets.clover.runtimeClasspath + main = "com.atlassian.clover.reporters.console.ConsoleReporter" + + if (cloverreport_mem.length() > 0) { + maxHeapSize = cloverreport_mem + } + if (cloverreport_jvmargs.length() > 0) { + jvmArgs Arrays.asList(cloverreport_jvmargs.split(" ")) } + + def argsList = [ + "--alwaysreport", + "--initstring", + cloverDb, + "--unittests" + ] + + args argsList.toArray() +} + + +task cloverHtmlReport(type: JavaExec) { + group = "Verification" + description = "Creates clover HTML report" + + onlyIf { + file(cloverDb).exists() + } + + def cloverHtmlDir = cloverReportDir + inputs.dir cloverClassesDir + outputs.dir cloverHtmlDir + + classpath = sourceSets.clover.runtimeClasspath + main = "com.atlassian.clover.reporters.html.HtmlReporter" + + if (cloverreport_mem.length() > 0) { + maxHeapSize = cloverreport_mem + } + if (cloverreport_jvmargs.length() > 0) { + jvmArgs Arrays.asList(cloverreport_jvmargs.split(" ")) + } + + def argsList = [ + "--alwaysreport", + "--initstring", + cloverDb, + "--outputdir", + cloverHtmlDir + ] + + if (cloverreport_html_options.length() > 0) { + argsList += cloverreport_html_options.split(" ") + } + + args argsList.toArray() +} + + +task cloverXmlReport(type: JavaExec) { + group = "Verification" + description = "Creates clover XML report" + + onlyIf { + file(cloverDb).exists() + } + + def cloverXmlFile = "${cloverReportDir}/clover.xml" + inputs.dir cloverClassesDir + outputs.file cloverXmlFile + + classpath = sourceSets.clover.runtimeClasspath + main = "com.atlassian.clover.reporters.xml.XMLReporter" + + if (cloverreport_mem.length() > 0) { + maxHeapSize = cloverreport_mem + } + if (cloverreport_jvmargs.length() > 0) { + jvmArgs Arrays.asList(cloverreport_jvmargs.split(" ")) + } + + def argsList = [ + "--alwaysreport", + "--initstring", + cloverDb, + "--outfile", + cloverXmlFile + ] + + if (cloverreport_xml_options.length() > 0) { + argsList += cloverreport_xml_options.split(" ") + } + + args argsList.toArray() +} + + +task cloverReport { + group = "Verification" + description = "Creates clover reports" + + dependsOn cloverXmlReport + dependsOn cloverHtmlReport } @@ -790,43 +953,29 @@ compileCloverJava { options.compilerArgs += additional_compiler_args print ("Setting target compatibility to "+targetCompatibility+"\n") } - classpath += configurations.cloverRuntime -} - - -task cleanClover { - doFirst { - delete cloverInstrDir - delete cloverDb - } + //classpath += configurations.cloverRuntime } // end clover bits compileJava { - + // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ? sourceCompatibility = compile_source_compatibility targetCompatibility = compile_target_compatibility options.compilerArgs = additional_compiler_args options.encoding = "UTF-8" doFirst { - print ("Setting target compatibility to "+targetCompatibility+"\n") + print ("Setting target compatibility to "+compile_target_compatibility+"\n") } } compileTestJava { - if (use_clover) { - dependsOn compileCloverJava - classpath += configurations.cloverRuntime - } else { - classpath += sourceSets.main.runtimeClasspath - } + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs = additional_compiler_args doFirst { - sourceCompatibility = compile_source_compatibility - targetCompatibility = compile_target_compatibility - options.compilerArgs = additional_compiler_args print ("Setting target compatibility to "+targetCompatibility+"\n") } } @@ -855,22 +1004,25 @@ def getDate(format) { task setGitVals { - def hashStdOut = new ByteArrayOutputStream() - exec { - commandLine "git", "rev-parse", "--short", "HEAD" - standardOutput = hashStdOut - ignoreExitValue true - } - def branchStdOut = new ByteArrayOutputStream() - exec { - commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" - standardOutput = branchStdOut - ignoreExitValue true - } + doFirst { + def hashStdOut = new ByteArrayOutputStream() + def resultHash = exec { + commandLine "git", "rev-parse", "--short", "HEAD" + standardOutput = hashStdOut + ignoreExitValue true + } - gitHash = hashStdOut.toString().trim() - gitBranch = branchStdOut.toString().trim() + def branchStdOut = new ByteArrayOutputStream() + def resultBranch = exec { + commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" + standardOutput = branchStdOut + ignoreExitValue true + } + + gitHash = resultHash.getExitValue() == 0 ? hashStdOut.toString().trim() : "NO_GIT_COMMITID_FOUND" + gitBranch = resultBranch.getExitValue() == 0 ? branchStdOut.toString().trim() : "NO_GIT_BRANCH_FOUND" + } outputs.upToDateWhen { false } } @@ -909,53 +1061,116 @@ task cleanBuildingHTML(type: Delete) { } -task convertBuildingMD(type: Exec) { +def convertMdToHtml (FileTree mdFiles, File cssFile) { + MutableDataSet options = new MutableDataSet() + + def extensions = new ArrayList<>() + extensions.add(AnchorLinkExtension.create()) + extensions.add(AutolinkExtension.create()) + extensions.add(StrikethroughExtension.create()) + extensions.add(TaskListExtension.create()) + extensions.add(TablesExtension.create()) + extensions.add(TocExtension.create()) + + options.set(Parser.EXTENSIONS, extensions) + + // set GFM table parsing options + options.set(TablesExtension.WITH_CAPTION, false) + options.set(TablesExtension.COLUMN_SPANS, false) + options.set(TablesExtension.MIN_HEADER_ROWS, 1) + options.set(TablesExtension.MAX_HEADER_ROWS, 1) + options.set(TablesExtension.APPEND_MISSING_COLUMNS, true) + options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true) + options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true) + // GFM anchor links + options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false) + options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor") + options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true) + options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "") + + Parser parser = Parser.builder(options).build() + HtmlRenderer renderer = HtmlRenderer.builder(options).build() + + mdFiles.each { mdFile -> + // add table of contents + def mdText = "[TOC]\n"+mdFile.text + + // grab the first top-level title + def title = null + def titleRegex = /(?m)^#(\s+|([^#]))(.*)/ + def matcher = mdText =~ titleRegex + if (matcher.size() > 0) { + // matcher[0][2] is the first character of the title if there wasn't any whitespace after the # + title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3] + } + // or use the filename if none found + if (title == null) { + title = mdFile.getName() + } + + Node document = parser.parse(mdText) + String htmlBody = renderer.render(document) + def htmlText = ''' + + +
+ + + +''' + htmlText += ((title != null) ? "