@atomist/automation-client
Version:
Atomist API for software low-level client
160 lines • 7.2 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const url = require("url");
const ActionResult_1 = require("../../action/ActionResult");
const globals_1 = require("../../globals");
const httpClient_1 = require("../../spi/http/httpClient");
const logger_1 = require("../../util/logger");
const AbstractRemoteRepoRef_1 = require("./AbstractRemoteRepoRef");
const validationPatterns_1 = require("./params/validationPatterns");
const RepoId_1 = require("./RepoId");
exports.GitlabDotComApiBase = "https://gitlab.com/api/v4";
exports.GitlabDotComRemoteUrl = "https://gitlab.com/";
/**
* Repository reference implementation for Gitlab
*/
class GitlabRepoRef extends AbstractRemoteRepoRef_1.AbstractRemoteRepoRef {
constructor(owner, repo, sha, apiBase = exports.GitlabDotComApiBase, gitlabRemoteUrl = exports.GitlabDotComRemoteUrl, path, branch) {
super(apiBase === exports.GitlabDotComApiBase ? RepoId_1.ProviderType.gitlab_com : RepoId_1.ProviderType.gitlab_enterprise, gitlabRemoteUrl, apiBase, owner, repo, sha, path, branch);
this.apiBase = apiBase;
this.kind = "gitlab";
}
static from(params) {
if (params.sha && !params.sha.match(validationPatterns_1.GitShaRegExp.pattern)) {
throw new Error("You provided an invalid SHA: " + params.sha);
}
const result = new GitlabRepoRef(params.owner, params.repo, params.sha, params.rawApiBase, params.gitlabRemoteUrl, params.path, params.branch);
return result;
}
static concatUrl(base, segment) {
if (base.endsWith("/")) {
if (segment.startsWith("/")) {
return base + segment.substr(1);
}
else {
return base + segment;
}
}
else {
if (segment.startsWith("/")) {
return base + segment;
}
else {
return base + "/" + segment;
}
}
}
createRemote(creds, description, visibility) {
return __awaiter(this, void 0, void 0, function* () {
const gitlabUrl = GitlabRepoRef.concatUrl(this.apiBase, `projects`);
const httpClient = globals_1.automationClientInstance().configuration.http.client.factory.create(gitlabUrl);
const namespace = yield this.getNamespaceForOwner(this.owner, creds);
return httpClient.exchange(gitlabUrl, {
method: httpClient_1.HttpMethod.Post,
body: {
name: `${this.repo}`,
visibility,
namespace_id: namespace,
},
headers: {
"Private-Token": creds.privateToken,
"Content-Type": "application/json",
},
}).then(response => {
return {
target: this,
success: true,
response,
};
}).catch(err => {
logger_1.logger.error(`Error attempting to create remote project, status code ${err.response.status}. ` +
`The response was ${JSON.stringify(err.response.data)}`);
return Promise.reject(err);
});
});
}
deleteRemote(creds) {
const gitlabUrl = GitlabRepoRef.concatUrl(this.apiBase, `project/${this.owner}%2f${this.repo}`);
const httpClient = globals_1.automationClientInstance().configuration.http.client.factory.create(gitlabUrl);
logger_1.logger.debug(`Making request to '${url}' to delete repo`);
return httpClient.exchange(gitlabUrl, {
method: httpClient_1.HttpMethod.Delete,
headers: {
"Private-Token": creds.privateToken,
"Content-Type": "application/json",
},
}).then(response => {
return {
target: this,
success: true,
response,
};
}).catch(err => {
logger_1.logger.error("Error attempting to delete repository: " + err);
return Promise.reject(err);
});
}
setUserConfig(credentials, project) {
return Promise.resolve(ActionResult_1.successOn(this));
}
raisePullRequest(credentials, title, body, head, base) {
const gitlabUrl = GitlabRepoRef.concatUrl(this.apiBase, `projects/${this.owner}%2f${this.repo}/merge_requests`);
const httpClient = globals_1.automationClientInstance().configuration.http.client.factory.create(gitlabUrl);
logger_1.logger.debug(`Making request to '${url}' to raise PR`);
return httpClient.exchange(gitlabUrl, {
method: httpClient_1.HttpMethod.Post,
body: {
id: `${this.owner}%2f${this.repo}`,
title,
description: body,
source_branch: head,
target_branch: base,
},
headers: {
"Private-Token": credentials.privateToken,
"Content-Type": "application/json",
},
}).then(response => {
return {
target: this,
success: true,
response,
};
}).catch(err => {
logger_1.logger.error(`Error attempting to raise PR, status code ${err.response.status}. ` +
`The response was ${JSON.stringify(err.response.data)}`);
return Promise.reject(err);
});
}
getNamespaceForOwner(owner, creds) {
const gitlabUrl = GitlabRepoRef.concatUrl(this.apiBase, `namespaces?search=${encodeURI(owner)}`);
const httpClient = globals_1.automationClientInstance().configuration.http.client.factory.create(gitlabUrl);
return httpClient.exchange(gitlabUrl, {
method: httpClient_1.HttpMethod.Get,
headers: {
"Private-Token": creds.privateToken,
"Content-Type": "application/json",
},
}).then(response => {
const namespaces = response.body;
const ownerNamespace = namespaces.filter(n => n.name === owner)[0];
if (!!ownerNamespace) {
return ownerNamespace.id;
}
else {
return Promise.reject("Cannot find Gitlab namespace with name " + owner);
}
});
}
}
exports.GitlabRepoRef = GitlabRepoRef;
//# sourceMappingURL=GitlabRepoRef.js.map