#!/usr/bin/env node const IncrementalUpdater = require('./incremental-updater'); /** * 🔄 增量更新命令行工具 * 提供独立的增量更新功能入口 */ function showHelp() { console.log(` 🔄 增量更新工具 - WWJCloud PHP to NestJS 用法: node incremental-update-cli.js [选项] 选项: --help, -h 显示帮助信息 --dry-run 干运行模式,不实际修改文件 --verbose, -v 详细输出模式 --force 强制更新,忽略冲突警告 --backup 创建备份(默认启用) --no-backup 不创建备份 环境变量: DRY_RUN=true 启用干运行模式 VERBOSE=true 启用详细输出 FORCE=true 启用强制模式 示例: # 基本增量更新 node incremental-update-cli.js # 干运行模式(查看将要进行的更改) node incremental-update-cli.js --dry-run # 详细输出模式 node incremental-update-cli.js --verbose # 强制更新模式 node incremental-update-cli.js --force # 使用环境变量 DRY_RUN=true node incremental-update-cli.js 功能特性: ✅ 智能变更检测 - 基于文件哈希和时间戳 ✅ 用户代码保护 - 自动检测和保护用户自定义代码 ✅ 三路合并算法 - 智能合并PHP变更和用户修改 ✅ 冲突处理机制 - 自动标记和处理合并冲突 ✅ 备份恢复功能 - 自动创建备份,支持快速恢复 ✅ 增量状态跟踪 - 记录更新历史和文件状态 ✅ 详细更新报告 - 提供完整的更新统计和结果 注意事项: - 首次运行将建立基线状态 - 建议在重要更新前手动备份 - 冲突文件需要手动解决 - 支持回滚到任意历史版本 `); } async function main() { const args = process.argv.slice(2); // 处理帮助选项 if (args.includes('--help') || args.includes('-h')) { showHelp(); return; } // 解析命令行参数 const options = { dryRun: args.includes('--dry-run') || process.env.DRY_RUN === 'true', verbose: args.includes('--verbose') || args.includes('-v') || process.env.VERBOSE === 'true', force: args.includes('--force') || process.env.FORCE === 'true', backup: !args.includes('--no-backup') }; console.log('🔄 WWJCloud 增量更新工具'); console.log('=================================================='); if (options.dryRun) { console.log('🔍 运行模式: 干运行 (不会实际修改文件)'); } if (options.verbose) { console.log('📝 输出模式: 详细输出'); } if (options.force) { console.log('⚡ 更新模式: 强制更新'); } if (!options.backup) { console.log('⚠️ 备份模式: 已禁用备份'); } console.log('==================================================\n'); try { // 设置环境变量 if (options.dryRun) { process.env.DRY_RUN = 'true'; } if (options.verbose) { process.env.VERBOSE = 'true'; } if (options.force) { process.env.FORCE = 'true'; } if (!options.backup) { process.env.NO_BACKUP = 'true'; } // 创建并运行增量更新器 const updater = new IncrementalUpdater(); const success = await updater.run(); if (success) { console.log('\n✅ 增量更新成功完成!'); if (options.dryRun) { console.log('\n💡 提示: 这是干运行模式,没有实际修改文件'); console.log(' 要执行实际更新,请移除 --dry-run 参数'); } process.exit(0); } else { console.log('\n❌ 增量更新失败'); process.exit(1); } } catch (error) { console.error('\n💥 增量更新过程中发生错误:'); console.error(error.message); if (options.verbose) { console.error('\n📋 详细错误信息:'); console.error(error.stack); } console.log('\n🔧 故障排除建议:'); console.log('1. 检查PHP项目路径是否正确'); console.log('2. 检查NestJS项目路径是否正确'); console.log('3. 确保有足够的文件系统权限'); console.log('4. 尝试使用 --dry-run 模式查看详细信息'); console.log('5. 查看备份目录是否有可恢复的版本'); process.exit(1); } } // 处理未捕获的异常 process.on('unhandledRejection', (reason, promise) => { console.error('💥 未处理的Promise拒绝:', reason); process.exit(1); }); process.on('uncaughtException', (error) => { console.error('💥 未捕获的异常:', error); process.exit(1); }); // 处理中断信号 process.on('SIGINT', () => { console.log('\n\n⏹️ 用户中断操作'); console.log('增量更新已停止'); process.exit(0); }); process.on('SIGTERM', () => { console.log('\n\n⏹️ 收到终止信号'); console.log('增量更新已停止'); process.exit(0); }); // 运行主程序 if (require.main === module) { main(); } module.exports = { main, showHelp };