@lenne.tech/cli
Version:
lenne.Tech CLI: lt
380 lines • 25.6 kB
JavaScript
;
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 });
exports.Git = void 0;
/**
* Git functions
*/
class Git {
/**
* Constructor for integration of toolbox
*/
constructor(toolbox) {
this.toolbox = toolbox;
}
/**
* Ask for reset
*/
askForReset() {
return __awaiter(this, arguments, void 0, function* (options = {}) {
// Process options
const opts = Object.assign({
errorMessage: 'Please commit or stash changes!',
showError: false,
text: 'There are changes, reset?',
}, options);
// Toolbox features
const { print: { error }, prompt, system, } = this.toolbox;
// Check changes in current branch
const changes = yield system.run('git status --porcelain');
if (changes) {
const reset = yield prompt.confirm(opts.text);
if (!reset) {
if (opts.showError) {
error(opts.errorMessage);
}
return false;
}
yield system.run('git reset --hard && git clean -fd');
}
// Return changes
return true;
});
}
/**
* Check if current branch has changes
*/
changes(options) {
return __awaiter(this, void 0, void 0, function* () {
// Process options
const opts = Object.assign({
errorMessage: 'Please commit or stash changes!',
showError: false,
}, options);
// Toolbox features
const { print: { error }, system, } = this.toolbox;
// Check changes
const changes = yield system.run('git status --porcelain');
if (changes && opts.showError) {
error(opts.errorMessage);
}
return changes;
});
}
/**
* Get current branch
*/
currentBranch() {
return __awaiter(this, void 0, void 0, function* () {
// Toolbox features
const { helper: { trim }, system, } = this.toolbox;
return trim(yield system.run('git rev-parse --abbrev-ref HEAD'));
});
}
/**
* Get all relative files paths of files that differ between local branch and origin / other branch
*/
diffFiles(branch, options) {
return __awaiter(this, void 0, void 0, function* () {
// Process options
const opts = Object.assign({
noDiffResult: null,
otherBranch: `origin/${branch}`,
showWarning: false,
}, options);
// Toolbox features
const { print: { warning }, system, } = this.toolbox;
// Get diff
try {
const diff = yield system.run(`git --no-pager diff --name-only ${branch} ${opts.otherBranch}`);
// Return relative file paths as array
return diff.split(/\r?\n/).filter(item => item);
}
catch (error) {
if (opts.showWarning) {
warning('Branch diff could not be performed!');
}
return opts.noDiffResult;
}
});
}
/**
* Get branches
*/
getBranches() {
return __awaiter(this, void 0, void 0, function* () {
// Prepare results
const result = [];
// Toolbox features
const { system } = this.toolbox;
// Get branches
const branches = yield system.run('git fetch && git show-branch --list');
branches.split('\n').forEach((item) => {
const matches = item.match(/\[(.*?)]/);
if (matches) {
result.push(matches[1]);
}
});
// Return result
return result;
});
}
/**
* Get merge base
*/
getMergeBase() {
return __awaiter(this, arguments, void 0, function* (baseBranch = 'dev') {
// Toolbox features
const { helper: { trim }, system: { run }, } = this.toolbox;
return trim(yield run(`git merge-base HEAD ${baseBranch}`));
});
}
/**
* Get first commit messages from branch
*/
getFirstBranchCommit(branch, baseBranch) {
return __awaiter(this, void 0, void 0, function* () {
if (!baseBranch) {
baseBranch = (yield this.getDefaultBranch()) || 'dev';
}
if (!branch) {
throw new Error('Missing branch');
}
// Toolbox features
const { helper: { trim }, system: { run }, } = this.toolbox;
try {
const logCommand = `git log ${baseBranch}..${branch} --oneline`;
const output = yield run(logCommand);
if (!output) {
throw new Error('No commits found');
}
const commits = output.split('\n').filter(line => line.trim());
const firstCommit = commits[commits.length - 1];
const messageStart = firstCommit.indexOf(' ');
return trim(firstCommit.slice(messageStart + 1));
}
catch (error) {
throw new Error(`Failed to get first commit message: ${error.message}`);
}
});
}
/**
* Get default branch
*/
getDefaultBranch() {
// Toolbox features
const { system: { run }, } = this.toolbox;
return run('basename $(git symbolic-ref --short refs/remotes/origin/HEAD)');
}
/**
* Get git user
*/
getUser() {
return __awaiter(this, void 0, void 0, function* () {
// Toolbox features
const { helper: { trim }, system: { run }, } = this.toolbox;
// Get data
const user = {
email: trim(yield run('git config user.email')),
name: trim(yield run('git config user.name')),
};
// Return user
return user;
});
}
/**
* Check if git is installed
*/
gitInstalled() {
return __awaiter(this, void 0, void 0, function* () {
// Toolbox features
const { print: { error }, system, } = this.toolbox;
const gitInstalled = !!system.which('git');
if (!gitInstalled) {
error('Please install git: https://git-scm.com');
return false;
}
return true;
});
}
/**
* Get name of a branch
*/
getBranch(branch_1) {
return __awaiter(this, arguments, void 0, function* (branch, options = {}) {
// Check branch
if (!branch) {
return;
}
// Process options
const opts = Object.assign({
error: false,
errorText: `Branch ${branch} not found!`,
exact: true,
local: false,
remote: false,
spin: false,
spinText: 'Search branch',
}, options);
// Toolbox features
const { helper: { trim }, print: { error, info, spin }, system, } = this.toolbox;
// Prepare spinner
let searchSpin;
if (opts.spin) {
searchSpin = spin(opts.spinText);
}
// Update infos
const fetch = yield system.run('git fetch');
if (fetch.length && !fetch.startsWith('remote')) {
info(`Could not update infos ${fetch.length}`);
process.exit(1);
}
// Search branch
if (opts.exact) {
if (opts.remote) {
if (!(yield system.run(`git ls-remote --heads origin ${branch}`))) {
branch = null;
}
}
else {
try {
yield system.run(`git rev-parse --verify ${branch}`);
}
catch (e) {
branch = null;
}
}
}
else {
branch = (yield system.run('git branch -a'))
.split(/\r?\n/)
.map(line => line.trim())
.find(line => line.includes(branch))
.replace(/^.*origin\//, '')
.replace(/^.*github\//, '')
.trim();
}
if (!branch) {
if (opts.spin) {
searchSpin.fail();
}
if (opts.error) {
error(opts.errorText);
}
return;
}
// Trim branch
branch = trim(branch);
// Check remote, if not done before
if (opts.remote && !opts.exact) {
const remoteBranch = trim(yield system.run(`git ls-remote --heads origin ${branch}`));
if (!remoteBranch) {
if (opts.spin) {
searchSpin.fail();
}
if (opts.error) {
error(opts.errorText);
}
return;
}
}
// Check local
if (opts.local) {
const remoteBranch = trim(yield system.run(`git rev-parse --verify --quiet ${branch}`));
if (!remoteBranch) {
if (opts.spin) {
searchSpin.fail();
}
if (opts.error) {
error(opts.errorText);
}
return;
}
}
// End spinner
if (opts.spin) {
searchSpin.succeed();
}
// Return branch name
return branch;
});
}
/**
* Get last commit from current branch
*/
lastCommitMessage() {
return __awaiter(this, void 0, void 0, function* () {
// Toolbox features
const { helper: { trim }, system: { run }, } = this.toolbox;
return trim(yield run('git show-branch --no-name HEAD'));
});
}
/**
* Reset branch
*/
reset(mergeBase, soft = false) {
// Toolbox features
const { system: { run }, } = this.toolbox;
return run(soft ? `git reset --soft ${mergeBase}` : `git reset ${mergeBase}`);
}
/**
* Select a branch
*/
selectBranch() {
return __awaiter(this, arguments, void 0, function* (options = {}) {
// Process options
const opts = Object.assign({
defaultBranch: 'dev',
text: 'Select branch',
}, options);
// Toolbox features
const { prompt: { ask }, } = this.toolbox;
// Get branches
let branches = yield this.getBranches();
if (!branches || branches.length === 0) {
return;
}
// Check default branch
if (!branches.includes(opts.defaultBranch) && branches.includes('main')) {
opts.defaultBranch = 'main';
}
// Prepare branches
if (branches.includes(opts.defaultBranch)) {
branches = [opts.defaultBranch].concat(branches.filter(item => item !== opts.defaultBranch));
}
// Select branch
const { branch } = yield ask({
choices: branches,
message: opts.text,
name: 'branch',
type: 'select',
});
// Return selected branch
return branch;
});
}
/**
* Get status
*/
status() {
// Toolbox features
const { system: { run }, } = this.toolbox;
return run('git status');
}
}
exports.Git = Git;
/**
* Extend toolbox
*/
exports.default = (toolbox) => {
toolbox.git = new Git(toolbox);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dGVuc2lvbnMvZ2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUVBOztHQUVHO0FBQ0gsTUFBYSxHQUFHO0lBQ2Q7O09BRUc7SUFDSCxZQUFzQixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtJQUFHLENBQUM7SUFFekQ7O09BRUc7SUFDVSxXQUFXOzZEQUFDLFVBQXlFLEVBQUU7WUFDbEcsa0JBQWtCO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3hCO2dCQUNFLFlBQVksRUFBRSxpQ0FBaUM7Z0JBQy9DLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixJQUFJLEVBQUUsMkJBQTJCO2FBQ2xDLEVBQ0QsT0FBTyxDQUNSLENBQUM7WUFFRixtQkFBbUI7WUFDbkIsTUFBTSxFQUNKLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUNoQixNQUFNLEVBQ04sTUFBTSxHQUNQLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUVqQixrQ0FBa0M7WUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ1gsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ25CLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzNCLENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRUQsaUJB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