Skip to content

Commit 5734bde

Browse files
committed
Merge branch 'master' into pr/ewels/6044
2 parents 76adbc4 + 548c87b commit 5734bde

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1065
-407
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
.node-nextflow*
99
.devcontainer
1010
.vscode/*
11+
.lineage/
1112
*/*/bin/*
1213
**/build/**
1314
build/**

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
25.03.1-edge
1+
25.04.0

changelog.txt

+45
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,50 @@
11
NEXTFLOW CHANGE-LOG
22
===================
3+
24.04.0 - 8 May 2025
4+
- Add Support for Google Batch network tags (#5951) [d6e4d6c2]
5+
- Add Trace observer v2 (#6014) [c4437c1a]
6+
- Add allowed plugins list (#6049) [e22882e3]
7+
- Add azure.batch.jobMaxWallClockTime config option (#5996) [74963fdc]
8+
- Add config error checking to `run` command (#5998) [b0191fa4]
9+
- Add lineage to gitignore [02e1a542]
10+
- Add plugin create command (#6032) [68865f7f]
11+
- Add socketTimeoutException to retryable condition [b676e996]
12+
- Add support for Java 24 [a47ceefe]
13+
- Add timezone to lineage list timestamp [77736b55]
14+
- Add verbose AWS Batch job cleanup logging [504bd2df]
15+
- Add Support downloading plugins from OCI registries (#6016) [b41c65d5]
16+
- Add Support prefetching plugins metadata from plugins registry (#5887) [37d433d8]
17+
- Bring topic channels out of preview (#6030) [4b1b008b]
18+
- Data Lineage quick fixes (#6045) [f3cee76b]
19+
- Data Lineage workflow outputs fixes (#6041) [2cb49d08]
20+
- Data Lineage documentation (#5999) [c0bfc092]
21+
- Data Lineage programmatic API (#6003) [85b9d00d]
22+
- Fix NPE when params value is null [c7316eaf]
23+
- Fix `lineage find` command arguments validation (#6034) [375dc17c]
24+
- Fix concurrent modification error in `lint` command (#6053) [ccf5705e]
25+
- Fix errors in output fragment (#6020) [f947c9b4]
26+
- Fix false error in workflow output (#5982) [039ad401]
27+
- Fix small formatting inconsistencies (#6024) [c3a47605]
28+
- Fix task progress percentage with failed tasks (#5868) [7e931e83]
29+
- Fix timeout in failing test [cf3e1661]
30+
- Improve plugin template update [d33c5063]
31+
- Improve process creation logging [0121670c]
32+
- Make plugins log less verbose [38410fd0]
33+
- Minor allow null output params and values [53824bb0]
34+
- Refactor lineage annotations as list (#6022) [9280b59e]
35+
- Remove test constructors or mark as TestOnly (#5216) [d4fadd42]
36+
- Replace output `labels` with `label` directive (#6035) [f99bcd33]
37+
- Separate language and runtime reference docs (#6018) [75ad21d0]
38+
- Split standard library docs into multiple pages (#5993) [2f82d236]
39+
- Store lineage meta in root location and default to .lineage path [d1cae3be]
40+
- Use `channel` namespace to access channel factories (#6029) [26557f0c]
41+
- Use the same antlr4 dep as Groovy 4 (#5990) [bd33a76e]
42+
- Bump plugin template v0.1.0 [b54e78f3]
43+
- Bump repository provider connection timeout to 60 secs [39aaa831]
44+
- Bump [email protected] [b7aba74d]
45+
- Bump [email protected] [e8304c1e]
46+
- Bump [email protected] [c5100f6d]
47+
348
24.10.6 - 24 Apr 2025
449
- Add support for Fusion Snapshots (#5954) [76a997a3]
550
- Bump [email protected] [3ddf16fb]

docs/config.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ process {
206206
}
207207
```
208208

209-
The above configuration snippet sets 2 cpus and 4 GB of memory to the processes annotated with a label `foo` and `bar`.
209+
The above configuration snippet requests 2 cpus and 4 GB of memory for processes labeled as `foo` or `bar`.
210210

211211
A process selector can be negated prefixing it with the special character `!`. For example:
212212

docs/reference/env-vars.md

+5
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ The following environment variables control the configuration of the Nextflow ru
145145
`NXF_PID_FILE`
146146
: Name of the file where the process PID is saved when Nextflow is launched in background.
147147

148+
`NXF_PLUGINS_ALLOWED`
149+
: :::{versionadded} 25.04.0
150+
:::
151+
: Comma separated list of plugin IDs that can be used in a workflow executions e.g. `NXF_PLUGINS_ALLOWED=nf-amazon,nf-tower,nf-wave`. Use empty string to disallow all plugins.
152+
148153
`NXF_PLUGINS_DEFAULT`
149154
: Whether to use the default plugins when no plugins are specified in the Nextflow configuration (default: `true`).
150155

modules/nextflow/src/main/groovy/nextflow/config/parser/v2/ConfigParserV2.groovy

+15-10
Original file line numberDiff line numberDiff line change
@@ -130,20 +130,25 @@ class ConfigParserV2 implements ConfigParser {
130130
return Bolts.toConfigObject(target)
131131
}
132132
catch( CompilationFailedException e ) {
133-
final source = compiler.getSource()
134-
final errorListener = new StandardErrorListener('full', false)
135-
println()
136-
errorListener.beforeErrors()
137-
for( final message : compiler.getErrors() ) {
138-
final cause = message.getCause()
139-
final filename = getRelativePath(source, path)
140-
errorListener.onError(cause, filename, source)
141-
}
142-
errorListener.afterErrors()
133+
if( path )
134+
printErrors(path)
143135
throw new ConfigParseException("Config parsing failed", e)
144136
}
145137
}
146138

139+
private void printErrors(Path path) {
140+
final source = compiler.getSource()
141+
final errorListener = new StandardErrorListener('full', false)
142+
println()
143+
errorListener.beforeErrors()
144+
for( final message : compiler.getErrors() ) {
145+
final cause = message.getCause()
146+
final filename = getRelativePath(source, path)
147+
errorListener.onError(cause, filename, source)
148+
}
149+
errorListener.afterErrors()
150+
}
151+
147152
private String getRelativePath(SourceUnit source, Path path) {
148153
final uri = source.getSource().getURI()
149154
return path.getParent().relativize(Path.of(uri)).toString()

modules/nextflow/src/main/groovy/nextflow/processor/TaskConfig.groovy

-1
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,6 @@ class TaskConfig extends LazyMap implements Cloneable {
555555
if( code == null )
556556
return defValue
557557

558-
log.warn1 "The `when` process section is deprecated -- use conditional logic in the calling workflow instead"
559558
String source = null
560559
try {
561560
if( code instanceof Closure ) {

modules/nextflow/src/main/groovy/nextflow/processor/TaskProcessor.groovy

-2
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,6 @@ class TaskProcessor {
308308
this.ownerScript = script
309309
this.config = config
310310
this.taskBody = taskBody
311-
if( taskBody.isShell )
312-
log.warn1 "The `shell` process section is deprecated -- use the `script` section instead"
313311
this.name = name
314312
this.maxForks = config.maxForks && config.maxForks>0 ? config.maxForks as int : 0
315313
this.forksCount = maxForks ? new LongAdder() : null

modules/nextflow/src/main/groovy/nextflow/scm/AssetManager.groovy

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import groovy.transform.TupleConstructor
2929
import groovy.util.logging.Slf4j
3030
import nextflow.cli.HubOptions
3131
import nextflow.config.Manifest
32-
import nextflow.config.parser.v1.ConfigParserV1
32+
import nextflow.config.ConfigParserFactory
3333
import nextflow.exception.AbortOperationException
3434
import nextflow.exception.AmbiguousPipelineNameException
3535
import nextflow.script.ScriptFile
@@ -455,11 +455,11 @@ class AssetManager {
455455
}
456456

457457
if( text ) try {
458-
def config = new ConfigParserV1().setIgnoreIncludes(true).setStrict(false).parse(text)
458+
def config = ConfigParserFactory.create().setIgnoreIncludes(true).setStrict(false).parse(text)
459459
result = (ConfigObject)config.manifest
460460
}
461461
catch( Exception e ) {
462-
throw new AbortOperationException("Project config file is malformed -- Cause: ${e.message ?: e}", e)
462+
log.warn "Cannot read project manifest -- Cause: ${e.message ?: e}"
463463
}
464464

465465
// by default return an empty object

modules/nextflow/src/main/groovy/nextflow/scm/RepositoryProvider.groovy

-1
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@ abstract class RepositoryProvider {
316316
return bytes ? new String(bytes) : null
317317
}
318318

319-
320319
/**
321320
* Validate the repository for the specified file.
322321
* It tries to read the content of the specified file throwing an {@link AbortOperationException} if it does not exist

modules/nextflow/src/main/groovy/nextflow/trace/AnsiLogObserver.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -475,8 +475,8 @@ class AnsiLogObserver implements TraceObserver {
475475
term.a(Attribute.INTENSITY_FAINT).a(", cached: $stats.cached").reset()
476476
if( stats.stored )
477477
term.a(", stored: $stats.stored")
478-
if( stats.failed )
479-
term.a(", failed: $stats.failed")
478+
if( stats.ignored )
479+
term.a(", ignored: $stats.ignored")
480480
if( stats.retries )
481481
term.a(", retries: $stats.retries")
482482
// Show red cross ('✘') or green tick ('✔') according to status

modules/nextflow/src/main/groovy/nextflow/trace/ProgressRecord.groovy

+6-4
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class ProgressRecord implements Cloneable {
3838
int running // number of tasks whose execution started
3939
int succeeded // number of tasks whose execution completed successfully
4040
int cached // number of tasks whose execution
41-
int failed
41+
int failed // number of failed tasks -- includes ignored and retried
4242
int aborted
4343
int stored
4444
int ignored
@@ -61,13 +61,15 @@ class ProgressRecord implements Cloneable {
6161
this.taskName = processName
6262
}
6363

64+
// failed tasks that were not retried are included in the total count
6465
int getTotalCount() {
65-
pending+ submitted+ running+
66-
succeeded+ failed+ cached+ stored + aborted
66+
pending + submitted + running +
67+
succeeded + failed - retries + cached + stored + aborted
6768
}
6869

70+
// only failed tasks that were ignored are included in the completed count
6971
int getCompletedCount() {
70-
succeeded+ failed+ cached+ stored
72+
succeeded + ignored + cached + stored
7173
}
7274

7375
@Override

modules/nextflow/src/main/groovy/nextflow/trace/WorkflowStats.groovy

+16-7
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ class WorkflowStats implements Cloneable {
9797
x >= 0 ? x : 0
9898
}
9999

100+
int getTotalCount() {
101+
gtz(succeededCount + cachedCount + ignoredCount + effectiveFailedCount + abortedCount)
102+
}
103+
100104
String getSucceedCountFmt() {
101105
INTEGER_FMT.format(gtz(succeededCount))
102106
}
@@ -114,23 +118,23 @@ class WorkflowStats implements Cloneable {
114118
}
115119

116120
float getSucceedPct() {
117-
int tot = gtz(succeededCount + cachedCount + ignoredCount + failedCount)
121+
int tot = getTotalCount()
118122
tot ? Math.round(succeededCount / tot * 10000.0 as float) / 100.0 as float : 0
119123
}
120124

121125
float getCachedPct() {
122-
def tot = gtz(succeededCount + cachedCount + ignoredCount + failedCount)
126+
int tot = getTotalCount()
123127
tot ? Math.round(gtz(cachedCount) / tot * 10000.0 as float) / 100.0 as float : 0
124128
}
125129

126130
float getIgnoredPct() {
127-
def tot = gtz(succeededCount + cachedCount + ignoredCount + failedCount)
131+
int tot = getTotalCount()
128132
tot ? Math.round(gtz(ignoredCount) / tot * 10000.0 as float) / 100.0 as float : 0
129133
}
130134

131-
float getFailedPct() {
132-
def tot = gtz(succeededCount + cachedCount + ignoredCount + failedCount)
133-
tot ? Math.round(gtz(failedCount) / tot * 10000.0 as float) / 100.0 as float : 0
135+
float getEffectiveFailedPct() {
136+
int tot = getTotalCount()
137+
tot ? Math.round(gtz(effectiveFailedCount) / tot * 10000.0 as float) / 100.0 as float : 0
134138
}
135139

136140
protected Duration makeDuration(long value) {
@@ -164,10 +168,15 @@ class WorkflowStats implements Cloneable {
164168
int getSucceededCount() { gtz(succeededCount) }
165169

166170
/**
167-
* @return Failed tasks count
171+
* @return Failed tasks count (includes ignored and retried)
168172
*/
169173
int getFailedCount() { gtz(failedCount) }
170174

