UNPKG

@flxbl-io/sfp

Version:

sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model

270 lines 21.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const simple_git_1 = __importDefault(require("simple-git")); const fs = require("fs-extra"); const path = require("path"); const ignore_1 = __importDefault(require("ignore")); const GitIdentity_1 = __importDefault(require("./GitIdentity")); const tmp_1 = __importDefault(require("tmp")); //Git Abstraction class Git { constructor(projectDir, logger) { this.projectDir = projectDir; this.logger = logger; this._isATemporaryRepo = false; if (this.projectDir) { this._git = (0, simple_git_1.default)(this.projectDir); this.repositoryLocation = this.projectDir; } else { this._git = (0, simple_git_1.default)(); this.repositoryLocation = process.cwd(); } } async fetch() { return this._git.fetch('origin'); } async getHeadCommit() { return this._git.revparse(['HEAD']); } async getBaseBranchCommit(baseBranch) { return this._git.revparse([baseBranch]); } async show(options) { return this._git.show(options); } async tag(options) { let tagResult = await this._git.tag(options); let temp = tagResult.split('\n'); temp.pop(); return temp; } async diff(options) { let diffResult = await this._git.diff(options); let temp = diffResult.split('\n'); temp.pop(); return temp; } async log(options) { let gitLogResult = await this._git.log(options); return gitLogResult['all'][0]['hash'].split('\n'); } async getRemoteOriginUrl(overrideOriginURL) { let remoteOriginURL; if (!overrideOriginURL) { remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; if (!remoteOriginURL) { remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; } sfp_logger_1.default.log(`Fetched Remote URL ${remoteOriginURL}`, sfp_logger_1.LoggerLevel.DEBUG); } else remoteOriginURL = overrideOriginURL; if (!remoteOriginURL) throw new Error('Remote origin must be set in repository'); return remoteOriginURL; } async commitFile(pathToFiles, message = `[skip ci] Autogenerated commit by sfp`) { try { await new GitIdentity_1.default(this._git).setUsernameAndEmail(); await this._git.add(pathToFiles); await this._git.commit(message); sfp_logger_1.default.log(`Committed File ${pathToFiles}`); } catch (error) { sfp_logger_1.default.log(`Unable to commit file, probably due to no change or something else,Please try manually`, sfp_logger_1.LoggerLevel.ERROR); throw error; } } async pushTags(tags) { if (!tags) await this._git.pushTags(); else { for (let tag of tags) { await this._git.push('origin', tag); } } } async deleteTags(tags) { if (tags) await this._git.push('origin', '--delete', tags); } async addAnnotatedTag(tagName, annotation, commitId) { try { await new GitIdentity_1.default(this._git).setUsernameAndEmail(); if (!commitId) { await this._git.addAnnotatedTag(tagName, annotation); } else { const commands = ['tag', tagName, commitId, '-m', annotation]; await this._git.raw(commands); } } catch (error) { sfp_logger_1.default.log(`Unable to commit file, probably due to no change or something else,Please try manually`, sfp_logger_1.LoggerLevel.ERROR); throw error; } } async isBranchExists(branch) { const listOfBranches = await this._git.branch(['-la']); return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false; } static async initiateRepoAtTempLocation(logger, commitRef, branch) { let locationOfCopiedDirectory = tmp_1.default.dirSync({ unsafeCleanup: true }); sfp_logger_1.default.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, sfp_logger_1.LoggerLevel.INFO, logger); let repoDir = locationOfCopiedDirectory.name; // Copy source directory to temp dir const gitignore = (0, ignore_1.default)(); const gitignorePath = `${process.cwd()}/.gitignore`; if (fs.existsSync(gitignorePath)) { const gitignoreContent = fs.readFileSync(gitignorePath).toString(); gitignore.add(gitignoreContent); } // Copy source directory to temp dir respecting .gitignore fs.copySync(process.cwd(), repoDir, { filter: (src) => { const relativePath = path.relative(process.cwd(), src); // Always include root directory if (!relativePath) { return true; } // Check if file should be ignored return !gitignore.ignores(relativePath); }, }); //Initiate git on new repo on using the abstracted object let git = new Git(repoDir, logger); git._isATemporaryRepo = true; git.tempRepoLocation = locationOfCopiedDirectory; await git.addSafeConfig(repoDir); await git.getRemoteOriginUrl(); await git.fetch(); if (branch) { await git.createBranch(branch); } if (commitRef) { await git.checkout(commitRef, true); } sfp_logger_1.default.log(`Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`, sfp_logger_1.LoggerLevel.INFO, logger); return git; } static async initiateRepo(logger, projectDir) { let git = new Git(projectDir, logger); if (projectDir) await git.addSafeConfig(projectDir); else { await git.addSafeConfig(process.cwd()); } await git.getRemoteOriginUrl(); return git; } raw(commands) { return this._git.raw(commands); } getRepositoryPath() { return this.repositoryLocation; } async deleteTempoRepoIfAny() { if (this.tempRepoLocation) this.tempRepoLocation.removeCallback(); } async addSafeConfig(repoDir) { try { //add workaround for safe directory (https://github.com/actions/runner/issues/2033) await this._git.addConfig('safe.directory', repoDir, false, 'global'); } catch (error) { //ignore error sfp_logger_1.default.log(`Unable to set safe.directory`, sfp_logger_1.LoggerLevel.TRACE); } } async pushToRemote(branch, isForce) { if (!branch) branch = (await this._git.branch()).current; sfp_logger_1.default.log(`Pushing ${branch}`, sfp_logger_1.LoggerLevel.INFO, this.logger); if (process.env.SFPOWERSCRIPTS_OVERRIDE_ORIGIN_URL) { await this._git.removeRemote('origin'); await this._git.addRemote('origin', process.env.SFPOWERSCRIPTS_OVERRIDE_ORIGIN_URL); } if (isForce) { await this._git.push('origin', branch, [`--force`]); } else { await this._git.push('origin', branch); } } isATemporaryRepo() { return this._isATemporaryRepo; } async getCurrentCommitId() { return this._git.revparse(['HEAD']); } async checkout(commitRef, isForce) { if (isForce) { return this._git.checkout(commitRef, [`--force`]); } else return this._git.checkout(commitRef, {}); } async checkoutPath(commitRef, path, isForce) { if (isForce) { return this._git.checkout(commitRef, [path, `--force`]); } else return this._git.checkout(commitRef, [path]); } async stageChangedFiles(path) { try { await this._git.add(path); return true; } catch (error) { sfp_logger_1.default.log(`Nothing to add, ignoring`, sfp_logger_1.LoggerLevel.INFO, this.logger); return false; } } async createBranch(branch) { if (await this.isBranchExists(branch)) { await this._git.checkout(branch, ['-f']); try { // For ease-of-use when running locally and local branch exists await this._git.merge([`refs/remotes/origin/${branch}`]); } catch (error) { sfp_logger_1.default.log(`Unable to find remote`, sfp_logger_1.LoggerLevel.TRACE, this.logger); } } else { await this._git.checkout(['-b', branch]); } } } exports.default = Git; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZ2l0L0dpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUVBQXNFO0FBQ3RFLDREQUFrRDtBQUNsRCwrQkFBZ0M7QUFDaEMsNkJBQThCO0FBQzlCLG9EQUE0QjtBQUM1QixnRUFBd0M7QUFDeEMsOENBQXNCO0FBRXRCLGlCQUFpQjtBQUNqQixNQUFxQixHQUFHO0lBTXBCLFlBQTRCLFVBQW1CLEVBQVUsTUFBZTtRQUE1QyxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUZoRSxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFHdkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFBLG9CQUFTLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzlDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFBLG9CQUFTLEdBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBaUI7UUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxD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