feat: skipArchivedRepos flag added to config

Signed-off-by: Mateusz Wiszniewski <cichy04@gmail.com>
This commit is contained in:
Mateusz Wiszniewski
2024-04-08 12:59:30 +02:00
parent 122cf5eed1
commit 062ffb1f3e
10 changed files with 51 additions and 9 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
---
Allow skipping archived repositories (`skipArchivedRepos` flag) on Bitbucket.
@@ -63,6 +63,7 @@ catalog:
filters: # optional
projectKey: '^apis-.*$' # optional; RegExp
repoSlug: '^service-.*$' # optional; RegExp
skipArchivedRepos: true # optional; boolean
schedule: # same options as in TaskScheduleDefinition
# supports cron, ISO duration, "human duration" as used in code
frequency: { minutes: 30 }
@@ -81,6 +82,8 @@ catalog:
Regular expression used to filter results based on the project key.
- **`repoSlug`** _(optional)_:
Regular expression used to filter results based on the repo slug.
- **`skipArchivedRepos`** _(optional)_:
Boolean flag to filter out archived repositories.
- **`schedule`**:
- **`frequency`**:
How often you want the task to run. The system does its best to avoid overlapping invocations.
@@ -109,5 +109,6 @@ export type BitbucketServerRepository = {
href: string;
}[]
>;
archived: boolean;
};
```
@@ -46,6 +46,10 @@ export interface Config {
* @visibility frontend
*/
projectKey?: string;
/**
* (Optional) Skip archived repositories
*/
skipArchivedRepos?: boolean;
};
/**
* (Optional) TaskScheduleDefinition for the refresh.
@@ -74,6 +78,10 @@ export interface Config {
* @visibility frontend
*/
projectKey?: string;
/**
* (Optional) Skip archived repositories
*/
skipArchivedRepos?: boolean;
};
/**
* (Optional) TaskScheduleDefinition for the refresh.
@@ -121,6 +121,7 @@ describe('BitbucketServerClient', () => {
},
],
},
archived: false,
},
],
};
@@ -198,6 +199,7 @@ describe('BitbucketServerClient', () => {
},
],
},
archived: false,
};
return res(ctx.json(response));
@@ -27,6 +27,7 @@ export type BitbucketServerRepository = {
href: string;
}[]
>;
archived: boolean;
};
/** @public */
@@ -43,7 +43,7 @@ class PersistingTaskRunner implements TaskRunner {
type Project = {
key: string;
repos: [string];
repos: { name: string; archived?: true }[];
};
function pagedResponse(values: any): BitbucketServerPagedResponse<any> {
@@ -82,14 +82,15 @@ function setupStubs(projects: Project[], baseUrl: string) {
const response = [];
for (const repo of project.repos) {
response.push({
slug: repo,
slug: repo.name,
links: {
self: [
{
href: `${baseUrl}/projects/${project.key}/repos/${repo}/browse`,
href: `${baseUrl}/projects/${project.key}/repos/${repo.name}/browse`,
},
],
},
archived: repo.archived ?? false,
});
}
return res(ctx.json(pagedResponse(response)));
@@ -216,6 +217,7 @@ describe('BitbucketServerEntityProvider', () => {
filters: {
projectKey: 'project-.*',
repoSlug: 'repo-.*',
skipArchivedRepos: true,
},
},
},
@@ -237,8 +239,14 @@ describe('BitbucketServerEntityProvider', () => {
setupStubs(
[
{ key: 'project-test', repos: ['repo-test'] },
{ key: 'other-project', repos: ['other-repo'] },
{
key: 'project-test',
repos: [
{ name: 'repo-test' },
{ name: 'repo-archived', archived: true },
],
},
{ key: 'other-project', repos: [{ name: 'other-repo' }] },
],
`https://${host}`,
);
@@ -313,8 +321,8 @@ describe('BitbucketServerEntityProvider', () => {
setupStubs(
[
{ key: 'project-test', repos: ['repo-test'] },
{ key: 'other-project', repos: ['other-repo'] },
{ key: 'project-test', repos: [{ name: 'repo-test' }] },
{ key: 'other-project', repos: [{ name: 'other-repo' }] },
],
`https://${host}`,
);
@@ -472,8 +480,8 @@ describe('BitbucketServerEntityProvider', () => {
setupStubs(
[
{ key: 'project-test', repos: ['repo-test'] },
{ key: 'other-project', repos: ['other-repo'] },
{ key: 'project-test', repos: [{ name: 'repo-test' }] },
{ key: 'other-project', repos: [{ name: 'other-repo' }] },
],
`https://${host}`,
);
@@ -201,6 +201,9 @@ export class BitbucketServerEntityProvider implements EntityProvider {
) {
continue;
}
if (this.config?.filters?.skipArchivedRepos && repository.archived) {
continue;
}
for await (const entity of this.parser({
client,
logger: this.logger,
@@ -48,6 +48,7 @@ describe('readProviderConfigs', () => {
filters: {
projectKey: undefined,
repoSlug: undefined,
skipArchivedRepos: undefined,
},
});
});
@@ -87,6 +88,7 @@ describe('readProviderConfigs', () => {
filters: {
projectKey: undefined,
repoSlug: undefined,
skipArchivedRepos: undefined,
},
});
expect(providerConfigs[1]).toEqual({
@@ -96,6 +98,7 @@ describe('readProviderConfigs', () => {
filters: {
projectKey: undefined,
repoSlug: undefined,
skipArchivedRepos: undefined,
},
});
expect(providerConfigs[2]).toEqual({
@@ -105,6 +108,7 @@ describe('readProviderConfigs', () => {
filters: {
projectKey: undefined,
repoSlug: undefined,
skipArchivedRepos: undefined,
},
schedule: {
frequency: Duration.fromISO('PT30M'),
@@ -125,6 +129,7 @@ describe('readProviderConfigs', () => {
filters: {
projectKey: 'project1',
repoSlug: '.*',
skipArchivedRepos: true,
},
},
},
@@ -141,6 +146,7 @@ describe('readProviderConfigs', () => {
filters: {
projectKey: /project1/,
repoSlug: /.*/,
skipArchivedRepos: true,
},
});
});
@@ -30,6 +30,7 @@ export type BitbucketServerEntityProviderConfig = {
filters?: {
projectKey?: RegExp;
repoSlug?: RegExp;
skipArchivedRepos?: boolean;
};
schedule?: TaskScheduleDefinition;
};
@@ -64,6 +65,9 @@ function readProviderConfig(
config.getOptionalString('catalogPath') ?? DEFAULT_CATALOG_PATH;
const projectKeyPattern = config.getOptionalString('filters.projectKey');
const repoSlugPattern = config.getOptionalString('filters.repoSlug');
const skipArchivedReposFlag = config.getOptionalBoolean(
'filters.skipArchivedRepos',
);
const schedule = config.has('schedule')
? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule'))
@@ -76,6 +80,7 @@ function readProviderConfig(
filters: {
projectKey: projectKeyPattern ? new RegExp(projectKeyPattern) : undefined,
repoSlug: repoSlugPattern ? new RegExp(repoSlugPattern) : undefined,
skipArchivedRepos: skipArchivedReposFlag,
},
schedule,
};