175+
/**
176+
* @return "Effective" failed tasks count (excludes ignored and retried)
177+
*/
178+
int getEffectiveFailedCount() { gtz(failedCount - ignoredCount - retriesCount) }
179+
171180
/**
172181
* @return Ignored tasks count
173182
*/
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
build=5943
2-
version=25.03.1-edge
3-
timestamp=1745425182395
4-
commitId=c3bb7a513
1+
build=5944
2+
version=25.04.0
3+
timestamp=1746722511993
4+
commitId=b7aba74da
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
nf-amazon@2.14.0
2-
nf-azure@1.15.0
1+
nf-amazon@2.15.0
2+
nf-azure@1.16.0
33
44
55
6-
nf-google@1.20.0
6+
nf-google@1.21.0
77
88
99

modules/nextflow/src/main/resources/nextflow/trace/ReportTemplate.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ <h4>Workflow execution completed unsuccessfully!</h4>
145145
<div class="progress" style="height: 1.6rem; margin: 1.2rem auto; border-radius: 0.20rem;">
146146
<div style="width: ${workflow.stats.succeedPct}%" class="progress-bar bg-success" data-toggle="tooltip" data-placement="top" title="$workflow.stats.succeedCount tasks succeeded"><span class="text-truncate">&nbsp; $workflow.stats.succeedCount succeeded &nbsp;</span></div>
147147
<div style="width: ${workflow.stats.cachedPct}%" class="progress-bar bg-secondary" data-toggle="tooltip" data-placement="top" title="$workflow.stats.cachedCount tasks were cached"><span class="text-truncate">&nbsp; $workflow.stats.cachedCount cached &nbsp;</span></div>
148-
<div style="width: ${workflow.stats.ignoredPct}%" class="progress-bar bg-warning" data-toggle="tooltip" data-placement="top" title="$workflow.stats.ignoredCount tasks reported and error and were ignored"><span class="text-truncate">&nbsp; $workflow.stats.ignoredCount ignored &nbsp;</span></div>
149-
<div style="width: ${workflow.stats.failedPct}%" class="progress-bar bg-danger" data-toggle="tooltip" data-placement="top" title="$workflow.stats.failedCount tasks failed"><span class="text-truncate">&nbsp; $workflow.stats.failedCount failed &nbsp;</span></div>
148+
<div style="width: ${workflow.stats.ignoredPct}%" class="progress-bar bg-warning" data-toggle="tooltip" data-placement="top" title="$workflow.stats.ignoredCount tasks failed and were ignored"><span class="text-truncate">&nbsp; $workflow.stats.ignoredCount ignored &nbsp;</span></div>
149+
<div style="width: ${workflow.stats.effectiveFailedPct}%" class="progress-bar bg-danger" data-toggle="tooltip" data-placement="top" title="$workflow.stats.effectiveFailedCount tasks failed"><span class="text-truncate">&nbsp; $workflow.stats.effectiveFailedCount failed ($workflow.stats.retriesCount retries) &nbsp;</span></div>
150150
</div>
151151
</dl>
152152

