diff --git a/CHANGELOG.md b/CHANGELOG.md
index dfe97f4fa..242eb9a0f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@
- Fixed condition for `awsfulltest` to run ([#3203](https://github.com/nf-core/tools/pull/3203))
- Fix too many empty lines added by jinja ([#3204](https://github.com/nf-core/tools/pull/3204) and [#3206](https://github.com/nf-core/tools/pull/3206))
- Fix header blocks in local subworkflow including git merge marker-like strings ([#3201](https://github.com/nf-core/tools/pull/3201))
+- Update included subworkflows and modules ([#3208](https://github.com/nf-core/tools/pull/3208))
## [v3.0.0 - Titanium Tapir](https://github.com/nf-core/tools/releases/tag/3.0.0) - [2024-10-08]
diff --git a/nf_core/pipeline-template/modules.json b/nf_core/pipeline-template/modules.json
index 9bc344e7d..fa4651ee1 100644
--- a/nf_core/pipeline-template/modules.json
+++ b/nf_core/pipeline-template/modules.json
@@ -13,7 +13,7 @@
}{% endif %}{%- if multiqc %}{% if fastqc %},{% endif %}
"multiqc": {
"branch": "master",
- "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1",
+ "git_sha": "b8d36829fa84b6e404364abff787e8b07f6d058c",
"installed_by": ["modules"]
}
{%- endif %}
@@ -23,12 +23,12 @@
"nf-core": {
"utils_nextflow_pipeline": {
"branch": "master",
- "git_sha": "d20fb2a9cc3e2835e9d067d1046a63252eb17352",
+ "git_sha": "9d05360da397692321d377b6102d2fb22507c6ef",
"installed_by": ["subworkflows"]
},
"utils_nfcore_pipeline": {
"branch": "master",
- "git_sha": "2fdce49d30c0254f76bc0f13c55c17455c1251ab",
+ "git_sha": "772684d9d66f37b650c8ba5146ac1ee3ecba2acb",
"installed_by": ["subworkflows"]
}{% if nf_schema %},
"utils_nfschema_plugin": {
diff --git a/nf_core/pipeline-template/modules/nf-core/multiqc/environment.yml b/nf_core/pipeline-template/modules/nf-core/multiqc/environment.yml
index f1cd99b07..6f5b867b7 100644
--- a/nf_core/pipeline-template/modules/nf-core/multiqc/environment.yml
+++ b/nf_core/pipeline-template/modules/nf-core/multiqc/environment.yml
@@ -2,4 +2,4 @@ channels:
- conda-forge
- bioconda
dependencies:
- - bioconda::multiqc=1.24.1
+ - bioconda::multiqc=1.25.1
diff --git a/nf_core/pipeline-template/modules/nf-core/multiqc/main.nf b/nf_core/pipeline-template/modules/nf-core/multiqc/main.nf
index b9ccebdbb..9724d2f34 100644
--- a/nf_core/pipeline-template/modules/nf-core/multiqc/main.nf
+++ b/nf_core/pipeline-template/modules/nf-core/multiqc/main.nf
@@ -3,8 +3,8 @@ process MULTIQC {
conda "${moduleDir}/environment.yml"
container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
- 'https://depot.galaxyproject.org/singularity/multiqc:1.25--pyhdfd78af_0' :
- 'biocontainers/multiqc:1.25--pyhdfd78af_0' }"
+ 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' :
+ 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }"
input:
path multiqc_files, stageAs: "?/*"
diff --git a/nf_core/pipeline-template/modules/nf-core/multiqc/tests/main.nf.test.snap b/nf_core/pipeline-template/modules/nf-core/multiqc/tests/main.nf.test.snap
index b779e4692..2fcbb5ff7 100644
--- a/nf_core/pipeline-template/modules/nf-core/multiqc/tests/main.nf.test.snap
+++ b/nf_core/pipeline-template/modules/nf-core/multiqc/tests/main.nf.test.snap
@@ -2,14 +2,14 @@
"multiqc_versions_single": {
"content": [
[
- "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd"
+ "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916"
]
],
"meta": {
- "nf-test": "0.8.4",
- "nextflow": "24.04.2"
+ "nf-test": "0.9.0",
+ "nextflow": "24.04.4"
},
- "timestamp": "2024-07-10T12:41:34.562023"
+ "timestamp": "2024-10-02T17:51:46.317523"
},
"multiqc_stub": {
"content": [
@@ -17,25 +17,25 @@
"multiqc_report.html",
"multiqc_data",
"multiqc_plots",
- "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd"
+ "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916"
]
],
"meta": {
- "nf-test": "0.8.4",
- "nextflow": "24.04.2"
+ "nf-test": "0.9.0",
+ "nextflow": "24.04.4"
},
- "timestamp": "2024-07-10T11:27:11.933869532"
+ "timestamp": "2024-10-02T17:52:20.680978"
},
"multiqc_versions_config": {
"content": [
[
- "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd"
+ "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916"
]
],
"meta": {
- "nf-test": "0.8.4",
- "nextflow": "24.04.2"
+ "nf-test": "0.9.0",
+ "nextflow": "24.04.4"
},
- "timestamp": "2024-07-10T11:26:56.709849369"
+ "timestamp": "2024-10-02T17:52:09.185842"
}
-}
+}
\ No newline at end of file
diff --git a/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
index 28e32b200..2b0dc67a6 100644
--- a/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
+++ b/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
@@ -3,13 +3,12 @@
//
/*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SUBWORKFLOW DEFINITION
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
workflow UTILS_NEXTFLOW_PIPELINE {
-
take:
print_version // boolean: print version
dump_parameters // boolean: dump parameters
@@ -22,7 +21,7 @@ workflow UTILS_NEXTFLOW_PIPELINE {
// Print workflow version and exit on --version
//
if (print_version) {
- log.info "${workflow.manifest.name} ${getWorkflowVersion()}"
+ log.info("${workflow.manifest.name} ${getWorkflowVersion()}")
System.exit(0)
}
@@ -45,9 +44,9 @@ workflow UTILS_NEXTFLOW_PIPELINE {
}
/*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTIONS
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
//
@@ -72,11 +71,11 @@ def getWorkflowVersion() {
// Dump pipeline parameters to a JSON file
//
def dumpParametersToJSON(outdir) {
- def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')
- def filename = "params_${timestamp}.json"
- def temp_pf = new File(workflow.launchDir.toString(), ".${filename}")
- def jsonStr = groovy.json.JsonOutput.toJson(params)
- temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr)
+ def timestamp = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss')
+ def filename = "params_${timestamp}.json"
+ def temp_pf = new File(workflow.launchDir.toString(), ".${filename}")
+ def jsonStr = groovy.json.JsonOutput.toJson(params)
+ temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr)
nextflow.extension.FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json")
temp_pf.delete()
@@ -91,9 +90,14 @@ def checkCondaChannels() {
try {
def config = parser.load("conda config --show channels".execute().text)
channels = config.channels
- } catch(NullPointerException | IOException e) {
- log.warn "Could not verify conda channel configuration."
- return
+ }
+ catch (NullPointerException e) {
+ log.warn("Could not verify conda channel configuration.")
+ return null
+ }
+ catch (IOException e) {
+ log.warn("Could not verify conda channel configuration.")
+ return null
}
// Check that all channels are present
@@ -106,19 +110,13 @@ def checkCondaChannels() {
required_channels_in_order.eachWithIndex { channel, index ->
if (index < required_channels_in_order.size() - 1) {
- channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index+1]))
+ channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index + 1]))
}
}
if (channels_missing | channel_priority_violation) {
- log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
- " There is a problem with your Conda configuration!\n\n" +
- " You will need to set-up the conda-forge and bioconda channels correctly.\n" +
- " Please refer to https://bioconda.github.io/\n" +
- " The observed channel order is \n" +
- " ${channels}\n" +
- " but the following channel order is required:\n" +
- " ${required_channels_in_order}\n" +
- "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+ log.warn(
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + " Please refer to https://bioconda.github.io/\n" + " The observed channel order is \n" + " ${channels}\n" + " but the following channel order is required:\n" + " ${required_channels_in_order}\n" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+ )
}
}
diff --git a/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
index cbd8495bb..b78273ca4 100644
--- a/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
+++ b/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
@@ -3,13 +3,12 @@
//
/*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SUBWORKFLOW DEFINITION
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
workflow UTILS_NFCORE_PIPELINE {
-
take:
nextflow_cli_args
@@ -22,9 +21,9 @@ workflow UTILS_NFCORE_PIPELINE {
}
/*
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTIONS
-========================================================================================
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
//
@@ -33,12 +32,9 @@ workflow UTILS_NFCORE_PIPELINE {
def checkConfigProvided() {
def valid_config = true as Boolean
if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) {
- log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" +
- "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" +
- " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" +
- " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" +
- " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" +
- "Please refer to the quick start section and usage docs for the pipeline.\n "
+ log.warn(
+ "[${workflow.manifest.name}] You are attempting to run the pipeline without any custom configuration!\n\n" + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + "Please refer to the quick start section and usage docs for the pipeline.\n "
+ )
valid_config = false
}
return valid_config
@@ -49,12 +45,14 @@ def checkConfigProvided() {
//
def checkProfileProvided(nextflow_cli_args) {
if (workflow.profile.endsWith(',')) {
- error "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" +
- "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+ error(
+ "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+ )
}
if (nextflow_cli_args[0]) {
- log.warn "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" +
- "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+ log.warn(
+ "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n"
+ )
}
}
@@ -70,13 +68,7 @@ def workflowCitation() {
manifest_doi.each { doi_ref ->
temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n"
}
- return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" +
- "* The pipeline\n" +
- temp_doi_ref + "\n" +
- "* The nf-core framework\n" +
- " https://doi.org/10.1038/s41587-020-0439-x\n\n" +
- "* Software dependencies\n" +
- " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md"
+ return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + temp_doi_ref + "\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md"
}
//
@@ -102,7 +94,7 @@ def getWorkflowVersion() {
//
def processVersionsFromYAML(yaml_file) {
def yaml = new org.yaml.snakeyaml.Yaml()
- def versions = yaml.load(yaml_file).collectEntries { k, v -> [ k.tokenize(':')[-1], v ] }
+ def versions = yaml.load(yaml_file).collectEntries { k, v -> [k.tokenize(':')[-1], v] }
return yaml.dumpAsMap(versions).trim()
}
@@ -112,8 +104,8 @@ def processVersionsFromYAML(yaml_file) {
def workflowVersionToYAML() {
return """
Workflow:
- $workflow.manifest.name: ${getWorkflowVersion()}
- Nextflow: $workflow.nextflow.version
+ ${workflow.manifest.name}: ${getWorkflowVersion()}
+ Nextflow: ${workflow.nextflow.version}
""".stripIndent().trim()
}
@@ -121,11 +113,7 @@ def workflowVersionToYAML() {
// Get channel of software versions used in pipeline in YAML format
//
def softwareVersionsToYAML(ch_versions) {
- return ch_versions
- .unique()
- .map { version -> processVersionsFromYAML(version) }
- .unique()
- .mix(Channel.of(workflowVersionToYAML()))
+ return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML()))
}
//
@@ -133,25 +121,31 @@ def softwareVersionsToYAML(ch_versions) {
//
def paramsSummaryMultiqc(summary_params) {
def summary_section = ''
- summary_params.keySet().each { group ->
- def group_params = summary_params.get(group) // This gets the parameters of that particular group
- if (group_params) {
- summary_section += "
$group
\n"
- summary_section += " \n"
- group_params.keySet().sort().each { param ->
- summary_section += " - $param
- ${group_params.get(param) ?: 'N/A'}
\n"
+ summary_params
+ .keySet()
+ .each { group ->
+ def group_params = summary_params.get(group)
+ // This gets the parameters of that particular group
+ if (group_params) {
+ summary_section += " ${group}
\n"
+ summary_section += " \n"
+ group_params
+ .keySet()
+ .sort()
+ .each { param ->
+ summary_section += " - ${param}
- ${group_params.get(param) ?: 'N/A'}
\n"
+ }
+ summary_section += "
\n"
}
- summary_section += "
\n"
}
- }
- def yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" as String
- yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n"
- yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
- yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
- yaml_file_text += "plot_type: 'html'\n"
- yaml_file_text += "data: |\n"
- yaml_file_text += "${summary_section}"
+ def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String
+ yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n"
+ yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
+ yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
+ yaml_file_text += "plot_type: 'html'\n"
+ yaml_file_text += "data: |\n"
+ yaml_file_text += "${summary_section}"
return yaml_file_text
}
@@ -199,54 +193,54 @@ def logColours(monochrome_logs=true) {
colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m"
// Regular Colors
- colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m"
- colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m"
- colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m"
- colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m"
- colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m"
- colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m"
- colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m"
- colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m"
+ colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m"
+ colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m"
+ colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m"
+ colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m"
+ colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m"
+ colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m"
+ colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m"
+ colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m"
// Bold
- colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m"
- colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m"
- colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m"
- colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m"
- colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m"
- colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m"
- colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m"
- colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m"
+ colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m"
+ colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m"
+ colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m"
+ colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m"
+ colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m"
+ colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m"
+ colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m"
+ colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m"
// Underline
- colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m"
- colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m"
- colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m"
- colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m"
- colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m"
- colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m"
- colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m"
- colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m"
+ colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m"
+ colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m"
+ colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m"
+ colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m"
+ colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m"
+ colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m"
+ colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m"
+ colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m"
// High Intensity
- colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m"
- colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m"
- colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m"
- colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m"
- colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m"
- colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m"
- colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m"
- colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m"
+ colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m"
+ colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m"
+ colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m"
+ colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m"
+ colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m"
+ colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m"
+ colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m"
+ colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m"
// Bold High Intensity
- colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m"
- colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m"
- colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m"
- colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m"
- colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m"
- colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m"
- colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m"
- colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m"
+ colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m"
+ colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m"
+ colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m"
+ colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m"
+ colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m"
+ colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m"
+ colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m"
+ colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m"
return colorcodes
}
@@ -261,14 +255,15 @@ def attachMultiqcReport(multiqc_report) {
mqc_report = multiqc_report.getVal()
if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) {
if (mqc_report.size() > 1) {
- log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one"
+ log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one")
}
mqc_report = mqc_report[0]
}
}
- } catch (all) {
+ }
+ catch (Exception all) {
if (multiqc_report) {
- log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email"
+ log.warn("[${workflow.manifest.name}] Could not attach MultiQC report to summary email")
}
}
return mqc_report
@@ -280,26 +275,35 @@ def attachMultiqcReport(multiqc_report) {
def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true, multiqc_report=null) {
// Set up the e-mail variables
- def subject = "[$workflow.manifest.name] Successful: $workflow.runName"
+ def subject = "[${workflow.manifest.name}] Successful: ${workflow.runName}"
if (!workflow.success) {
- subject = "[$workflow.manifest.name] FAILED: $workflow.runName"
+ subject = "[${workflow.manifest.name}] FAILED: ${workflow.runName}"
}
def summary = [:]
- summary_params.keySet().sort().each { group ->
- summary << summary_params[group]
- }
+ summary_params
+ .keySet()
+ .sort()
+ .each { group ->
+ summary << summary_params[group]
+ }
def misc_fields = [:]
misc_fields['Date Started'] = workflow.start
misc_fields['Date Completed'] = workflow.complete
misc_fields['Pipeline script file path'] = workflow.scriptFile
misc_fields['Pipeline script hash ID'] = workflow.scriptId
- if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository
- if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId
- if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision
- misc_fields['Nextflow Version'] = workflow.nextflow.version
- misc_fields['Nextflow Build'] = workflow.nextflow.build
+ if (workflow.repository) {
+ misc_fields['Pipeline repository Git URL'] = workflow.repository
+ }
+ if (workflow.commitId) {
+ misc_fields['Pipeline repository Git Commit'] = workflow.commitId
+ }
+ if (workflow.revision) {
+ misc_fields['Pipeline Git branch/tag'] = workflow.revision
+ }
+ misc_fields['Nextflow Version'] = workflow.nextflow.version
+ misc_fields['Nextflow Build'] = workflow.nextflow.build
misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp
def email_fields = [:]
@@ -337,7 +341,7 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi
// Render the sendmail template
def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as nextflow.util.MemoryUnit
- def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ]
+ def smail_fields = [email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes()]
def sf = new File("${workflow.projectDir}/assets/sendmail_template.txt")
def sendmail_template = engine.createTemplate(sf).make(smail_fields)
def sendmail_html = sendmail_template.toString()
@@ -346,30 +350,32 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi
def colors = logColours(monochrome_logs) as Map
if (email_address) {
try {
- if (plaintext_email) { throw new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML') }
+ if (plaintext_email) {
+new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML') }
// Try to send HTML e-mail using sendmail
def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html")
sendmail_tf.withWriter { w -> w << sendmail_html }
- [ 'sendmail', '-t' ].execute() << sendmail_html
- log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-"
- } catch (all) {
+ ['sendmail', '-t'].execute() << sendmail_html
+ log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (sendmail)-")
+ }
+ catch (Exception all) {
// Catch failures and try with plaintext
- def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ]
+ def mail_cmd = ['mail', '-s', subject, '--content-type=text/html', email_address]
mail_cmd.execute() << email_html
- log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-"
+ log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (mail)-")
}
}
// Write summary e-mail HTML to a file
def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html")
output_hf.withWriter { w -> w << email_html }
- nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html");
+ nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html")
output_hf.delete()
// Write summary e-mail TXT to a file
def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt")
output_tf.withWriter { w -> w << email_txt }
- nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt");
+ nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt")
output_tf.delete()
}
@@ -380,12 +386,14 @@ def completionSummary(monochrome_logs=true) {
def colors = logColours(monochrome_logs) as Map
if (workflow.success) {
if (workflow.stats.ignoredCount == 0) {
- log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-"
- } else {
- log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-"
+ log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Pipeline completed successfully${colors.reset}-")
+ }
+ else {
+ log.info("-${colors.purple}[${workflow.manifest.name}]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-")
}
- } else {
- log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-"
+ }
+ else {
+ log.info("-${colors.purple}[${workflow.manifest.name}]${colors.red} Pipeline completed with errors${colors.reset}-")
}
}
@@ -394,21 +402,30 @@ def completionSummary(monochrome_logs=true) {
//
def imNotification(summary_params, hook_url) {
def summary = [:]
- summary_params.keySet().sort().each { group ->
- summary << summary_params[group]
- }
+ summary_params
+ .keySet()
+ .sort()
+ .each { group ->
+ summary << summary_params[group]
+ }
def misc_fields = [:]
- misc_fields['start'] = workflow.start
- misc_fields['complete'] = workflow.complete
- misc_fields['scriptfile'] = workflow.scriptFile
- misc_fields['scriptid'] = workflow.scriptId
- if (workflow.repository) misc_fields['repository'] = workflow.repository
- if (workflow.commitId) misc_fields['commitid'] = workflow.commitId
- if (workflow.revision) misc_fields['revision'] = workflow.revision
- misc_fields['nxf_version'] = workflow.nextflow.version
- misc_fields['nxf_build'] = workflow.nextflow.build
- misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp
+ misc_fields['start'] = workflow.start
+ misc_fields['complete'] = workflow.complete
+ misc_fields['scriptfile'] = workflow.scriptFile
+ misc_fields['scriptid'] = workflow.scriptId
+ if (workflow.repository) {
+ misc_fields['repository'] = workflow.repository
+ }
+ if (workflow.commitId) {
+ misc_fields['commitid'] = workflow.commitId
+ }
+ if (workflow.revision) {
+ misc_fields['revision'] = workflow.revision
+ }
+ misc_fields['nxf_version'] = workflow.nextflow.version
+ misc_fields['nxf_build'] = workflow.nextflow.build
+ misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp
def msg_fields = [:]
msg_fields['version'] = getWorkflowVersion()
@@ -433,13 +450,13 @@ def imNotification(summary_params, hook_url) {
def json_message = json_template.toString()
// POST
- def post = new URL(hook_url).openConnection();
+ def post = new URL(hook_url).openConnection()
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
- post.getOutputStream().write(json_message.getBytes("UTF-8"));
- def postRC = post.getResponseCode();
- if (! postRC.equals(200)) {
- log.warn(post.getErrorStream().getText());
+ post.getOutputStream().write(json_message.getBytes("UTF-8"))
+ def postRC = post.getResponseCode()
+ if (!postRC.equals(200)) {
+ log.warn(post.getErrorStream().getText())
}
}