UNPKG

@atomist/automation-client

Version:

Atomist API for software low-level client

160 lines • 7.2 kB
"use strict"; 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