add git check
This commit is contained in:
92
single-scripts/git-check.ts
Executable file
92
single-scripts/git-check.ts
Executable 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==
|
||||
Reference in New Issue
Block a user