added update command
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu';
|
||||
import chalk = require('chalk');
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
const findPwcliRepoRoot = (): string | null => {
|
||||
// When compiled, __dirname will be .../build/commands/update
|
||||
// Repo root is .../ (three levels up from build/commands/update to build, then one more to repo root)
|
||||
const candidates = [
|
||||
path.resolve(__dirname, '../../../..'), // repo root when running from build/commands/update
|
||||
path.resolve(__dirname, '../../..'), // fallback to build (in case structure differs)
|
||||
process.cwd(), // last resort
|
||||
];
|
||||
|
||||
for (const candidate of candidates) {
|
||||
try {
|
||||
const pkgPath = path.join(candidate, 'package.json');
|
||||
if (!fs.existsSync(pkgPath)) continue;
|
||||
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
||||
if (pkg && pkg.name === 'pwcli') {
|
||||
return candidate;
|
||||
}
|
||||
} catch {}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
name: 'update',
|
||||
alias: ['up'],
|
||||
description: 'Update the pwcli repository to latest main and rebuild (up)',
|
||||
hidden: false,
|
||||
run: async (toolbox: GluegunMenuToolbox) => {
|
||||
const { print, system } = toolbox;
|
||||
|
||||
const runCmd = async (cmd: string, cwd: string) =>
|
||||
await system.run(cmd, { cwd, trim: true });
|
||||
|
||||
const repoRoot = findPwcliRepoRoot();
|
||||
if (!repoRoot) {
|
||||
print.error(
|
||||
chalk.red(
|
||||
'Unable to locate the pwcli repository. This command only supports updating the pwcli repo.',
|
||||
),
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
print.info(`Updating repository: ${chalk.cyan(repoRoot)}`);
|
||||
|
||||
try {
|
||||
// Ensure we are inside a git repo and on main (or switch to main)
|
||||
await runCmd('git rev-parse --is-inside-work-tree', repoRoot);
|
||||
|
||||
await runCmd('git fetch origin main', repoRoot);
|
||||
|
||||
try {
|
||||
await runCmd('git checkout main', repoRoot);
|
||||
} catch {}
|
||||
|
||||
let behindCountStr = '0';
|
||||
try {
|
||||
behindCountStr = await runCmd(
|
||||
'git rev-list --count HEAD..origin/main',
|
||||
repoRoot,
|
||||
);
|
||||
} catch {}
|
||||
|
||||
const behindCount = parseInt((behindCountStr || '0').trim(), 10) || 0;
|
||||
|
||||
if (behindCount === 0) {
|
||||
print.success(chalk.green('Everything is up to date.'));
|
||||
process.exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
print.info(
|
||||
chalk.yellow(`Updating ${behindCount} commit(s) from origin/main...`),
|
||||
);
|
||||
|
||||
await runCmd('git pull --ff-only origin main', repoRoot);
|
||||
|
||||
print.info(chalk.yellow('Running yarn build...'));
|
||||
await runCmd('yarn build', repoRoot);
|
||||
|
||||
print.success(chalk.green('Update complete. Exiting pwcli...'));
|
||||
process.exit(0);
|
||||
} catch (e) {
|
||||
print.error(chalk.red('Update failed. Please check the logs above.'));
|
||||
process.exit(1);
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user