🍴 Meu Garfo é uma visualização em grafo dos CNPJs
cuducos.tngl.io/meu-garfo
1const { execSync } = require("node:child_process");
2const { mkdtempSync, rmSync, cpSync, readdirSync } = require("node:fs");
3const { tmpdir } = require("node:os");
4const { join } = require("node:path");
5
6const SITE_BRANCH = process.env.SITE_BRANCH || "site";
7
8const run = (cmd, opts = {}) => execSync(cmd, { stdio: "inherit", ...opts });
9
10const capture = (cmd, opts = {}) =>
11 execSync(cmd, { stdio: ["ignore", "pipe", "inherit"], ...opts })
12 .toString()
13 .trim();
14
15if (capture("git status --porcelain")) {
16 console.error("Working tree has uncommitted changes. Commit or stash first.");
17 process.exit(1);
18}
19
20let REMOTE;
21try {
22 const upstream = capture("git rev-parse --abbrev-ref @{upstream}");
23 REMOTE = upstream.split("/")[0];
24} catch {
25 console.error(
26 "Current branch has no upstream. Set one with `git push -u <remote> <branch>` first.",
27 );
28 process.exit(1);
29}
30
31run("npm run build");
32
33const workdir = mkdtempSync(join(tmpdir(), "meu-garfo-deploy-"));
34let worktreeAdded = false;
35
36try {
37 const remoteHas =
38 capture(`git ls-remote --heads ${REMOTE} ${SITE_BRANCH}`) !== "";
39
40 if (remoteHas) {
41 run(`git fetch ${REMOTE} ${SITE_BRANCH}`);
42 run(`git worktree add --force ${workdir} ${REMOTE}/${SITE_BRANCH}`);
43 run(`git -C ${workdir} checkout -B ${SITE_BRANCH}`);
44 } else {
45 run(`git worktree add --force --orphan -B ${SITE_BRANCH} ${workdir}`);
46 }
47 worktreeAdded = true;
48
49 for (const entry of readdirSync(workdir)) {
50 if (entry === ".git") continue;
51 rmSync(join(workdir, entry), { recursive: true, force: true });
52 }
53
54 for (const entry of readdirSync("dist")) {
55 cpSync(join("dist", entry), join(workdir, entry), { recursive: true });
56 }
57
58 run(`git -C ${workdir} add -A`);
59 const hasChanges = capture(`git -C ${workdir} status --porcelain`) !== "";
60 const sourceSha = capture("git rev-parse --short HEAD");
61
62 if (!hasChanges && remoteHas) {
63 console.log(
64 `No changes to deploy on ${SITE_BRANCH} (source at ${sourceSha}).`,
65 );
66 } else {
67 run(`git -C ${workdir} commit -m "Deploy ${sourceSha}" --allow-empty`, {
68 env: {
69 ...process.env,
70 GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME || "deploy",
71 GIT_COMMITTER_EMAIL: process.env.GIT_COMMITTER_EMAIL || "deploy@local",
72 },
73 });
74 run(`git -C ${workdir} push ${REMOTE} ${SITE_BRANCH}`);
75 }
76} finally {
77 if (worktreeAdded) {
78 try {
79 run(`git worktree remove --force ${workdir}`);
80 } catch {
81 rmSync(workdir, { recursive: true, force: true });
82 }
83 } else {
84 rmSync(workdir, { recursive: true, force: true });
85 }
86}