@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
JavaScript
"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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