mtset
Version:
日常工具集合
94 lines (91 loc) • 4.13 kB
JavaScript
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;