AutoCommit/src/models/commitHandle.ts

345 lines
11 KiB
TypeScript
Raw Normal View History

2019-12-30 21:13:08 +08:00
/*
* Author : OBKoro1
* Date : 2019-12-30 16:59:30
* LastEditors : OBKoro1
* LastEditTime : 2021-01-08 19:50:07
* File : \autoCommit\src\models\commitHandle.ts
2019-12-30 21:13:08 +08:00
* Description : commit
* https://github.com/OBKoro1
*/
import * as moment from 'moment';
import * as fs from 'fs';
2020-12-10 20:02:10 +08:00
import { exec } from 'child_process';
import { sep } from 'path';
import { WebviewMsg } from '../util/dataStatement';
2019-12-30 21:13:08 +08:00
import { RandomNumber } from '../util/util';
2020-01-08 14:08:09 +08:00
import {
getPanelWebview,
outputLog,
isProduction,
2020-12-10 20:02:10 +08:00
getExtensionContext,
2020-01-08 14:08:09 +08:00
} from '../util/vscodeUtil';
2019-12-30 21:13:08 +08:00
import WebView from './WebView';
2020-12-10 20:02:10 +08:00
interface TimeElement {
value: Array<string>;
commitNumber: number;
}
2020-12-10 20:02:10 +08:00
interface DayTime {
value: string;
commitNumber: number;
}
2020-12-10 20:02:10 +08:00
// 获取两个日期之间的间隔: [ '2019-02-02', '2019-02-03' ... ]
const getAllDay = (begin: string, end: string) => {
const timeArr = [];
const beginDate: Date = moment(begin).toDate();
2020-12-10 20:02:10 +08:00
const beginNumber = beginDate.getTime();
const endDate = moment(end).toDate();
2020-12-10 20:02:10 +08:00
const endNumber = endDate.getTime();
for (let k: any = beginNumber; k <= endNumber;) {
// eslint-disable-next-line radix
const day = new Date(parseInt(k));
const dayFormat = moment(day).format('YYYY-MM-DD');
timeArr.push(dayFormat);
k += 24 * 60 * 60 * 1000;
}
return timeArr;
};
// 获取当天的随机时间
const getTodayRandomNumber = (time: string) => {
const hour1 = RandomNumber(0, 2);
let hour2 = RandomNumber(0, 9);
if (hour1 === 2) {
// 小时第一个数字为2 则小时第二个数字最多为3
hour2 = RandomNumber(0, 3);
}
const minute = `${RandomNumber(0, 5)}${RandomNumber(0, 9)}`;
const hour = `${hour1}${hour2}`;
return `${time} ${hour}:${minute}`;
};
2019-12-30 21:13:08 +08:00
class CommitHandle {
public paramsObj: any;
2020-12-10 20:02:10 +08:00
public moreObj: any;
2020-12-10 20:02:10 +08:00
public timeArr: Array<DayTime>;
2019-12-30 21:13:08 +08:00
public autoCommitView: WebView;
2020-12-10 20:02:10 +08:00
private userCancel: boolean;
2020-12-10 20:02:10 +08:00
private totalCommit: number; // 总commit次数
2020-12-10 20:02:10 +08:00
constructor(message: WebviewMsg) {
this.paramsObj = message.data.form;
this.moreObj = message.data.moreObj;
2019-12-30 21:13:08 +08:00
this.timeArr = [];
this.totalCommit = 0;
this.userCancel = false;
2019-12-30 21:13:08 +08:00
this.timeHandle();
this.autoCommitView = getPanelWebview();
}
2020-12-10 20:02:10 +08:00
2019-12-30 21:13:08 +08:00
// 处理所有时间段
timeHandle() {
// 处理所有时间范围
2020-12-10 20:02:10 +08:00
this.paramsObj.timeArr.forEach((item: TimeElement) => {
2019-12-30 21:13:08 +08:00
// 获取每个时间范围的具体日期
2020-12-10 20:02:10 +08:00
const detailTimeArr = getAllDay(item.value[0], item.value[1]);
// 日期去重 组织数据
2020-12-10 20:02:10 +08:00
detailTimeArr.forEach((ele) => {
const index = this.timeArr.findIndex((element) => element.value === ele);
2020-01-02 17:19:47 +08:00
// 删除重复日期
if (index !== -1) {
this.timeArr.splice(index, 1);
}
// 获取当天的commit次数
const dayCommitNumber = this.getDayCommitNumber(item.commitNumber);
this.totalCommit = dayCommitNumber + this.totalCommit;
2020-01-02 17:19:47 +08:00
this.timeArr.push({
value: ele,
commitNumber: dayCommitNumber,
2020-01-02 17:19:47 +08:00
});
2019-12-30 21:13:08 +08:00
});
});
this.sortTime();
}
2020-12-10 20:02:10 +08:00
2019-12-30 21:13:08 +08:00
// 日期排序
sortTime() {
this.timeArr = this.timeArr.sort(
2020-12-10 20:02:10 +08:00
(item1: DayTime, item2: DayTime): number => {
const dateArr1: Array<any> = item1.value.split('-');
const dateArr2: Array<any> = item2.value.split('-');
if (dateArr1[0] === dateArr2[0]) {
if (dateArr1[1] === dateArr2[1]) {
// 日期不同就比较日期
return dateArr1[2] - dateArr2[2];
}
2020-12-10 20:02:10 +08:00
// 月份不同就比较月份
return dateArr1[1] - dateArr2[1];
2019-12-30 21:13:08 +08:00
}
2020-12-10 20:02:10 +08:00
// 年份不同就比较年份
return dateArr1[0] - dateArr2[0];
},
);
2020-12-10 20:02:10 +08:00
this.deleteDayArrDay();
this.commitFn();
}
2020-12-10 20:02:10 +08:00
// 随机删除日期数组中的某几天
deleteDayArrDay() {
2020-12-10 20:02:10 +08:00
const { noCommitDay } = this.moreObj;
const { scopeDay } = this.moreObj;
if (scopeDay < 1 || noCommitDay < 1) return; // 必须大于1
if (scopeDay > this.timeArr.length) return; // 日期不够
// 删除
2020-12-10 20:02:10 +08:00
for (let i = 0; i < noCommitDay; i++) {
const ranDomNum = Math.floor(Math.random() * this.timeArr.length); // 随机数
this.timeArr.splice(ranDomNum, 1);
}
2019-12-30 21:13:08 +08:00
}
2020-12-10 20:02:10 +08:00
async commitFn() {
2020-01-02 14:19:05 +08:00
await outputLog('将要commit的日期:', JSON.stringify(this.timeArr));
outputLog('总commit天数:', this.timeArr.length);
outputLog('总commit次数:', this.totalCommit);
2019-12-30 21:13:08 +08:00
let totalNum = 0; // 总commit次数
if (sep === '\\') {
const reg = new RegExp(/\\/g);
this.paramsObj.itemSrc = `${this.paramsObj.itemSrc.replace(reg, '/')}`;
}
2019-12-30 21:13:08 +08:00
// 遍历日期
2020-12-10 20:02:10 +08:00
for (const item of this.timeArr.values()) {
if (this.cancelCommit()) break;
2019-12-30 21:13:08 +08:00
// 每个日期commit次数
const dayCommitNumber = item.commitNumber;
2020-12-10 20:02:10 +08:00
/* eslint no-plusplus: ["error", { "allowForLoopAfterthoughts": true }] */
for (let i = 0; i < dayCommitNumber; i++) {
if (this.cancelCommit()) break;
2020-12-10 20:02:10 +08:00
let time = getTodayRandomNumber(item.value); // 2019-01-02 08:00
2020-01-15 11:47:31 +08:00
time = moment(time).format(); // 2019-01-02T00:00:00+0800
2020-12-10 20:02:10 +08:00
const commitContent = this.commitFileContent(time, totalNum);
2020-01-02 14:19:05 +08:00
let commitMsg: string = '';
const isDebug = false; // 手动更改调试模拟是否提交git
if (!isProduction() || !isDebug) {
try {
// 异步执行命令 让出线程 打印日志 等
2020-12-10 20:02:10 +08:00
// eslint-disable-next-line no-await-in-loop
2020-01-02 14:19:05 +08:00
commitMsg = await new Promise((resolve, reject) => {
// 先提交commit 再修改commit日期和时间
const cmd = `git add . && git commit -m '${this.paramsObj.commitMsg}' && set GIT_COMMITTER_DATE='${time}' && set GIT_AUTHOR_DATE='${time}' && git commit --amend --no-edit --date '${time}'`;
exec(
cmd,
{
cwd: this.paramsObj.itemSrc,
env: process.env,
},
(error, stdout, stderr) => {
if (error) {
outputLog(`执行命令出错:${cmd}`);
outputLog(`错误信息:${error}`, stderr);
reject(error);
return;
}
resolve(stdout);
},
);
2020-01-02 14:19:05 +08:00
});
} catch (err) {
outputLog(`commit出错:${err}`);
2020-01-02 17:19:47 +08:00
continue; // 错误 退出本次循环
2020-01-02 14:19:05 +08:00
}
} else {
// 模拟git提交
2020-12-10 20:02:10 +08:00
// eslint-disable-next-line no-await-in-loop
await new Promise((resolve) => {
setTimeout(() => {
outputLog('延迟一秒');
resolve('延迟一秒');
}, 1000);
});
}
2020-12-10 20:02:10 +08:00
totalNum += 1;
// commit次数小于100显示log
console.log(`${totalNum}commit内容`, commitContent);
console.log(`${totalNum}commit信息`, commitMsg);
2019-12-30 21:13:08 +08:00
}
}
this.pushCommitFn(totalNum);
}
2020-12-10 20:02:10 +08:00
async pushCommitFn(totalNum: number) {
const commitNumberBig = 100; // commit数量过大
2020-01-10 17:01:32 +08:00
let thinkNumber = 10000; // 考虑时间 避免运行过快导致误操作
if (totalNum > commitNumberBig) {
outputLog(`commit数量:${totalNum}`);
outputLog('commit数量超过100次,请考虑10秒钟是否需要取消commit');
2020-01-10 17:01:32 +08:00
} else {
thinkNumber = 2000; // 无感 考虑两秒
}
2020-12-10 20:02:10 +08:00
await new Promise((resolve) => {
2020-01-10 17:01:32 +08:00
setTimeout(() => {
resolve();
}, thinkNumber);
});
2020-01-07 22:34:31 +08:00
if (this.cancelCommit()) {
if (totalNum === 0) return;
2020-01-08 17:13:17 +08:00
await this.resetCommit(totalNum);
2020-01-10 17:01:32 +08:00
this.commitEnd(totalNum, true);
2020-01-07 22:34:31 +08:00
} else {
outputLog('提交中...');
2020-01-08 14:08:09 +08:00
this.autoCommitView.postMessage('提交中...', '提交中');
2020-01-07 22:34:31 +08:00
const res = await new Promise((resolve, reject) => {
const cmd = 'git pull --rebase && git push';
exec(
cmd,
{
encoding: 'utf8',
cwd: this.paramsObj.itemSrc,
env: undefined,
},
(error, stdout, stderr) => {
if (error) {
outputLog(`执行命令出错:${cmd}`);
outputLog(`错误信息:${error}`, stderr);
outputLog(
'git push失败很可能是你的网络有问题请换到一个网络状况比较良好的地方然后再项目下执行 git push操作。',
);
reject(error);
return;
}
resolve(stdout);
},
);
2020-01-07 22:34:31 +08:00
});
outputLog('提交信息:', res);
2020-01-10 17:01:32 +08:00
this.commitEnd(totalNum);
2020-01-07 22:34:31 +08:00
}
}
2020-12-10 20:02:10 +08:00
2020-01-08 17:13:17 +08:00
async resetCommit(totalNum: number) {
this.autoCommitView.postMessage('回滚', '回滚');
outputLog('回滚中...');
2020-12-10 20:02:10 +08:00
const p = await new Promise((resolve, reject) => {
const cmd = `git reset --hard HEAD~${totalNum}`;
exec(
cmd,
{
encoding: 'utf8',
cwd: this.paramsObj.itemSrc,
},
(error, stdout, stderr) => {
if (error) {
outputLog(`执行命令出错:${cmd}`);
outputLog(`回滚失败:${error}`, stderr);
reject(error);
return;
}
outputLog(`回滚${totalNum}次commit成功:`, stdout);
resolve(stdout);
},
);
2020-01-08 17:13:17 +08:00
});
2020-12-10 20:02:10 +08:00
return p;
2020-01-08 17:13:17 +08:00
}
2020-12-10 20:02:10 +08:00
2020-01-10 17:01:32 +08:00
commitEnd(totalNum: number, cancel: boolean = false) {
this.userCancel = false; // 重新打开终止开关
2020-01-10 17:01:32 +08:00
if (!cancel) {
this.autoCommitView.postMessage('commit 完成', this.paramsObj);
getExtensionContext().globalState.update('commit-params', this.paramsObj);
outputLog('自动commit完成', `总commit次数${totalNum}`);
}
2020-01-08 14:08:09 +08:00
outputLog('保存参数信息');
}
2020-12-10 20:02:10 +08:00
cancelCommit() {
if (this.userCancel) {
outputLog('终止自动commit');
}
return this.userCancel;
}
2020-12-10 20:02:10 +08:00
public closeCommit() {
this.userCancel = true;
2019-12-30 21:13:08 +08:00
}
2020-12-10 20:02:10 +08:00
2020-01-08 17:13:17 +08:00
// 组织commit文件的内容
2020-01-08 17:19:00 +08:00
commitFileContent(time: string, totalNum: number) {
2020-01-08 17:13:17 +08:00
const commitContent = `${time}\n随机数:${RandomNumber(
1,
2020-12-10 20:02:10 +08:00
100000,
2020-01-08 17:13:17 +08:00
)}\n提交次数:${totalNum + 1}`;
// 写入内容
fs.writeFileSync(
`${this.paramsObj.itemSrc}/${this.paramsObj.fileName}`,
commitContent,
2020-12-10 20:02:10 +08:00
'utf-8',
2020-01-08 17:13:17 +08:00
);
2020-01-10 17:01:32 +08:00
return commitContent;
2020-01-08 17:13:17 +08:00
}
2020-12-10 20:02:10 +08:00
// 获取当天的commit次数
getDayCommitNumber(commitNumber: number) {
let dayCommitNumber = this.paramsObj.commitNumber; // 固定commit次数
// 使用随机commit次数
2020-01-08 17:13:17 +08:00
if (this.paramsObj.randomCommit) {
dayCommitNumber = RandomNumber(1, this.paramsObj.commitNumber);
}
// 如果该时间范围有commit次数 则用该范围的
if (commitNumber !== 0) {
dayCommitNumber = commitNumber;
2020-01-08 17:13:17 +08:00
}
return dayCommitNumber;
}
2019-12-30 21:13:08 +08:00
}
export default CommitHandle;