From: Jim Procter
Date: Mon, 8 Aug 2022 16:16:14 +0000 (+0100)
Subject: Merge branch 'improvement/JAL-4014_gecos_colour_schemes' into develop
X-Git-Tag: Release_2_11_2_6~30
X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=commitdiff_plain;h=4ad2441df1220e3b1133feb3f70f00ba8b28392f;hp=3f5088fe082c479c0de91f897ed26a5adf540f98
Merge branch 'improvement/JAL-4014_gecos_colour_schemes' into develop
---
diff --git a/.gitignore b/.gitignore
index cd56818..616d27d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,6 +27,7 @@ TESTNG
/getdown/website
/getdown/full_app
/getdown/files
+/getdown/old
/getdown/src/getdown/*/target/
/getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Build.java
/getdown/src/getdown/launcher/dependency-reduced-pom.xml
@@ -41,3 +42,5 @@ TESTNG
/site2
/resources/.build_properties
/resources/channel_properties
+/help/help/html/releases.html
+/help/help/html/whatsNew.html
diff --git a/RELEASE b/RELEASE
index 557e9d9..c63eaef 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,2 +1,2 @@
jalview.release=releases/Release_2_11_2_Branch
-jalview.version=2.11.2.3
+jalview.version=2.11.2.4
diff --git a/build.gradle b/build.gradle
index b4636bc..a62e85a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,6 +12,7 @@ import java.security.MessageDigest
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
@@ -22,6 +23,11 @@ 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
+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 {
@@ -30,6 +36,7 @@ buildscript {
}
dependencies {
classpath "com.vladsch.flexmark:flexmark-all:0.62.0"
+ classpath "org.jsoup:jsoup:1.14.3"
}
}
@@ -41,7 +48,7 @@ plugins {
id "com.diffplug.gradle.spotless" version "3.28.0"
id 'com.github.johnrengelman.shadow' version '4.0.3'
id 'com.install4j.gradle' version '9.0.6'
- id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
+ 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
}
@@ -96,6 +103,7 @@ def overrideProperties(String propsFileName, boolean output = false) {
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"
@@ -130,6 +138,7 @@ ext {
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")
@@ -189,13 +198,20 @@ ext {
testSourceDir = useClover ? cloverTestInstrDir : testDir
testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
- getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
+ 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
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
getdownImagesDir = string("${jalviewDir}/${getdown_images_dir}")
@@ -212,6 +228,10 @@ ext {
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":
@@ -229,6 +249,7 @@ ext {
case [ "RELEASE", "JALVIEWJS-RELEASE" ]:
getdownAppDistDir = getdown_app_dir_release
+ getdownSetAppBaseProperty = true
reportRsyncCommand = true
install4jSuffix = ""
install4jInstallerName = "${jalview_name} Installer"
@@ -252,7 +273,7 @@ ext {
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")
} else {
@@ -279,6 +300,7 @@ ext {
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"
@@ -315,9 +337,11 @@ ext {
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
@@ -325,11 +349,14 @@ ext {
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) {
// revert to LOCAL if empty string
if (string(getdown_appbase_override) == "") {
- getdownAppBase = file(getdownWebsiteDir).toURI().toString()
+ 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)
@@ -343,11 +370,10 @@ ext {
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
@@ -357,15 +383,15 @@ ext {
}
// 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 __
@@ -373,10 +399,10 @@ ext {
.toLowerCase()
getdownWrapperLink = install4jUnixApplicationFolder // e.g. "jalview_local"
- getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
- //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
- getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
- getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
+ 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
@@ -1040,7 +1066,6 @@ cleanTest {
// format is a string like date.format("dd MMMM yyyy")
def getDate(format) {
- def date = new Date()
return date.format(format)
}
@@ -1175,6 +1200,214 @@ task convertMdFiles {
}
+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 = '\n\n'
+ def inSection = false
+ changes.eachLine { line ->
+ def m = null
+ if (m = line =~ /^##([^#].*)$/) {
+ if (inSection) {
+ changesHugo += "
\n\n"
+ }
+ def section = m[0][1].trim()
+ section = section.toLowerCase()
+ section = section.replaceAll(/ +/, "_")
+ section = section.replaceAll(/[^a-z0-9_\-]/, "")
+ changesHugo += "\n\n"
+ inSection = true
+ } else if (m = line =~ /^(\s*-\s*)(.*?)(
)?\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}{{}} "
+ 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
\n\n"
+ }
+ changesHugo += ''
+ }
+
+ 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 = "${helpBuildDir}/${help_dir}"
@@ -1210,6 +1443,143 @@ task copyHelp(type: Copy) {
}
+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 += "${displayPart}"
+ 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"
@@ -1307,6 +1677,7 @@ task prepare {
dependsOn buildResources
dependsOn copyDocs
dependsOn copyHelp
+ dependsOn releasesTemplates
dependsOn convertMdFiles
dependsOn buildIndices
}
@@ -1379,7 +1750,7 @@ task linkCheck(type: JavaExec) {
def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
classpath = files("${jalviewDir}/${utils_dir}")
main = "HelpLinksChecker"
- workingDir = jalviewDir
+ workingDir = "${helpBuildDir}"
args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
@@ -1415,7 +1786,7 @@ jar {
manifest {
attributes "Main-Class": main_class,
"Permissions": "all-permissions",
- "Application-Name": install4jApplicationName,
+ "Application-Name": applicationName,
"Codebase": application_codebase,
"Implementation-Version": JALVIEW_VERSION
}
@@ -1488,7 +1859,7 @@ shadowJar {
}
manifest {
attributes "Implementation-Version": JALVIEW_VERSION,
- "Application-Name": install4jApplicationName
+ "Application-Name": applicationName
}
duplicatesStrategy "INCLUDE"
@@ -1508,13 +1879,12 @@ task getdownWebsite() {
}
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 {
@@ -1526,11 +1896,11 @@ task getdownWebsite() {
copy {
from channelPropsFile
- into getdownWebsiteDir
+ into getdownAppBaseDir
}
getdownWebsiteResourceFilenames += file(channelPropsFile).getName()
- // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
+ // 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)
@@ -1551,17 +1921,17 @@ task getdownWebsite() {
}
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
@@ -1581,15 +1951,15 @@ task getdownWebsite() {
}
}
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 {
@@ -1604,9 +1974,9 @@ task getdownWebsite() {
if (s.exists()) {
copy {
from s
- into "${getdownWebsiteDir}/${getdown_wrapper_script_dir}"
+ into "${getdownAppBaseDir}/${getdown_wrapper_script_dir}"
}
- getdownTextString += "resource = ${getdown_wrapper_script_dir}/${script}\n"
+ getdownTextLines += "resource = ${getdown_wrapper_script_dir}/${script}"
}
}
@@ -1623,8 +1993,8 @@ task getdownWebsite() {
// 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
@@ -1637,8 +2007,8 @@ task getdownWebsite() {
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
@@ -1648,27 +2018,27 @@ task getdownWebsite() {
*/
// 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) {
- getdownTextString += "jvmarg = -Dgetdowndistdir=${getdownAppDistDir}\n"
- getdownTextString += "jvmarg = -Dgetdownappbase=${getdownAppBase}\n"
+ 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
@@ -1677,13 +2047,13 @@ task getdownWebsite() {
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 "${getdownAppDir}/${getdown_build_properties}"
if (file(getdownLauncher).getName() != getdown_launcher) {
@@ -1701,18 +2071,18 @@ task getdownWebsite() {
// 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 "${getdownWebsiteDir}/${channel_props}"
+ from "${getdownAppBaseDir}/${getdown_build_properties}"
+ from "${getdownAppBaseDir}/${channel_props}"
if (file(getdownLauncher).getName() != getdown_launcher) {
rename(file(getdownLauncher).getName(), getdown_launcher)
}
into getdownFilesDir
}
- // and ./resources (not all downloaded by getdown)
+ // and ./resource (not all downloaded by getdown)
copy {
from getdownResourceDir
into "${getdownFilesDir}/${getdown_resource_dir}"
@@ -1722,7 +2092,7 @@ task getdownWebsite() {
if (buildDist) {
inputs.dir("${jalviewDir}/${package_dir}")
}
- outputs.dir(getdownWebsiteDir)
+ outputs.dir(getdownAppBaseDir)
outputs.dir(getdownFilesDir)
}
@@ -1753,9 +2123,9 @@ task getdownDigest(type: JavaExec) {
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")
}
@@ -1765,7 +2135,7 @@ task getdown() {
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'"
@@ -1782,6 +2152,106 @@ task getdown() {
}
+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("^(?appbase\\s*=\\s*).*", '${s}'+getdownFullArchiveAppBase)
+ line = line.replaceAll("^(?(resource|code)\\s*=\\s*)${getdownAppDistDir}/", '${s}'+vAltDir+"/")
+ line = line.replaceAll("^(?ui.background_image\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_background.png")
+ line = line.replaceAll("^(?ui.instant_background_image\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_background_initialising.png")
+ line = line.replaceAll("^(?ui.error_background\\s*=\\s*).*\\.png", '${s}'+"${getdown_resource_dir}/jalview_archive_getdown_background_error.png")
+ line = line.replaceAll("^(?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'
}
@@ -1789,8 +2259,9 @@ tasks.withType(JavaCompile) {
clean {
doFirst {
- delete getdownWebsiteDir
+ delete getdownAppBaseDir
delete getdownFilesDir
+ delete getdownArchiveDir
}
}
@@ -1838,11 +2309,7 @@ task copyInstall4jTemplate {
// 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
@@ -1895,12 +2362,23 @@ clean {
}
}
+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 installerFiles(type: com.install4j.gradle.Install4jTask) {
group = "distribution"
description = "Create the install4j installers"
dependsOn getdown
dependsOn copyInstall4jTemplate
+ dependsOn cleanInstallersDataFiles
projectFile = install4jConfFile
@@ -1915,12 +2393,10 @@ task installers(type: com.install4j.gradle.Install4jTask) {
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,
@@ -1952,7 +2428,7 @@ task installers(type: com.install4j.gradle.Install4jTask) {
'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,
@@ -2001,7 +2477,7 @@ task installers(type: com.install4j.gradle.Install4jTask) {
}
//verbose=true
- inputs.dir(getdownWebsiteDir)
+ inputs.dir(getdownAppBaseDir)
inputs.file(install4jConfFile)
inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
inputs.dir(macosJavaVMDir)
@@ -2009,6 +2485,84 @@ task installers(type: com.install4j.gradle.Install4jTask) {
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 {
@@ -2043,8 +2597,7 @@ task sourceDist(type: Tar) {
dependsOn createSourceReleaseProperties
- def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
- def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
+ def outputFileName = "${project.name}_${JALVIEW_VERSION_UNDERSCORES}.tar.gz"
archiveFileName = outputFileName
compression Compression.GZIP
@@ -2116,7 +2669,9 @@ task sourceDist(type: Tar) {
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")
@@ -2145,8 +2700,45 @@ task sourceDist(type: Tar) {
}
}
+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
diff --git a/doc/building.md b/doc/building.md
index 8e21d57..34d5d67 100644
--- a/doc/building.md
+++ b/doc/building.md
@@ -6,7 +6,7 @@
# download
git clone http://source.jalview.org/git/jalview.git
# compile
-cd jalview
+cd ./jalview
gradle shadowJar
# run
java -jar build/libs/jalview-all-*-j11.jar
@@ -14,7 +14,7 @@ java -jar build/libs/jalview-all-*-j11.jar
# and/or create launcher
gradle getdown
# use launcher
-cd getdown/files
+cd ./build/getdown/files/11
java -jar getdown-launcher.jar . jalview
```
diff --git a/getdown/lib/FJVL_VERSION b/getdown/lib/FJVL_VERSION
index 4a5376d..1a5992a 100644
--- a/getdown/lib/FJVL_VERSION
+++ b/getdown/lib/FJVL_VERSION
@@ -1 +1 @@
-1.8.3-1.2.12_FJVL
+1.8.3-1.2.13_FJVL
diff --git a/getdown/lib/JVL_VERSION b/getdown/lib/JVL_VERSION
index ed249ad..60daf6c 100644
--- a/getdown/lib/JVL_VERSION
+++ b/getdown/lib/JVL_VERSION
@@ -1 +1 @@
-1.8.3-1.2.12_JVL
+1.8.3-1.2.13_JVL
diff --git a/getdown/lib/getdown-core.jar b/getdown/lib/getdown-core.jar
index 2e695eb..5c98d23 100644
Binary files a/getdown/lib/getdown-core.jar and b/getdown/lib/getdown-core.jar differ
diff --git a/getdown/lib/getdown-launcher-local.jar b/getdown/lib/getdown-launcher-local.jar
index fd89e15..b022d9f 100644
Binary files a/getdown/lib/getdown-launcher-local.jar and b/getdown/lib/getdown-launcher-local.jar differ
diff --git a/getdown/lib/getdown-launcher.jar b/getdown/lib/getdown-launcher.jar
index 38c3a19..b9e3c6b 100644
Binary files a/getdown/lib/getdown-launcher.jar and b/getdown/lib/getdown-launcher.jar differ
diff --git a/getdown/src/getdown/ant/pom.xml b/getdown/src/getdown/ant/pom.xml
index 881c952..ed0f34a 100644
--- a/getdown/src/getdown/ant/pom.xml
+++ b/getdown/src/getdown/ant/pom.xml
@@ -4,7 +4,7 @@
com.threerings.getdown
getdown
- 1.8.3-1.2.12_FJVL
+ 1.8.3-1.2.13_FJVL
getdown-ant
diff --git a/getdown/src/getdown/core/pom.xml b/getdown/src/getdown/core/pom.xml
index 3e52eca..a7dfa07 100644
--- a/getdown/src/getdown/core/pom.xml
+++ b/getdown/src/getdown/core/pom.xml
@@ -4,7 +4,7 @@
com.threerings.getdown
getdown
- 1.8.3-1.2.12_FJVL
+ 1.8.3-1.2.13_FJVL
getdown-core
diff --git a/getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java b/getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
index 8048728..9d9fe14 100644
--- a/getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
+++ b/getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
@@ -1085,6 +1085,9 @@ public class Application
log.info("Not setting proxy");
}
+ // add the getdowninstanceappbase property. getdownappdir is added by getdown.txt
+ args.add("-Dgetdowninstanceappbase=" + getAppbase().toString());
+
// add the marker indicating the app is running in getdown
args.add("-D" + Properties.GETDOWN + "=true");
args.add("-Dsys.install4jVersion=" + Application.i4jVersion);
diff --git a/getdown/src/getdown/launcher/pom.xml b/getdown/src/getdown/launcher/pom.xml
index df0ebbe..6cf40a8 100644
--- a/getdown/src/getdown/launcher/pom.xml
+++ b/getdown/src/getdown/launcher/pom.xml
@@ -4,7 +4,7 @@
com.threerings.getdown
getdown
- 1.8.3-1.2.12_FJVL
+ 1.8.3-1.2.13_FJVL
getdown-launcher
diff --git a/getdown/src/getdown/mvn_cmd b/getdown/src/getdown/mvn_cmd
index 4a9d2ea..36bc298 100755
--- a/getdown/src/getdown/mvn_cmd
+++ b/getdown/src/getdown/mvn_cmd
@@ -3,7 +3,7 @@
if [ x$JVLVERSION != x ]; then
export VERSION=$JVLVERSION
else
- export VERSION=1.8.3-1.2.12_JVL
+ export VERSION=1.8.3-1.2.13_JVL
fi
if [ x${VERSION%_JVL} = x$VERSION ]; then
diff --git a/getdown/src/getdown/pom.xml b/getdown/src/getdown/pom.xml
index 87b361e..dc12610 100644
--- a/getdown/src/getdown/pom.xml
+++ b/getdown/src/getdown/pom.xml
@@ -10,7 +10,7 @@
com.threerings.getdown
getdown
pom
- 1.8.3-1.2.12_FJVL
+ 1.8.3-1.2.13_FJVL
getdown
An application installer and updater.
diff --git a/gradle.properties b/gradle.properties
index ae8e8ac..acb65e9 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -22,7 +22,7 @@ jalview_key = jalview
jalview_key.pass = alignmentisfun
jalview_tsaurl =
proxyPort = 80
-proxyHost = sqid
+proxyHost = squid
jalview_keyalg = SHA1withRSA
jalview_keydig = SHA1
@@ -58,10 +58,25 @@ shadow_jar_main_class = jalview.bin.Launcher
jalview_name = Jalview
+hugo_old_jvl = utils/hugo/old_jvl.txt
+hugo_jalviewjs = utils/hugo/jalviewjs.txt
+hugo_build_dir = build/website/hugo
+hugo_data_installers_dir = data/installers
+hugo_version_archive_dir = content/development/archive
+hugo_templates_dir = utils/hugo/templates
+releases_template = help/templates/releases.html
+whatsnew_template = help/templates/whatsNew.html
+releases_html = html/releases.html
+whatsnew_html = html/whatsNew.html
+whatsnew_dir = help/markdown/whatsnew
+releases_dir = help/markdown/releases
+# these are going to be used in the future to gather website release files together
+getdown_website_dir = build/website/docroot/getdown
+getdown_archive_dir = build/website/docroot/old
+getdown_files_dir = build/getdown/files
+
getdown_local = false
-getdown_website_dir = getdown/website
getdown_resource_dir = resource
-getdown_files_dir = getdown/files
getdown_lib_dir = getdown/lib
getdown_launcher = getdown-launcher.jar
getdown_launcher_local = getdown-launcher-local.jar
@@ -81,7 +96,7 @@ getdown_txt_max_concurrent_downloads = 10
# now got better (dynamic) defaults when jvmmem* not set
#getdown_txt_jalview.jvmmempc = 90
#getdown_txt_jalview.jvmmemmax = 32G
-getdown_txt_multi_jvmarg = -Dgetdownappdir=%APPDIR%
+getdown_txt_multi_jvmarg = -Dgetdowninstanceappdir=%APPDIR%
getdown_txt_strict_comments = true
getdown_txt_ui.progress_sync_before_shown = true
getdown_txt_ui.progress_sync_after_shown = false
@@ -148,6 +163,7 @@ OSX_ALTOOLPASS =
CHANNEL=LOCAL
getdown_channel_base = https://www.jalview.org/getdown
+getdown_archive_base = https://www.jalview.org/old
getdown_app_dir_release = release
getdown_app_dir_alt = alt
getdown_app_dir_java = jre
diff --git a/help/help/html/features/3dbeacons_button.png b/help/help/html/features/3dbeacons_button.png
index 2dae1f6..b80f70b 100644
Binary files a/help/help/html/features/3dbeacons_button.png and b/help/help/html/features/3dbeacons_button.png differ
diff --git a/help/help/html/features/pymol.html b/help/help/html/features/pymol.html
index c6a2ae2..7bf5651 100644
--- a/help/help/html/features/pymol.html
+++ b/help/help/html/features/pymol.html
@@ -218,11 +218,25 @@
+ Troubleshooting
+
+ Jalview will try to automatically configure itself according to the
+ configured Pymol installation (or the first one it discovers in the
+ standard installation locations). You can see which Pymol executable
+ is being used by enabling
+ DEBUG output in
+ Jalview's Java console.
+
+
If Jalview raises warning messages about Pymol not being located
+ or executed, or no structures appear when Jalview launches Pymol,
+ please ask for help on
+ Jalview's discussion forum.
+
Pymol and Windows Firewall
Jalview and Pymol communicate using the
Pymol's XML-RPC over
- HTTP interface(https://pymolwiki.org/index.php/RPC).
+ HTTP interface (https://pymolwiki.org/index.php/RPC).
Technically this requires both Pymol and Jalview to open
ports on the local network, and this may be blocked by Windows
diff --git a/help/help/html/features/schooser_main.png b/help/help/html/features/schooser_main.png
index 07a1a3c..5a7fe0a 100644
Binary files a/help/help/html/features/schooser_main.png and b/help/help/html/features/schooser_main.png differ
diff --git a/help/help/html/features/uniprotqueryfields.html b/help/help/html/features/uniprotqueryfields.html
index 182b206..66082f2 100644
--- a/help/help/html/features/uniprotqueryfields.html
+++ b/help/help/html/features/uniprotqueryfields.html
@@ -33,359 +33,238 @@
syntax).
-
-
- Field |
- Example |
- Description |
-
-
- accession |
- accession:P62988 |
- Lists all entries with the primary or secondary accession
- number P62988. |
-
-
- active |
- active:no |
- Lists all obsolete entries. |
-
-
- annotation |
-
- annotation:(type:non-positional)
- annotation:(type:positional) annotation:(type:mod_res
- "Pyrrolidone carboxylic acid" evidence:experimental)
- |
- Lists all entries with:
-
- - any general annotation (comments [CC])
- - any sequence annotation (features [FT])
- - at least one amino acid modified with a Pyrrolidone
- carboxylic acid group
-
- |
-
-
- author |
- author:ashburner |
- Lists all entries with at least one reference co-authored
- by Michael Ashburner. |
-
-
- cdantigen |
- cdantigen:CD233 |
- Lists all entries whose cluster of differentiation number
- is CD233. |
-
-
- citation |
-
- citation:("intracellular structural proteins")
- citation:(author:ashburner journal:nature) citation:9169874
- |
- Lists all entries with a literature citation:
-
- - containing the phrase "intracellular structural
- proteins" in either title or abstract
- - co-authored by Michael Ashburner and published in
- Nature
- - with the PubMed identifier 9169874
-
- |
-
-
- cluster |
- cluster:UniRef90_A5YMT3 |
- Lists all entries in the UniRef 90% identity cluster
- whose representative sequence is UniProtKB entry A5YMT3. |
-
-
- count |
-
- annotation:(type:transmem count:5)
- annotation:(type:transmem count:[5 TO *])
- annotation:(type:cofactor count:[3 TO *])
- |
- Lists all entries with:
-
- - exactly 5 transmembrane regions
- - 5 or more transmembrane regions
- - 3 or more Cofactor comments
-
- |
-
-
- created |
-
- created:[20121001 TO *] reviewed:yes AND
- created:[current TO *]
- |
- Lists all entries created since October 1st 2012.
- Lists all new UniProtKB/Swiss-Prot entries in the last release.
- |
-
-
- database |
-
- database:(type:pfam) database:(type:pdb 1aut)
- |
- Lists all entries with:
-
- - a cross-reference to the Pfam database
- - a cross-reference to the PDB database entry 1aut
-
+
+
+
+rest.uniprot.org field |
+rest.uniprot.org example |
+Description |
+
+
+
+
+accession |
+accession:P62988 |
+The old behaviour was to list all entries with primary or secondary accession number P62988. The new behaviour will list all primary / canonical isoform accessions P62988. To search over secondary accessions, we have introduced the sec_acc field. |
+
+
+active |
+active:false |
+Lists all obsolete entries. |
+
+
+Refer to the page: Sequence Annotations |
+ |
+Lists all entries with:- any general annotation (comments [CC])
- any sequence annotation (features [FT])
- at least one amino acid modified with a Pyrrolidone carboxylic acid group
|
+
+
+lit_author |
+lit_author:ashburner |
+Lists all entries with at least one reference co-authored by Michael Ashburner. |
+
+
+protein_name |
+protein_name:CD233 |
+Lists all entries whose cluster of differentiation number is CD233 (see cdlist.txt). |
+
+
+chebi |
+chebi:18420 |
+Lists all entries which are associated with the small molecule corresponding to ChEBI identifier 18420, Mg(2+) (see How can I search UniProt for chemical or reaction data?). |
+
+
+uniprot_id (/uniref), then uniref_cluster_90 (/uniprotkb) |
+- uniprot_id:A5YMT3 to find cluster UniRef90_P00395
- uniref_cluster_90:UniRef90_P00395
|
+Find all entries in the UniRef 90% identity cluster whose representative sequence is UniProtKB entry A5YMT3 (about UniRef). |
+
+
+xrefcount_pdb (or xref_count) |
+xref_count_pdb:[20 TO *] |
+Lists all entries with 20 or more cross-references to PDB |
+
+
+date_created |
+date_created:[2012-10-01 TO *] |
+Lists all entries created since October 1st 2012. |
+
+
+database, xref |
+- database:pfam
- xref:pdb-1aut
|
+Lists all entries with:- a cross-reference to the Pfam database
- a cross-reference to the PDB database entry 1aut
(see Databases cross-referenced in UniProtKB and Database mapping) |
+
+
+ec |
+ec:3.2.1.23 |
+Lists all beta-galactosidases (Enzyme nomenclature database). |
+
+
+Refer to the pages: Comments or Sequence Annotations |
+ |
+Lists all entries with: - a signal sequence whose positions have been experimentally proven
- experimentally proven phosphoserine sites
- a function manually asserted according to rules
(see Evidence attribution) |
+
+
+existence |
+existence:3 |
+See Protein existence criteria. |
+
+
+family |
+family:serpin |
+Lists all entries belonging to the Serpin family of proteins (Index of protein domains and families). |
+
+
+fragment |
+fragment:true |
+Lists all entries with an incomplete sequence. |
+
+
+gene |
+gene:HPSE |
+Lists all entries for proteins encoded by gene HPSE, but also by HPSE2. |
+
+
+gene_exact |
+gene_exact:HPSE |
+Lists all entries for proteins encoded by gene HPSE, but excluding variations like HPSE2 or HPSE_0. |
+
+
+go |
+go:0015629) |
+Lists all entries associated with the GO term Actin cytoskeleton and any subclasses |
+
+
+virus_host_name, virus_host_id |
+virus_host_id:10090 |
+Lists all entries for viruses infecting Mus musculus (Mouse) |
+
+
+accession_id |
+accession_id:P00750 |
+Returns the entry with the primary accession number P00750. |
+
+
+inchikey |
+inchikey:WQZGKKKJIJFFOK-GASJEMHNSA-N |
+Returns entries associated with the small molecule identified by the InChIKey WQZGKKKJIJFFOK-GASJEMHNSA-N, i.e. D-glucopyranose (see How can I search UniProt for chemical or reaction data?). To get the CHEBI identifier for an Inchikey value, one can now use the advanced search builder. |
+
+
+protein_name |
+protein_name:Anakinra |
+Lists all entries whose protein name includes the "International Nonproprietary Name" is Anakinra. |
+
+
+interactor |
+interactor:P00520 |
+Lists all entries describing interactions with the protein described by entry P00520. |
+
+
+keyword |
+- keyword:toxin
- keyword:KW-0800
|
+- Lists all entries associated with a keyword matching "Toxin" in its name or description (UniProtKB Keywords).
- Lists all entries associated with the UniProtKB keyword Toxin.
|
+
+
+length |
+length:[500 TO 700] |
+Lists all entries describing sequences of length between 500 and 700 residues. |
+
+
+mass |
+mass:[500000 TO *] |
+Lists all entries describing sequences with a mass of at least 500,000 Da. |
+
+
+cc_mass_spectrometry |
+cc_mass_spectrometry:maldi |
+Lists all entries for proteins identified by: matrix-assisted laser desorption/ionization (MALDI), crystallography (X-Ray). The method field searches names of physico-chemical identification methods in the 'Biophysicochemical properties' subsection of the 'Function' section, the 'Publications' and 'Cross-references' sections. |
+
+
+date_modified |
+modified:[2012-01-01 TO 2019-03-01] AND active:true |
+Lists all active entries that were last modified between January and March 2019. |
+
+
+protein_name |
+protein_name:"prion protein" |
+Lists all entries for prion proteins. |
+
+
+organelle |
+organelle:Mitochondrion |
+Lists all entries for proteins encoded by a gene of the mitochondrial chromosome. |
+
+
+organism_name, organism_id |
+- organism_name:"Ovis aries"
- organism_id:9940
- organism_name:sheep
|
+Lists all entries for proteins expressed in sheep (first 2 examples) and organisms whose name contains the term "sheep" (UniProt taxonomy). |
+
+
+plasmid |
+plasmid:ColE1 |
+Lists all entries for proteins encoded by a gene of plasmid ColE1 (Controlled vocabulary of plasmids). |
+
+
+proteome |
+proteome:UP000005640 |
+Lists all entries from the human proteome. |
+
+
+proteomecomponent |
+proteomecomponent:"chromosome 1" AND organism_id:9606 |
+Lists all entries from the human chromosome 1. |
+
+
+sec_acc |
+sec_acc:P02023 |
+Lists all entries that were created from a merge with entry P02023 (see FAQ). |
+
+
+reviewed |
+reviewed:true |
+Lists all UniProtKB/Swiss-Prot entries (about UniProtKB). |
+
+
+scope |
+scope:mutagenesis |
+Lists all entries containing a reference that was used to gather information about mutagenesis (Entry view: "Cited for", See 'Publications' section of the user manual). |
+
+
+sec_acc |
+sec_acc:P62988 |
+Lists all entries containing a secondary accession P62988. |
+
+
+sequence |
+accession:P05067-9 AND is_isoform:true |
+Lists all entries containing a link to isoform 9 of the sequence described in entry P05067. Allows searching by specific sequence identifier. |
+
+
+date_sequence_modified |
+- date_sequence_modified:[2012-01-01 TO 2012-03-01]
- date_sequence_modified:[2012-01-01 TO 2012-03-01]
|
+- Lists all entries whose sequences were last modified between January and March 2012.
- Lists all UniProtKB/Swiss-Prot entries whose sequences were modified after the start of 2012.
|
+
+
+strain |
+strain:wistar |
+Lists all entries containing a reference relevant to strain wistar (Lists of strains in reference comments and Taxonomy help: organism strains). |
+
+
+taxonomy_name, taxonomy_id |
+- taxonomy_name:mammal
- taxonomy_id:40674
|
+Lists all entries for proteins expressed in Mammals. This field is used to retrieve entries for all organisms classified below a given taxonomic node (taxonomy classification). |
+
+
+tissue |
+tissue:liver |
+Lists all entries containing a reference describing the protein sequence obtained from a clone isolated from liver (Controlled vocabulary of tissues). |
+
+
+cc_webresource |
+cc_webresource:wikipedia |
+Lists all entries for proteins that are described in Wikipedia. |
+
+
+
- |
-
-
- domain |
- domain:VWFA |
- Lists all entries with a Von Willebrand factor type A
- domain described in the 'Family and Domains' section. |
-
-
- ec |
- ec:3.2.1.23 |
- Lists all beta-galactosidases. |
-
-
- evidence |
-
- annotation:(type:signal evidence:ECO_0000269)
- (type:mod_res phosphoserine evidence:ECO_0000269)
- annotation:(type:function AND evidence:ECO_0000255)
- |
- Lists all entries with:
-
- - a signal sequence whose positions have been
- experimentally proven
- - experimentally proven phosphoserine sites
- - a function manually asserted according to rules
-
- |
-
-
- family |
- family:serpin |
- Lists all entries belonging to the Serpin family of
- proteins. |
-
-
- fragment |
- fragment:yes |
- Lists all entries with an incomplete sequence. |
-
-
-
- gene |
- gene:HSPC233 |
- Lists all entries for proteins encoded by gene HSPC233. |
-
-
- go |
-
- go:cytoskeleton go:0015629
- |
- Lists all entries associated with:
-
- - a GO term containing the word "cytoskeleton"
- - the GO term Actin cytoskeleton and any subclasses
-
- |
-
-
- host |
-
- host:mouse host:10090 host:40674
- |
- Lists all entries for viruses infecting:
-
- - organisms with a name containing the word "mouse"
- - Mus musculus (Mouse)
- - all mammals (all taxa classified under the taxonomy
- node for Mammalia)
-
- |
-
-
- id |
- id:P00750 |
- Returns the entry with the primary accession number
- P00750. |
-
-
- inn |
- inn:Anakinra |
- Lists all entries whose "International Nonproprietary
- Name" is Anakinra. |
-
-
- interactor |
- interactor:P00520 |
- Lists all entries describing interactions with the
- protein described by entry P00520. |
-
-
- keyword |
- keyword:toxin |
- Lists all entries associated with the keyword Toxin. |
-
-
- length |
- length:[500 TO 700] |
- Lists all entries describing sequences of length between
- 500 and 700 residues. |
-
-
- lineage |
- |
- This field is a synonym for the field taxonomy .
- |
-
-
- mass |
- mass:[500000 TO *] |
- Lists all entries describing sequences with a mass of at
- least 500,000 Da. |
-
-
- method |
-
- method:maldi method:xray
- |
- Lists all entries for proteins identified by:
- matrix-assisted laser desorption/ionization (MALDI),
- crystallography (X-Ray). The method field searches
- names of physico-chemical identification methods in the
- 'Biophysicochemical properties' subsection of the 'Function'
- section, the 'Publications' and 'Cross-references' sections.
- |
-
-
- mnemonic |
- mnemonic:ATP6_HUMAN |
- Lists all entries with entry name (ID) ATP6_HUMAN.
- Searches also obsolete entry names. |
-
-
- modified |
-
- modified:[20120101 TO 20120301] reviewed:yes AND
- modified:[current TO *]
- |
- Lists all entries that were last modified between January
- and March 2012. Lists all UniProtKB/Swiss-Prot entries
- modified in the last release.
- |
-
-
- name |
- name:"prion protein" |
- Lists all entries for prion proteins. |
-
-
- organelle |
- organelle:Mitochondrion |
- Lists all entries for proteins encoded by a gene of the
- mitochondrial chromosome. |
-
-
- organism |
-
- organism:"Ovis aries" organism:9940
- organism:sheep
- |
- Lists all entries for proteins expressed in sheep (first
- 2 examples) and organisms whose name contains the term "sheep".
- |
-
-
-
- plasmid |
- plasmid:ColE1 |
- Lists all entries for proteins encoded by a gene of
- plasmid ColE1. |
-
-
- proteome |
- proteome:UP000005640 |
- Lists all entries from the human proteome. |
-
-
- proteomecomponent |
- proteomecomponent:"chromosome 1" and
- organism:9606 |
- Lists all entries from the human chromosome 1. |
-
-
- replaces |
- replaces:P02023 |
- Lists all entries that were created from a merge with
- entry P02023. |
-
-
- reviewed |
- reviewed:yes |
- Lists all UniProtKB/Swiss-Prot entries. |
-
-
- scope |
- scope:mutagenesis |
- Lists all entries containing a reference that was used to
- gather information about mutagenesis. |
-
-
- sequence |
- sequence:P05067-9 |
- Lists all entries containing a link to isoform 9 of the
- sequence described in entry P05067. Allows searching by specific
- sequence identifier. |
-
-
- sequence_modified |
-
- sequence_modified:[20120101 TO 20120301] reviewed:yes
- AND sequence_modified:[current TO *]
- |
- Lists all entries whose sequences were last modified
- between January and March 2012. Lists all
- UniProtKB/Swiss-Prot entries whose sequences were modified in
- the last release.
- |
-
-
- source |
- source:intact |
- Lists all entries containing a GO term whose annotation
- source is the IntAct database. |
-
-
- strain |
- strain:wistar |
- Lists all entries containing a reference relevant to
- strain wistar. |
-
-
- taxonomy |
- taxonomy:40674 |
- Lists all entries for proteins expressed in Mammals. This
- field is used to retrieve entries for all organisms classified
- below a given taxonomic node taxonomy classification). |
-
-
- tissue |
- tissue:liver |
- Lists all entries containing a reference describing the
- protein sequence obtained from a clone isolated from liver. |
-
-
- web |
- web:wikipedia |
- Lists all entries for proteins that are described in
- Wikipedia. |
-
-