UNPKG

@harryisfish/gitt

Version:

A command-line tool to help you manage Git repositories and remote repositories, such as keeping in sync, pushing, pulling, etc.

266 lines (265 loc) 9.67 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __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 }); exports.upgradeCommand = upgradeCommand; const prompts_1 = require("@inquirer/prompts"); const child_process_1 = require("child_process"); const chalk_1 = __importDefault(require("chalk")); const errors_1 = require("../errors"); const packageJson = require('../../package.json'); /** * Detect which package manager is being used */ function detectPackageManager() { try { // Check if installed globally with pnpm try { const result = (0, child_process_1.spawnSync)('pnpm', ['list', '-g', '--depth=0'], { encoding: 'utf8', stdio: 'pipe' }); if (result.status === 0 && result.stdout.includes(packageJson.name)) { return 'pnpm'; } } catch (e) { // Not installed with pnpm or pnpm not available } // Check if installed globally with yarn try { const result = (0, child_process_1.spawnSync)('yarn', ['global', 'list'], { encoding: 'utf8', stdio: 'pipe' }); if (result.status === 0 && result.stdout.includes(packageJson.name)) { return 'yarn'; } } catch (e) { // Not installed with yarn or yarn not available } // Check if installed globally with npm try { const result = (0, child_process_1.spawnSync)('npm', ['list', '-g', '--depth=0'], { encoding: 'utf8', stdio: 'pipe' }); if (result.status === 0 && result.stdout.includes(packageJson.name)) { return 'npm'; } } catch (e) { // Not installed with npm } return null; } catch (error) { return null; } } /** * Fetch latest release information from GitHub */ async function fetchLatestRelease() { try { const response = await fetch('https://api.github.com/repos/harryisfish/gitt/releases/latest', { headers: { 'Accept': 'application/vnd.github.v3+json', 'User-Agent': 'gitt-cli' } }); if (!response.ok) { return null; } const data = await response.json(); return { version: data.tag_name.replace(/^v/, ''), // Remove 'v' prefix if present changelog: data.body || 'No changelog available', publishedAt: data.published_at }; } catch (error) { return null; } } /** * Format changelog for display */ function formatChangelog(changelog) { // Split by lines and format const lines = changelog.split('\n'); const formatted = []; for (const line of lines) { if (line.trim() === '') continue; // Format headers if (line.startsWith('## ')) { formatted.push(chalk_1.default.bold.cyan(line)); } else if (line.startsWith('### ')) { formatted.push(chalk_1.default.bold.yellow(line)); } else if (line.startsWith('- ') || line.startsWith('* ')) { formatted.push(chalk_1.default.gray(' ' + line)); } else { formatted.push(line); } } return formatted.join('\n'); } /** * Check for updates using update-notifier */ async function checkForUpdate() { try { const updateNotifier = await Promise.resolve().then(() => __importStar(require('update-notifier'))).then(m => m.default); const notifier = updateNotifier({ pkg: packageJson, updateCheckInterval: 0 // Force check }); if (notifier.update) { return { current: notifier.update.current, latest: notifier.update.latest, type: notifier.update.type }; } return null; } catch (error) { return null; } } /** * Execute upgrade command */ function executeUpgrade(packageManager, packageName) { console.log(chalk_1.default.cyan('\nUpgrading...')); try { let command; let args; switch (packageManager) { case 'pnpm': command = 'pnpm'; args = ['add', '-g', `${packageName}@latest`]; break; case 'yarn': command = 'yarn'; args = ['global', 'add', `${packageName}@latest`]; break; case 'npm': default: command = 'npm'; args = ['install', '-g', `${packageName}@latest`]; break; } console.log(chalk_1.default.gray(`Running: ${command} ${args.join(' ')}\n`)); const result = (0, child_process_1.spawnSync)(command, args, { stdio: 'inherit', encoding: 'utf8' }); if (result.status !== 0) { throw new Error(`Command exited with status ${result.status}`); } console.log(''); (0, errors_1.printSuccess)('Upgrade completed successfully!'); console.log(chalk_1.default.gray('Run "gitt --version" to verify the new version.\n')); } catch (error) { throw new errors_1.GitError('Upgrade failed. Please try upgrading manually:\n' + ` ${packageManager} install -g ${packageName}@latest`, error instanceof Error ? error : undefined); } } /** * Main upgrade command handler */ async function upgradeCommand() { try { console.log(chalk_1.default.cyan('🔍 Checking for updates...\n')); // Check for updates const updateInfo = await checkForUpdate(); if (!updateInfo) { (0, errors_1.printSuccess)('You are already on the latest version! 🎉'); console.log(chalk_1.default.gray(`Current version: ${packageJson.version}\n`)); return; } const { current, latest, type } = updateInfo; // Display version comparison console.log(chalk_1.default.bold('Version Information:')); console.log(` Current: ${chalk_1.default.yellow(current)}`); console.log(` Latest: ${chalk_1.default.green(latest)}`); console.log(` Type: ${chalk_1.default.gray(type)}\n`); // Fetch and display changelog console.log(chalk_1.default.bold('📝 Fetching release notes...\n')); const releaseInfo = await fetchLatestRelease(); if (releaseInfo && releaseInfo.changelog) { console.log(chalk_1.default.bold('What\'s New:\n')); console.log(formatChangelog(releaseInfo.changelog)); console.log(''); } // Detect package manager const packageManager = detectPackageManager(); if (!packageManager) { console.log(chalk_1.default.yellow('⚠ Could not detect package manager.')); console.log(chalk_1.default.gray('Please upgrade manually using one of these commands:\n')); console.log(chalk_1.default.gray(` npm install -g ${packageJson.name}@latest`)); console.log(chalk_1.default.gray(` pnpm add -g ${packageJson.name}@latest`)); console.log(chalk_1.default.gray(` yarn global add ${packageJson.name}@latest\n`)); return; } console.log(chalk_1.default.gray(`Package manager detected: ${packageManager}\n`)); // Ask for confirmation const shouldUpgrade = await (0, prompts_1.confirm)({ message: `Would you like to upgrade to v${latest}?`, default: true }); if (!shouldUpgrade) { console.log(chalk_1.default.gray('\nUpgrade cancelled.\n')); return; } // Execute upgrade executeUpgrade(packageManager, packageJson.name); } catch (error) { if (error instanceof errors_1.GitError) { throw error; } throw new errors_1.GitError('Failed to check for updates. Please check your internet connection.', error instanceof Error ? error : undefined); } }