UNPKG

mtset

Version:

日常工具集合

94 lines (91 loc) 4.13 kB
const { program } = require('commander'); const inquirer = require('inquirer'); const chalk = require('chalk'); const fs = require('fs'); const path = require('path'); const { execGitCommand } = require('../utils/public-methods.js'); const { groupBy } = require('lodash'); function containsCharExactlyTwice(str, char) { const count = str.split(char).length - 1; return (count === 2 && /"id":.*\n=======/g.test(str) && /"branchId":.*\n=======/g.test(str)) || ((count === 1) && /"branchId":.*\n=======/g.test(str)); } async function resolveConflict (saveNewOrOld) { if (!saveNewOrOld) { console.error(chalk.red('缺失一个必传参数:[saveNewOrOld] 采用传入或当前的更改,或者保留下方或者上方,up保留上方,down保留下方')); program.help(); } const flieDir = path.join(process.cwd()); const filterFileList = await readDirReturnFileList(flieDir); const fileMapList = filterFileList.map(item => { const lastBytIndex = item.lastIndexOf('-'); const fileNameStart = item.slice(0, lastBytIndex); const fileVersionId = item.split('.')[0].split('-').pop(); return { fileNameStart: fileNameStart, fileVersionId: +fileVersionId, fileName: item } }); const res = groupBy(fileMapList, (item)=>{ return item.fileNameStart; }) Object.keys(res).forEach((item)=>{ const arr = res[item]; const maxVersionId = Math.max(...arr.map(i=>i.fileVersionId)); res[item] = arr.filter(i=>i.fileVersionId !== maxVersionId); }); // 待删除文件任务队列 const promiseAll = []; const repeatFileList = []; for (const group of Object.values(res)) { for (const file of group) { promiseAll.push(fs.promises.unlink(path.join(flieDir, file.fileName))); repeatFileList.push(file.fileName); } } try { await Promise.allSettled(promiseAll); console.log(chalk.yellow(`重复文件`)); console.log(chalk.green(repeatFileList.join("、"))); console.log('已经删除,请再次确认是否有误!'); const useAnswer = await inquirer.prompt([ { type: 'confirm', name: 'answer', message: '请确认文件删除是否正确,否则终止进程,并撤销git操作;如继续则进行文件内容冲突解决...' } ]); if (useAnswer.answer) { console.log(chalk.green('人工确认删除文件成功')); console.log(chalk.blue('进入下一阶段,自动解决文件内容冲突...')); const fileList = await readDirReturnFileList(flieDir); const waitCheckFileList = []; for (let i = 0; i < fileList.length; i++) { const fileText = await fs.promises.readFile(path.join(flieDir, fileList[i]), 'utf-8'); const flag = containsCharExactlyTwice(fileText, '=======') if (flag) { let newFileTxt = ''; if (saveNewOrOld === 'up') { newFileTxt = fileText.replace(/<<<<<<<.*?\n/g, '').replace(/=======.*?\n[\s\S]*?\n>>>>>>>.*?\n/g, ''); } if (saveNewOrOld === 'down') { newFileTxt = fileText.replace(/>>>>>>>.*?\n/g, '').replace(/<<<<<<<.*?\n[\s\S]*?\n=======.*?\n/g, ''); } await fs.promises.writeFile(path.join(flieDir, fileList[i]), newFileTxt); } else { if (fileText.includes('=======')) { waitCheckFileList.push(fileList[i]); } } } console.log(chalk.yellow(`不要忘记检查 .lowcode 文件夹的冲突!!!`)); console.log(chalk.yellow(`还需手动待检查文件: ${ waitCheckFileList.length ? waitCheckFileList.join(',') : '无'}`)); } else { await execGitCommand('git merge --abort'); await execGitCommand('git restore .'); } } catch (error) { console.log(chalk.red(`删除文件或执行git操作失败:${error}`)); } } exports.resolveConflict = resolveConflict;