UNPKG

setup-cpp

Version:

Install all the tools required for building and testing C++/C projects.

80 lines (66 loc) 2.84 kB
import { promises } from "fs" import { grantUserWriteAccess } from "admina" import { info, warning } from "ci-log" import memoize from "memoizee" import { pathExists } from "path-exists" import { untildifyUser } from "untildify-user" const { appendFile, readFile, writeFile } = promises export const defaultRcPath = untildifyUser("~/.bashrc") /** * Options for adding an rc file */ export type RcOptions = { /** The path to the RC file that the env variables should be added to. */ rcPath: string /** Provide a name (your tool) to add a variable guard for sourcing your rc file */ guard?: string } async function sourceRCInRc_(options: RcOptions) { const sourceRcString = options.guard === undefined ? `\nsource "${options.rcPath}"\n` : `\n# ${options.guard}\nif [[ "$SOURCE_${options.guard.toUpperCase()}RC" != 0 && -f "${options.rcPath}" ]]; then source "${options.rcPath}"; fi\n` try { await Promise.all([ addRCHeader(options), addSourceToTargetRc(sourceRcString, untildifyUser("~/.bashrc")), addSourceToTargetRc(sourceRcString, untildifyUser("~/.profile")), ]) } catch (err) { warning(`Failed to add ${sourceRcString} to .profile or .bashrc. You should add it manually: ${err}`) } } /** * handles adding conditions to source rc file from .bashrc and .profile */ export const sourceRCInRc = memoize(sourceRCInRc_, { promise: true }) async function addRCHeader(options: RcOptions) { // a variable that prevents source rc from being called from .bashrc and .profile const rcHeader = options.guard === undefined ? "\n# Automatically Generated by envosman\n" : `\n# Automatically Generated by envosman ${options.guard}\nexport SOURCE_${options.guard.toUpperCase()}RC=0\n` if (await pathExists(options.rcPath)) { const rcContent = await readFile(options.rcPath, "utf8") if (!rcContent.includes(rcHeader)) { // already executed setupCppInProfile await appendFile(options.rcPath, `\n${rcHeader}\n`) info(`Added ${rcHeader} to ${options.rcPath}`) } } } async function addSourceToTargetRc(sourceRcString: string, targetRcPath: string) { if (await pathExists(targetRcPath)) { const bashrcContent = await readFile(targetRcPath, "utf-8") if (!bashrcContent.includes(sourceRcString)) { await appendFile(targetRcPath, sourceRcString) info(`${sourceRcString} was added to ${targetRcPath}`) } } } export async function finalizeRC(rcOptions: RcOptions) { if (await pathExists(rcOptions.rcPath)) { const entries = (await readFile(rcOptions.rcPath, "utf-8")).split("\n") const uniqueEntries = [...new Set(entries.reverse())].reverse() // remove duplicates, keeping the latest entry await writeFile(rcOptions.rcPath, uniqueEntries.join("\n")) await grantUserWriteAccess(rcOptions.rcPath) } }