Skip to content

Commit f711f24

Browse files
tcrespogpditommaso
andauthored
Add support for Bitbucket API token (#6209) [ci fast]
Signed-off-by: Paolo Di Tommaso <[email protected]> Co-authored-by: Paolo Di Tommaso <[email protected]>
1 parent e7c9379 commit f711f24

File tree

5 files changed

+62
-15
lines changed

5 files changed

+62
-15
lines changed

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,37 @@ final class BitbucketRepositoryProvider extends RepositoryProvider {
3939
this.config = config ?: new ProviderConfig('bitbucket')
4040
}
4141

42-
/** {@inheritDoc} */
42+
@Override
43+
protected String[] getAuth() {
44+
return config.token
45+
? new String[] { "Authorization", "Bearer ${config.token}" }
46+
: super.getAuth()
47+
}
48+
49+
@Override
50+
boolean hasCredentials() {
51+
return config.token
52+
? true
53+
: super.hasCredentials()
54+
}
55+
56+
/** {@inheritDoc} */
4357
@Override
4458
String getName() { "BitBucket" }
4559

4660
@Override
4761
String getEndpointUrl() {
48-
"${config.endpoint}/api/2.0/repositories/${project}"
62+
"${config.endpoint}/2.0/repositories/${project}"
4963
}
5064

5165
@Override
5266
String getContentUrl( String path ) {
5367
final ref = revision ? getRefForRevision(revision) : getMainBranch()
54-
return "${config.endpoint}/api/2.0/repositories/$project/src/$ref/$path"
68+
return "${config.endpoint}/2.0/repositories/$project/src/$ref/$path"
5569
}
5670

5771
private String getMainBranchUrl() {
58-
"${config.endpoint}/api/2.0/repositories/$project"
72+
"${config.endpoint}/2.0/repositories/$project"
5973
}
6074

6175
String getMainBranch() {
@@ -87,7 +101,7 @@ final class BitbucketRepositoryProvider extends RepositoryProvider {
87101
}
88102

89103
private String getRefForRevision0(String revision, String type){
90-
final resp = invokeAndParseResponse("${config.endpoint}/api/2.0/repositories/$project/refs/$type/$revision")
104+
final resp = invokeAndParseResponse("${config.endpoint}/2.0/repositories/$project/refs/$type/$revision")
91105
return resp?.target?.hash
92106
}
93107

@@ -117,7 +131,7 @@ final class BitbucketRepositoryProvider extends RepositoryProvider {
117131
@Override
118132
List<TagInfo> getTags() {
119133
final result = new ArrayList<TagInfo>()
120-
final url = "$config.endpoint/api/2.0/repositories/$project/refs/tags"
134+
final url = "$config.endpoint/2.0/repositories/$project/refs/tags"
121135
final mapper = { Map entry -> result.add( new TagInfo(entry.name, entry.target?.hash) ) }
122136
invokeAndResponseWithPaging(url, mapper)
123137
return result
@@ -131,7 +145,7 @@ final class BitbucketRepositoryProvider extends RepositoryProvider {
131145
@Override
132146
List<BranchInfo> getBranches() {
133147
final result = new ArrayList<BranchInfo>()
134-
final url = "$config.endpoint/api/2.0/repositories/$project/refs/branches"
148+
final url = "$config.endpoint/2.0/repositories/$project/refs/branches"
135149
final mapper = { Map entry -> result.add( new BranchInfo(entry.name, entry.target?.hash) ) }
136150
invokeAndResponseWithPaging(url, mapper)
137151
return result

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class ProviderConfig {
8484
case 'bitbucket':
8585
attr.platform = name
8686
if( !attr.server ) attr.server = 'https://bitbucket.org'
87+
if( !attr.endpoint ) attr.endpoint = 'https://api.bitbucket.org'
8788
break
8889

8990
case 'azurerepos':

modules/nextflow/src/test/groovy/nextflow/scm/BitbucketRepositoryProviderTest.groovy

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import spock.lang.IgnoreIf
2121
import spock.lang.Requires
2222
import spock.lang.Specification
2323
import spock.lang.Timeout
24+
import spock.lang.Unroll
2425

2526
@Timeout(30)
2627
@IgnoreIf({System.getenv('NXF_SMOKE')})
@@ -35,7 +36,7 @@ class BitbucketRepositoryProviderTest extends Specification {
3536
when:
3637
def url = new BitbucketRepositoryProvider('pditommaso/tutorial',config).getCloneUrl()
3738
then:
38-
url == "https://${config.user}@bitbucket.org/pditommaso/tutorial.git".toString()
39+
url ==~ /https:\/\/\w+@bitbucket.org\/pditommaso\/tutorial.git/
3940
}
4041

4142
def testGetHomePage() {
@@ -50,11 +51,11 @@ class BitbucketRepositoryProviderTest extends Specification {
5051
def config = new ProviderConfig('bitbucket').setAuth(token)
5152

5253
when:
53-
def repo = new BitbucketRepositoryProvider('pditommaso/tutorial', config)
54+
def repo = new BitbucketRepositoryProvider('pditommaso/secret', config)
5455
def result = repo.readText('main.nf')
5556

5657
then:
57-
result.trim().startsWith('#!/usr/bin/env nextflow')
58+
result.trim() == "println 'Hello from Bitbucket'"
5859
}
5960

6061
@Requires( { System.getenv('NXF_BITBUCKET_ACCESS_TOKEN') } )
@@ -110,17 +111,17 @@ class BitbucketRepositoryProviderTest extends Specification {
110111
expect:
111112
new BitbucketRepositoryProvider('pditommaso/tutorial', config)
112113
.setRevision('test-branch')
113-
.getContentUrl('main.nf') == 'https://bitbucket.org/api/2.0/repositories/pditommaso/tutorial/src/test-branch/main.nf'
114+
.getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/test-branch/main.nf'
114115

115116
and:
116117
new BitbucketRepositoryProvider('pditommaso/tutorial', config)
117118
.setRevision('feature/with-slash')
118-
.getContentUrl('main.nf') == 'https://bitbucket.org/api/2.0/repositories/pditommaso/tutorial/src/a6b825b22d46758cdeb496ae6cf26aef839ace52/main.nf'
119+
.getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/a6b825b22d46758cdeb496ae6cf26aef839ace52/main.nf'
119120

120121
and:
121122
new BitbucketRepositoryProvider('pditommaso/tutorial', config)
122123
.setRevision('test/tag/v2')
123-
.getContentUrl('main.nf') == 'https://bitbucket.org/api/2.0/repositories/pditommaso/tutorial/src/8f849beceb2ea479ef836809ca33d3daeeed25f9/main.nf'
124+
.getContentUrl('main.nf') == 'https://api.bitbucket.org/2.0/repositories/pditommaso/tutorial/src/8f849beceb2ea479ef836809ca33d3daeeed25f9/main.nf'
124125

125126
}
126127

@@ -171,4 +172,35 @@ class BitbucketRepositoryProviderTest extends Specification {
171172
!data.contains('world')
172173
data.contains('mundo')
173174
}
175+
176+
@Unroll
177+
def 'should validate hasCredentials' () {
178+
given:
179+
def provider = new BitbucketRepositoryProvider('pditommaso/tutorial', CONFIG)
180+
181+
expect:
182+
provider.hasCredentials() == EXPECTED
183+
184+
where:
185+
EXPECTED | CONFIG
186+
false | new ProviderConfig('bitbucket')
187+
false | new ProviderConfig('bitbucket').setUser('foo')
188+
true | new ProviderConfig('bitbucket').setUser('foo').setPassword('bar')
189+
true | new ProviderConfig('bitbucket').setToken('xyz')
190+
}
191+
192+
@Unroll
193+
def 'should validate getAuth' () {
194+
given:
195+
def provider = new BitbucketRepositoryProvider('pditommaso/tutorial', CONFIG)
196+
197+
expect:
198+
provider.getAuth() == EXPECTED as String[]
199+
200+
where:
201+
EXPECTED | CONFIG
202+
null | new ProviderConfig('bitbucket')
203+
["Authorization", "Bearer xyz"] | new ProviderConfig('bitbucket').setToken('xyz')
204+
["Authorization", "Basic ${"foo:bar".bytes.encodeBase64()}"] | new ProviderConfig('bitbucket').setUser('foo').setPassword('bar')
205+
}
174206
}

modules/nextflow/src/test/groovy/nextflow/scm/ProviderConfigTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class ProviderConfigTest extends Specification {
9595
then:
9696
config.name == 'bitbucket'
9797
config.server == 'https://bitbucket.org'
98-
config.endpoint == 'https://bitbucket.org'
98+
config.endpoint == 'https://api.bitbucket.org'
9999
config.platform == 'bitbucket'
100100
config.domain == 'bitbucket.org'
101101
}

modules/nextflow/src/test/groovy/nextflow/scm/RepositoryProviderTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class RepositoryProviderTest extends Specification {
4848
provider = RepositoryFactory.newRepositoryProvider(new ProviderConfig('bitbucket'),'project/z')
4949
then:
5050
provider instanceof BitbucketRepositoryProvider
51-
provider.endpointUrl == 'https://bitbucket.org/api/2.0/repositories/project/z'
51+
provider.endpointUrl == 'https://api.bitbucket.org/2.0/repositories/project/z'
5252

5353
when:
5454
provider = RepositoryFactory.newRepositoryProvider(new ProviderConfig('local', [path:'/user/data']),'local/w')

0 commit comments

Comments
 (0)