From ebb7339c24a1226440f4affbfd7802f9ebd5fb16 Mon Sep 17 00:00:00 2001 From: jorgee Date: Thu, 20 Nov 2025 19:26:07 +0100 Subject: [PATCH 1/4] Fix pull repo with URL characters in revision name Signed-off-by: jorgee --- .../nextflow/scm/AzureRepositoryProvider.groovy | 7 ++++--- .../scm/BitbucketServerRepositoryProvider.groovy | 5 ++++- .../nextflow/scm/GiteaRepositoryProvider.groovy | 7 +++++-- .../nextflow/scm/GithubRepositoryProvider.groovy | 7 +++++-- .../nextflow/scm/GitlabRepositoryProvider.groovy | 11 +++++++---- .../nextflow/scm/AzureRepositoryProviderTest.groovy | 2 ++ .../scm/BitbucketServerRepositoryProviderTest.groovy | 4 ++++ .../nextflow/scm/GiteaRepositoryProviderTest.groovy | 5 ++++- .../nextflow/scm/GithubRepositoryProviderTest.groovy | 5 +++++ .../nextflow/scm/GitlabRepositoryProviderTest.groovy | 5 +++++ 10 files changed, 45 insertions(+), 13 deletions(-) diff --git a/modules/nextflow/src/main/groovy/nextflow/scm/AzureRepositoryProvider.groovy b/modules/nextflow/src/main/groovy/nextflow/scm/AzureRepositoryProvider.groovy index 172a3fe7ff..bbe96757ef 100644 --- a/modules/nextflow/src/main/groovy/nextflow/scm/AzureRepositoryProvider.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/scm/AzureRepositoryProvider.groovy @@ -17,6 +17,7 @@ package nextflow.scm import java.net.http.HttpResponse +import java.nio.charset.StandardCharsets import java.util.regex.Pattern import groovy.transform.CompileDynamic @@ -97,7 +98,7 @@ final class AzureRepositoryProvider extends RepositoryProvider { 'path':path ] as Map if( revision ) { - queryParams['versionDescriptor.version']=revision + queryParams['versionDescriptor.version']=URLEncoder.encode(revision, StandardCharsets.UTF_8) if( COMMIT_REGEX.matcher(revision).matches() ) queryParams['versionDescriptor.versionType'] = 'commit' @@ -203,7 +204,7 @@ final class AzureRepositoryProvider extends RepositoryProvider { ] as Map if( revision ) { - queryParams['versionDescriptor.version'] = revision + queryParams['versionDescriptor.version'] = URLEncoder.encode(revision, StandardCharsets.UTF_8) if( COMMIT_REGEX.matcher(revision).matches() ) queryParams['versionDescriptor.versionType'] = 'commit' } @@ -236,7 +237,7 @@ final class AzureRepositoryProvider extends RepositoryProvider { } if (revision) { - queryParams['versionDescriptor.version'] = revision + queryParams['versionDescriptor.version'] = URLEncoder.encode(revision, StandardCharsets.UTF_8) if (COMMIT_REGEX.matcher(revision).matches()) { queryParams['versionDescriptor.versionType'] = 'commit' } diff --git a/modules/nextflow/src/main/groovy/nextflow/scm/BitbucketServerRepositoryProvider.groovy b/modules/nextflow/src/main/groovy/nextflow/scm/BitbucketServerRepositoryProvider.groovy index 3455988ac3..bad497c688 100644 --- a/modules/nextflow/src/main/groovy/nextflow/scm/BitbucketServerRepositoryProvider.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/scm/BitbucketServerRepositoryProvider.groovy @@ -21,6 +21,9 @@ import groovy.json.JsonSlurper import groovy.transform.Memoized import groovy.util.logging.Slf4j import nextflow.exception.AbortOperationException + +import java.nio.charset.StandardCharsets + /** * Implements a repository provider for the private hosted BitBucket Server service * @@ -73,7 +76,7 @@ final class BitbucketServerRepositoryProvider extends RepositoryProvider { // def result = "${config.endpoint}/rest/api/1.0/projects/${project}/repos/${repository}/raw/${path}" if( revision ) - result += "?at=$revision" + result += "?at=${URLEncoder.encode(revision, StandardCharsets.UTF_8)}" return result } diff --git a/modules/nextflow/src/main/groovy/nextflow/scm/GiteaRepositoryProvider.groovy b/modules/nextflow/src/main/groovy/nextflow/scm/GiteaRepositoryProvider.groovy index 4c93c1427a..03d9d0d471 100644 --- a/modules/nextflow/src/main/groovy/nextflow/scm/GiteaRepositoryProvider.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/scm/GiteaRepositoryProvider.groovy @@ -20,6 +20,9 @@ package nextflow.scm import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.util.logging.Slf4j + +import java.nio.charset.StandardCharsets + /** * Implements a repository provider for Gitea service * @@ -86,7 +89,7 @@ final class GiteaRepositoryProvider extends RepositoryProvider { // note: `ref` is undocumented def result = "${config.endpoint}/repos/$project/raw/$path" if( revision ) - result += "?ref=$revision" + result += "?ref=${URLEncoder.encode(revision, StandardCharsets.UTF_8)}" return result } @@ -118,7 +121,7 @@ final class GiteaRepositoryProvider extends RepositoryProvider { /** {@inheritDoc} */ @Override List listDirectory(String path, int depth) { - final branch = revision ?: "master" + final branch = URLEncoder.encode(revision ?: "master", StandardCharsets.UTF_8) // Normalize path using base class helper final dirPath = normalizePath(path) diff --git a/modules/nextflow/src/main/groovy/nextflow/scm/GithubRepositoryProvider.groovy b/modules/nextflow/src/main/groovy/nextflow/scm/GithubRepositoryProvider.groovy index d40eea2ba9..4755a46c16 100644 --- a/modules/nextflow/src/main/groovy/nextflow/scm/GithubRepositoryProvider.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/scm/GithubRepositoryProvider.groovy @@ -22,6 +22,8 @@ import groovy.transform.Memoized import groovy.util.logging.Slf4j import nextflow.SysEnv +import java.nio.charset.StandardCharsets + /** * Implements a repository provider for GitHub service * @@ -69,7 +71,7 @@ class GithubRepositoryProvider extends RepositoryProvider { // def result = "${config.endpoint}/repos/$project/contents/$path" if( revision ) - result += "?ref=$revision" + result += "?ref=${URLEncoder.encode(revision, StandardCharsets.UTF_8)}" return result } @@ -205,7 +207,8 @@ class GithubRepositoryProvider extends RepositoryProvider { if (revision) { // Try to resolve the revision to a commit SHA try { - Map ref = invokeAndParseResponse("${config.endpoint}/repos/$project/git/refs/heads/$revision") + + Map ref = invokeAndParseResponse("${config.endpoint}/repos/$project/git/refs/heads/${URLEncoder.encode(revision, StandardCharsets.UTF_8)}") Map object = ref.get('object') as Map return object.get('sha') as String } catch (Exception e) { diff --git a/modules/nextflow/src/main/groovy/nextflow/scm/GitlabRepositoryProvider.groovy b/modules/nextflow/src/main/groovy/nextflow/scm/GitlabRepositoryProvider.groovy index 7de273ebec..68aed44da2 100644 --- a/modules/nextflow/src/main/groovy/nextflow/scm/GitlabRepositoryProvider.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/scm/GitlabRepositoryProvider.groovy @@ -18,6 +18,9 @@ package nextflow.scm import groovy.json.JsonSlurper import groovy.util.logging.Slf4j + +import java.nio.charset.StandardCharsets + /** * Implements a repository provider for GitHub service * @@ -94,8 +97,8 @@ class GitlabRepositoryProvider extends RepositoryProvider { // see // https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository // - final ref = revision ?: getDefaultBranch() - final encodedPath = URLEncoder.encode(path.stripStart('/'),'utf-8') + final ref = URLEncoder.encode(revision ?: getDefaultBranch(), StandardCharsets.UTF_8) + final encodedPath = URLEncoder.encode(path.stripStart('/'), StandardCharsets.UTF_8) return "${config.endpoint}/api/v4/projects/${getProjectName()}/repository/files/${encodedPath}?ref=${ref}" } @@ -128,9 +131,9 @@ class GitlabRepositoryProvider extends RepositoryProvider { /** {@inheritDoc} */ @Override List listDirectory(String path, int depth) { - final ref = revision ?: getDefaultBranch() + final ref = URLEncoder.encode(revision ?: getDefaultBranch(),StandardCharsets.UTF_8) final normalizedPath = normalizePath(path) - final encodedPath = normalizedPath ? URLEncoder.encode(normalizedPath, 'utf-8') : "" + final encodedPath = normalizedPath ? URLEncoder.encode(normalizedPath, StandardCharsets.UTF_8) : "" // Build the Tree API URL String url = "${config.endpoint}/api/v4/projects/${getProjectName()}/repository/tree" diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy index de52cd4801..a6d7d34708 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy @@ -112,6 +112,8 @@ class AzureRepositoryProviderTest extends Specification { expect: new AzureRepositoryProvider('t-neumann/hello', obj).setRevision("a-branch").getContentUrl('main.nf') == 'https://dev.azure.com/t-neumann/hello/_apis/git/repositories/hello/items?download=false&includeContent=true&includeContentMetadata=false&api-version=6.0&\$format=json&path=main.nf&versionDescriptor.version=a-branch' + and: + new AzureRepositoryProvider('t-neumann/hello', obj).setRevision("test/branch+with&strangecharacters").getContentUrl('main.nf') == 'https://dev.azure.com/t-neumann/hello/_apis/git/repositories/hello/items?download=false&includeContent=true&includeContentMetadata=false&api-version=6.0&\$format=json&path=main.nf&versionDescriptor.version=test%2Fbranch%2Bwith%26strangecharacters' } /* diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketServerRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketServerRepositoryProviderTest.groovy index 5ac2ec3fff..c7a2df726a 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketServerRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketServerRepositoryProviderTest.groovy @@ -94,6 +94,10 @@ class BitbucketServerRepositoryProviderTest extends Specification { new BitbucketServerRepositoryProvider('pditommaso/hello', obj) .setRevision('foo') .getContentUrl('main.nf') == 'https://bitbucket.server.com/rest/api/1.0/projects/pditommaso/repos/hello/raw/main.nf?at=foo' + and: + new BitbucketServerRepositoryProvider('pditommaso/hello', obj) + .setRevision('test/branch+with&strangecharacters') + .getContentUrl('main.nf') == 'https://bitbucket.server.com/rest/api/1.0/projects/pditommaso/repos/hello/raw/main.nf?at=test%2Fbranch%2Bwith%26strangecharacters' } diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy index cce9716e22..4a4c1fe077 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy @@ -54,7 +54,10 @@ class GiteaRepositoryProviderTest extends Specification { new GiteaRepositoryProvider('pditommaso/hello', obj) .setRevision('12345') .getContentUrl('main.nf') == 'https://gitea.com/api/v1/repos/pditommaso/hello/raw/main.nf?ref=12345' - + and: + new GiteaRepositoryProvider('pditommaso/hello', obj) + .setRevision('test/branch+with&strangecharacters') + .getContentUrl('main.nf') == 'https://gitea.com/api/v1/repos/pditommaso/hello/raw/main.nf?ref=test%2Fbranch%2Bwith%26strangecharacters' } @Unroll diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy index dbb92ed14c..73311b87ab 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy @@ -95,6 +95,11 @@ class GithubRepositoryProviderTest extends Specification { .setRevision('the-commit-id') .getContentUrl('main.nf') == 'https://github.com/repos/pditommaso/hello/contents/main.nf?ref=the-commit-id' + and: + new GithubRepositoryProvider('pditommaso/hello', obj) + .setRevision('test/branch+with&strangecharacters') + .getContentUrl('main.nf') == 'https://github.com/repos/pditommaso/hello/contents/main.nf?ref=test%2Fbranch%2Bwith%26strangecharacters' + } def 'should user github token as creds' () { diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy index 7f4bd1fb86..af60939c9d 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy @@ -134,6 +134,11 @@ class GitlabRepositoryProviderTest extends Specification { .setRevision('the-commit-id') .getContentUrl('main.nf') == 'https://gitlab.com/api/v4/projects/pditommaso%2Fhello/repository/files/main.nf?ref=the-commit-id' + and: + new GitlabRepositoryProvider('pditommaso/hello', obj) + .setRevision('test/branch+with&strangecharacters') + .getContentUrl('main.nf') == 'https://gitlab.com/api/v4/projects/pditommaso/hello/contents/main.nf?ref=test%2Fbranch%2Bwith%26strangecharacters' + and: new GitlabRepositoryProvider('pditommaso/hello', obj) .getContentUrl('conf/extra.conf') == 'https://gitlab.com/api/v4/projects/pditommaso%2Fhello/repository/files/conf%2Fextra.conf?ref=master' From c37fdc877f0667887538e0fa953d8353b40ebb7f Mon Sep 17 00:00:00 2001 From: jorgee Date: Mon, 1 Dec 2025 12:20:18 +0100 Subject: [PATCH 2/4] Add real tests Signed-off-by: jorgee --- .../nextflow/scm/AzureRepositoryProviderTest.groovy | 10 ++++++++++ .../scm/BitbucketRepositoryProviderTest.groovy | 12 ++++++++++++ .../nextflow/scm/GiteaRepositoryProviderTest.groovy | 7 +++++++ .../nextflow/scm/GithubRepositoryProviderTest.groovy | 8 ++++++++ .../nextflow/scm/GitlabRepositoryProviderTest.groovy | 9 ++++++++- 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy index 9b3dc9addc..467cbd035c 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy @@ -228,6 +228,16 @@ class AzureRepositoryProviderTest extends Specification { def result = repo.readText('file-on-dev.txt') then: result=='hello\n' + + when: + // uses repo at + // https://pditommaso.visualstudio.com/nf-azure-repo/_git/nf-azure-repo + repo = new AzureRepositoryProvider('pditommaso/nf-azure-repo', config) + repo.revision = 'test/branch+with&special-chars' + result = repo.readText('file-on-dev.txt') + then: + result=='hello\n' + } @IgnoreIf({System.getenv('NXF_SMOKE')}) diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy index d1789f5f3e..7985ec3b6a 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy @@ -123,6 +123,10 @@ class BitbucketRepositoryProviderTest extends Specification { .setRevision('test/tag/v2') .getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/8f849beceb2ea479ef836809ca33d3daeeed25f9/main.nf' + and: + new BitbucketRepositoryProvider('pditommaso/tutorial', config) + .setRevision('test/branch+with&special-chars') + .getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/8f849beceb2ea479ef836809ca33d3daeeed25f9/main.nf' } @Requires( { System.getenv('NXF_BITBUCKET_ACCESS_TOKEN') } ) @@ -171,6 +175,14 @@ class BitbucketRepositoryProviderTest extends Specification { then: !data.contains('world') data.contains('mundo') + + when: + repo.setRevision('test/branch+with&special-chars') + and: + data = repo.readText('main.nf') + then: + data.contains('world') + !data.contains('WORLD') } @Unroll diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy index 4a4c1fe077..f7889a86ef 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/GiteaRepositoryProviderTest.groovy @@ -95,6 +95,13 @@ class GiteaRepositoryProviderTest extends Specification { // result = repo.readText('README.md') // then: // result.contains("foo branch") + + when: + repo = new GiteaRepositoryProvider('pditommaso/test-hello', config) + repo.setRevision('test/branch+with&special-chars') + result = repo.readText('README.md') + then: + result.contains('Basic Nextflow script') } @IgnoreIf({System.getenv('NXF_SMOKE')}) diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy index 73311b87ab..a06a1b2374 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/GithubRepositoryProviderTest.groovy @@ -52,6 +52,14 @@ class GithubRepositoryProviderTest extends Specification { def result = repo.readText('main.nf') then: result.trim().startsWith('#!/usr/bin/env nextflow') + + //Read from branch + when: + repo.setRevision('test/branch+with&strangecharacters') + result = repo.readText('/test/branch_name') + then: + result.trim().startsWith('test/branch+with&strangecharacters') + } @Requires({System.getenv('NXF_GITHUB_ACCESS_TOKEN')}) diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy index af60939c9d..a770ea750b 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/GitlabRepositoryProviderTest.groovy @@ -77,6 +77,13 @@ class GitlabRepositoryProviderTest extends Specification { def result = repo.readText('main.nf') then: result.trim().startsWith('#!/usr/bin/env nextflow') + + when: + repo = new GitlabRepositoryProvider('pditommaso/hello', config) + repo.setRevision('test/branch+with&special-chars') + result = repo.readText('main.nf') + then: + result.trim().startsWith('#!/usr/bin/env nextflow') } @Requires({System.getenv('NXF_GITLAB_ACCESS_TOKEN')}) @@ -137,7 +144,7 @@ class GitlabRepositoryProviderTest extends Specification { and: new GitlabRepositoryProvider('pditommaso/hello', obj) .setRevision('test/branch+with&strangecharacters') - .getContentUrl('main.nf') == 'https://gitlab.com/api/v4/projects/pditommaso/hello/contents/main.nf?ref=test%2Fbranch%2Bwith%26strangecharacters' + .getContentUrl('main.nf') == 'https://gitlab.com/api/v4/projects/pditommaso%2Fhello/repository/files/main.nf?ref=test%2Fbranch%2Bwith%26strangecharacters' and: new GitlabRepositoryProvider('pditommaso/hello', obj) From 866d59a137429ae68274275eadfd159e295e4660 Mon Sep 17 00:00:00 2001 From: jorgee Date: Mon, 1 Dec 2025 12:38:49 +0100 Subject: [PATCH 3/4] fix tests Signed-off-by: jorgee --- .../nextflow/scm/AzureRepositoryProviderTest.groovy | 9 +++++---- .../nextflow/scm/BitbucketRepositoryProviderTest.groovy | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy index 467cbd035c..3574d8013a 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/AzureRepositoryProviderTest.groovy @@ -135,6 +135,8 @@ class AzureRepositoryProviderTest extends Specification { def result = repo.readText('main.nf') then: result == 'println "Hello from Azure repos!"' + + } @IgnoreIf({System.getenv('NXF_SMOKE')}) @@ -230,13 +232,12 @@ class AzureRepositoryProviderTest extends Specification { result=='hello\n' when: - // uses repo at - // https://pditommaso.visualstudio.com/nf-azure-repo/_git/nf-azure-repo + // check revision with special branches repo = new AzureRepositoryProvider('pditommaso/nf-azure-repo', config) repo.revision = 'test/branch+with&special-chars' - result = repo.readText('file-on-dev.txt') + result = repo.readText('main.nf') then: - result=='hello\n' + result == 'println "Hello from Azure repos!"' } diff --git a/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy b/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy index 7985ec3b6a..e0c342ccc3 100644 --- a/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy @@ -126,7 +126,7 @@ class BitbucketRepositoryProviderTest extends Specification { and: new BitbucketRepositoryProvider('pditommaso/tutorial', config) .setRevision('test/branch+with&special-chars') - .getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/8f849beceb2ea479ef836809ca33d3daeeed25f9/main.nf' + .getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/755ba829cbc4f28dcb3c16b9dcc1c49c7ee47ff5/main.nf' } @Requires( { System.getenv('NXF_BITBUCKET_ACCESS_TOKEN') } ) From a07eecab568da8b783536a83c5ced32969d3dcd9 Mon Sep 17 00:00:00 2001 From: Paolo Di Tommaso Date: Thu, 4 Dec 2025 16:48:02 +0100 Subject: [PATCH 4/4] [e2e prod] test Signed-off-by: Paolo Di Tommaso