diff --git a/plugins/catalog-backend-module-azure/src/alpha.ts b/plugins/catalog-backend-module-azure/src/alpha.ts index cba672ce49..3e2354114f 100644 --- a/plugins/catalog-backend-module-azure/src/alpha.ts +++ b/plugins/catalog-backend-module-azure/src/alpha.ts @@ -19,3 +19,5 @@ import { default as feature } from './module'; /** @alpha */ const _feature = feature; export default _feature; + +export { analyzeAzureDevOpsWebhookEvent } from './events/analyzeAzureDevOpsWebhookEvent'; diff --git a/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.test.ts b/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.test.ts index 9edeb1602d..77e30946cc 100644 --- a/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.test.ts +++ b/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.test.ts @@ -127,6 +127,40 @@ describe('analyzeAzureDevOpsWebhookEvent', () => { }); }); + it('does not double-encode branch names containing slashes', async () => { + const repoWithSlashBranch = { + ...baseRepository, + defaultBranch: 'refs/heads/feature/my-branch', + }; + await expect( + analyzeAzureDevOpsWebhookEvent( + 'git.push', + withPushEvent({ + repository: repoWithSlashBranch, + refUpdates: [{ name: 'refs/heads/feature/my-branch' }], + commits: [ + { + commitId: 'abc', + changes: [ + { changeType: 'add', item: { path: '/catalog-info.yaml' } }, + ], + }, + ], + }), + { isRelevantPath }, + ), + ).resolves.toEqual({ + result: 'ok', + events: [ + { + type: 'location.created', + url: `${baseRepository.remoteUrl}?path=/catalog-info.yaml&version=GBfeature/my-branch`, + context: { commitUrl: `${baseRepository.remoteUrl}/commit/abc` }, + }, + ], + }); + }); + it('ignores non-default-branch pushes', async () => { await expect( analyzeAzureDevOpsWebhookEvent( diff --git a/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.ts b/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.ts index 10bf5e75d7..0840c8b1d3 100644 --- a/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.ts +++ b/plugins/catalog-backend-module-azure/src/events/analyzeAzureDevOpsWebhookEvent.ts @@ -156,16 +156,10 @@ function toLocationUrl(options: { const url = new URL(options.remoteUrl); const branch = branchNameFromRef(options.branchRef); - // Encode each path segment individually to protect against special chars while - // preserving '/' separators, which is what Azure DevOps expects in the path param. - const encodedPath = options.path - .split('/') - .map(encodeURIComponent) - .join('/'); url.search = branch - ? `path=${encodedPath}&version=GB${encodeURIComponent(branch)}` - : `path=${encodedPath}`; - return url.toString(); + ? `path=${options.path}&version=GB${branch}` + : `path=${options.path}`; + return encodeURI(url.toString()); } function toCommitUrl( diff --git a/plugins/catalog-backend-module-azure/src/index.ts b/plugins/catalog-backend-module-azure/src/index.ts index f1c5c66c48..dbbdff67ce 100644 --- a/plugins/catalog-backend-module-azure/src/index.ts +++ b/plugins/catalog-backend-module-azure/src/index.ts @@ -23,4 +23,3 @@ export { default } from './module'; export { AzureDevOpsDiscoveryProcessor } from './processors'; export { AzureDevOpsEntityProvider } from './providers'; -export { analyzeAzureDevOpsWebhookEvent } from './events/analyzeAzureDevOpsWebhookEvent';