@atomist/sdm-core
Version:
Atomist Software Delivery Machine - Implementation
183 lines (174 loc) • 6.76 kB
text/typescript
/*
* Copyright © 2019 Atomist, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
BitBucketServerRepoRef,
GitHubRepoRef,
GitlabRepoRef,
RemoteRepoRef,
} from "@atomist/automation-client";
import {
CoreRepoFieldsAndChannels,
OnPushToAnyBranch,
ProviderType,
RepoRefResolver,
SdmGoalEvent,
} from "@atomist/sdm";
import * as _ from "lodash";
export class DefaultRepoRefResolver implements RepoRefResolver {
/**
* Obtain a RemoteRepoRef from the given push, correctly
* resolving provider.
* @param {OnPushToAnyBranch.Push} push
* @return {any}
*/
public repoRefFromPush(push: OnPushToAnyBranch.Push): RemoteRepoRef {
const providerType = push.repo.org.provider.providerType;
switch (providerType) {
case ProviderType.github_com:
case ProviderType.ghe:
return GitHubRepoRef.from({
owner: push.repo.owner,
repo: push.repo.name,
sha: push.after.sha,
rawApiBase: push.repo.org.provider.apiUrl,
branch: push.branch,
});
case ProviderType.bitbucket:
const providerUrl = push.repo.org.provider.url;
return this.toBitBucketServerRepoRef({
providerUrl,
owner: push.repo.owner,
name: push.repo.name,
sha: push.after.sha,
branch: push.branch,
});
case ProviderType.gitlab:
return GitlabRepoRef.from({
owner: push.repo.owner,
repo: push.repo.name,
sha: push.after.sha,
rawApiBase: push.repo.org.provider.apiUrl,
gitlabRemoteUrl: push.repo.org.provider.url,
branch: push.branch,
});
case ProviderType.bitbucket_cloud:
throw new Error("BitBucket Cloud not yet supported");
default:
throw new Error(`Provider ${providerType} not currently supported in SDM`);
}
}
public toBitBucketServerRepoRef(params: {
providerUrl: string,
owner: string,
name: string,
sha: string,
branch?: string,
}): BitBucketServerRepoRef {
const url = params.providerUrl;
const id = new BitBucketServerRepoRef(
url,
params.owner,
params.name,
true,
params.sha,
);
id.branch = params.branch;
// id.cloneUrl = (creds: BasicAuthCredentials) =>
// `http://${encodeURIComponent(creds.username)}:${encodeURIComponent(creds.password)}@${id.remoteBase}${id.pathComponent}.git`;
return id;
}
public providerIdFromPush(push: OnPushToAnyBranch.Push): string {
return push.repo.org.provider.providerId;
}
public repoRefFromSdmGoal(sdmGoal: SdmGoalEvent): RemoteRepoRef {
const provider = sdmGoal.push.repo.org.provider;
switch (provider.providerType) {
case ProviderType.github_com:
case ProviderType.ghe:
return GitHubRepoRef.from({
owner: sdmGoal.push.repo.owner,
repo: sdmGoal.push.repo.name,
sha: sdmGoal.sha,
branch: sdmGoal.branch,
rawApiBase: provider.apiUrl,
});
case ProviderType.bitbucket:
return this.toBitBucketServerRepoRef({
providerUrl: provider.url,
owner: sdmGoal.push.repo.owner,
name: sdmGoal.push.repo.name,
sha: sdmGoal.sha,
branch: sdmGoal.branch,
});
case ProviderType.gitlab:
return GitlabRepoRef.from({
owner: sdmGoal.push.repo.owner,
repo: sdmGoal.push.repo.name,
sha: sdmGoal.sha,
rawApiBase: provider.apiUrl,
gitlabRemoteUrl: provider.url,
branch: sdmGoal.branch,
});
default:
throw new Error(`Provider ${provider.providerType} not currently supported in SDM`);
}
}
/**
* Convert GraphQL return to our remote repo ref, instantiating
* the correct type based on provider
* @param {CoreRepoFieldsAndChannels.Fragment} repo
* @param opts options - sha or branch
* @return {RemoteRepoRef}
*/
public toRemoteRepoRef(repo: CoreRepoFieldsAndChannels.Fragment, opts: { sha?: string, branch?: string } = {}): RemoteRepoRef {
const providerType = _.get(repo, "org.provider.providerType");
const apiUrl = _.get(repo, "org.provider.apiUrl");
const url = _.get(repo, "org.provider.url");
switch (providerType) {
case undefined:
// tslint:disable-next-line:no-null-keyword
case null:
case ProviderType.github_com:
case ProviderType.ghe:
return GitHubRepoRef.from({
owner: repo.owner,
repo: repo.name,
sha: opts.sha,
branch: opts.branch,
rawApiBase: apiUrl,
});
case ProviderType.bitbucket:
return this.toBitBucketServerRepoRef({
owner: repo.owner,
name: repo.name,
sha: opts.sha,
branch: opts.branch,
providerUrl: apiUrl,
});
case ProviderType.gitlab:
return GitlabRepoRef.from({
owner: repo.owner,
repo: repo.name,
sha: opts.sha,
rawApiBase: apiUrl,
gitlabRemoteUrl: url,
branch: opts.branch,
});
default:
throw new Error(`Provider ${repo.org.provider.providerType} not currently supported in SDM`);
}
}
}