@red-hat-developer-hub/backstage-plugin-bulk-import-backend 6.2.0 → 6.3.0
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/CHANGELOG.md +12 -0
- package/dist/catalog/catalogHttpClient.cjs.js +1 -0
- package/dist/catalog/catalogHttpClient.cjs.js.map +1 -1
- package/dist/generated/openapidocument.cjs.js +80 -1
- package/dist/generated/openapidocument.cjs.js.map +1 -1
- package/dist/github/githubApiService.cjs.js +5 -4
- package/dist/github/githubApiService.cjs.js.map +1 -1
- package/dist/github/utils/orgUtils.cjs.js +1 -0
- package/dist/github/utils/orgUtils.cjs.js.map +1 -1
- package/dist/github/utils/prUtils.cjs.js +1 -0
- package/dist/github/utils/prUtils.cjs.js.map +1 -1
- package/dist/github/utils/utils.cjs.js +1 -28
- package/dist/github/utils/utils.cjs.js.map +1 -1
- package/dist/gitlab/GitlabAppManager.cjs.js +54 -0
- package/dist/gitlab/GitlabAppManager.cjs.js.map +1 -0
- package/dist/gitlab/gitlabApiService.cjs.js +558 -0
- package/dist/gitlab/gitlabApiService.cjs.js.map +1 -0
- package/dist/gitlab/utils/glUtils.cjs.js +15 -0
- package/dist/gitlab/utils/glUtils.cjs.js.map +1 -0
- package/dist/gitlab/utils/orgUtils.cjs.js +72 -0
- package/dist/gitlab/utils/orgUtils.cjs.js.map +1 -0
- package/dist/gitlab/utils/prUtils.cjs.js +72 -0
- package/dist/gitlab/utils/prUtils.cjs.js.map +1 -0
- package/dist/gitlab/utils/repoUtils.cjs.js +200 -0
- package/dist/gitlab/utils/repoUtils.cjs.js.map +1 -0
- package/dist/gitlab/utils/utils.cjs.js +130 -0
- package/dist/gitlab/utils/utils.cjs.js.map +1 -0
- package/dist/helpers/utils.cjs.js +37 -0
- package/dist/helpers/utils.cjs.js.map +1 -1
- package/dist/service/handlers/import/bulkImports.cjs.js +61 -32
- package/dist/service/handlers/import/bulkImports.cjs.js.map +1 -1
- package/dist/service/handlers/import/importStatus.cjs.js +4 -7
- package/dist/service/handlers/import/importStatus.cjs.js.map +1 -1
- package/dist/service/handlers/organization/organizations.cjs.js +2 -2
- package/dist/service/handlers/organization/organizations.cjs.js.map +1 -1
- package/dist/service/handlers/repository/repositories.cjs.js +4 -2
- package/dist/service/handlers/repository/repositories.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +20 -10
- package/dist/service/router.cjs.js.map +1 -1
- package/package.json +11 -10
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var integration = require('@backstage/integration');
|
|
4
|
+
var gitUrlParse = require('git-url-parse');
|
|
5
|
+
var catalogUtils = require('../catalog/catalogUtils.cjs.js');
|
|
6
|
+
require('@backstage/errors');
|
|
7
|
+
require('@backstage/plugin-permission-common');
|
|
8
|
+
require('@red-hat-developer-hub/backstage-plugin-bulk-import-common');
|
|
9
|
+
require('just-kebab-case');
|
|
10
|
+
var loggingUtils = require('../helpers/loggingUtils.cjs.js');
|
|
11
|
+
var utils$1 = require('../helpers/utils.cjs.js');
|
|
12
|
+
var handlers = require('../service/handlers/handlers.cjs.js');
|
|
13
|
+
var GitlabAppManager = require('./GitlabAppManager.cjs.js');
|
|
14
|
+
var glUtils = require('./utils/glUtils.cjs.js');
|
|
15
|
+
var orgUtils = require('./utils/orgUtils.cjs.js');
|
|
16
|
+
var prUtils = require('./utils/prUtils.cjs.js');
|
|
17
|
+
var repoUtils = require('./utils/repoUtils.cjs.js');
|
|
18
|
+
var utils = require('./utils/utils.cjs.js');
|
|
19
|
+
|
|
20
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
21
|
+
|
|
22
|
+
var gitUrlParse__default = /*#__PURE__*/_interopDefaultCompat(gitUrlParse);
|
|
23
|
+
|
|
24
|
+
class GitlabApiService {
|
|
25
|
+
logger;
|
|
26
|
+
integrations;
|
|
27
|
+
gitlabCredentialsProvider;
|
|
28
|
+
config;
|
|
29
|
+
// Cache for storing ETags (used for efficient caching of unchanged data returned by GitHub)
|
|
30
|
+
cache;
|
|
31
|
+
constructor(logger, config, cacheService) {
|
|
32
|
+
this.logger = logger;
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.integrations = integration.ScmIntegrations.fromConfig(config);
|
|
35
|
+
this.gitlabCredentialsProvider = GitlabAppManager.CustomGitlabCredentialsProvider.fromIntegrations(this.integrations);
|
|
36
|
+
this.cache = cacheService;
|
|
37
|
+
}
|
|
38
|
+
async getRepositoryFromIntegrations(repoUrl) {
|
|
39
|
+
const gitUrl = gitUrlParse__default.default(repoUrl);
|
|
40
|
+
const glConfig = this.integrations.gitlab.byUrl(repoUrl)?.config;
|
|
41
|
+
if (!glConfig) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`No Gitlab integration config found for repo ${repoUrl}. Please add a configuration entry under 'integrations.gitlab`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const credentials = await utils.getCredentialsForConfig(
|
|
47
|
+
this.gitlabCredentialsProvider,
|
|
48
|
+
glConfig
|
|
49
|
+
);
|
|
50
|
+
let repository = undefined;
|
|
51
|
+
for (const credential of credentials) {
|
|
52
|
+
const glKit = glUtils.buildGitlab(
|
|
53
|
+
{
|
|
54
|
+
logger: this.logger,
|
|
55
|
+
cache: this.cache
|
|
56
|
+
},
|
|
57
|
+
{ credential, owner: gitUrl.owner },
|
|
58
|
+
glConfig.baseUrl
|
|
59
|
+
);
|
|
60
|
+
const repo = await glKit.Projects.show(`${gitUrl.owner}/${gitUrl.name}`);
|
|
61
|
+
if (!repo) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
repository = {
|
|
65
|
+
name: repo.name,
|
|
66
|
+
full_name: repo.path_with_namespace,
|
|
67
|
+
url: repo._links.self,
|
|
68
|
+
html_url: repo.web_url,
|
|
69
|
+
default_branch: repo.default_branch,
|
|
70
|
+
updated_at: repo.updated_at
|
|
71
|
+
};
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
repository,
|
|
76
|
+
errors: []
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async getOrganizationsFromIntegrations(search, pageNumber = handlers.DefaultPageNumber, pageSize = handlers.DefaultPageSize) {
|
|
80
|
+
const groups = /* @__PURE__ */ new Map();
|
|
81
|
+
const result = await utils.fetchFromAllIntegrations(
|
|
82
|
+
{
|
|
83
|
+
logger: this.logger,
|
|
84
|
+
cache: this.cache,
|
|
85
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
86
|
+
},
|
|
87
|
+
this.integrations,
|
|
88
|
+
{
|
|
89
|
+
dataFetcher: async (glApi, credential, glConfig) => {
|
|
90
|
+
const dataFetchErrors = /* @__PURE__ */ new Map();
|
|
91
|
+
const resp = await orgUtils.addGitlabTokenGroups(
|
|
92
|
+
{
|
|
93
|
+
logger: this.logger
|
|
94
|
+
},
|
|
95
|
+
glApi,
|
|
96
|
+
credential,
|
|
97
|
+
{
|
|
98
|
+
search,
|
|
99
|
+
groups,
|
|
100
|
+
pageNumber,
|
|
101
|
+
pageSize,
|
|
102
|
+
errors: dataFetchErrors
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
this.logger.debug(
|
|
106
|
+
`Got ${resp.totalCount} groups(s) for ${glConfig.host}`
|
|
107
|
+
);
|
|
108
|
+
return {
|
|
109
|
+
result: resp.totalCount ?? 0,
|
|
110
|
+
errors: Array.from(dataFetchErrors.values())
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
const groupList = Array.from(groups.values());
|
|
116
|
+
const totalCount = utils$1.computeTotalCount(groupList, result.data, pageSize);
|
|
117
|
+
return {
|
|
118
|
+
organizations: groupList,
|
|
119
|
+
errors: Array.from(result.errors?.values() ?? []),
|
|
120
|
+
totalCount
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async getOrgRepositoriesFromIntegrations(orgName, search, pageNumber = handlers.DefaultPageNumber, pageSize = handlers.DefaultPageSize) {
|
|
124
|
+
const orgRepositories = /* @__PURE__ */ new Map();
|
|
125
|
+
const result = await utils.fetchFromAllIntegrations(
|
|
126
|
+
{
|
|
127
|
+
logger: this.logger,
|
|
128
|
+
cache: this.cache,
|
|
129
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
130
|
+
},
|
|
131
|
+
this.integrations,
|
|
132
|
+
{
|
|
133
|
+
dataFetcher: async (glApi, credential, glConfig) => {
|
|
134
|
+
const dataFetchErrors = /* @__PURE__ */ new Map();
|
|
135
|
+
const resp = await repoUtils.addGitlabTokenOrgRepositories(
|
|
136
|
+
{
|
|
137
|
+
logger: this.logger
|
|
138
|
+
},
|
|
139
|
+
glApi,
|
|
140
|
+
credential,
|
|
141
|
+
orgName,
|
|
142
|
+
orgRepositories,
|
|
143
|
+
dataFetchErrors,
|
|
144
|
+
{
|
|
145
|
+
search,
|
|
146
|
+
pageNumber,
|
|
147
|
+
pageSize
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
this.logger.debug(
|
|
151
|
+
`Got ${resp.totalCount} org repo(s) for ${glConfig.host}`
|
|
152
|
+
);
|
|
153
|
+
return {
|
|
154
|
+
stopFetchingData: true,
|
|
155
|
+
result: resp.totalCount ?? 0,
|
|
156
|
+
errors: Array.from(dataFetchErrors.values())
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
const repoList = Array.from(orgRepositories.values());
|
|
162
|
+
const totalCount = utils$1.computeTotalCount(repoList, result.data, pageSize);
|
|
163
|
+
return {
|
|
164
|
+
repositories: repoList,
|
|
165
|
+
errors: Array.from(result.errors?.values() ?? []),
|
|
166
|
+
totalCount
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Returns GitlabRepositoryResponse containing:
|
|
171
|
+
* - a list of unique repositories the gitlab integrations have access to
|
|
172
|
+
* - a list of errors encountered by each token (if any exist)
|
|
173
|
+
*/
|
|
174
|
+
async getRepositoriesFromIntegrations(search, pageNumber = handlers.DefaultPageNumber, pageSize = handlers.DefaultPageSize) {
|
|
175
|
+
const repositories = /* @__PURE__ */ new Map();
|
|
176
|
+
const result = await utils.fetchFromAllIntegrations(
|
|
177
|
+
{
|
|
178
|
+
logger: this.logger,
|
|
179
|
+
cache: this.cache,
|
|
180
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
181
|
+
},
|
|
182
|
+
this.integrations,
|
|
183
|
+
{
|
|
184
|
+
dataFetcher: async (glApi, credential, glConfig) => {
|
|
185
|
+
const dataFetchErrors = /* @__PURE__ */ new Map();
|
|
186
|
+
const resp = await repoUtils.addGitlabTokenRepositories(
|
|
187
|
+
{
|
|
188
|
+
logger: this.logger
|
|
189
|
+
},
|
|
190
|
+
glApi,
|
|
191
|
+
credential,
|
|
192
|
+
repositories,
|
|
193
|
+
dataFetchErrors,
|
|
194
|
+
{
|
|
195
|
+
search,
|
|
196
|
+
pageNumber,
|
|
197
|
+
pageSize
|
|
198
|
+
}
|
|
199
|
+
);
|
|
200
|
+
this.logger.debug(
|
|
201
|
+
`Got ${resp.totalCount} repo(s) for ${glConfig.host}`
|
|
202
|
+
);
|
|
203
|
+
return {
|
|
204
|
+
result: resp.totalCount ?? 0,
|
|
205
|
+
errors: Array.from(dataFetchErrors.values())
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
);
|
|
210
|
+
const repoList = Array.from(repositories.values());
|
|
211
|
+
const totalCount = utils$1.computeTotalCount(repoList, result.data, pageSize);
|
|
212
|
+
return {
|
|
213
|
+
repositories: repoList,
|
|
214
|
+
errors: Array.from(result.errors?.values() ?? []),
|
|
215
|
+
totalCount
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async filterLocationsAccessibleFromIntegrations(locationUrls) {
|
|
219
|
+
const locationGitOwnerMap = utils$1.extractLocationOwnerMap(locationUrls);
|
|
220
|
+
const allAccessibleTokenOrgs = /* @__PURE__ */ new Set();
|
|
221
|
+
const allAccessibleUsernames = /* @__PURE__ */ new Set();
|
|
222
|
+
await utils.fetchFromAllIntegrations(
|
|
223
|
+
{
|
|
224
|
+
logger: this.logger,
|
|
225
|
+
cache: this.cache,
|
|
226
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
227
|
+
},
|
|
228
|
+
this.integrations,
|
|
229
|
+
{
|
|
230
|
+
dataFetcher: async (gitlab) => {
|
|
231
|
+
const username = (await gitlab.Users.showCurrentUser()).username;
|
|
232
|
+
if (username) {
|
|
233
|
+
allAccessibleUsernames.add(username);
|
|
234
|
+
}
|
|
235
|
+
const allGroups = await gitlab.Groups.all({
|
|
236
|
+
allAvailable: false
|
|
237
|
+
});
|
|
238
|
+
allGroups.map((org) => org.path)?.forEach((orgName) => allAccessibleTokenOrgs.add(orgName));
|
|
239
|
+
return {};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
return locationUrls.filter((loc) => {
|
|
244
|
+
if (!locationGitOwnerMap.has(loc)) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
const owner = locationGitOwnerMap.get(loc);
|
|
248
|
+
return allAccessibleTokenOrgs.has(owner) || allAccessibleUsernames.has(owner);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async findImportOpenPr(logger, input) {
|
|
252
|
+
const glConfig = this.integrations.gitlab.byUrl(input.repoUrl)?.config;
|
|
253
|
+
if (!glConfig) {
|
|
254
|
+
throw new Error(`Could not find GL integration from ${input.repoUrl}`);
|
|
255
|
+
}
|
|
256
|
+
const gitUrl = gitUrlParse__default.default(input.repoUrl);
|
|
257
|
+
const owner = gitUrl.organization;
|
|
258
|
+
const repo = gitUrl.name;
|
|
259
|
+
const credentials = await this.gitlabCredentialsProvider.getAllCredentials({
|
|
260
|
+
host: glConfig.host
|
|
261
|
+
});
|
|
262
|
+
if (credentials.length === 0) {
|
|
263
|
+
throw new Error(`No credentials for GL integration`);
|
|
264
|
+
}
|
|
265
|
+
const branchName = catalogUtils.getBranchName(this.config);
|
|
266
|
+
for (const credential of credentials) {
|
|
267
|
+
const glKit = glUtils.buildGitlab(
|
|
268
|
+
{
|
|
269
|
+
logger: this.logger,
|
|
270
|
+
cache: this.cache
|
|
271
|
+
},
|
|
272
|
+
{ credential, owner },
|
|
273
|
+
glConfig.baseUrl
|
|
274
|
+
);
|
|
275
|
+
try {
|
|
276
|
+
return await prUtils.findOpenPRForBranch(
|
|
277
|
+
logger,
|
|
278
|
+
this.config,
|
|
279
|
+
glKit,
|
|
280
|
+
owner,
|
|
281
|
+
repo,
|
|
282
|
+
branchName,
|
|
283
|
+
input.includeCatalogInfoContent
|
|
284
|
+
);
|
|
285
|
+
} catch (error) {
|
|
286
|
+
loggingUtils.logErrorIfNeeded(this.logger, "Error fetching pull requests", error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return {};
|
|
290
|
+
}
|
|
291
|
+
async submitPrToRepo(logger, input) {
|
|
292
|
+
const fileName = catalogUtils.getCatalogFilename(this.config);
|
|
293
|
+
const errors = [];
|
|
294
|
+
const result = await utils.executeFunctionOnFirstSuccessfulIntegration(
|
|
295
|
+
{
|
|
296
|
+
logger: this.logger,
|
|
297
|
+
cache: this.cache,
|
|
298
|
+
config: this.config,
|
|
299
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
300
|
+
},
|
|
301
|
+
this.integrations,
|
|
302
|
+
{
|
|
303
|
+
repoUrl: input.repoUrl,
|
|
304
|
+
fn: async (validatedRepo, gitlab) => {
|
|
305
|
+
const { owner, repo, branchName } = validatedRepo;
|
|
306
|
+
try {
|
|
307
|
+
const catalogInfoFileExists = await repoUtils.fileExistsInDefaultBranch(
|
|
308
|
+
logger,
|
|
309
|
+
gitlab,
|
|
310
|
+
owner,
|
|
311
|
+
repo,
|
|
312
|
+
fileName,
|
|
313
|
+
input.defaultBranch
|
|
314
|
+
);
|
|
315
|
+
if (catalogInfoFileExists) {
|
|
316
|
+
return {
|
|
317
|
+
successful: true,
|
|
318
|
+
result: {
|
|
319
|
+
hasChanges: false
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
const existingPrForBranch = await prUtils.findOpenPRForBranch(
|
|
324
|
+
logger,
|
|
325
|
+
this.config,
|
|
326
|
+
gitlab,
|
|
327
|
+
owner,
|
|
328
|
+
repo,
|
|
329
|
+
branchName
|
|
330
|
+
);
|
|
331
|
+
const repoData = await gitlab.Projects.show(`${owner}/${repo}`);
|
|
332
|
+
const parentRef = await gitlab.Branches.show(
|
|
333
|
+
`${owner}/${repo}`,
|
|
334
|
+
repoData.default_branch
|
|
335
|
+
);
|
|
336
|
+
if (existingPrForBranch.prNum) {
|
|
337
|
+
await repoUtils.createOrUpdateFileInBranch(
|
|
338
|
+
gitlab,
|
|
339
|
+
owner,
|
|
340
|
+
repo,
|
|
341
|
+
branchName,
|
|
342
|
+
fileName,
|
|
343
|
+
input.catalogInfoContent
|
|
344
|
+
);
|
|
345
|
+
const pullRequestResponse2 = await gitlab.MergeRequests.edit(
|
|
346
|
+
`${owner}/${repo}`,
|
|
347
|
+
existingPrForBranch.prNum,
|
|
348
|
+
{
|
|
349
|
+
description: input.prBody,
|
|
350
|
+
title: input.prTitle,
|
|
351
|
+
targetBranch: repoData.default_branch
|
|
352
|
+
}
|
|
353
|
+
);
|
|
354
|
+
return {
|
|
355
|
+
successful: true,
|
|
356
|
+
result: {
|
|
357
|
+
prNumber: existingPrForBranch.prNum,
|
|
358
|
+
prUrl: pullRequestResponse2.web_url,
|
|
359
|
+
lastUpdate: pullRequestResponse2.updated_at
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
try {
|
|
364
|
+
await gitlab.Branches.show(`${owner}/${repo}`, branchName);
|
|
365
|
+
} catch (error) {
|
|
366
|
+
if (error.cause.response.status === 404) {
|
|
367
|
+
await gitlab.Branches.create(
|
|
368
|
+
`${owner}/${repo}`,
|
|
369
|
+
branchName,
|
|
370
|
+
parentRef.name
|
|
371
|
+
);
|
|
372
|
+
} else {
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
await repoUtils.createOrUpdateFileInBranch(
|
|
377
|
+
gitlab,
|
|
378
|
+
owner,
|
|
379
|
+
repo,
|
|
380
|
+
branchName,
|
|
381
|
+
fileName,
|
|
382
|
+
input.catalogInfoContent
|
|
383
|
+
);
|
|
384
|
+
const pullRequestResponse = await gitlab.MergeRequests.create(
|
|
385
|
+
`${owner}/${repo}`,
|
|
386
|
+
branchName,
|
|
387
|
+
repoData.default_branch,
|
|
388
|
+
input.prTitle,
|
|
389
|
+
{
|
|
390
|
+
description: input.prBody
|
|
391
|
+
}
|
|
392
|
+
);
|
|
393
|
+
return {
|
|
394
|
+
successful: true,
|
|
395
|
+
result: {
|
|
396
|
+
prNumber: pullRequestResponse.iid,
|
|
397
|
+
prUrl: pullRequestResponse.web_url,
|
|
398
|
+
lastUpdate: pullRequestResponse.updated_at,
|
|
399
|
+
hasChanges: true
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
} catch (e) {
|
|
403
|
+
loggingUtils.logErrorIfNeeded(
|
|
404
|
+
this.logger,
|
|
405
|
+
`Couldn't create PR in ${input.repoUrl}`,
|
|
406
|
+
e
|
|
407
|
+
);
|
|
408
|
+
errors.push(e.message);
|
|
409
|
+
return { successful: false };
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
);
|
|
414
|
+
if (result) {
|
|
415
|
+
return result;
|
|
416
|
+
}
|
|
417
|
+
logger.warn(
|
|
418
|
+
`Tried all possible Gitlab credentials, but could not create PR in ${input.repoUrl}. Please try again later...`
|
|
419
|
+
);
|
|
420
|
+
return {
|
|
421
|
+
errors
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
async hasFileInRepo(input) {
|
|
425
|
+
const fileExists = await utils.executeFunctionOnFirstSuccessfulIntegration(
|
|
426
|
+
{
|
|
427
|
+
logger: this.logger,
|
|
428
|
+
cache: this.cache,
|
|
429
|
+
config: this.config,
|
|
430
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
431
|
+
},
|
|
432
|
+
this.integrations,
|
|
433
|
+
{
|
|
434
|
+
repoUrl: input.repoUrl,
|
|
435
|
+
fn: async (validatedRepo, gitlab) => {
|
|
436
|
+
const { owner, repo } = validatedRepo;
|
|
437
|
+
const exists = await repoUtils.fileExistsInDefaultBranch(
|
|
438
|
+
this.logger,
|
|
439
|
+
gitlab,
|
|
440
|
+
owner,
|
|
441
|
+
repo,
|
|
442
|
+
input.fileName,
|
|
443
|
+
input.defaultBranch
|
|
444
|
+
);
|
|
445
|
+
if (exists === undefined) {
|
|
446
|
+
return { successful: false };
|
|
447
|
+
}
|
|
448
|
+
return { successful: true, result: exists };
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
);
|
|
452
|
+
if (fileExists === undefined) {
|
|
453
|
+
throw new Error(
|
|
454
|
+
`Could not determine if repo at ${input.repoUrl} already has a file named ${input.fileName} in its default branch (${input.defaultBranch})`
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
return fileExists;
|
|
458
|
+
}
|
|
459
|
+
async closeImportPR(logger, input) {
|
|
460
|
+
await utils.executeFunctionOnFirstSuccessfulIntegration(
|
|
461
|
+
{
|
|
462
|
+
logger: this.logger,
|
|
463
|
+
cache: this.cache,
|
|
464
|
+
config: this.config,
|
|
465
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
466
|
+
},
|
|
467
|
+
this.integrations,
|
|
468
|
+
{
|
|
469
|
+
repoUrl: input.repoUrl,
|
|
470
|
+
fn: async (validatedRepo, gitlab) => {
|
|
471
|
+
const { owner, repo, branchName } = validatedRepo;
|
|
472
|
+
try {
|
|
473
|
+
const existingPrForBranch = await prUtils.findOpenPRForBranch(
|
|
474
|
+
logger,
|
|
475
|
+
this.config,
|
|
476
|
+
gitlab,
|
|
477
|
+
owner,
|
|
478
|
+
repo,
|
|
479
|
+
branchName
|
|
480
|
+
);
|
|
481
|
+
if (existingPrForBranch.prNum) {
|
|
482
|
+
await prUtils.closePRWithComment(
|
|
483
|
+
gitlab,
|
|
484
|
+
owner,
|
|
485
|
+
repo,
|
|
486
|
+
existingPrForBranch.prNum,
|
|
487
|
+
input.comment
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
return { successful: true };
|
|
491
|
+
} catch (e) {
|
|
492
|
+
loggingUtils.logErrorIfNeeded(
|
|
493
|
+
this.logger,
|
|
494
|
+
`Couldn't close PR in ${input.repoUrl}`,
|
|
495
|
+
e
|
|
496
|
+
);
|
|
497
|
+
return { successful: false };
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
async deleteImportBranch(input) {
|
|
504
|
+
await utils.executeFunctionOnFirstSuccessfulIntegration(
|
|
505
|
+
{
|
|
506
|
+
logger: this.logger,
|
|
507
|
+
cache: this.cache,
|
|
508
|
+
config: this.config,
|
|
509
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
510
|
+
},
|
|
511
|
+
this.integrations,
|
|
512
|
+
{
|
|
513
|
+
repoUrl: input.repoUrl,
|
|
514
|
+
fn: async (validatedRepo, gitlab) => {
|
|
515
|
+
const { owner, repo, branchName } = validatedRepo;
|
|
516
|
+
try {
|
|
517
|
+
await gitlab.Branches.remove(`${owner}/${repo}`, branchName);
|
|
518
|
+
return { successful: true };
|
|
519
|
+
} catch (e) {
|
|
520
|
+
loggingUtils.logErrorIfNeeded(
|
|
521
|
+
this.logger,
|
|
522
|
+
`Couldn't close import PR and/or delete import branch in ${input.repoUrl}`,
|
|
523
|
+
e
|
|
524
|
+
);
|
|
525
|
+
return { successful: false };
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
async isRepoEmpty(input) {
|
|
532
|
+
return await utils.executeFunctionOnFirstSuccessfulIntegration(
|
|
533
|
+
{
|
|
534
|
+
logger: this.logger,
|
|
535
|
+
cache: this.cache,
|
|
536
|
+
config: this.config,
|
|
537
|
+
gitlabCredentialsProvider: this.gitlabCredentialsProvider
|
|
538
|
+
},
|
|
539
|
+
this.integrations,
|
|
540
|
+
{
|
|
541
|
+
repoUrl: input.repoUrl,
|
|
542
|
+
fn: async (validatedRepo, gitlab) => {
|
|
543
|
+
const { owner, repo } = validatedRepo;
|
|
544
|
+
const resp = await gitlab.Repositories.allContributors(
|
|
545
|
+
`${owner}/${repo}`,
|
|
546
|
+
{
|
|
547
|
+
showExpanded: true
|
|
548
|
+
}
|
|
549
|
+
);
|
|
550
|
+
return { successful: true, result: resp?.data?.length < 1 };
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
exports.GitlabApiService = GitlabApiService;
|
|
558
|
+
//# sourceMappingURL=gitlabApiService.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlabApiService.cjs.js","sources":["../../src/gitlab/gitlabApiService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n GitLabIntegrationConfig,\n ScmIntegrations,\n} from '@backstage/integration';\n\nimport { Gitlab } from '@gitbeaker/rest';\nimport gitUrlParse from 'git-url-parse';\n\nimport { getBranchName, getCatalogFilename } from '../catalog/catalogUtils';\nimport {\n computeTotalCount,\n extractLocationOwnerMap,\n logErrorIfNeeded,\n} from '../helpers';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n} from '../service/handlers/handlers';\nimport { CustomGitlabCredentialsProvider } from './GitlabAppManager';\nimport {\n ExtendedGitlabCredentials,\n GitlabFetchError,\n GitlabOrganization,\n GitlabOrganizationResponse,\n GitlabRepository,\n GitlabRepositoryResponse,\n} from './types';\nimport { buildGitlab } from './utils/glUtils';\nimport { addGitlabTokenGroups } from './utils/orgUtils';\nimport { closePRWithComment, findOpenPRForBranch } from './utils/prUtils';\nimport {\n addGitlabTokenOrgRepositories,\n addGitlabTokenRepositories,\n createOrUpdateFileInBranch,\n fileExistsInDefaultBranch,\n ValidatedRepo,\n} from './utils/repoUtils';\nimport {\n executeFunctionOnFirstSuccessfulIntegration,\n fetchFromAllIntegrations,\n getCredentialsForConfig,\n} from './utils/utils';\n\nexport class GitlabApiService {\n private readonly logger: LoggerService;\n private readonly integrations: ScmIntegrations;\n private readonly gitlabCredentialsProvider: CustomGitlabCredentialsProvider;\n private readonly config: Config;\n // Cache for storing ETags (used for efficient caching of unchanged data returned by GitHub)\n private readonly cache: CacheService;\n constructor(\n logger: LoggerService,\n config: Config,\n cacheService: CacheService,\n ) {\n this.logger = logger;\n this.config = config;\n this.integrations = ScmIntegrations.fromConfig(config);\n this.gitlabCredentialsProvider =\n CustomGitlabCredentialsProvider.fromIntegrations(this.integrations);\n this.cache = cacheService;\n }\n\n async getRepositoryFromIntegrations(repoUrl: string): Promise<{\n repository?: GitlabRepository;\n errors?: GitlabFetchError[];\n }> {\n const gitUrl = gitUrlParse(repoUrl);\n\n const glConfig = this.integrations.gitlab.byUrl(repoUrl)?.config;\n if (!glConfig) {\n throw new Error(\n `No Gitlab integration config found for repo ${repoUrl}. Please add a configuration entry under 'integrations.gitlab`,\n );\n }\n\n const credentials = await getCredentialsForConfig(\n this.gitlabCredentialsProvider,\n glConfig,\n );\n let repository: GitlabRepository | undefined = undefined;\n for (const credential of credentials) {\n const glKit = buildGitlab(\n {\n logger: this.logger,\n cache: this.cache,\n },\n { credential, owner: gitUrl.owner },\n glConfig.baseUrl,\n );\n const repo = await glKit.Projects.show(`${gitUrl.owner}/${gitUrl.name}`);\n if (!repo) {\n continue;\n }\n repository = {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n };\n break;\n }\n\n return {\n repository,\n errors: [],\n };\n }\n\n async getOrganizationsFromIntegrations(\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n ): Promise<GitlabOrganizationResponse> {\n const groups = new Map<string, GitlabOrganization>();\n const result = await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n glApi: InstanceType<typeof Gitlab<false>>,\n credential: ExtendedGitlabCredentials,\n glConfig: GitLabIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GitlabFetchError>();\n const resp = await addGitlabTokenGroups(\n {\n logger: this.logger,\n },\n glApi,\n credential,\n {\n search,\n groups,\n pageNumber,\n pageSize,\n errors: dataFetchErrors,\n },\n );\n this.logger.debug(\n `Got ${resp.totalCount} groups(s) for ${glConfig.host}`,\n );\n return {\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const groupList = Array.from(groups.values());\n const totalCount = computeTotalCount(groupList, result.data, pageSize);\n return {\n organizations: groupList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n async getOrgRepositoriesFromIntegrations(\n orgName: string,\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n ): Promise<GitlabRepositoryResponse> {\n const orgRepositories = new Map<string, GitlabRepository>();\n const result = await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n glApi: InstanceType<typeof Gitlab<false>>,\n credential: ExtendedGitlabCredentials,\n glConfig: GitLabIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GitlabFetchError>();\n const resp = await addGitlabTokenOrgRepositories(\n {\n logger: this.logger,\n },\n glApi,\n credential,\n orgName,\n orgRepositories,\n dataFetchErrors,\n {\n search,\n pageNumber,\n pageSize,\n },\n );\n this.logger.debug(\n `Got ${resp.totalCount} org repo(s) for ${glConfig.host}`,\n );\n return {\n stopFetchingData: true,\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const repoList = Array.from(orgRepositories.values());\n const totalCount = computeTotalCount(repoList, result.data, pageSize);\n return {\n repositories: repoList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n /**\n * Returns GitlabRepositoryResponse containing:\n * - a list of unique repositories the gitlab integrations have access to\n * - a list of errors encountered by each token (if any exist)\n */\n async getRepositoriesFromIntegrations(\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n ): Promise<GitlabRepositoryResponse> {\n const repositories = new Map<string, GitlabRepository>();\n const result = await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n glApi: InstanceType<typeof Gitlab<false>>,\n credential: ExtendedGitlabCredentials,\n glConfig: GitLabIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GitlabFetchError>();\n const resp = await addGitlabTokenRepositories(\n {\n logger: this.logger,\n },\n glApi,\n credential,\n repositories,\n dataFetchErrors,\n {\n search,\n pageNumber,\n pageSize,\n },\n );\n this.logger.debug(\n `Got ${resp.totalCount} repo(s) for ${glConfig.host}`,\n );\n return {\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const repoList = Array.from(repositories.values());\n const totalCount = computeTotalCount(repoList, result.data, pageSize);\n return {\n repositories: repoList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n async filterLocationsAccessibleFromIntegrations(\n locationUrls: string[],\n ): Promise<string[]> {\n const locationGitOwnerMap = extractLocationOwnerMap(locationUrls);\n\n const allAccessibleTokenOrgs = new Set<string>();\n const allAccessibleUsernames = new Set<string>();\n await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (gitlab: InstanceType<typeof Gitlab<false>>) => {\n // find authenticated gitlab owner...\n const username = (await gitlab.Users.showCurrentUser()).username;\n if (username) {\n allAccessibleUsernames.add(username);\n }\n // ... along with orgs accessible from the token auth\n\n const allGroups = await gitlab.Groups.all<false, 'offset'>({\n allAvailable: false,\n });\n allGroups\n .map(org => org.path)\n ?.forEach((orgName: string) => allAccessibleTokenOrgs.add(orgName));\n return {};\n },\n },\n );\n\n return locationUrls.filter(loc => {\n if (!locationGitOwnerMap.has(loc)) {\n return false;\n }\n const owner = locationGitOwnerMap.get(loc)!;\n return (\n allAccessibleTokenOrgs.has(owner) || allAccessibleUsernames.has(owner)\n );\n });\n }\n\n async findImportOpenPr(\n logger: LoggerService,\n input: {\n repoUrl: string;\n includeCatalogInfoContent?: boolean;\n },\n ): Promise<{\n prNum?: number;\n prUrl?: string;\n prTitle?: string;\n prBody?: string;\n prCatalogInfoContent?: string;\n lastUpdate?: string;\n }> {\n const glConfig = this.integrations.gitlab.byUrl(input.repoUrl)?.config;\n if (!glConfig) {\n throw new Error(`Could not find GL integration from ${input.repoUrl}`);\n }\n\n const gitUrl = gitUrlParse(input.repoUrl);\n const owner = gitUrl.organization;\n const repo = gitUrl.name;\n\n const credentials = await this.gitlabCredentialsProvider.getAllCredentials({\n host: glConfig.host,\n });\n if (credentials.length === 0) {\n throw new Error(`No credentials for GL integration`);\n }\n\n const branchName = getBranchName(this.config);\n for (const credential of credentials) {\n const glKit = buildGitlab(\n {\n logger: this.logger,\n cache: this.cache,\n },\n { credential, owner },\n glConfig.baseUrl,\n );\n try {\n return await findOpenPRForBranch(\n logger,\n this.config,\n glKit,\n owner,\n repo,\n branchName,\n input.includeCatalogInfoContent,\n );\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error fetching pull requests', error);\n }\n }\n return {};\n }\n\n async submitPrToRepo(\n logger: LoggerService,\n input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n defaultBranch?: string;\n prTitle: string;\n prBody: string;\n catalogInfoContent: string;\n },\n ): Promise<{\n prUrl?: string;\n prNumber?: number;\n hasChanges?: boolean;\n lastUpdate?: string;\n errors?: string[];\n }> {\n const fileName = getCatalogFilename(this.config);\n const errors: any[] = [];\n\n const result = await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ): Promise<{\n successful: boolean;\n result?: {\n prUrl?: string;\n prNumber?: number;\n hasChanges?: boolean;\n lastUpdate?: string;\n };\n }> => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n // Check if there is already a catalogInfo in the default branch\n const catalogInfoFileExists = await fileExistsInDefaultBranch(\n logger,\n gitlab,\n owner,\n repo,\n fileName,\n input.defaultBranch,\n );\n if (catalogInfoFileExists) {\n // No need to create a PR => component will be imported as is\n return {\n successful: true,\n result: {\n hasChanges: false,\n },\n };\n }\n\n const existingPrForBranch = await findOpenPRForBranch(\n logger,\n this.config,\n gitlab,\n owner,\n repo,\n branchName,\n );\n\n const repoData = await gitlab.Projects.show(`${owner}/${repo}`);\n\n const parentRef = await gitlab.Branches.show(\n `${owner}/${repo}`,\n repoData.default_branch,\n ); // This might not be neccesarry\n\n if (existingPrForBranch.prNum) {\n await createOrUpdateFileInBranch(\n gitlab,\n owner,\n repo,\n branchName,\n fileName,\n input.catalogInfoContent,\n );\n const pullRequestResponse = await gitlab.MergeRequests.edit(\n `${owner}/${repo}`,\n existingPrForBranch.prNum,\n {\n description: input.prBody,\n title: input.prTitle,\n targetBranch: repoData.default_branch,\n },\n );\n return {\n successful: true,\n result: {\n prNumber: existingPrForBranch.prNum,\n prUrl: pullRequestResponse.web_url,\n lastUpdate: pullRequestResponse.updated_at,\n },\n };\n }\n\n try {\n await gitlab.Branches.show(`${owner}/${repo}`, branchName);\n } catch (error: any) {\n if (error.cause.response.status === 404) {\n await gitlab.Branches.create(\n `${owner}/${repo}`,\n branchName,\n parentRef.name,\n );\n } else {\n throw error;\n }\n }\n\n // Might not be able to do this in the gitlab api\n // This is if the branch exists, but there wasn't a PR yet\n // if (branchExists) {\n // // update it in case it is outdated compared to the base branch\n // try {\n // await octo.repos.merge({\n // owner: owner,\n // repo: repo,\n // base: branchName,\n // head: repoData.data.default_branch,\n // });\n // } catch (error: any) {\n // logErrorIfNeeded(\n // this.logger,\n // `Could not merge default branch ${repoData.data.default_branch} into import branch ${branchName}`,\n // error,\n // );\n // }\n // }\n\n await createOrUpdateFileInBranch(\n gitlab,\n owner,\n repo,\n branchName,\n fileName,\n input.catalogInfoContent,\n );\n\n const pullRequestResponse = await gitlab.MergeRequests.create(\n `${owner}/${repo}`,\n branchName,\n repoData.default_branch,\n input.prTitle,\n {\n description: input.prBody,\n },\n );\n return {\n successful: true,\n result: {\n prNumber: pullRequestResponse.iid,\n prUrl: pullRequestResponse.web_url,\n lastUpdate: pullRequestResponse.updated_at,\n hasChanges: true,\n },\n };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't create PR in ${input.repoUrl}`,\n e,\n );\n errors.push(e.message);\n return { successful: false };\n }\n },\n },\n );\n\n if (result) {\n return result;\n }\n\n logger.warn(\n `Tried all possible Gitlab credentials, but could not create PR in ${input.repoUrl}. Please try again later...`,\n );\n\n return {\n errors: errors,\n };\n }\n\n async hasFileInRepo(input: {\n repoUrl: string;\n defaultBranch?: string;\n fileName: string;\n }) {\n const fileExists = await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ) => {\n const { owner, repo } = validatedRepo;\n const exists = await fileExistsInDefaultBranch(\n this.logger,\n gitlab,\n owner,\n repo,\n input.fileName,\n input.defaultBranch,\n );\n if (exists === undefined) {\n return { successful: false };\n }\n return { successful: true, result: exists };\n },\n },\n );\n\n if (fileExists === undefined) {\n throw new Error(\n `Could not determine if repo at ${input.repoUrl} already has a file named ${input.fileName} in its default branch (${input.defaultBranch})`,\n );\n }\n\n return fileExists;\n }\n\n async closeImportPR(\n logger: LoggerService,\n input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n comment: string;\n },\n ) {\n await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ) => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n const existingPrForBranch = await findOpenPRForBranch(\n logger,\n this.config,\n gitlab,\n owner,\n repo,\n branchName,\n );\n if (existingPrForBranch.prNum) {\n await closePRWithComment(\n gitlab,\n owner,\n repo,\n existingPrForBranch.prNum,\n input.comment,\n );\n }\n return { successful: true };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't close PR in ${input.repoUrl}`,\n e,\n );\n return { successful: false };\n }\n },\n },\n );\n }\n\n async deleteImportBranch(input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n }) {\n await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ) => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n await gitlab.Branches.remove(`${owner}/${repo}`, branchName);\n return { successful: true };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't close import PR and/or delete import branch in ${input.repoUrl}`,\n e,\n );\n return { successful: false };\n }\n },\n },\n );\n }\n\n async isRepoEmpty(input: { repoUrl: string }) {\n return await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n gitlabCredentialsProvider: this.gitlabCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ) => {\n const { owner, repo } = validatedRepo;\n const resp = await gitlab.Repositories.allContributors(\n `${owner}/${repo}`,\n {\n showExpanded: true,\n },\n );\n return { successful: true, result: resp?.data?.length < 1 };\n },\n },\n );\n }\n}\n"],"names":["ScmIntegrations","CustomGitlabCredentialsProvider","gitUrlParse","getCredentialsForConfig","buildGitlab","DefaultPageNumber","DefaultPageSize","fetchFromAllIntegrations","addGitlabTokenGroups","computeTotalCount","addGitlabTokenOrgRepositories","addGitlabTokenRepositories","extractLocationOwnerMap","getBranchName","findOpenPRForBranch","logErrorIfNeeded","getCatalogFilename","executeFunctionOnFirstSuccessfulIntegration","fileExistsInDefaultBranch","createOrUpdateFileInBranch","pullRequestResponse","closePRWithComment"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var rest = require('@gitbeaker/rest');
|
|
4
|
+
|
|
5
|
+
const GITLAB_BASEURL_ENDPOINT = "https://gitlab.com";
|
|
6
|
+
function buildGitlab(_deps, input, baseUrl = GITLAB_BASEURL_ENDPOINT) {
|
|
7
|
+
const apiThing = new rest.Gitlab({
|
|
8
|
+
host: baseUrl,
|
|
9
|
+
token: input.credential.token
|
|
10
|
+
});
|
|
11
|
+
return apiThing;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.buildGitlab = buildGitlab;
|
|
15
|
+
//# sourceMappingURL=glUtils.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glUtils.cjs.js","sources":["../../../src/gitlab/utils/glUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\nimport { Gitlab } from '@gitbeaker/rest';\n\nimport {\n type ExtendedGitlabCredentials,\n type GitlabFetchError,\n} from '../types';\n\nconst GITLAB_BASEURL_ENDPOINT = 'https://gitlab.com';\n\nexport function buildGitlab(\n _deps: {\n logger: LoggerService;\n cache: CacheService;\n },\n input: {\n credential: ExtendedGitlabCredentials;\n owner?: string;\n errors?: Map<number, GitlabFetchError>;\n },\n baseUrl: string = GITLAB_BASEURL_ENDPOINT,\n): InstanceType<typeof Gitlab<false>> {\n const apiThing = new Gitlab({\n host: baseUrl,\n token: input.credential.token,\n });\n return apiThing;\n}\n"],"names":["Gitlab"],"mappings":";;;;AA4BA,MAAM,uBAA0B,GAAA,oBAAA;AAEzB,SAAS,WACd,CAAA,KAAA,EAIA,KAKA,EAAA,OAAA,GAAkB,uBACkB,EAAA;AACpC,EAAM,MAAA,QAAA,GAAW,IAAIA,WAAO,CAAA;AAAA,IAC1B,IAAM,EAAA,OAAA;AAAA,IACN,KAAA,EAAO,MAAM,UAAW,CAAA;AAAA,GACzB,CAAA;AACD,EAAO,OAAA,QAAA;AACT;;;;"}
|