integration: implement azure core with AzureUrl + fix tests

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2021-09-10 11:46:48 +02:00
parent 63e3745fe3
commit 0408b0d7ff
2 changed files with 11 additions and 127 deletions
+7 -9
View File
@@ -45,22 +45,22 @@ describe('azure core', () => {
{
url: 'https://dev.azure.com/org-name/project-name/_git/repo-name?path=my-template.yaml&version=GBmaster',
result:
'https://dev.azure.com/org-name/project-name/_apis/git/repositories/repo-name/items?path=my-template.yaml&version=master',
'https://dev.azure.com/org-name/project-name/_apis/git/repositories/repo-name/items?api-version=6.0&path=my-template.yaml&version=master',
},
{
url: 'https://dev.azure.com/org-name/project-name/_git/repo-name?path=my-template.yaml',
result:
'https://dev.azure.com/org-name/project-name/_apis/git/repositories/repo-name/items?path=my-template.yaml',
'https://dev.azure.com/org-name/project-name/_apis/git/repositories/repo-name/items?api-version=6.0&path=my-template.yaml',
},
{
url: 'https://api.com/org-name/project-name/_git/repo-name?path=my-template.yaml',
result:
'https://api.com/org-name/project-name/_apis/git/repositories/repo-name/items?path=my-template.yaml',
'https://api.com/org-name/project-name/_apis/git/repositories/repo-name/items?api-version=6.0&path=my-template.yaml',
},
{
url: 'https://api.com/org-name/project-name/_git/repo-name?path=my-template.yaml&version=GBmaster',
result:
'https://api.com/org-name/project-name/_apis/git/repositories/repo-name/items?path=my-template.yaml&version=master',
'https://api.com/org-name/project-name/_apis/git/repositories/repo-name/items?api-version=6.0&path=my-template.yaml&version=master',
},
])('should handle happy path %#', async ({ url, result }) => {
expect(getAzureFileFetchUrl(url)).toBe(result);
@@ -69,13 +69,11 @@ describe('azure core', () => {
it.each([
{
url: 'https://api.com/a/b/blob/master/path/to/c.yaml',
error:
'Incorrect URL: https://api.com/a/b/blob/master/path/to/c.yaml, Error: Wrong Azure Devops URL or Invalid file path',
error: 'Azure URL must point to a git repository',
},
{
url: 'com/a/b/blob/master/path/to/c.yaml',
error:
'Incorrect URL: com/a/b/blob/master/path/to/c.yaml, TypeError: Invalid URL: com/a/b/blob/master/path/to/c.yaml',
error: 'Invalid URL: com/a/b/blob/master/path/to/c.yaml',
},
])('should handle error path %#', ({ url, error }) => {
expect(() => getAzureFileFetchUrl(url)).toThrow(error);
@@ -95,7 +93,7 @@ describe('azure core', () => {
const result = getAzureDownloadUrl(
'https://dev.azure.com/organization/project/_git/repository?path=%2Fdocs',
);
expect(new URL(result).searchParams.get('scopePath')).toEqual('docs');
expect(new URL(result).searchParams.get('scopePath')).toEqual('/docs');
});
it.each([
+4 -118
View File
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import parseGitUrl from 'git-url-parse';
import { AzureUrl } from './AzureUrl';
import { AzureIntegrationConfig } from './config';
/**
@@ -28,53 +28,7 @@ import { AzureIntegrationConfig } from './config';
* @param url A URL pointing to a file
*/
export function getAzureFileFetchUrl(url: string): string {
try {
const parsedUrl = new URL(url);
const [empty, userOrOrg, project, srcKeyword, repoName] =
parsedUrl.pathname.split('/');
const path = parsedUrl.searchParams.get('path') || '';
const ref = parsedUrl.searchParams.get('version')?.substr(2);
if (
empty !== '' ||
userOrOrg === '' ||
project === '' ||
srcKeyword !== '_git' ||
repoName === '' ||
path === '' ||
ref === ''
) {
throw new Error('Wrong Azure Devops URL or Invalid file path');
}
// transform to api
parsedUrl.pathname = [
empty,
userOrOrg,
project,
'_apis',
'git',
'repositories',
repoName,
'items',
].join('/');
const queryParams = [`path=${path}`];
if (ref) {
queryParams.push(`version=${ref}`);
}
parsedUrl.search = queryParams.join('&');
parsedUrl.protocol = 'https';
return parsedUrl.toString();
} catch (e) {
throw new Error(`Incorrect URL: ${url}, ${e}`);
}
return AzureUrl.fromRepoUrl(url).toFileUrl();
}
/**
@@ -84,33 +38,7 @@ export function getAzureFileFetchUrl(url: string): string {
* @param url A URL pointing to a path
*/
export function getAzureDownloadUrl(url: string): string {
const {
name: repoName,
owner: project,
organization,
protocol,
resource,
filepath,
} = parseGitUrl(url);
// scopePath will limit the downloaded content
// /docs will only download the docs folder and everything below it
// /docs/index.md will only download index.md but put it in the root of the archive
const scopePath = filepath
? `&scopePath=${encodeURIComponent(filepath)}`
: '';
if (resource === 'dev.azure.com') {
return `${protocol}://${resource}/${organization}/${project}/_apis/git/repositories/${repoName}/items?recursionLevel=full&download=true&api-version=6.0${scopePath}`;
}
// For Azure DevOps Server `parseGitUrl` returns the same values
// for `organization` and `project` like this: `organization/project/_git`
// so we drop `project` and then strip `/_git` from `organization`
return `${protocol}://${resource}/${organization.replace(
'/_git',
'',
)}/_apis/git/repositories/${repoName}/items?recursionLevel=full&download=true&api-version=6.0${scopePath}`;
return AzureUrl.fromRepoUrl(url).toArchiveUrl();
}
/**
@@ -119,49 +47,7 @@ export function getAzureDownloadUrl(url: string): string {
* @param url A URL pointing to a repository or a sub-path
*/
export function getAzureCommitsUrl(url: string): string {
try {
const parsedUrl = new URL(url);
const [empty, userOrOrg, project, srcKeyword, repoName] =
parsedUrl.pathname.split('/');
// Remove the "GB" from "GBmain" for example.
const ref = parsedUrl.searchParams.get('version')?.substr(2);
if (
!!empty ||
!userOrOrg ||
!project ||
srcKeyword !== '_git' ||
!repoName
) {
throw new Error('Wrong Azure Devops URL');
}
// transform to commits api
parsedUrl.pathname = [
empty,
userOrOrg,
project,
'_apis',
'git',
'repositories',
repoName,
'commits',
].join('/');
const queryParams = [];
if (ref) {
queryParams.push(`searchCriteria.itemVersion.version=${ref}`);
}
parsedUrl.search = queryParams.join('&');
parsedUrl.protocol = 'https';
return parsedUrl.toString();
} catch (e) {
throw new Error(`Incorrect URL: ${url}, ${e}`);
}
return AzureUrl.fromRepoUrl(url).toCommitsUrl();
}
/**