add git check

This commit is contained in:
2026-02-08 17:11:41 +08:00
parent 23a6bfde8c
commit 22c8bf0c22
2 changed files with 101 additions and 0 deletions

92
single-scripts/git-check.ts Executable file
View File

@@ -0,0 +1,92 @@
#!/usr/bin/env runts -- --allow-import --allow-run --allow-read
import {
execCommand,
log,
ProcessBar,
} from "https://script.hatter.ink/@29/deno-commons-mod.ts";
import {
getGitLocalRev,
getGitRemoteRev,
} from "https://script.hatter.ink/@0/deno-git-mod.ts";
import {
formatHumanTime,
readFileToString,
writeStringToFile,
} from "../libraries/deno-commons-mod.ts";
async function sha256OfString(input: string): Promise<string> {
const data = new TextEncoder().encode(input);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join(
"",
);
}
async function getPwd(): Promise<string> {
const pwd = await execCommand("pwd");
pwd.assertSuccess();
return pwd.stdout.trim();
}
interface GitCheckCache {
path: string;
lastCheckTime: number;
}
async function main() {
const pwd = await getPwd();
const pwdHash = await sha256OfString(pwd);
const gitCheckCacheFile = `~/.cache/git-check-${
pwdHash.substring(0, 20)
}.json`;
log.debug(`Check git cache file: ${gitCheckCacheFile}`);
const gitCheckCacheContent = await readFileToString(gitCheckCacheFile);
const gitCheckCache = gitCheckCacheContent
? JSON.parse(gitCheckCacheContent) as GitCheckCache
: null;
if (gitCheckCache) {
const timeBefore = Date.now() - gitCheckCache.lastCheckTime;
if (timeBefore < 60 * 60 * 1000) {
log.info(
`Last check at ${new Date(
gitCheckCache.lastCheckTime,
)}, in ${
formatHumanTime(timeBefore)
}, skip check git remote rev`,
);
return;
}
}
const localRev = await getGitLocalRev();
const remoteRev = await new ProcessBar("Checking rev").call(
async (): Promise<string> => {
return await getGitRemoteRev();
},
);
if (localRev === remoteRev) {
log.success(`Check rev successfully, rev: ${localRev}`);
await writeStringToFile(
gitCheckCacheFile,
JSON.stringify(
{
path: pwd,
lastCheckTime: Date.now(),
} as GitCheckCache,
null,
2,
),
);
} else {
log.error(
`Check rev failed, local rev: ${localRev} vs remote rev: ${remoteRev}`,
);
Deno.exit(1);
}
}
await main();
// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260208T171132+08:00.MEQCIE+nwuOV0aljgeKyGzFE
// eSZrNDvMwRpta2s+C26F0PKHAiBdgS0xvwSjiVrl+82PtaSVsDnxJ8/AsAfb3D1t4fFaeA==