diff --git a/.changeset/curvy-planes-flash.md b/.changeset/curvy-planes-flash.md new file mode 100644 index 0000000000..0d3368e53d --- /dev/null +++ b/.changeset/curvy-planes-flash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +--- + +Allow skipping archived repositories (`skipArchivedRepos` flag) on Bitbucket. diff --git a/docs/integrations/bitbucketServer/discovery.md b/docs/integrations/bitbucketServer/discovery.md index f37732b600..d9fc946460 100644 --- a/docs/integrations/bitbucketServer/discovery.md +++ b/docs/integrations/bitbucketServer/discovery.md @@ -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. diff --git a/plugins/catalog-backend-module-bitbucket-server/api-report.md b/plugins/catalog-backend-module-bitbucket-server/api-report.md index 467294f3b0..a9c84b35de 100644 --- a/plugins/catalog-backend-module-bitbucket-server/api-report.md +++ b/plugins/catalog-backend-module-bitbucket-server/api-report.md @@ -109,5 +109,6 @@ export type BitbucketServerRepository = { href: string; }[] >; + archived: boolean; }; ``` diff --git a/plugins/catalog-backend-module-bitbucket-server/config.d.ts b/plugins/catalog-backend-module-bitbucket-server/config.d.ts index 57a94550e9..b02e0e9a24 100644 --- a/plugins/catalog-backend-module-bitbucket-server/config.d.ts +++ b/plugins/catalog-backend-module-bitbucket-server/config.d.ts @@ -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. diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts index d205b7434e..a3d4155121 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts @@ -121,6 +121,7 @@ describe('BitbucketServerClient', () => { }, ], }, + archived: false, }, ], }; @@ -198,6 +199,7 @@ describe('BitbucketServerClient', () => { }, ], }, + archived: false, }; return res(ctx.json(response)); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts index 67a10abea7..381eecb493 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/types.ts @@ -27,6 +27,7 @@ export type BitbucketServerRepository = { href: string; }[] >; + archived: boolean; }; /** @public */ diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts index bc3fa2ae23..3eff56e6f5 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts @@ -43,7 +43,7 @@ class PersistingTaskRunner implements TaskRunner { type Project = { key: string; - repos: [string]; + repos: { name: string; archived?: true }[]; }; function pagedResponse(values: any): BitbucketServerPagedResponse { @@ -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}`, ); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts index 95bda0e910..dfd42d1832 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts @@ -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, diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.test.ts index af8639566f..9e8aca5dd9 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.test.ts @@ -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, }, }); }); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts index b2ed7a8556..2f1bb7227d 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProviderConfig.ts @@ -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, };