run402 4.24.1 → 4.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.mjs +6 -6
- package/git-remote-run402.mjs +328 -0
- package/lib/command-manifest.mjs +13 -1
- package/lib/credentials.mjs +4 -0
- package/lib/deploy-v2.mjs +78 -1
- package/lib/doctor.mjs +80 -1
- package/lib/domains.mjs +0 -14
- package/lib/gitvault.mjs +582 -0
- package/lib/init.mjs +153 -5
- package/lib/org-context.mjs +44 -1
- package/lib/pay.test.mjs +0 -4
- package/package.json +8 -2
- package/sdk/dist/index.d.ts +20 -3
- package/sdk/dist/index.d.ts.map +1 -1
- package/sdk/dist/index.js +22 -3
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/namespaces/admin.d.ts +0 -5
- package/sdk/dist/namespaces/admin.d.ts.map +1 -1
- package/sdk/dist/namespaces/admin.js +0 -9
- package/sdk/dist/namespaces/admin.js.map +1 -1
- package/sdk/dist/namespaces/assets.d.ts +1 -20
- package/sdk/dist/namespaces/assets.d.ts.map +1 -1
- package/sdk/dist/namespaces/assets.js +0 -27
- package/sdk/dist/namespaces/assets.js.map +1 -1
- package/sdk/dist/namespaces/domains.d.ts +0 -19
- package/sdk/dist/namespaces/domains.d.ts.map +1 -1
- package/sdk/dist/namespaces/domains.js +0 -19
- package/sdk/dist/namespaces/domains.js.map +1 -1
- package/sdk/dist/namespaces/gitvault.crypto.d.ts +319 -0
- package/sdk/dist/namespaces/gitvault.crypto.d.ts.map +1 -0
- package/sdk/dist/namespaces/gitvault.crypto.js +690 -0
- package/sdk/dist/namespaces/gitvault.crypto.js.map +1 -0
- package/sdk/dist/namespaces/gitvault.d.ts +521 -0
- package/sdk/dist/namespaces/gitvault.d.ts.map +1 -0
- package/sdk/dist/namespaces/gitvault.js +786 -0
- package/sdk/dist/namespaces/gitvault.js.map +1 -0
- package/sdk/dist/namespaces/gitvault.types.d.ts +481 -0
- package/sdk/dist/namespaces/gitvault.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/gitvault.types.js +19 -0
- package/sdk/dist/namespaces/gitvault.types.js.map +1 -0
- package/sdk/dist/namespaces/org.d.ts +1 -3
- package/sdk/dist/namespaces/org.d.ts.map +1 -1
- package/sdk/dist/namespaces/org.js +6 -10
- package/sdk/dist/namespaces/org.js.map +1 -1
- package/sdk/dist/namespaces/pay.d.ts +0 -8
- package/sdk/dist/namespaces/pay.d.ts.map +1 -1
- package/sdk/dist/namespaces/pay.js.map +1 -1
- package/sdk/dist/namespaces/projects.d.ts +2 -2
- package/sdk/dist/namespaces/projects.d.ts.map +1 -1
- package/sdk/dist/namespaces/projects.js +4 -12
- package/sdk/dist/namespaces/projects.js.map +1 -1
- package/sdk/dist/namespaces/secrets.d.ts +0 -2
- package/sdk/dist/namespaces/secrets.d.ts.map +1 -1
- package/sdk/dist/namespaces/secrets.js +3 -10
- package/sdk/dist/namespaces/secrets.js.map +1 -1
- package/sdk/dist/namespaces/subdomains.d.ts +0 -2
- package/sdk/dist/namespaces/subdomains.d.ts.map +1 -1
- package/sdk/dist/namespaces/subdomains.js +5 -16
- package/sdk/dist/namespaces/subdomains.js.map +1 -1
- package/sdk/dist/namespaces/transfers.d.ts +0 -2
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js +8 -10
- package/sdk/dist/namespaces/transfers.js.map +1 -1
- package/sdk/dist/namespaces/wallets.d.ts +0 -12
- package/sdk/dist/namespaces/wallets.d.ts.map +1 -1
- package/sdk/dist/namespaces/wallets.js +0 -14
- package/sdk/dist/namespaces/wallets.js.map +1 -1
- package/sdk/dist/node/gitvault-creation-journal.d.ts +222 -0
- package/sdk/dist/node/gitvault-creation-journal.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-creation-journal.js +365 -0
- package/sdk/dist/node/gitvault-creation-journal.js.map +1 -0
- package/sdk/dist/node/gitvault-deploy.d.ts +211 -0
- package/sdk/dist/node/gitvault-deploy.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-deploy.js +292 -0
- package/sdk/dist/node/gitvault-deploy.js.map +1 -0
- package/sdk/dist/node/gitvault-keystore.d.ts +207 -0
- package/sdk/dist/node/gitvault-keystore.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-keystore.js +529 -0
- package/sdk/dist/node/gitvault-keystore.js.map +1 -0
- package/sdk/dist/node/gitvault-prune.d.ts +341 -0
- package/sdk/dist/node/gitvault-prune.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-prune.js +410 -0
- package/sdk/dist/node/gitvault-prune.js.map +1 -0
- package/sdk/dist/node/gitvault-publication.d.ts +730 -0
- package/sdk/dist/node/gitvault-publication.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-publication.js +1475 -0
- package/sdk/dist/node/gitvault-publication.js.map +1 -0
- package/sdk/dist/node/gitvault-snapshot.d.ts +227 -0
- package/sdk/dist/node/gitvault-snapshot.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-snapshot.js +556 -0
- package/sdk/dist/node/gitvault-snapshot.js.map +1 -0
- package/sdk/dist/node/index.d.ts +11 -0
- package/sdk/dist/node/index.d.ts.map +1 -1
- package/sdk/dist/node/index.js +9 -0
- package/sdk/dist/node/index.js.map +1 -1
- package/sdk/dist/node/paid-fetch.d.ts.map +1 -1
- package/sdk/dist/node/paid-fetch.js +0 -4
- package/sdk/dist/node/paid-fetch.js.map +1 -1
- package/sdk/dist/node/sites-node.d.ts +1 -8
- package/sdk/dist/node/sites-node.d.ts.map +1 -1
- package/sdk/dist/node/sites-node.js +1 -7
- package/sdk/dist/node/sites-node.js.map +1 -1
- package/sdk/dist/scoped.d.ts +4 -35
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +9 -74
- package/sdk/dist/scoped.js.map +1 -1
- package/lib/sender-domain.mjs +0 -36
- package/sdk/dist/deprecate.d.ts +0 -23
- package/sdk/dist/deprecate.d.ts.map +0 -1
- package/sdk/dist/deprecate.js +0 -42
- package/sdk/dist/deprecate.js.map +0 -1
- package/sdk/dist/namespaces/sender-domain.d.ts +0 -47
- package/sdk/dist/namespaces/sender-domain.d.ts.map +0 -1
- package/sdk/dist/namespaces/sender-domain.js +0 -45
- package/sdk/dist/namespaces/sender-domain.js.map +0 -1
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gitvault — snapshot + hardened git execution (protocol rev 40 §6.6; task 5.5).
|
|
3
|
+
*
|
|
4
|
+
* Snapshot policy: clean tree → `HEAD`; dirty → a synthetic commit of tracked
|
|
5
|
+
* + untracked-not-ignored paths (parented on HEAD; parentless on an unborn
|
|
6
|
+
* HEAD); unmerged index → `SNAPSHOT_CONFLICTED_INDEX`; detached HEAD is
|
|
7
|
+
* representable; linked worktrees, bare layouts, sparse checkouts, shallow
|
|
8
|
+
* clones, submodules, SHA-256 repositories, alternates/grafts, and active
|
|
9
|
+
* filters on any captured path are REFUSED BY NAME before any object is
|
|
10
|
+
* created.
|
|
11
|
+
*
|
|
12
|
+
* Ignore authority is FROZEN and read AS DATA: repository `.gitignore`,
|
|
13
|
+
* `.git/info/exclude`, and the user's global excludes file. The global path
|
|
14
|
+
* is discovered deterministically (round-6 M11) by parsing
|
|
15
|
+
* `$XDG_CONFIG_HOME/git/config` then `~/.gitconfig` with a frozen config
|
|
16
|
+
* subset (last value wins, `~/`/`$HOME` expansion only; `include`/`includeIf`
|
|
17
|
+
* or an unreadable config/excludes file → refuse by name). git never sees the
|
|
18
|
+
* user's config: the discovered file is handed to `git ls-files` as an
|
|
19
|
+
* `--exclude-from` pattern source, so git's matcher runs over OUR discovery.
|
|
20
|
+
*
|
|
21
|
+
* Object creation NEVER invokes filters for any path (tracked or untracked):
|
|
22
|
+
* bytes are hashed with `git hash-object --no-filters`; every included path is
|
|
23
|
+
* first checked with `git check-attr filter`, and any configured filter (LFS
|
|
24
|
+
* included) refuses the capture by name — no clean/smudge/process command is
|
|
25
|
+
* ever started (the acceptance test asserts a sentinel the filter would write
|
|
26
|
+
* never appears).
|
|
27
|
+
*
|
|
28
|
+
* Every git invocation is argv-only (no shell), with `GIT_*` cleared,
|
|
29
|
+
* `GIT_CONFIG_NOSYSTEM`, `GIT_CONFIG_GLOBAL=/dev/null` (no user config), an
|
|
30
|
+
* empty `core.hooksPath`, `--no-replace-objects`, `core.fsmonitor=false`, and
|
|
31
|
+
* no alternates. Repository-config `include`/`includeIf` is refused by name
|
|
32
|
+
* (git applies it before any `-c`; there is no override switch).
|
|
33
|
+
*/
|
|
34
|
+
import { execFile } from "node:child_process";
|
|
35
|
+
import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readlinkSync, realpathSync, rmSync } from "node:fs";
|
|
36
|
+
import { tmpdir } from "node:os";
|
|
37
|
+
import { join, resolve } from "node:path";
|
|
38
|
+
import { LocalError } from "../errors.js";
|
|
39
|
+
import { GITVAULT_OID40_RE, deriveDigestKey, keyedCommitment, snapshotOidContent } from "../namespaces/gitvault.crypto.js";
|
|
40
|
+
// ─── Constants (constants.json) ──────────────────────────────────────────────
|
|
41
|
+
/** `MAX_GIT_OBJECT_BYTES` — any single object above this is `GIT_OBJECT_TOO_LARGE`. */
|
|
42
|
+
export const GITVAULT_MAX_GIT_OBJECT_BYTES = 200 * 1024 * 1024;
|
|
43
|
+
/** `refs/run402/deploys/latest` — the single protocol-owned deploy ref (round-3 H9). */
|
|
44
|
+
export const GITVAULT_DEPLOY_REF = "refs/run402/deploys/latest";
|
|
45
|
+
/** Probed git version range: `[2.32, ∞)` — `GIT_CONFIG_GLOBAL` landed in 2.32. */
|
|
46
|
+
export const GITVAULT_MIN_GIT_VERSION = [2, 32];
|
|
47
|
+
function fail(code, message, context, details) {
|
|
48
|
+
throw new LocalError(message, context, { code, details });
|
|
49
|
+
}
|
|
50
|
+
let emptyHooksDir = null;
|
|
51
|
+
function hooksPath() {
|
|
52
|
+
if (!emptyHooksDir) {
|
|
53
|
+
emptyHooksDir = mkdtempSync(join(tmpdir(), "run402-gitvault-nohooks-"));
|
|
54
|
+
}
|
|
55
|
+
return emptyHooksDir;
|
|
56
|
+
}
|
|
57
|
+
/** The environment every gitvault git process runs under — nothing inherited except PATH. */
|
|
58
|
+
export function hardenedGitEnv(extra = {}) {
|
|
59
|
+
const env = {
|
|
60
|
+
PATH: process.env.PATH ?? "/usr/bin:/bin",
|
|
61
|
+
LC_ALL: "C",
|
|
62
|
+
GIT_CONFIG_NOSYSTEM: "1",
|
|
63
|
+
GIT_CONFIG_GLOBAL: "/dev/null",
|
|
64
|
+
GIT_NO_REPLACE_OBJECTS: "1",
|
|
65
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
66
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
67
|
+
// hash-object/commit-tree identity for synthetic commits — fixed, never the user's.
|
|
68
|
+
GIT_AUTHOR_NAME: "run402 gitvault",
|
|
69
|
+
GIT_AUTHOR_EMAIL: "gitvault@run402.com",
|
|
70
|
+
GIT_COMMITTER_NAME: "run402 gitvault",
|
|
71
|
+
GIT_COMMITTER_EMAIL: "gitvault@run402.com",
|
|
72
|
+
};
|
|
73
|
+
if (process.env.HOME)
|
|
74
|
+
env.HOME = process.env.HOME; // only so /dev/null config resolution has a home; never read.
|
|
75
|
+
for (const [k, v] of Object.entries(extra))
|
|
76
|
+
env[k] = v;
|
|
77
|
+
return env;
|
|
78
|
+
}
|
|
79
|
+
/** The argv prefix that neutralizes hooks, fsmonitor, replace refs, and filter autodetection for every invocation. */
|
|
80
|
+
export const HARDENED_GIT_ARGV_PREFIX = () => [
|
|
81
|
+
"--no-replace-objects",
|
|
82
|
+
"-c", `core.hooksPath=${hooksPath()}`,
|
|
83
|
+
"-c", "core.fsmonitor=false",
|
|
84
|
+
"-c", "core.untrackedCache=false",
|
|
85
|
+
"-c", "core.commitGraph=false",
|
|
86
|
+
"-c", "gc.auto=0",
|
|
87
|
+
"-c", "protocol.allow=never",
|
|
88
|
+
];
|
|
89
|
+
/**
|
|
90
|
+
* Run git with explicit args (no shell) in `cwd` under the hardened env.
|
|
91
|
+
* Throws `GIT_COMMAND_FAILED` on a non-ok exit.
|
|
92
|
+
*/
|
|
93
|
+
export function hardenedGit(cwd, args, options = {}) {
|
|
94
|
+
const argv = [...HARDENED_GIT_ARGV_PREFIX(), ...args];
|
|
95
|
+
return new Promise((resolvePromise, reject) => {
|
|
96
|
+
const child = execFile("git", argv, { cwd, env: hardenedGitEnv(options.env), encoding: "buffer", maxBuffer: options.maxBuffer ?? 1024 * 1024 * 1024, windowsHide: true }, (error, stdout, stderr) => {
|
|
97
|
+
const status = error && typeof error.code === "number" ? (error.code) : error ? -1 : 0;
|
|
98
|
+
const stderrText = Buffer.from(stderr).toString("utf8");
|
|
99
|
+
if (error && status === -1) {
|
|
100
|
+
reject(new LocalError(`git could not be executed: ${error.message}`, "running hardened git", { code: "GIT_UNAVAILABLE", details: { args: argv }, cause: error }));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (status !== 0 && !(options.okStatuses ?? []).includes(status)) {
|
|
104
|
+
reject(new LocalError(`git ${args[0] ?? ""} failed (exit ${status}): ${stderrText.trim().slice(0, 500)}`, "running hardened git", { code: "GIT_COMMAND_FAILED", details: { args, status, stderr: stderrText.slice(0, 2000) } }));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const out = Buffer.from(stdout);
|
|
108
|
+
resolvePromise({
|
|
109
|
+
status,
|
|
110
|
+
stdout: out,
|
|
111
|
+
stderr: stderrText,
|
|
112
|
+
text: () => out.toString("utf8"),
|
|
113
|
+
lines: () => out.toString("utf8").split("\n").filter((l) => l.length > 0),
|
|
114
|
+
nul: () => out.toString("utf8").split("\0").filter((l) => l.length > 0),
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
if (options.input !== undefined)
|
|
118
|
+
child.stdin?.end(typeof options.input === "string" ? Buffer.from(options.input, "utf8") : Buffer.from(options.input));
|
|
119
|
+
else
|
|
120
|
+
child.stdin?.end();
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/** `realpath` when it resolves, the input otherwise — path equality across `/tmp` → `/private/tmp` and friends. */
|
|
124
|
+
function canonicalPath(p) {
|
|
125
|
+
try {
|
|
126
|
+
return realpathSync(p);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return p;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve — and PROVE — the repository git invoked this helper for.
|
|
134
|
+
*
|
|
135
|
+
* git always sets `GIT_DIR` when it runs a remote helper against a
|
|
136
|
+
* repository: `.git` (relative, cwd already moved to the top level) for
|
|
137
|
+
* fetch/push, the linked worktree's git dir inside a worktree, `.` in a bare
|
|
138
|
+
* repository, and the ABSOLUTE path of the not-yet-populated target during
|
|
139
|
+
* `git clone`. It is unset only for a repository-free invocation such as
|
|
140
|
+
* `git ls-remote <url>` run outside any checkout, which needs no repository
|
|
141
|
+
* at all.
|
|
142
|
+
*
|
|
143
|
+
* So `process.cwd()` is NOT the repository: during a clone it is the directory
|
|
144
|
+
* the user ran clone FROM, which is routinely inside some unrelated repo. A
|
|
145
|
+
* helper that discovers its repository from cwd therefore writes the vault's
|
|
146
|
+
* decrypted objects into a repository the user never named — the leak this
|
|
147
|
+
* function exists to make impossible. It fails closed: no `GIT_DIR`, a
|
|
148
|
+
* `GIT_DIR` that is not a repository, or a `GIT_DIR` whose own
|
|
149
|
+
* `--absolute-git-dir` disagrees with the path we were handed, all refuse.
|
|
150
|
+
* The caller must write nothing after a refusal.
|
|
151
|
+
*/
|
|
152
|
+
export async function resolveGitInvocationRepo(env = process.env, cwd = process.cwd()) {
|
|
153
|
+
const declared = typeof env.GIT_DIR === "string" ? env.GIT_DIR.trim() : "";
|
|
154
|
+
if (declared === "") {
|
|
155
|
+
fail("GIT_INVOCATION_REPO_UNRESOLVED", "git set no GIT_DIR for this invocation, so the repository it wants operated on cannot be established; refusing rather than guessing from the current directory", "resolving the invoking git repository", { reason: "no_git_dir", cwd });
|
|
156
|
+
}
|
|
157
|
+
const absolute = resolve(cwd, declared);
|
|
158
|
+
let observed;
|
|
159
|
+
try {
|
|
160
|
+
observed = (await hardenedGit(absolute, ["rev-parse", "--absolute-git-dir"])).text().trim();
|
|
161
|
+
}
|
|
162
|
+
catch (cause) {
|
|
163
|
+
fail("GIT_INVOCATION_REPO_UNRESOLVED", `GIT_DIR ${absolute} is not a readable git repository`, "resolving the invoking git repository", { reason: "git_dir_not_a_repository", git_dir: absolute, cause: cause instanceof Error ? cause.message : String(cause) });
|
|
164
|
+
}
|
|
165
|
+
// The proof: discovery started AT the named directory must come back to that
|
|
166
|
+
// same directory. A `GIT_DIR` pointing at a plain subdirectory of some other
|
|
167
|
+
// repository resolves upward to that other repository — which is exactly the
|
|
168
|
+
// confusion that must never be acted on.
|
|
169
|
+
if (canonicalPath(observed) !== canonicalPath(absolute)) {
|
|
170
|
+
fail("GIT_INVOCATION_REPO_UNRESOLVED", `GIT_DIR ${absolute} resolves to a different repository (${observed}); refusing to operate on a repository git did not name`, "resolving the invoking git repository", { reason: "git_dir_mismatch", git_dir: absolute, resolved: observed });
|
|
171
|
+
}
|
|
172
|
+
return { git_dir: observed, repo_dir: observed };
|
|
173
|
+
}
|
|
174
|
+
/** `git version` parsed as [major, minor]; refuses below {@link GITVAULT_MIN_GIT_VERSION}. */
|
|
175
|
+
export async function probeGitVersion(cwd = process.cwd()) {
|
|
176
|
+
const r = await hardenedGit(cwd, ["version"]);
|
|
177
|
+
const m = /git version (\d+)\.(\d+)/.exec(r.text());
|
|
178
|
+
if (!m)
|
|
179
|
+
fail("GIT_UNAVAILABLE", `unrecognized git version output: ${r.text().trim()}`, "probing git version");
|
|
180
|
+
const v = [Number(m[1]), Number(m[2])];
|
|
181
|
+
const [minMajor, minMinor] = GITVAULT_MIN_GIT_VERSION;
|
|
182
|
+
if (v[0] < minMajor || (v[0] === minMajor && v[1] < minMinor)) {
|
|
183
|
+
fail("GIT_VERSION_UNSUPPORTED", `git ${v[0]}.${v[1]} is below the supported ${minMajor}.${minMinor}`, "probing git version", { version: v });
|
|
184
|
+
}
|
|
185
|
+
return v;
|
|
186
|
+
}
|
|
187
|
+
function unquoteConfigValue(raw) {
|
|
188
|
+
// git-config: value runs to end of line; `#`/`;` outside quotes start a comment; backslash escapes \" \\ \n \t \b; quoted segments keep spaces.
|
|
189
|
+
let out = "";
|
|
190
|
+
let inQuote = false;
|
|
191
|
+
for (let i = 0; i < raw.length; i++) {
|
|
192
|
+
const ch = raw[i];
|
|
193
|
+
if (ch === "\\" && i + 1 < raw.length) {
|
|
194
|
+
const n = raw[++i];
|
|
195
|
+
out += n === "n" ? "\n" : n === "t" ? "\t" : n === "b" ? "\b" : n;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (ch === '"') {
|
|
199
|
+
inQuote = !inQuote;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (!inQuote && (ch === "#" || ch === ";"))
|
|
203
|
+
break;
|
|
204
|
+
out += ch;
|
|
205
|
+
}
|
|
206
|
+
return inQuote ? out : out.trim();
|
|
207
|
+
}
|
|
208
|
+
/** Parse a git config file as data (frozen subset). Throws by name on `include`/`includeIf`. */
|
|
209
|
+
export function parseGitConfigAsData(text, file) {
|
|
210
|
+
const entries = [];
|
|
211
|
+
let section = "";
|
|
212
|
+
let subsection = null;
|
|
213
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
214
|
+
const line = rawLine.trim();
|
|
215
|
+
if (!line || line.startsWith("#") || line.startsWith(";"))
|
|
216
|
+
continue;
|
|
217
|
+
const header = /^\[([A-Za-z0-9.-]+)(?:\s+"((?:[^"\\]|\\.)*)")?\]$/.exec(line);
|
|
218
|
+
if (header) {
|
|
219
|
+
section = header[1].toLowerCase();
|
|
220
|
+
subsection = header[2] !== undefined ? header[2].replace(/\\(.)/g, "$1") : null;
|
|
221
|
+
// `[section.sub]` legacy form — lowercase everything.
|
|
222
|
+
if (subsection === null && section.includes(".")) {
|
|
223
|
+
const dot = section.indexOf(".");
|
|
224
|
+
subsection = section.slice(dot + 1);
|
|
225
|
+
section = section.slice(0, dot);
|
|
226
|
+
}
|
|
227
|
+
if (section === "include" || section === "includeif") {
|
|
228
|
+
throw new LocalError(`${file}: [${section}] is not supported by the frozen ignore-authority discovery; remove it or set core.excludesFile directly`, "discovering global excludes", { code: "GITVAULT_CONFIG_INCLUDE_REFUSED", details: { file, key: section } });
|
|
229
|
+
}
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const kv = /^([A-Za-z][A-Za-z0-9-]*)\s*(?:=\s*(.*))?$/.exec(line);
|
|
233
|
+
if (!kv)
|
|
234
|
+
continue; // not in the subset — ignored as data
|
|
235
|
+
entries.push({ section, subsection, key: kv[1].toLowerCase(), value: kv[2] === undefined ? "true" : unquoteConfigValue(kv[2]), file });
|
|
236
|
+
}
|
|
237
|
+
return entries;
|
|
238
|
+
}
|
|
239
|
+
function expandConfigPath(value, home, file) {
|
|
240
|
+
if (value.startsWith("~/")) {
|
|
241
|
+
if (!home)
|
|
242
|
+
fail("GITVAULT_EXCLUDES_PATH_UNSUPPORTED", `${file}: core.excludesFile uses ~/ but HOME is unset`, "discovering global excludes", { file, value });
|
|
243
|
+
return join(home, value.slice(2));
|
|
244
|
+
}
|
|
245
|
+
if (value.startsWith("$HOME/") || value === "$HOME") {
|
|
246
|
+
if (!home)
|
|
247
|
+
fail("GITVAULT_EXCLUDES_PATH_UNSUPPORTED", `${file}: core.excludesFile uses $HOME but HOME is unset`, "discovering global excludes", { file, value });
|
|
248
|
+
return join(home, value.slice(5));
|
|
249
|
+
}
|
|
250
|
+
if (value.startsWith("/"))
|
|
251
|
+
return value;
|
|
252
|
+
fail("GITVAULT_EXCLUDES_PATH_UNSUPPORTED", `${file}: core.excludesFile "${value}" is relative or environment-dependent; only absolute, ~/, and $HOME/ paths are supported`, "discovering global excludes", { file, value });
|
|
253
|
+
}
|
|
254
|
+
function readAsData(file, code, context) {
|
|
255
|
+
try {
|
|
256
|
+
return readFileSync(file, "utf8");
|
|
257
|
+
}
|
|
258
|
+
catch (e) {
|
|
259
|
+
const err = e;
|
|
260
|
+
if (err.code === "ENOENT")
|
|
261
|
+
return null;
|
|
262
|
+
throw new LocalError(`${file} exists but is unreadable (${err.code ?? "error"}); refusing the capture rather than silently widening the snapshot`, context, { code, details: { file, errno: err.code }, cause: e });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Deterministic discovery of the user's global excludes file (M11):
|
|
267
|
+
* `$XDG_CONFIG_HOME/git/config` (default `~/.config/git/config`) THEN
|
|
268
|
+
* `~/.gitconfig`, last value wins; default `$XDG_CONFIG_HOME/git/ignore`
|
|
269
|
+
* falling back to `~/.config/git/ignore`. Every refusal names its file.
|
|
270
|
+
*/
|
|
271
|
+
export function discoverGlobalExcludes(env = { HOME: process.env.HOME, XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME }) {
|
|
272
|
+
const home = env.HOME;
|
|
273
|
+
const xdg = env.XDG_CONFIG_HOME && env.XDG_CONFIG_HOME.startsWith("/") ? env.XDG_CONFIG_HOME : home ? join(home, ".config") : null;
|
|
274
|
+
const configs = [];
|
|
275
|
+
if (xdg)
|
|
276
|
+
configs.push(join(xdg, "git", "config"));
|
|
277
|
+
if (home)
|
|
278
|
+
configs.push(join(home, ".gitconfig"));
|
|
279
|
+
let excludes = null;
|
|
280
|
+
const read = [];
|
|
281
|
+
for (const file of configs) {
|
|
282
|
+
const text = readAsData(file, "GITVAULT_CONFIG_UNREADABLE", "discovering global excludes");
|
|
283
|
+
if (text === null)
|
|
284
|
+
continue;
|
|
285
|
+
read.push(file);
|
|
286
|
+
for (const e of parseGitConfigAsData(text, file)) {
|
|
287
|
+
if (e.section === "core" && e.subsection === null && e.key === "excludesfile")
|
|
288
|
+
excludes = { value: e.value, file };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
let path;
|
|
292
|
+
let source;
|
|
293
|
+
if (excludes) {
|
|
294
|
+
path = expandConfigPath(excludes.value, home, excludes.file);
|
|
295
|
+
source = "core.excludesFile";
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
source = "default";
|
|
299
|
+
const candidates = [xdg ? join(xdg, "git", "ignore") : null, home ? join(home, ".config", "git", "ignore") : null].filter((p) => p !== null);
|
|
300
|
+
path = candidates.find((p) => existsSync(p)) ?? null;
|
|
301
|
+
}
|
|
302
|
+
let patterns = null;
|
|
303
|
+
if (path) {
|
|
304
|
+
patterns = readAsData(path, "GITVAULT_EXCLUDES_UNREADABLE", "reading global excludes as data");
|
|
305
|
+
if (patterns === null)
|
|
306
|
+
path = source === "default" ? null : path; // an explicitly configured but absent file: git ignores it too
|
|
307
|
+
}
|
|
308
|
+
return { path: patterns === null ? null : path, source, configs_read: read, patterns };
|
|
309
|
+
}
|
|
310
|
+
async function gitRevParse(dir, flag) {
|
|
311
|
+
return (await hardenedGit(dir, ["rev-parse", flag])).text().trim();
|
|
312
|
+
}
|
|
313
|
+
/** Inspect `dir`; every unsupported layout is refused with its named code. */
|
|
314
|
+
export async function inspectRepository(dir) {
|
|
315
|
+
const abs = resolve(dir);
|
|
316
|
+
// `--is-bare-repository` FIRST: inside a bare repository `--show-toplevel` fails (there is no
|
|
317
|
+
// work tree), so probing it first would report every bare repo as "not a repository".
|
|
318
|
+
let bare;
|
|
319
|
+
try {
|
|
320
|
+
bare = await gitRevParse(abs, "--is-bare-repository");
|
|
321
|
+
}
|
|
322
|
+
catch (e) {
|
|
323
|
+
fail("GITVAULT_NOT_A_REPOSITORY", `${abs} is not inside a git repository`, "inspecting repository", { dir: abs, cause: String(e.message) });
|
|
324
|
+
}
|
|
325
|
+
if (bare === "true")
|
|
326
|
+
fail("GITVAULT_BARE_REPOSITORY", "bare repositories are refused: a snapshot needs a work tree", "inspecting repository", { dir: abs });
|
|
327
|
+
let top;
|
|
328
|
+
try {
|
|
329
|
+
top = await gitRevParse(abs, "--show-toplevel");
|
|
330
|
+
}
|
|
331
|
+
catch (e) {
|
|
332
|
+
fail("GITVAULT_NOT_A_REPOSITORY", `${abs} is not inside a git work tree`, "inspecting repository", { dir: abs, cause: String(e.message) });
|
|
333
|
+
}
|
|
334
|
+
const gitDir = resolve(top, await gitRevParse(top, "--git-dir"));
|
|
335
|
+
const commonDir = resolve(top, await gitRevParse(top, "--git-common-dir"));
|
|
336
|
+
if (gitDir !== commonDir)
|
|
337
|
+
fail("GITVAULT_LINKED_WORKTREE", `linked worktrees are refused by name: ${top} is a linked worktree of ${commonDir}`, "inspecting repository", { worktree: top, git_dir: gitDir, git_common_dir: commonDir });
|
|
338
|
+
if ((await gitRevParse(top, "--is-shallow-repository")) === "true")
|
|
339
|
+
fail("GITVAULT_SHALLOW_CLONE", "shallow/partial clones are refused: the object set is incomplete", "inspecting repository", { dir: top });
|
|
340
|
+
const format = (await gitRevParse(top, "--show-object-format")).trim();
|
|
341
|
+
if (format !== "sha1")
|
|
342
|
+
fail("GIT_OBJECT_FORMAT_UNSUPPORTED", `object format ${format} is not supported in V0 (sha1 only)`, "inspecting repository", { object_format: format });
|
|
343
|
+
for (const [file, code, what] of [
|
|
344
|
+
[join(commonDir, "objects", "info", "alternates"), "GITVAULT_ALTERNATES_UNSUPPORTED", "objects/info/alternates"],
|
|
345
|
+
[join(commonDir, "info", "grafts"), "GITVAULT_GRAFTS_UNSUPPORTED", "info/grafts"],
|
|
346
|
+
]) {
|
|
347
|
+
if (existsSync(file))
|
|
348
|
+
fail(code, `${what} is present; alternates/grafts are refused so the captured object set is exactly this repository's`, "inspecting repository", { file });
|
|
349
|
+
}
|
|
350
|
+
// sparse checkout: the config bit or the sparse-checkout file
|
|
351
|
+
const sparse = await hardenedGit(top, ["config", "--bool", "--get", "core.sparseCheckout"], { okStatuses: [1] });
|
|
352
|
+
if (sparse.text().trim() === "true" || existsSync(join(gitDir, "info", "sparse-checkout")))
|
|
353
|
+
fail("GITVAULT_SPARSE_CHECKOUT", "sparse checkouts are refused: the work tree is not the whole tree", "inspecting repository", { dir: top });
|
|
354
|
+
// repository config includes — git applies them before -c; refuse by name
|
|
355
|
+
const cfg = await hardenedGit(top, ["config", "--file", join(commonDir, "config"), "--list", "--name-only"], { okStatuses: [1] });
|
|
356
|
+
for (const name of cfg.lines()) {
|
|
357
|
+
const lower = name.toLowerCase();
|
|
358
|
+
if (lower.startsWith("include.") || lower.startsWith("includeif."))
|
|
359
|
+
fail("GITVAULT_CONFIG_INCLUDE_REFUSED", `repository config carries ${name}; include/includeIf is refused by name`, "inspecting repository", { key: name });
|
|
360
|
+
}
|
|
361
|
+
// submodules: .gitmodules or gitlinks in the index
|
|
362
|
+
if (existsSync(join(top, ".gitmodules")))
|
|
363
|
+
fail("GITVAULT_SUBMODULES_UNSUPPORTED", ".gitmodules present; submodules are not supported in V0", "inspecting repository", { dir: top });
|
|
364
|
+
const gitlinks = (await hardenedGit(top, ["ls-files", "-s", "-z"])).nul().filter((l) => l.startsWith("160000 "));
|
|
365
|
+
if (gitlinks.length > 0)
|
|
366
|
+
fail("GITVAULT_SUBMODULES_UNSUPPORTED", "the index contains gitlinks; submodules are not supported in V0", "inspecting repository", { paths: gitlinks.map((l) => l.split("\t")[1]) });
|
|
367
|
+
// HEAD
|
|
368
|
+
const symref = await hardenedGit(top, ["symbolic-ref", "-q", "HEAD"], { okStatuses: [1] });
|
|
369
|
+
const resolved = await hardenedGit(top, ["rev-parse", "-q", "--verify", "HEAD^{commit}"], { okStatuses: [1] });
|
|
370
|
+
const resolvedOid = resolved.status === 0 ? resolved.text().trim() : null;
|
|
371
|
+
let head;
|
|
372
|
+
if (symref.status === 0) {
|
|
373
|
+
const ref = symref.text().trim();
|
|
374
|
+
if (!ref.startsWith("refs/heads/"))
|
|
375
|
+
fail("REFNAME_UNSUPPORTED", `HEAD points at ${ref}, which is not a refs/heads/* branch`, "inspecting repository", { ref });
|
|
376
|
+
head = { kind: "symref", ref, resolved_oid: resolvedOid };
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
if (!resolvedOid)
|
|
380
|
+
fail("GITVAULT_NOT_A_REPOSITORY", "HEAD is neither a symbolic ref nor a commit", "inspecting repository", { dir: top });
|
|
381
|
+
head = { kind: "detached", oid: resolvedOid, resolved_oid: resolvedOid };
|
|
382
|
+
}
|
|
383
|
+
const unmerged = [...new Set((await hardenedGit(top, ["ls-files", "-u", "-z"])).nul().map((l) => l.split("\t")[1]))];
|
|
384
|
+
return { top_level: top, git_dir: gitDir, git_common_dir: commonDir, object_format: "sha1", head, unmerged_paths: unmerged };
|
|
385
|
+
}
|
|
386
|
+
function isExecutable(mode) { return (mode & 0o111) !== 0; }
|
|
387
|
+
/**
|
|
388
|
+
* Capture the work tree per the §6.6 policy. Branches, index, and work tree
|
|
389
|
+
* are left byte-identical; a synthetic commit lives only in the object
|
|
390
|
+
* database (plus the local deploy ref when enabled).
|
|
391
|
+
*/
|
|
392
|
+
export async function captureSnapshot(options) {
|
|
393
|
+
const repo = await inspectRepository(options.dir);
|
|
394
|
+
const top = repo.top_level;
|
|
395
|
+
if (repo.unmerged_paths.length > 0) {
|
|
396
|
+
fail("SNAPSHOT_CONFLICTED_INDEX", `the index has unmerged paths; resolve the merge conflict, then redeploy`, "capturing snapshot", { paths: repo.unmerged_paths });
|
|
397
|
+
}
|
|
398
|
+
// Ignore authority — discovered and read AS DATA before git sees anything.
|
|
399
|
+
const excludes = discoverGlobalExcludes(options.env);
|
|
400
|
+
const excludeArgs = excludes.path ? ["--exclude-from", excludes.path] : [];
|
|
401
|
+
const headTarget = repo.head.kind === "symref" ? { kind: "symref", ref: repo.head.ref } : { kind: "detached", oid: repo.head.oid };
|
|
402
|
+
const headOid = repo.head.resolved_oid;
|
|
403
|
+
// Dirty detection: index/worktree vs HEAD, plus untracked-not-ignored.
|
|
404
|
+
const untracked = (await hardenedGit(top, ["ls-files", "-z", "--others", "--exclude-standard", ...excludeArgs])).nul();
|
|
405
|
+
let dirty = untracked.length > 0;
|
|
406
|
+
if (!dirty) {
|
|
407
|
+
if (!headOid)
|
|
408
|
+
dirty = (await hardenedGit(top, ["ls-files", "-z"])).nul().length > 0; // unborn HEAD with a populated index
|
|
409
|
+
else {
|
|
410
|
+
await hardenedGit(top, ["update-index", "-q", "--refresh"], { okStatuses: [1] });
|
|
411
|
+
dirty = (await hardenedGit(top, ["diff-index", "--name-only", "-z", "HEAD", "--"])).nul().length > 0;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (!dirty && headOid) {
|
|
415
|
+
const tree = (await hardenedGit(top, ["rev-parse", "HEAD^{tree}"])).text().trim();
|
|
416
|
+
return { kind: "head", oid: headOid, tree_oid: tree, head: headTarget, head_oid: headOid, paths: [], global_excludes_path: excludes.path, top_level: top };
|
|
417
|
+
}
|
|
418
|
+
// Synthetic commit: tracked paths present on disk + untracked-not-ignored.
|
|
419
|
+
const tracked = (await hardenedGit(top, ["ls-files", "-z", "--cached"])).nul();
|
|
420
|
+
const candidates = [...new Set([...tracked, ...untracked])].sort();
|
|
421
|
+
const present = [];
|
|
422
|
+
for (const p of candidates) {
|
|
423
|
+
const abs = join(top, p);
|
|
424
|
+
let st;
|
|
425
|
+
try {
|
|
426
|
+
st = lstatSync(abs);
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
continue;
|
|
430
|
+
} // deleted in the work tree → absent from the snapshot
|
|
431
|
+
if (st.isSymbolicLink())
|
|
432
|
+
present.push({ path: p, mode: "120000", size: st.size });
|
|
433
|
+
else if (st.isFile())
|
|
434
|
+
present.push({ path: p, mode: isExecutable(st.mode) ? "100755" : "100644", size: st.size });
|
|
435
|
+
// directories (e.g. nested repos) and specials are skipped — git would not track them either
|
|
436
|
+
}
|
|
437
|
+
// Size cap before any object is written.
|
|
438
|
+
const oversize = present.find((e) => e.size > GITVAULT_MAX_GIT_OBJECT_BYTES);
|
|
439
|
+
if (oversize) {
|
|
440
|
+
fail("GIT_OBJECT_TOO_LARGE", `${oversize.path} is ${oversize.size} bytes; the per-object cap is ${GITVAULT_MAX_GIT_OBJECT_BYTES} bytes (200 MiB)`, "capturing snapshot", { path: oversize.path, size_bytes: String(oversize.size), cap_bytes: String(GITVAULT_MAX_GIT_OBJECT_BYTES) });
|
|
441
|
+
}
|
|
442
|
+
// Filter detection over EVERY included path (LFS is a filter) — refuse by name, never start one.
|
|
443
|
+
const active = await detectActiveFilters(top, present.map((e) => e.path));
|
|
444
|
+
if (active.length > 0) {
|
|
445
|
+
const lfs = active.filter((a) => a.filter === "lfs");
|
|
446
|
+
const code = lfs.length > 0 ? "GITVAULT_LFS_UNSUPPORTED" : "GITVAULT_FILTER_ACTIVE";
|
|
447
|
+
fail(code, `${active.length} captured path(s) have an active clean/smudge filter (${[...new Set(active.map((a) => a.filter))].join(", ")}); gitvault never runs filters, so the capture is refused by name — first: ${active[0].path}`, "capturing snapshot", { paths: active });
|
|
448
|
+
}
|
|
449
|
+
// Hash raw bytes with filters structurally disabled.
|
|
450
|
+
const entries = [];
|
|
451
|
+
const regular = present.filter((e) => e.mode !== "120000");
|
|
452
|
+
if (regular.length > 0) {
|
|
453
|
+
const out = await hardenedGit(top, ["hash-object", "-w", "--no-filters", "--stdin-paths"], { input: regular.map((e) => e.path).join("\n") + "\n" });
|
|
454
|
+
const oids = out.lines();
|
|
455
|
+
if (oids.length !== regular.length)
|
|
456
|
+
fail("GIT_COMMAND_FAILED", "hash-object returned a different number of ids than paths", "capturing snapshot");
|
|
457
|
+
regular.forEach((e, i) => entries.push({ path: e.path, mode: e.mode, oid: oids[i] }));
|
|
458
|
+
}
|
|
459
|
+
for (const e of present.filter((x) => x.mode === "120000")) {
|
|
460
|
+
const target = readlinkSync(join(top, e.path));
|
|
461
|
+
const out = await hardenedGit(top, ["hash-object", "-w", "--no-filters", "--stdin"], { input: target });
|
|
462
|
+
entries.push({ path: e.path, mode: "120000", oid: out.text().trim() });
|
|
463
|
+
}
|
|
464
|
+
// regular files were hashed in one batch and symlinks after them — restore path order.
|
|
465
|
+
entries.sort((a, b) => (a.path === b.path ? 0 : a.path < b.path ? -1 : 1));
|
|
466
|
+
// Build the tree in a TEMPORARY index so the user's index stays byte-identical.
|
|
467
|
+
const tmp = mkdtempSync(join(tmpdir(), "run402-gitvault-snapshot-"));
|
|
468
|
+
try {
|
|
469
|
+
const indexFile = join(tmp, "index");
|
|
470
|
+
const info = entries.map((e) => `${e.mode} ${e.oid}\t${e.path}\n`).join("");
|
|
471
|
+
await hardenedGit(top, ["update-index", "--index-info"], { input: info, env: { GIT_INDEX_FILE: indexFile } });
|
|
472
|
+
const tree = (await hardenedGit(top, ["write-tree"], { env: { GIT_INDEX_FILE: indexFile } })).text().trim();
|
|
473
|
+
const when = Math.floor((options.now ?? (() => new Date()))().getTime() / 1000);
|
|
474
|
+
const dateEnv = { GIT_AUTHOR_DATE: `${when} +0000`, GIT_COMMITTER_DATE: `${when} +0000` };
|
|
475
|
+
const parentArgs = headOid ? ["-p", headOid] : [];
|
|
476
|
+
const commit = (await hardenedGit(top, ["commit-tree", tree, ...parentArgs, "-m", options.message ?? "run402 gitvault snapshot (synthetic commit of the work tree)"], { env: dateEnv })).text().trim();
|
|
477
|
+
if (options.update_local_deploy_ref !== false) {
|
|
478
|
+
await hardenedGit(top, ["update-ref", GITVAULT_DEPLOY_REF, commit]);
|
|
479
|
+
}
|
|
480
|
+
return { kind: "synthetic", oid: commit, tree_oid: tree, head: headTarget, head_oid: headOid, paths: entries.map((e) => e.path), global_excludes_path: excludes.path, top_level: top };
|
|
481
|
+
}
|
|
482
|
+
finally {
|
|
483
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/** `git check-attr filter` over paths; returns every path whose `filter` attribute is set (LFS included). */
|
|
487
|
+
export async function detectActiveFilters(top, paths) {
|
|
488
|
+
if (paths.length === 0)
|
|
489
|
+
return [];
|
|
490
|
+
const out = await hardenedGit(top, ["check-attr", "-z", "--stdin", "filter"], { input: paths.join("\0") + "\0" });
|
|
491
|
+
const parts = out.nul();
|
|
492
|
+
const active = [];
|
|
493
|
+
for (let i = 0; i + 2 < parts.length; i += 3) {
|
|
494
|
+
const value = parts[i + 2];
|
|
495
|
+
if (value !== "unspecified" && value !== "unset")
|
|
496
|
+
active.push({ path: parts[i], filter: value });
|
|
497
|
+
}
|
|
498
|
+
return active;
|
|
499
|
+
}
|
|
500
|
+
// ─── Materialization (the deploy lane builds from THIS, never the work tree) ─
|
|
501
|
+
/**
|
|
502
|
+
* Check out `oid`'s tree into `targetDir` through a temporary index
|
|
503
|
+
* (`read-tree` + `checkout-index`) — filter-free, hook-free, and isolated
|
|
504
|
+
* from the mutable work tree. Returns the absolute target directory.
|
|
505
|
+
*/
|
|
506
|
+
export async function materializeSnapshot(repoDir, oid, targetDir) {
|
|
507
|
+
if (!GITVAULT_OID40_RE.test(oid))
|
|
508
|
+
fail("GITVAULT_BAD_OID", `not a 40-hex oid: ${oid}`, "materializing snapshot");
|
|
509
|
+
const top = (await hardenedGit(resolve(repoDir), ["rev-parse", "--show-toplevel"])).text().trim();
|
|
510
|
+
const target = targetDir ? resolve(targetDir) : mkdtempSync(join(tmpdir(), "run402-gitvault-materialize-"));
|
|
511
|
+
mkdirSync(target, { recursive: true });
|
|
512
|
+
const tmp = mkdtempSync(join(tmpdir(), "run402-gitvault-index-"));
|
|
513
|
+
try {
|
|
514
|
+
const indexFile = join(tmp, "index");
|
|
515
|
+
await hardenedGit(top, ["read-tree", `${oid}^{tree}`], { env: { GIT_INDEX_FILE: indexFile } });
|
|
516
|
+
await hardenedGit(top, ["-c", "core.autocrlf=false", "checkout-index", "-a", "-f", `--prefix=${target.endsWith("/") ? target : target + "/"}`], { env: { GIT_INDEX_FILE: indexFile } });
|
|
517
|
+
}
|
|
518
|
+
finally {
|
|
519
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
520
|
+
}
|
|
521
|
+
return target;
|
|
522
|
+
}
|
|
523
|
+
// ─── Commitment ──────────────────────────────────────────────────────────────
|
|
524
|
+
/** `snapshot_oid_hmac` = HMAC(K_digest("snapshot_oid"), JCS({oid, format:"sha1"})) — the keyed commitment the platform compares without ever seeing the oid. */
|
|
525
|
+
export function snapshotCommitment(kRepo, repoId, epoch, oid) {
|
|
526
|
+
return keyedCommitment(deriveDigestKey(kRepo, repoId, epoch, "snapshot_oid"), snapshotOidContent(oid));
|
|
527
|
+
}
|
|
528
|
+
/** The client-side `gitvault_commit` line — printed ALWAYS; commit ids never reach the platform. */
|
|
529
|
+
export function gitvaultCommitLine(snapshot) {
|
|
530
|
+
return `gitvault_commit ${snapshot.oid}${snapshot.kind === "synthetic" ? " (synthetic)" : ""}`;
|
|
531
|
+
}
|
|
532
|
+
/** Object sizes for a set of oids (`cat-file --batch-check`), for the per-object cap on tracked history. */
|
|
533
|
+
export async function findOversizeObjects(repoDir, tips, cap = GITVAULT_MAX_GIT_OBJECT_BYTES) {
|
|
534
|
+
if (tips.length === 0)
|
|
535
|
+
return [];
|
|
536
|
+
const objects = (await hardenedGit(repoDir, ["rev-list", "--objects", ...tips])).lines().map((l) => l.split(" ")[0]);
|
|
537
|
+
const out = await hardenedGit(repoDir, ["cat-file", "--batch-check=%(objectname) %(objectsize)"], { input: objects.join("\n") + "\n" });
|
|
538
|
+
const over = [];
|
|
539
|
+
for (const line of out.lines()) {
|
|
540
|
+
const [oid, size] = line.split(" ");
|
|
541
|
+
if (oid && size && Number(size) > cap)
|
|
542
|
+
over.push({ oid, size_bytes: Number(size) });
|
|
543
|
+
}
|
|
544
|
+
return over;
|
|
545
|
+
}
|
|
546
|
+
/** True iff `ancestor` is reachable from `descendant` (`merge-base --is-ancestor`). */
|
|
547
|
+
export async function isAncestor(repoDir, ancestor, descendant) {
|
|
548
|
+
const r = await hardenedGit(repoDir, ["merge-base", "--is-ancestor", ancestor, descendant], { okStatuses: [1] });
|
|
549
|
+
return r.status === 0;
|
|
550
|
+
}
|
|
551
|
+
/** Does the object exist locally? */
|
|
552
|
+
export async function hasObject(repoDir, oid) {
|
|
553
|
+
const r = await hardenedGit(repoDir, ["cat-file", "-e", `${oid}^{object}`], { okStatuses: [1, 128] });
|
|
554
|
+
return r.status === 0;
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=gitvault-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitvault-snapshot.js","sourceRoot":"","sources":["../../src/node/gitvault-snapshot.ts"],"names":[],"mappings":"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"}
|
package/sdk/dist/node/index.d.ts
CHANGED
|
@@ -114,6 +114,17 @@ export type { Run402ConfigContext, Run402DirConfigOptions, Run402EmailTriggerOpt
|
|
|
114
114
|
export type { DeployManifestDatabaseSpec, DeployManifestFileEntry, DeployManifestFileSet, DeployManifestFunctionsSpec, DeployManifestFunctionSpec, DeployManifestInput, DeployManifestMigrationSpec, DeployManifestSiteSpec, DeployManifestVerifyHttpCheck, DeployManifestVerifySpec, LoadDeployManifestOptions, NormalizedDeployManifest, NormalizedDeployManifestVerify, NormalizeDeployManifestOptions, } from "./deploy-manifest.js";
|
|
115
115
|
export { resolveRun402TargetProfile } from "./target-profile.js";
|
|
116
116
|
export type { ResolveRun402TargetProfileOptions, Run402TargetKind, Run402TargetProfile, Run402TargetProfileEnvAliases, Run402TargetProfileSources, Run402TargetRequirement, } from "./target-profile.js";
|
|
117
|
+
export { GitvaultKeystore, getGitvaultKeystoreRoot, readFileNoFollow, writeFileAtomic0600, } from "./gitvault-keystore.js";
|
|
118
|
+
export type { GitvaultAuditEntry, GitvaultAuditEvent, GitvaultHeadPin, GitvaultIdentityFile, GitvaultKeystoreOptions, GitvaultKeystoreState, GitvaultLockOptions, GitvaultPermissionFinding, GitvaultRepoFile, } from "./gitvault-keystore.js";
|
|
119
|
+
export { GITVAULT_CREATION_STAGES, GitvaultCreation, createGitvault, gitvaultDoctorRecoveryText, gitvaultJournalPath, listIncompleteGitvaultJournals, readGitvaultJournal, } from "./gitvault-creation-journal.js";
|
|
120
|
+
export type { GitvaultAdmitGenesisRequest, GitvaultAdmitGenesisResult, GitvaultAllocateRequest, GitvaultCreationJournal, GitvaultCreationOptions, GitvaultCreationResult, GitvaultCreationStage, GitvaultCreationTransport, GitvaultDoctorRecoveryText, GitvaultJournaledObject, GitvaultObjectReceipt, GitvaultPutObjectRequest, } from "./gitvault-creation-journal.js";
|
|
121
|
+
export { GITVAULT_DEPLOY_REF, GITVAULT_MAX_GIT_OBJECT_BYTES, GITVAULT_MIN_GIT_VERSION, HARDENED_GIT_ARGV_PREFIX, captureSnapshot, detectActiveFilters, discoverGlobalExcludes, findOversizeObjects, gitvaultCommitLine, hardenedGit, hardenedGitEnv, hasObject, inspectRepository, isAncestor, materializeSnapshot, parseGitConfigAsData, probeGitVersion, resolveGitInvocationRepo, snapshotCommitment, } from "./gitvault-snapshot.js";
|
|
122
|
+
export type { GitConfigDiscoveryEnv, GitInvocationRepo, GitvaultRepositoryInspection, GitvaultRepositoryRefusalCode, GitvaultSnapshot, GitvaultSnapshotOptions, GitvaultSnapshotRefusalPath, GlobalExcludesDiscovery, GlobalExcludesRefusal, HardenedGitOptions, HardenedGitResult, ParsedGitConfigEntry, } from "./gitvault-snapshot.js";
|
|
123
|
+
export { GITVAULT_MAX_CANONICAL_REFS, GITVAULT_MAX_CHECKPOINT_PACKS, GITVAULT_MAX_CHECKPOINT_TOTAL_STORED_BYTES, GITVAULT_MAX_HEADS_PER_LISTING_PAGE, GITVAULT_MAX_REF_STATE_OBJECT_BYTES, GITVAULT_MAX_REF_UPDATES_PER_TRANSACTION, GITVAULT_MAX_REPAIR_ADDED_ROOTS, GITVAULT_MAX_RETENTION_ROOT_ENTRIES, GITVAULT_MAX_WAL_RECEIPTS_PER_HEAD, GITVAULT_MULTI_OBJECT_PACK_TARGET_BYTES, GITVAULT_PUSH_CONFLICT_RETRIES, GITVAULT_RETENTION_MIN_DAYS, GITVAULT_VERIFICATION_BUDGET_HEADS, GitvaultVault, assertNoTransition, assertRefMapCardinality, bigIntToGeneration, captureBinding, checkChainLink, checkClaimSetEquality, checkGenerationRegression, checkOpenBinding, compareRoots, createGitvaultHttpTransport, deployRefTransaction, effectiveAdmittedAt, evaluateRefTransaction, evolveRetentionRoots, generationToBigInt, gitvaultPaths, isRootEligibleForRemoval, nextGeneration, nextListingRequest, gitvaultLedgerId, gitvaultManifestEntry, gitvaultWireRefForPath, openBindingDigest, validateHeadsListingRequest, verifyHeadsListingPage, } from "./gitvault-publication.js";
|
|
124
|
+
export type { GitvaultAdmitHeadRequest, GitvaultAdmitHeadResult, GitvaultBuiltCheckpoint, GitvaultChainLinkInput, GitvaultCutoffOptions, GitvaultDroppedTip, GitvaultEvaluateRefTransactionOptions, GitvaultEvolveRootsOptions, GitvaultHttpTransportOptions, GitvaultListingProgress, GitvaultMaintenanceLease, GitvaultMaintenanceLeaseRequest, GitvaultObjectReadRequest, GitvaultResourceBinding, GitvaultVaultRecord, GitvaultWireRef, GitvaultMaterializedState, GitvaultOpenBindingRecord, GitvaultPublishResult, GitvaultPushOptions, GitvaultRefMap, GitvaultRefTransactionEvaluation, GitvaultRefUpdateFailure, GitvaultRetentionCutoffIssued, GitvaultTransport, GitvaultUploadObject, GitvaultUploadReceipt, GitvaultVaultOptions, GitvaultVerifiedState, } from "./gitvault-publication.js";
|
|
125
|
+
export { GITVAULT_DEPLOY_OUTCOMES, checkActivationTokenBinding, checkAuthorizationEpoch, drainOverrideJournals, listPendingOverrideJournals, matchCaptureReceipt, overrideJournalDir, overrideJournalPath, readOverrideJournal, runGitvaultDeploy, writeOverrideJournal, } from "./gitvault-deploy.js";
|
|
126
|
+
export type { GitvaultCaptureReceiptMatch, GitvaultDeployError, GitvaultDeployLane, GitvaultDeployLaneCommitInput, GitvaultDeployLanePlan, GitvaultDeployLanePlanInput, GitvaultDeployNextAction, GitvaultDeployOptions, GitvaultDeployOutcome, GitvaultDeployResult, GitvaultOverrideDrainReport, GitvaultOverrideJournal, } from "./gitvault-deploy.js";
|
|
127
|
+
export * from "../namespaces/gitvault.crypto.js";
|
|
117
128
|
export { signCiDelegation } from "./ci.js";
|
|
118
129
|
export type { SignCiDelegationOptions } from "./ci.js";
|
|
119
130
|
export { signWalletOrgClaim, claimWalletOrg } from "./operator-claim.js";
|