env-ci
Version:
Get environment variables exposed by CI services
65 lines (55 loc) • 1.54 kB
JavaScript
import { execaSync } from "execa";
export function head(options) {
try {
return execaSync("git", ["rev-parse", "HEAD"], options).stdout;
} catch {
return undefined;
}
}
export function branch(options) {
try {
const headRef = execaSync(
"git",
["rev-parse", "--abbrev-ref", "HEAD"],
options,
).stdout;
if (headRef === "HEAD") {
const branch = execaSync(
"git",
["show", "-s", "--pretty=%d", "HEAD"],
options,
)
.stdout.replace(/^\(|\)$/g, "")
.split(", ")
.find((branch) => branch.startsWith("origin/"));
return branch ? branch.match(/^origin\/(?<branch>.+)/)[1] : undefined;
}
return headRef;
} catch {
return undefined;
}
}
// Match slug on SSH URLs (ex: `USER@HOST:PORT/ORG/REPO.git`)
const GIT_SSH_URL_SLUG_PATTERN = /^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/;
// Match slug on HTTP(S) URLs `https://github.com/semantic-release/env-ci.git`
const GIT_PATHNAME_SLUG_PATTERN = /^\/(.*)\.git$/;
/**
* Extract repository slug(owner/repo) from a repository URL
*
* @param {String} repositoryURL
* @returns {String | undefined}
*/
export function getSlugFromGitURL(repositoryURL) {
if (!repositoryURL) {
return undefined;
}
if (repositoryURL.match(GIT_SSH_URL_SLUG_PATTERN)) {
return repositoryURL.replace(GIT_SSH_URL_SLUG_PATTERN, "$1");
}
try {
const url = new URL(repositoryURL);
return url.pathname.replace(GIT_PATHNAME_SLUG_PATTERN, "$1");
} catch {
return undefined;
}
}