ZZZ-Plugin/lib/update.js

105 lines
2.8 KiB
JavaScript

import _ from 'lodash';
import { pluginName } from '../lib/path.js';
import { mdLogLineToHTML } from '../utils/data.js';
let Update = null;
try {
Update = (await import('../../other/update.js').catch(e => null))?.update;
Update ||= (await import('../../system/apps/update.ts')).update;
} catch (e) {
logger.error(
`[${pluginName}]未获取到更新js ${logger.yellow('更新功能')} 将无法使用`
);
}
let ZZZUpdate = null;
/**
* @typedef {Object} CommitLog
* @property {string} commit 提交ID
* @property {string} date 提交时间
* @property {string} msg 提交信息
* @property {boolean} local 是否本地记录
* @property {current} boolean 是否当前版本
*/
/**
* @typedef {Object} UpdateInfo
* @property {boolean} hasUpdate 是否有更新
* @property {CommitLog[]} logs 更新日志
*/
if (Update) {
ZZZUpdate = class ZZZUpdate extends Update {
async handleLog(remote = false) {
let cmdStr = 'git log -100 --pretty="%h||%cd||%s" --date=format:"%F %T"';
if (remote) {
cmdStr =
'git log -100 --pretty="%h||%cd||%s" --date=format:"%F %T" origin/main';
}
const cm = await this.exec(cmdStr, pluginName);
if (cm.error) {
throw new Error(cm.error.message);
}
const logAll = cm.stdout.split('\n');
if (!logAll.length) {
throw new Error('未获取到更新日志');
}
/** @type CommitLog[] */
const log = [];
let current = true;
for (let str of logAll) {
str = str.split('||');
if (str[0] === this.oldCommitId) break;
if (str[2].includes('Merge')) continue;
/** @type CommitLog */
const commit = {
commit: str[0],
date: str[1],
msg: mdLogLineToHTML(str[2]),
local: !remote,
current: false,
};
if (!remote && current) {
commit.current = true;
current = false;
}
log.push(commit);
}
return log;
}
async getZZZLog() {
const log = await this.handleLog();
return log;
}
async getZZZRemoteLog() {
const log = await this.handleLog(true);
return log;
}
async getZZZAllLog() {
const localLog = await this.getZZZLog();
const remoteLog = await this.getZZZRemoteLog();
const logs = _.unionBy(localLog, remoteLog, 'commit');
logs.sort((a, b) => {
return new Date(b.date) - new Date(a.date);
});
return logs;
}
async hasUpdate() {
const logs = await this.getZZZAllLog();
const newLogs = logs.filter(log => !log.local);
/** @type UpdateInfo */
let result = {
hasUpdate: false,
logs: [],
};
if (newLogs.length) {
result.hasUpdate = true;
result.logs = newLogs;
}
return result;
}
};
}
export { ZZZUpdate };