bitbucket-repository-provider 4.0.1 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -121,9 +121,9 @@ Supported name schemes are
|
|
|
121
121
|
Known environment variables
|
|
122
122
|
|
|
123
123
|
* BITBUCKET_API api
|
|
124
|
-
* BB_TOKEN api token
|
|
125
124
|
* BITBUCKET_TOKEN api token
|
|
126
125
|
* BITBUCKET_USERNAME username
|
|
126
|
+
* BITBUCKET_APP_PASSWORD password
|
|
127
127
|
* BITBUCKET_PASSWORD password
|
|
128
128
|
|
|
129
129
|
### Parameters
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bitbucket-repository-provider",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -31,16 +31,17 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"content-entry": "^5.0.0",
|
|
34
|
+
"fetch-rate-limit-util": "^2.8.1",
|
|
34
35
|
"matching-iterator": "^2.0.4",
|
|
35
36
|
"node-fetch": "^3.2.3",
|
|
36
37
|
"one-time-execution-method": "^2.0.13",
|
|
37
|
-
"repository-provider": "^28.
|
|
38
|
+
"repository-provider": "^28.1.1"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
41
|
"ava": "^4.2.0",
|
|
41
42
|
"c8": "^7.11.2",
|
|
42
43
|
"documentation": "^13.2.5",
|
|
43
|
-
"repository-provider-test-support": "^2.
|
|
44
|
+
"repository-provider-test-support": "^2.1.2",
|
|
44
45
|
"semantic-release": "^19.0.2"
|
|
45
46
|
},
|
|
46
47
|
"engines": {
|
package/src/bitbucket-branch.mjs
CHANGED
|
@@ -25,17 +25,13 @@ export class BitbucketBranch extends Branch {
|
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
fetch(...args) {
|
|
29
|
-
return this.provider.fetch(...args);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
28
|
/**
|
|
33
29
|
* {@link https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/src/%7Bnode%7D/%7Bpath%7D}
|
|
34
30
|
* @param {string} name
|
|
35
31
|
* @return {Promise<ContentEntry>}
|
|
36
32
|
*/
|
|
37
33
|
async entry(name) {
|
|
38
|
-
const res = await this.fetch(
|
|
34
|
+
const res = await this.provider.fetch(
|
|
39
35
|
`repositories/${this.slug}/src/${this.hash}/${name}`
|
|
40
36
|
);
|
|
41
37
|
if(res.ok) {
|
|
@@ -48,13 +44,11 @@ export class BitbucketBranch extends Branch {
|
|
|
48
44
|
* @param patterns
|
|
49
45
|
*/
|
|
50
46
|
async *entries(patterns) {
|
|
51
|
-
const
|
|
47
|
+
const { json } = await this.provider.fetchJSON(
|
|
52
48
|
`repositories/${this.slug}/src/${this.hash}/?max_depth=99`
|
|
53
49
|
);
|
|
54
50
|
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
for (const entry of matcher(res.values, patterns, { name: "path" })) {
|
|
51
|
+
for (const entry of matcher(json.values, patterns, { name: "path" })) {
|
|
58
52
|
yield entry.type === "commit_directory"
|
|
59
53
|
? new BaseCollectionEntry(entry.path)
|
|
60
54
|
: new LazyBufferContentEntry(entry.path, this);
|
|
@@ -78,7 +72,7 @@ export class BitbucketBranch extends Branch {
|
|
|
78
72
|
searchParams.set(u.name, await u.string);
|
|
79
73
|
}
|
|
80
74
|
|
|
81
|
-
return this.fetch(`repositories/${this.slug}/src`, {
|
|
75
|
+
return this.provider.fetch(`repositories/${this.slug}/src`, {
|
|
82
76
|
method: "POST",
|
|
83
77
|
headers: {
|
|
84
78
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
@@ -108,7 +102,7 @@ class LazyBufferContentEntry extends BufferContentEntryMixin(ContentEntry) {
|
|
|
108
102
|
async _buffer() {
|
|
109
103
|
const branch = this.branch;
|
|
110
104
|
|
|
111
|
-
const res = await branch.fetch(
|
|
105
|
+
const res = await branch.provider.fetch(
|
|
112
106
|
`repositories/${branch.slug}/src/${branch.hash}/${this.name}`
|
|
113
107
|
);
|
|
114
108
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fetch from "node-fetch";
|
|
2
2
|
import { replaceWithOneTimeExecutionMethod } from "one-time-execution-method";
|
|
3
|
-
|
|
3
|
+
import { stateActionHandler } from "fetch-rate-limit-util";
|
|
4
4
|
import { MultiGroupProvider } from "repository-provider";
|
|
5
5
|
import { BitbucketBranch } from "./bitbucket-branch.mjs";
|
|
6
6
|
import { BitbucketRepositoryGroup } from "./bitbucket-repository-group.mjs";
|
|
@@ -26,9 +26,9 @@ const domain = "bitbucket.org";
|
|
|
26
26
|
* - owner/repo-name
|
|
27
27
|
* Known environment variables
|
|
28
28
|
* - BITBUCKET_API api
|
|
29
|
-
* - BB_TOKEN api token
|
|
30
29
|
* - BITBUCKET_TOKEN api token
|
|
31
30
|
* - BITBUCKET_USERNAME username
|
|
31
|
+
* - BITBUCKET_APP_PASSWORD password
|
|
32
32
|
* - BITBUCKET_PASSWORD password
|
|
33
33
|
* @param {Object} config
|
|
34
34
|
* @param {string} config.url provider scm base
|
|
@@ -153,27 +153,22 @@ export class BitbucketProvider extends MultiGroupProvider {
|
|
|
153
153
|
* {@link https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories}
|
|
154
154
|
*/
|
|
155
155
|
async initializeRepositories() {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
res.values.map(b => {
|
|
170
|
-
const groupName = b.owner.nickname || b.owner.username;
|
|
171
|
-
this.addRepositoryGroup(groupName, b.owner).addRepository(b.name, b);
|
|
172
|
-
});
|
|
173
|
-
} while (next);
|
|
156
|
+
try {
|
|
157
|
+
let next = "repositories/?role=contributor";
|
|
158
|
+
|
|
159
|
+
do {
|
|
160
|
+
const { json } = await this.fetchJSON(next);
|
|
161
|
+
|
|
162
|
+
next = json.next;
|
|
163
|
+
json.values.map(b => {
|
|
164
|
+
const groupName = b.owner.nickname || b.owner.username;
|
|
165
|
+
this.addRepositoryGroup(groupName, b.owner).addRepository(b.name, b);
|
|
166
|
+
});
|
|
167
|
+
} while (next);
|
|
168
|
+
} catch {}
|
|
174
169
|
}
|
|
175
170
|
|
|
176
|
-
fetch(url, options = {}) {
|
|
171
|
+
fetch(url, options = {}, responseHandler) {
|
|
177
172
|
let authorization;
|
|
178
173
|
|
|
179
174
|
if (this.authentication.username) {
|
|
@@ -199,9 +194,22 @@ export class BitbucketProvider extends MultiGroupProvider {
|
|
|
199
194
|
headers["Content-Type"] = "application/json";
|
|
200
195
|
}
|
|
201
196
|
|
|
202
|
-
return
|
|
203
|
-
|
|
204
|
-
|
|
197
|
+
return stateActionHandler(
|
|
198
|
+
fetch,
|
|
199
|
+
new URL(url, this.api),
|
|
200
|
+
{
|
|
201
|
+
...options,
|
|
202
|
+
headers
|
|
203
|
+
},
|
|
204
|
+
responseHandler,
|
|
205
|
+
undefined,
|
|
206
|
+
(url, ...args) => this.trace(url.toString(), ...args)
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
fetchJSON(url, options) {
|
|
211
|
+
return this.fetch(url, options, async response => {
|
|
212
|
+
return { response, json: await response.json() };
|
|
205
213
|
});
|
|
206
214
|
}
|
|
207
215
|
}
|
|
@@ -31,12 +31,11 @@ export class BitbucketPullRequest extends PullRequest {
|
|
|
31
31
|
let url = `repositories/${repository.slug}/pullrequests${query}`;
|
|
32
32
|
|
|
33
33
|
do {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
url = res.next;
|
|
34
|
+
const { json } = await repository.provider.fetchJSON(url);
|
|
35
|
+
url = json.next;
|
|
37
36
|
|
|
38
|
-
if (
|
|
39
|
-
for (const p of
|
|
37
|
+
if (json.values) {
|
|
38
|
+
for (const p of json.values) {
|
|
40
39
|
const source = await getBranch(p.source);
|
|
41
40
|
|
|
42
41
|
if (filter.source && !filter.source.equals(source)) {
|
|
@@ -73,7 +72,7 @@ export class BitbucketPullRequest extends PullRequest {
|
|
|
73
72
|
|
|
74
73
|
const url = `repositories/${destination.slug}/pullrequests`;
|
|
75
74
|
|
|
76
|
-
const
|
|
75
|
+
const { json } = await destination.provider.fetchJSON(url, {
|
|
77
76
|
method: "POST",
|
|
78
77
|
data: {
|
|
79
78
|
source: {
|
|
@@ -91,8 +90,6 @@ export class BitbucketPullRequest extends PullRequest {
|
|
|
91
90
|
}
|
|
92
91
|
});
|
|
93
92
|
|
|
94
|
-
const json = await res.json();
|
|
95
|
-
|
|
96
93
|
if (json.type === "error" && json.error) {
|
|
97
94
|
throw new Error(json.error.message);
|
|
98
95
|
}
|
|
@@ -109,7 +106,7 @@ export class BitbucketPullRequest extends PullRequest {
|
|
|
109
106
|
*/
|
|
110
107
|
async _merge(method = "merge_commit") {
|
|
111
108
|
const url = `repositories/${this.destination.slug}/pullrequests/${this.number}/merge`;
|
|
112
|
-
return this.destination.fetch(url, {
|
|
109
|
+
return this.destination.provider.fetch(url, {
|
|
113
110
|
type: "a type",
|
|
114
111
|
message: "a message",
|
|
115
112
|
method: "POST",
|
|
@@ -20,7 +20,6 @@ export class BitbucketRepositoryGroup extends RepositoryGroup {
|
|
|
20
20
|
* @return {Repository} newly created repository
|
|
21
21
|
*/
|
|
22
22
|
async createRepository(name, options) {
|
|
23
|
-
//console.log(`repositories/${this.name}/${name}`);
|
|
24
23
|
const response = await this.provider.fetch(
|
|
25
24
|
`repositories/${this.name}/${name}`,
|
|
26
25
|
{
|
|
@@ -32,8 +31,6 @@ export class BitbucketRepositoryGroup extends RepositoryGroup {
|
|
|
32
31
|
}
|
|
33
32
|
);
|
|
34
33
|
|
|
35
|
-
//console.log(response);
|
|
36
|
-
|
|
37
34
|
if (response.ok) {
|
|
38
35
|
return this.addRepository(name, options);
|
|
39
36
|
}
|
|
@@ -53,14 +53,10 @@ export class BitbucketRepository extends Repository {
|
|
|
53
53
|
return `${this.provider.url}/${this.slug}/issues`;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
fetch(...args) {
|
|
57
|
-
return this.provider.fetch(...args);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
56
|
/**
|
|
61
57
|
* {@link https://developer.atlassian.com/cloud/bitbucket/rest/api-group-repositories/#api-repositories-workspace-repo-slug-put}
|
|
62
58
|
*/
|
|
63
|
-
|
|
59
|
+
async update() {
|
|
64
60
|
return this.provider.fetch(`repositories/${this.slug}`, {
|
|
65
61
|
method: "PUT",
|
|
66
62
|
body: JSON.stringify(
|
|
@@ -76,13 +72,11 @@ export class BitbucketRepository extends Repository {
|
|
|
76
72
|
let url = `repositories/${this.slug}/hooks`;
|
|
77
73
|
|
|
78
74
|
do {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
));
|
|
85
|
-
url = res.next;
|
|
75
|
+
const { json } = await this.provider.fetchJSON(url);
|
|
76
|
+
json.values.forEach(h =>
|
|
77
|
+
this.addHook(new this.hookClass(this, h.id, new Set(h.events), h))
|
|
78
|
+
);
|
|
79
|
+
url = json.next;
|
|
86
80
|
} while (url);
|
|
87
81
|
}
|
|
88
82
|
|
|
@@ -90,16 +84,15 @@ export class BitbucketRepository extends Repository {
|
|
|
90
84
|
let url = `repositories/${this.slug}/refs/branches`;
|
|
91
85
|
|
|
92
86
|
do {
|
|
93
|
-
const
|
|
94
|
-
const res = await r.json();
|
|
87
|
+
const { json } = await this.provider.fetchJSON(url);
|
|
95
88
|
|
|
96
|
-
if (
|
|
89
|
+
if (json.type === "error") {
|
|
97
90
|
break;
|
|
98
91
|
}
|
|
99
92
|
|
|
100
|
-
|
|
93
|
+
json.values.forEach(b => this.addBranch(b.name, b.target));
|
|
101
94
|
|
|
102
|
-
url =
|
|
95
|
+
url = json.next;
|
|
103
96
|
} while (url);
|
|
104
97
|
}
|
|
105
98
|
|
|
@@ -112,23 +105,25 @@ export class BitbucketRepository extends Repository {
|
|
|
112
105
|
* @param {string} options.message
|
|
113
106
|
*/
|
|
114
107
|
async createBranch(name, from = this.defaultBranch, options) {
|
|
108
|
+
const branch = this._branches.get(name);
|
|
109
|
+
if (branch) {
|
|
110
|
+
return branch;
|
|
111
|
+
}
|
|
112
|
+
|
|
115
113
|
from = await from;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
114
|
+
|
|
115
|
+
const { json } = await this.provider.fetchJSON(
|
|
116
|
+
`repositories/${this.slug}/refs/branches`,
|
|
117
|
+
{
|
|
118
|
+
method: "POST",
|
|
119
|
+
data: {
|
|
120
|
+
name,
|
|
121
|
+
target: {
|
|
122
|
+
hash: from.hash
|
|
123
|
+
}
|
|
122
124
|
}
|
|
123
125
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if(!res.ok) {
|
|
127
|
-
// TODO handle error
|
|
128
|
-
console.log(res.ok, res.status, res.statusText);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const json = await res.json();
|
|
126
|
+
);
|
|
132
127
|
|
|
133
128
|
return super.addBranch(name, json);
|
|
134
129
|
}
|
|
@@ -139,17 +134,13 @@ export class BitbucketRepository extends Repository {
|
|
|
139
134
|
*/
|
|
140
135
|
async deleteBranch(name) {
|
|
141
136
|
const url = `repositories/${this.slug}/refs/branches/${name}`;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const res = await this.fetch(url, { method: "DELETE" });
|
|
137
|
+
const response = await this.provider.fetch(url, { method: "DELETE" });
|
|
145
138
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
//console.log(p);
|
|
149
|
-
|
|
150
|
-
if(res.ok) {
|
|
151
|
-
return super.deleteBranch(name);
|
|
139
|
+
if(!response.ok) {
|
|
140
|
+
throw new Error(response.statusText);
|
|
152
141
|
}
|
|
142
|
+
|
|
143
|
+
return super.deleteBranch(name);
|
|
153
144
|
}
|
|
154
145
|
}
|
|
155
146
|
|