modules/nextflow/src/test/groovy/nextflow/cli/CmdLineageTest.groovy

+14-15
Original file line numberDiff line numberDiff line change
@@ -227,20 +227,19 @@ class CmdLineageTest extends Specification {
227227
'this is a script',
228228
null,null, null, null, null, [:],[], null)
229229
lidFile5.text = encoder.encode(entry)
230-
final network = """flowchart BT
231-
lid://12345/file.bam@{shape: document, label: "lid://12345/file.bam"}
232-
lid://123987/file.bam@{shape: document, label: "lid://123987/file.bam"}
233-
lid://123987@{shape: process, label: "foo [lid://123987]"}
234-
ggal_gut@{shape: document, label: "ggal_gut"}
235-
lid://45678/output.txt@{shape: document, label: "lid://45678/output.txt"}
236-
lid://45678@{shape: process, label: "bar [lid://45678]"}
237-
238-
lid://123987/file.bam -->lid://12345/file.bam
239-
lid://123987 -->lid://123987/file.bam
240-
ggal_gut -->lid://123987
241-
lid://45678/output.txt -->lid://123987
242-
lid://45678 -->lid://45678/output.txt
243-
"""
230+
final network = """\
231+
flowchart TB
232+
lid://12345/file.bam["lid://12345/file.bam"]
233+
lid://123987/file.bam["lid://123987/file.bam"]
234+
lid://123987(["foo [lid://123987]"])
235+
ggal_gut["ggal_gut"]
236+
lid://45678/output.txt["lid://45678/output.txt"]
237+
lid://45678(["bar [lid://45678]"])
238+
lid://123987/file.bam --> lid://12345/file.bam
239+
lid://123987 --> lid://123987/file.bam
240+
ggal_gut --> lid://123987
241+
lid://45678/output.txt --> lid://123987
242+
lid://45678 --> lid://45678/output.txt""".stripIndent()
244243
final template = MermaidHtmlRenderer.readTemplate()
245244
def expectedOutput = template.replace('REPLACE_WITH_NETWORK_DATA', network)
246245

@@ -256,7 +255,7 @@ class CmdLineageTest extends Specification {
256255

257256
then:
258257
stdout.size() == 1
259-
stdout[0] == "Linage graph for lid://12345/file.bam rendered in ${outputHtml}"
258+
stdout[0] == "Rendered lineage graph for lid://12345/file.bam to ${outputHtml}"
260259
outputHtml.exists()
261260
outputHtml.text == expectedOutput
262261

0 commit comments

Comments
 (0)