@telorun/cli 0.88.0 → 0.90.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/dist/bundle/built-layers.d.ts +36 -0
- package/dist/bundle/built-layers.d.ts.map +1 -0
- package/dist/bundle/built-layers.js +84 -0
- package/dist/bundle/built-layers.js.map +1 -0
- package/dist/bundle/module-payload.d.ts +30 -15
- package/dist/bundle/module-payload.d.ts.map +1 -1
- package/dist/bundle/module-payload.js +118 -21
- package/dist/bundle/module-payload.js.map +1 -1
- package/dist/bundle/partition-layers.d.ts +13 -6
- package/dist/bundle/partition-layers.d.ts.map +1 -1
- package/dist/bundle/partition-layers.js +49 -7
- package/dist/bundle/partition-layers.js.map +1 -1
- package/dist/bundle/payload-drift.d.ts +1 -1
- package/dist/bundle/payload-drift.d.ts.map +1 -1
- package/dist/bundle/select-files.d.ts +11 -2
- package/dist/bundle/select-files.d.ts.map +1 -1
- package/dist/bundle/select-files.js +23 -8
- package/dist/bundle/select-files.js.map +1 -1
- package/dist/bundle/staged-files.d.ts +43 -0
- package/dist/bundle/staged-files.d.ts.map +1 -0
- package/dist/bundle/staged-files.js +158 -0
- package/dist/bundle/staged-files.js.map +1 -0
- package/dist/bundle/warm-layers.d.ts +11 -6
- package/dist/bundle/warm-layers.d.ts.map +1 -1
- package/dist/bundle/warm-layers.js +26 -10
- package/dist/bundle/warm-layers.js.map +1 -1
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +7 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/module.d.ts.map +1 -1
- package/dist/commands/module.js +21 -7
- package/dist/commands/module.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +5 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.d.ts +8 -6
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +168 -69
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +14 -6
- package/dist/commands/run.js.map +1 -1
- package/dist/controller-runtime.d.ts +25 -3
- package/dist/controller-runtime.d.ts.map +1 -1
- package/dist/controller-runtime.js +39 -9
- package/dist/controller-runtime.js.map +1 -1
- package/dist/env-files.d.ts +23 -8
- package/dist/env-files.d.ts.map +1 -1
- package/dist/env-files.js +77 -17
- package/dist/env-files.js.map +1 -1
- package/dist/release/apply-plan.d.ts +2 -1
- package/dist/release/apply-plan.d.ts.map +1 -1
- package/dist/release/apply-plan.js +8 -4
- package/dist/release/apply-plan.js.map +1 -1
- package/dist/release/cargo-toml.d.ts +17 -0
- package/dist/release/cargo-toml.d.ts.map +1 -0
- package/dist/release/cargo-toml.js +253 -0
- package/dist/release/cargo-toml.js.map +1 -0
- package/dist/release/crate-inputs.d.ts +41 -0
- package/dist/release/crate-inputs.d.ts.map +1 -0
- package/dist/release/crate-inputs.js +407 -0
- package/dist/release/crate-inputs.js.map +1 -0
- package/dist/release/evidence.d.ts +13 -17
- package/dist/release/evidence.d.ts.map +1 -1
- package/dist/release/evidence.js +26 -30
- package/dist/release/evidence.js.map +1 -1
- package/dist/release/stage.d.ts +61 -0
- package/dist/release/stage.d.ts.map +1 -0
- package/dist/release/stage.js +506 -0
- package/dist/release/stage.js.map +1 -0
- package/dist/release/targets.d.ts +60 -0
- package/dist/release/targets.d.ts.map +1 -0
- package/dist/release/targets.js +94 -0
- package/dist/release/targets.js.map +1 -0
- package/dist/release/workspace.d.ts +17 -5
- package/dist/release/workspace.d.ts.map +1 -1
- package/dist/release/workspace.js +89 -13
- package/dist/release/workspace.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The build inputs of a crate-built source, as one digest.
|
|
3
|
+
*
|
|
4
|
+
* A source whose files are prebuilt from a crate in this repository names that
|
|
5
|
+
* crate (`build: { cargo: <dir> }`), and `telo release stage --pin` records what
|
|
6
|
+
* built them (`build.inputs`): the committed files of the crate and of every
|
|
7
|
+
* path crate it reaches transitively — through a path dependency or a `[patch]`
|
|
8
|
+
* entry — the `Cargo.lock` packages those crates reach, the cargo configuration
|
|
9
|
+
* and toolchain files that apply where the crate is built, and what the
|
|
10
|
+
* workspace root's `Cargo.toml` passes down. A lock entry nothing here depends
|
|
11
|
+
* on is not an input, so an unrelated crate's new dependency trips no source.
|
|
12
|
+
* `telo release check` recomputes the same digest and fails when it moved, so a
|
|
13
|
+
* module never ships binaries older than the code they were built from — and an
|
|
14
|
+
* edit to a crate every controller depends on (the SDK, the controller ABI)
|
|
15
|
+
* trips every source built on it.
|
|
16
|
+
*
|
|
17
|
+
* Files are what git tracks, read from the working tree: build output, ignored
|
|
18
|
+
* files and a scratch file nobody added are not inputs, wherever they sit.
|
|
19
|
+
* Cargo is never invoked, so the check needs no toolchain and builds nothing.
|
|
20
|
+
*/
|
|
21
|
+
import { isModuleKind, readModuleSources, sha256Base64Url, } from "@telorun/analyzer";
|
|
22
|
+
import { defaultCustomTags } from "@telorun/templating";
|
|
23
|
+
import { execFileSync } from "node:child_process";
|
|
24
|
+
import * as fs from "node:fs";
|
|
25
|
+
import * as path from "node:path";
|
|
26
|
+
import { parseAllDocuments } from "yaml";
|
|
27
|
+
import { parseCargoToml } from "./cargo-toml.js";
|
|
28
|
+
/** Files that configure a build from the directory they sit in downward. */
|
|
29
|
+
const BUILD_CONFIG_FILES = [
|
|
30
|
+
".cargo/config",
|
|
31
|
+
".cargo/config.toml",
|
|
32
|
+
"rust-toolchain",
|
|
33
|
+
"rust-toolchain.toml",
|
|
34
|
+
];
|
|
35
|
+
/** What the workspace root's `Cargo.toml` passes down to every member's build. */
|
|
36
|
+
const INHERITED_ROOT_KEYS = [
|
|
37
|
+
["patch"],
|
|
38
|
+
["replace"],
|
|
39
|
+
["profile"],
|
|
40
|
+
["workspace", "resolver"],
|
|
41
|
+
["workspace", "package"],
|
|
42
|
+
["workspace", "lints"],
|
|
43
|
+
];
|
|
44
|
+
const isTable = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
45
|
+
function readManifest(dir) {
|
|
46
|
+
const file = path.join(dir, "Cargo.toml");
|
|
47
|
+
if (!fs.existsSync(file))
|
|
48
|
+
throw new Error(`'${dir}' holds no Cargo.toml, so it is not a crate.`);
|
|
49
|
+
return parseCargoToml(fs.readFileSync(file, "utf8"), file);
|
|
50
|
+
}
|
|
51
|
+
/** The directory of the workspace governing `crateDir` — the one whose
|
|
52
|
+
* `Cargo.lock` fixed its registry dependencies — resolved as cargo does. */
|
|
53
|
+
function workspaceRootOf(crateDir, manifest) {
|
|
54
|
+
if (isTable(manifest.workspace))
|
|
55
|
+
return { dir: crateDir, manifest };
|
|
56
|
+
const pkg = manifest.package;
|
|
57
|
+
if (isTable(pkg) && typeof pkg.workspace === "string") {
|
|
58
|
+
const dir = path.resolve(crateDir, pkg.workspace);
|
|
59
|
+
return { dir, manifest: readManifest(dir) };
|
|
60
|
+
}
|
|
61
|
+
for (let dir = path.dirname(crateDir);; dir = path.dirname(dir)) {
|
|
62
|
+
if (fs.existsSync(path.join(dir, "Cargo.toml"))) {
|
|
63
|
+
const candidate = readManifest(dir);
|
|
64
|
+
const workspace = candidate.workspace;
|
|
65
|
+
if (isTable(workspace)) {
|
|
66
|
+
const relative = path.relative(dir, crateDir).split(path.sep).join("/");
|
|
67
|
+
const excluded = Array.isArray(workspace.exclude) && workspace.exclude.some((entry) => typeof entry === "string" && (relative === entry.replace(/\/+$/, "") || relative.startsWith(`${entry.replace(/\/+$/, "")}/`)));
|
|
68
|
+
return excluded ? { dir: crateDir, manifest } : { dir, manifest: candidate };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (path.dirname(dir) === dir)
|
|
72
|
+
return { dir: crateDir, manifest };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** The directories of the path dependencies one crate's manifest declares — in
|
|
76
|
+
* `[dependencies]`, `[build-dependencies]` and their per-target forms, the ones
|
|
77
|
+
* that link into the build — with `workspace = true` resolved against the
|
|
78
|
+
* workspace root's `[workspace.dependencies]`. */
|
|
79
|
+
function pathDependencies(crateDir, manifest, root, inheritedNames) {
|
|
80
|
+
const tables = [manifest.dependencies, manifest["build-dependencies"]];
|
|
81
|
+
if (isTable(manifest.target)) {
|
|
82
|
+
for (const target of Object.values(manifest.target)) {
|
|
83
|
+
if (isTable(target))
|
|
84
|
+
tables.push(target.dependencies, target["build-dependencies"]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const workspaceDeps = isTable(root.manifest.workspace) ? root.manifest.workspace.dependencies : undefined;
|
|
88
|
+
const out = [];
|
|
89
|
+
for (const table of tables) {
|
|
90
|
+
if (!isTable(table))
|
|
91
|
+
continue;
|
|
92
|
+
for (const [name, spec] of Object.entries(table)) {
|
|
93
|
+
if (!isTable(spec))
|
|
94
|
+
continue;
|
|
95
|
+
if (typeof spec.path === "string") {
|
|
96
|
+
out.push(path.resolve(crateDir, spec.path));
|
|
97
|
+
}
|
|
98
|
+
else if (spec.workspace === true) {
|
|
99
|
+
inheritedNames.add(name);
|
|
100
|
+
const inherited = isTable(workspaceDeps) ? workspaceDeps[name] : undefined;
|
|
101
|
+
if (inherited === undefined) {
|
|
102
|
+
throw new Error(`${path.join(crateDir, "Cargo.toml")}: dependency '${name}' sets workspace = true, but ` +
|
|
103
|
+
`${path.join(root.dir, "Cargo.toml")} declares no [workspace.dependencies] '${name}'.`);
|
|
104
|
+
}
|
|
105
|
+
if (isTable(inherited) && typeof inherited.path === "string") {
|
|
106
|
+
out.push(path.resolve(root.dir, inherited.path));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
/** Package name → directory of every path crate the workspace root's `[patch]`
|
|
114
|
+
* tables substitute for a registry or git dependency. */
|
|
115
|
+
function patchedPathCrates(root) {
|
|
116
|
+
const out = new Map();
|
|
117
|
+
const patch = root.manifest.patch;
|
|
118
|
+
if (!isTable(patch))
|
|
119
|
+
return out;
|
|
120
|
+
for (const registry of Object.values(patch)) {
|
|
121
|
+
if (!isTable(registry))
|
|
122
|
+
continue;
|
|
123
|
+
for (const [name, spec] of Object.entries(registry)) {
|
|
124
|
+
if (!isTable(spec) || typeof spec.path !== "string")
|
|
125
|
+
continue;
|
|
126
|
+
const crate = typeof spec.package === "string" ? spec.package : name;
|
|
127
|
+
out.set(crate, path.resolve(root.dir, spec.path));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
/** The git work tree `dir` belongs to. Not being able to ask is a failure. */
|
|
133
|
+
function gitTopLevel(dir) {
|
|
134
|
+
return realPath(git(dir, ["rev-parse", "--show-toplevel"]).trim());
|
|
135
|
+
}
|
|
136
|
+
function git(cwd, args) {
|
|
137
|
+
try {
|
|
138
|
+
return execFileSync("git", args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const stderr = err.stderr;
|
|
142
|
+
throw new Error(`\`git ${args.join(" ")}\` failed in ${cwd}` +
|
|
143
|
+
`${typeof stderr === "string" && stderr.trim() !== "" ? ` (${stderr.trim()})` : ""}. ` +
|
|
144
|
+
`A crate's build inputs are the files git tracks, so the digest is taken in the ` +
|
|
145
|
+
`repository's work tree.`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** A path with every link resolved, in the form the OS reports it. The native
|
|
149
|
+
* resolver, because it is the one that expands a Windows 8.3 short name
|
|
150
|
+
* (`RUNNER~1`) — git names the work tree by its long name, and a path compared
|
|
151
|
+
* against it in the other form reads as outside the repository. */
|
|
152
|
+
function realPath(target) {
|
|
153
|
+
return fs.realpathSync.native(target);
|
|
154
|
+
}
|
|
155
|
+
/** The files git tracks in `repo`, by repository-relative `/`-separated name.
|
|
156
|
+
* Listed once per digest and matched in memory: a process spawn costs far more
|
|
157
|
+
* than the listing, above all on Windows. */
|
|
158
|
+
class TrackedFiles {
|
|
159
|
+
repo;
|
|
160
|
+
names;
|
|
161
|
+
constructor(repo) {
|
|
162
|
+
this.repo = repo;
|
|
163
|
+
this.names = new Set(git(repo, ["ls-files", "-z", "--cached"]).split("\0").filter((name) => name !== ""));
|
|
164
|
+
}
|
|
165
|
+
nameOf(file) {
|
|
166
|
+
return path.relative(this.repo, file).split(path.sep).join("/");
|
|
167
|
+
}
|
|
168
|
+
has(file) {
|
|
169
|
+
return this.names.has(this.nameOf(file));
|
|
170
|
+
}
|
|
171
|
+
/** The tracked files under `dirs`, absolute. A tracked file deleted from the
|
|
172
|
+
* work tree is not an input any more, so it is left out. */
|
|
173
|
+
under(dirs) {
|
|
174
|
+
const prefixes = dirs.map((dir) => this.nameOf(dir));
|
|
175
|
+
return [...this.names]
|
|
176
|
+
.filter((name) => prefixes.some((prefix) => prefix === "" || name.startsWith(`${prefix}/`)))
|
|
177
|
+
.map((name) => path.join(this.repo, name))
|
|
178
|
+
.filter((file) => fs.existsSync(file));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** JSON with object keys sorted, so equal TOML data renders to equal text. */
|
|
182
|
+
function canonical(value) {
|
|
183
|
+
if (value === undefined)
|
|
184
|
+
return "null";
|
|
185
|
+
if (Array.isArray(value))
|
|
186
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
187
|
+
if (isTable(value)) {
|
|
188
|
+
return `{${Object.keys(value)
|
|
189
|
+
.sort()
|
|
190
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
191
|
+
.join(",")}}`;
|
|
192
|
+
}
|
|
193
|
+
return JSON.stringify(value);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* The `Cargo.lock` packages the given crates reach through the lock's own
|
|
197
|
+
* dependency graph. A dependency is written `name`, `name version` or
|
|
198
|
+
* `name version (source)` — as specific as the lock needs to tell packages of one
|
|
199
|
+
* name apart — and one that matches no package, or several, is refused rather
|
|
200
|
+
* than guessed.
|
|
201
|
+
*/
|
|
202
|
+
function reachedLockPackages(lockfile, crateNames) {
|
|
203
|
+
const lock = parseCargoToml(fs.readFileSync(lockfile, "utf8"), lockfile);
|
|
204
|
+
const packages = [];
|
|
205
|
+
for (const entry of Array.isArray(lock.package) ? lock.package : []) {
|
|
206
|
+
if (!isTable(entry) || typeof entry.name !== "string" || typeof entry.version !== "string") {
|
|
207
|
+
throw new Error(`${lockfile}: a [[package]] entry has no name or version.`);
|
|
208
|
+
}
|
|
209
|
+
packages.push({
|
|
210
|
+
name: entry.name,
|
|
211
|
+
version: entry.version,
|
|
212
|
+
...(typeof entry.source === "string" ? { source: entry.source } : {}),
|
|
213
|
+
entry,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const find = (spec, from) => {
|
|
217
|
+
const match = /^(\S+)(?: (\S+))?(?: \((.+)\))?$/.exec(spec);
|
|
218
|
+
const candidates = match
|
|
219
|
+
? packages.filter((p) => p.name === match[1] &&
|
|
220
|
+
(match[2] === undefined || p.version === match[2]) &&
|
|
221
|
+
(match[3] === undefined || p.source === match[3]))
|
|
222
|
+
: [];
|
|
223
|
+
if (candidates.length !== 1) {
|
|
224
|
+
throw new Error(`${lockfile}: ${from} depends on '${spec}', which names ${candidates.length === 0 ? "no" : "more than one"} ` +
|
|
225
|
+
`[[package]] — regenerate the lockfile with \`cargo generate-lockfile\`.`);
|
|
226
|
+
}
|
|
227
|
+
return candidates[0];
|
|
228
|
+
};
|
|
229
|
+
const reached = new Set();
|
|
230
|
+
const queue = crateNames.map((name) => {
|
|
231
|
+
const local = packages.filter((p) => p.name === name && p.source === undefined);
|
|
232
|
+
if (local.length !== 1) {
|
|
233
|
+
throw new Error(`${lockfile} has ${local.length === 0 ? "no" : "more than one"} entry for the path crate '${name}' — ` +
|
|
234
|
+
`run \`cargo generate-lockfile\` in the workspace.`);
|
|
235
|
+
}
|
|
236
|
+
return local[0];
|
|
237
|
+
});
|
|
238
|
+
while (queue.length > 0) {
|
|
239
|
+
const pkg = queue.shift();
|
|
240
|
+
if (reached.has(pkg))
|
|
241
|
+
continue;
|
|
242
|
+
reached.add(pkg);
|
|
243
|
+
const deps = pkg.entry.dependencies;
|
|
244
|
+
for (const dep of Array.isArray(deps) ? deps : []) {
|
|
245
|
+
if (typeof dep !== "string")
|
|
246
|
+
throw new Error(`${lockfile}: '${pkg.name}' lists a non-string dependency.`);
|
|
247
|
+
queue.push(find(dep, `'${pkg.name} ${pkg.version}'`));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return [...reached];
|
|
251
|
+
}
|
|
252
|
+
/** The value at a dotted key path, or undefined. */
|
|
253
|
+
function valueAt(table, keys) {
|
|
254
|
+
let current = table;
|
|
255
|
+
for (const key of keys)
|
|
256
|
+
current = isTable(current) ? current[key] : undefined;
|
|
257
|
+
return current;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The digest of a crate's build inputs, `sha256-<base64url>`: one line per input,
|
|
261
|
+
* sorted — each tracked file of the crate and of every path crate it reaches
|
|
262
|
+
* (workspace-root-relative path and content digest), each `Cargo.lock` package
|
|
263
|
+
* those crates reach, each cargo configuration or toolchain file from the crate's
|
|
264
|
+
* directory up to the repository root, and from the workspace root's
|
|
265
|
+
* `Cargo.toml` the inherited `[workspace.dependencies]` entries plus `[patch]`,
|
|
266
|
+
* `[replace]`, `[profile]` and `[workspace]`'s `resolver`, `package` and `lints`.
|
|
267
|
+
*/
|
|
268
|
+
export async function crateInputsDigest(crateDir) {
|
|
269
|
+
const manifest = readManifest(crateDir);
|
|
270
|
+
const root = workspaceRootOf(crateDir, manifest);
|
|
271
|
+
const lockfile = path.join(root.dir, "Cargo.lock");
|
|
272
|
+
if (!fs.existsSync(lockfile)) {
|
|
273
|
+
throw new Error(`${root.dir} has no Cargo.lock. The lockfile fixes every registry dependency the build ` +
|
|
274
|
+
`links, so it is part of the digest — generate it with \`cargo generate-lockfile\`.`);
|
|
275
|
+
}
|
|
276
|
+
const repo = gitTopLevel(crateDir);
|
|
277
|
+
const tracked = new TrackedFiles(repo);
|
|
278
|
+
const rootDir = realPath(root.dir);
|
|
279
|
+
const patched = patchedPathCrates(root);
|
|
280
|
+
const crates = new Set();
|
|
281
|
+
const crateNames = [];
|
|
282
|
+
const inheritedNames = new Set();
|
|
283
|
+
const walk = (start) => {
|
|
284
|
+
const queue = [start];
|
|
285
|
+
while (queue.length > 0) {
|
|
286
|
+
const dir = realPath(queue.shift());
|
|
287
|
+
if (crates.has(dir))
|
|
288
|
+
continue;
|
|
289
|
+
if (!tracked.has(path.join(dir, "Cargo.toml"))) {
|
|
290
|
+
throw new Error(`${path.join(dir, "Cargo.toml")} is not tracked by git. A build input is a committed ` +
|
|
291
|
+
`file, so an uncommitted crate has none to digest — git add the crate.`);
|
|
292
|
+
}
|
|
293
|
+
crates.add(dir);
|
|
294
|
+
const own = dir === realPath(crateDir) ? manifest : readManifest(dir);
|
|
295
|
+
const name = isTable(own.package) ? own.package.name : undefined;
|
|
296
|
+
if (typeof name !== "string")
|
|
297
|
+
throw new Error(`${path.join(dir, "Cargo.toml")} declares no [package] name.`);
|
|
298
|
+
crateNames.push(name);
|
|
299
|
+
queue.push(...pathDependencies(dir, own, root, inheritedNames));
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
walk(crateDir);
|
|
303
|
+
// A path crate the lock reaches that no path dependency named was substituted
|
|
304
|
+
// by `[patch]`: its files link into the build as much as any other's.
|
|
305
|
+
let reached = reachedLockPackages(lockfile, crateNames);
|
|
306
|
+
for (;;) {
|
|
307
|
+
const unwalked = reached.filter((p) => p.source === undefined && !crateNames.includes(p.name));
|
|
308
|
+
if (unwalked.length === 0)
|
|
309
|
+
break;
|
|
310
|
+
for (const pkg of unwalked) {
|
|
311
|
+
const dir = patched.get(pkg.name);
|
|
312
|
+
if (dir === undefined) {
|
|
313
|
+
throw new Error(`${lockfile}: the crate reaches the path package '${pkg.name}', but neither a path ` +
|
|
314
|
+
`dependency nor a [patch] entry of ${path.join(root.dir, "Cargo.toml")} names its directory, ` +
|
|
315
|
+
`so its files cannot be digested — regenerate the lockfile with \`cargo generate-lockfile\`.`);
|
|
316
|
+
}
|
|
317
|
+
walk(dir);
|
|
318
|
+
}
|
|
319
|
+
reached = reachedLockPackages(lockfile, crateNames);
|
|
320
|
+
}
|
|
321
|
+
const lines = reached.map((p) => `Cargo.lock#${p.name} ${p.version} ${p.source ?? ""}\0${canonical(p.entry)}`);
|
|
322
|
+
const workspace = isTable(root.manifest.workspace) ? root.manifest.workspace : {};
|
|
323
|
+
const workspaceDeps = isTable(workspace.dependencies) ? workspace.dependencies : {};
|
|
324
|
+
for (const name of inheritedNames) {
|
|
325
|
+
lines.push(`Cargo.toml#workspace.dependencies.${name}\0${canonical(workspaceDeps[name])}`);
|
|
326
|
+
}
|
|
327
|
+
for (const keys of INHERITED_ROOT_KEYS) {
|
|
328
|
+
const value = valueAt(root.manifest, keys);
|
|
329
|
+
if (value !== undefined)
|
|
330
|
+
lines.push(`Cargo.toml#${keys.join(".")}\0${canonical(value)}`);
|
|
331
|
+
}
|
|
332
|
+
const configs = [];
|
|
333
|
+
for (let dir = realPath(crateDir);; dir = path.dirname(dir)) {
|
|
334
|
+
for (const name of BUILD_CONFIG_FILES)
|
|
335
|
+
configs.push(path.join(dir, name));
|
|
336
|
+
if (dir === repo || path.dirname(dir) === dir)
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
const inputs = new Set(tracked.under([...crates]));
|
|
340
|
+
for (const config of configs) {
|
|
341
|
+
if (tracked.has(config) && fs.existsSync(config))
|
|
342
|
+
inputs.add(config);
|
|
343
|
+
}
|
|
344
|
+
for (const file of inputs) {
|
|
345
|
+
const name = path.relative(rootDir, file).split(path.sep).join("/");
|
|
346
|
+
lines.push(`${name}\0${await sha256Base64Url(fs.readFileSync(file))}`);
|
|
347
|
+
}
|
|
348
|
+
lines.sort();
|
|
349
|
+
return `sha256-${await sha256Base64Url(new TextEncoder().encode([...new Set(lines)].join("\n")))}`;
|
|
350
|
+
}
|
|
351
|
+
/** Recompute every crate-built source's inputs across `modules` and report each
|
|
352
|
+
* one that is unrecorded or has moved. */
|
|
353
|
+
export async function checkCrateInputs(modules) {
|
|
354
|
+
const failures = [];
|
|
355
|
+
for (const module of modules) {
|
|
356
|
+
const sources = moduleSources(module);
|
|
357
|
+
if (sources instanceof Error) {
|
|
358
|
+
failures.push({ module: module.key, source: "", message: sources.message });
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
for (const source of sources) {
|
|
362
|
+
if (source.build === undefined)
|
|
363
|
+
continue;
|
|
364
|
+
const { cargo, inputs } = source.build;
|
|
365
|
+
const fail = (message) => failures.push({ module: module.key, source: source.name, message });
|
|
366
|
+
let actual;
|
|
367
|
+
try {
|
|
368
|
+
actual = await crateInputsDigest(path.resolve(module.dir, cargo));
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
fail(`cannot digest crate '${cargo}': ${err instanceof Error ? err.message : String(err)}`);
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if (inputs === undefined) {
|
|
375
|
+
fail(`builds from crate '${cargo}' but records no build.inputs — run ` +
|
|
376
|
+
`\`telo release stage --pin --module ${module.key}\` after rebuilding its files.`);
|
|
377
|
+
}
|
|
378
|
+
else if (inputs !== actual) {
|
|
379
|
+
fail(`the build inputs of crate '${cargo}' moved (recorded ${inputs}, now ${actual}): a ` +
|
|
380
|
+
`tracked file of the crate or of a path crate it reaches, a lock package they reach, ` +
|
|
381
|
+
`or a cargo configuration applying to the build changed since its files were built. ` +
|
|
382
|
+
`Rebuild them and run \`telo release stage --pin --module ${module.key}\`.`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return failures;
|
|
387
|
+
}
|
|
388
|
+
function moduleSources(module) {
|
|
389
|
+
const text = fs.readFileSync(module.manifestPath, "utf8");
|
|
390
|
+
for (const doc of parseAllDocuments(text, { customTags: defaultCustomTags() })) {
|
|
391
|
+
if (doc.errors.length > 0) {
|
|
392
|
+
return new Error(`${module.manifestPath} does not parse, so its crate inputs cannot be checked: ` +
|
|
393
|
+
doc.errors[0].message);
|
|
394
|
+
}
|
|
395
|
+
const json = doc.toJSON();
|
|
396
|
+
if (typeof json?.kind !== "string" || !isModuleKind(json.kind))
|
|
397
|
+
continue;
|
|
398
|
+
const { sources, problems } = readModuleSources(json);
|
|
399
|
+
if (problems.length > 0) {
|
|
400
|
+
return new Error(`its sources: block cannot be read, so its crate inputs cannot be checked:\n` +
|
|
401
|
+
problems.map((problem) => ` ${problem.message}`).join("\n"));
|
|
402
|
+
}
|
|
403
|
+
return sources;
|
|
404
|
+
}
|
|
405
|
+
return [];
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=crate-inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crate-inputs.js","sourceRoot":"","sources":["../../src/release/crate-inputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,30 +15,26 @@
|
|
|
15
15
|
* version, which is why its guesswork had to be sound; here it decides only
|
|
16
16
|
* whether a changelog line is requested.
|
|
17
17
|
*/
|
|
18
|
-
import { type LayerDigests, type ModuleEvidence } from "@telorun/analyzer";
|
|
19
|
-
import { type ModulePayload } from "../bundle/module-payload.js";
|
|
18
|
+
import { type LayerDigests, type ModuleEvidence, type ModuleKey } from "@telorun/analyzer";
|
|
19
|
+
import { ModulePayloadBuilder, type ModulePayload } from "../bundle/module-payload.js";
|
|
20
20
|
import type { DiscoveredModule, Workspace } from "./workspace.js";
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
/** Where one module publishes: the resolved base, and the ref it derives. */
|
|
22
|
+
export interface ModuleTarget {
|
|
23
23
|
readonly registry: string;
|
|
24
|
+
readonly destination: string;
|
|
25
|
+
}
|
|
26
|
+
export interface EvidenceOptions {
|
|
27
|
+
/** Per module, because a workspace may declare a base per subtree. Resolved
|
|
28
|
+
* by the caller, which owns the flag / env / ledger rungs of the cascade. */
|
|
29
|
+
readonly targets: ReadonlyMap<ModuleKey, ModuleTarget>;
|
|
24
30
|
/** Git ref the changed-files reading diffs against. */
|
|
25
31
|
readonly baseRef: string;
|
|
26
32
|
/** Called before each module is built, so a long batch shows progress. */
|
|
27
33
|
readonly onModule?: (module: DiscoveredModule, index: number, total: number) => void;
|
|
34
|
+
/** Reused where the caller already read the import graph through one, so the
|
|
35
|
+
* manifest transform is not repeated per module. */
|
|
36
|
+
readonly builder?: ModulePayloadBuilder;
|
|
28
37
|
}
|
|
29
|
-
/**
|
|
30
|
-
* A module's publish destination: the registry base plus its own directory name.
|
|
31
|
-
*
|
|
32
|
-
* Identity is the ref, never `metadata.name` — this is the same rule the release
|
|
33
|
-
* job has always applied, lifted out of a shell script.
|
|
34
|
-
*
|
|
35
|
-
* This is the ROOT destination, which is a policy rather than a derivation:
|
|
36
|
-
* nothing in the graph can say which repo a module publishes to. The payload
|
|
37
|
-
* builder derives a SIBLING's from it instead of re-applying this rule, so the
|
|
38
|
-
* ref an artifact carries and the destination its dependency is pushed to are
|
|
39
|
-
* the same string by construction.
|
|
40
|
-
*/
|
|
41
|
-
export declare function destinationFor(registry: string, module: DiscoveredModule): string;
|
|
42
38
|
/**
|
|
43
39
|
* A built payload reduced to the per-layer digest map the ledger records.
|
|
44
40
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/release/evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/release/evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAElE,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B;kFAC8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACvD,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrF;yDACqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAajF;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkB3B;AAmED,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B3E"}
|
package/dist/release/evidence.js
CHANGED
|
@@ -15,28 +15,13 @@
|
|
|
15
15
|
* version, which is why its guesswork had to be sound; here it decides only
|
|
16
16
|
* whether a changelog line is requested.
|
|
17
17
|
*/
|
|
18
|
-
import { MANIFEST_LAYER, layerDigestKey, } from "@telorun/analyzer";
|
|
18
|
+
import { MANIFEST_LAYER, layerDigestKey, matchesPatterns, } from "@telorun/analyzer";
|
|
19
19
|
import { computeFilesIntegrity } from "@telorun/kernel";
|
|
20
|
-
import { selectByPatterns } from "@telorun/glob";
|
|
20
|
+
import { lastMatchIndex, selectByPatterns } from "@telorun/glob";
|
|
21
21
|
import { execFileSync } from "node:child_process";
|
|
22
22
|
import * as fs from "node:fs";
|
|
23
23
|
import * as path from "node:path";
|
|
24
24
|
import { ModulePayloadBuilder } from "../bundle/module-payload.js";
|
|
25
|
-
/**
|
|
26
|
-
* A module's publish destination: the registry base plus its own directory name.
|
|
27
|
-
*
|
|
28
|
-
* Identity is the ref, never `metadata.name` — this is the same rule the release
|
|
29
|
-
* job has always applied, lifted out of a shell script.
|
|
30
|
-
*
|
|
31
|
-
* This is the ROOT destination, which is a policy rather than a derivation:
|
|
32
|
-
* nothing in the graph can say which repo a module publishes to. The payload
|
|
33
|
-
* builder derives a SIBLING's from it instead of re-applying this rule, so the
|
|
34
|
-
* ref an artifact carries and the destination its dependency is pushed to are
|
|
35
|
-
* the same string by construction.
|
|
36
|
-
*/
|
|
37
|
-
export function destinationFor(registry, module) {
|
|
38
|
-
return `${registry.replace(/\/+$/, "")}/${path.basename(module.dir)}`;
|
|
39
|
-
}
|
|
40
25
|
/**
|
|
41
26
|
* A built payload reduced to the per-layer digest map the ledger records.
|
|
42
27
|
*
|
|
@@ -65,26 +50,30 @@ export async function digestPayload(payload) {
|
|
|
65
50
|
export async function collectEvidence(workspace, options) {
|
|
66
51
|
const byDir = new Map(workspace.modules.map((module) => [path.resolve(module.dir), module]));
|
|
67
52
|
const changed = changedModules(workspace, options.baseRef);
|
|
68
|
-
const builder = new ModulePayloadBuilder({ cacheRoot: path.join(workspace.root, ".telo") });
|
|
53
|
+
const builder = options.builder ?? new ModulePayloadBuilder({ cacheRoot: path.join(workspace.root, ".telo") });
|
|
69
54
|
const evidence = [];
|
|
70
55
|
for (const [index, module] of workspace.modules.entries()) {
|
|
71
56
|
options.onModule?.(module, index, workspace.modules.length);
|
|
57
|
+
const target = options.targets.get(module.key);
|
|
58
|
+
if (!target)
|
|
59
|
+
throw new Error(`no publish destination was resolved for '${module.key}'.`);
|
|
72
60
|
evidence.push(module.artifactKind === "image"
|
|
73
|
-
? await imageEvidence(module, changed)
|
|
74
|
-
: await registryEvidence(workspace, module, byDir, builder,
|
|
61
|
+
? await imageEvidence(module, target, changed)
|
|
62
|
+
: await registryEvidence(workspace, module, byDir, builder, target, changed));
|
|
75
63
|
}
|
|
76
64
|
return evidence;
|
|
77
65
|
}
|
|
78
66
|
/**
|
|
79
67
|
* A registry artifact module: the layers `telo publish` builds, digested.
|
|
80
68
|
*/
|
|
81
|
-
async function registryEvidence(workspace, module, byDir, builder,
|
|
82
|
-
const payload = await builder.payload(module.manifestPath,
|
|
69
|
+
async function registryEvidence(workspace, module, byDir, builder, target, changed) {
|
|
70
|
+
const payload = await builder.payload(module.manifestPath, target.destination);
|
|
83
71
|
return {
|
|
84
72
|
key: module.key,
|
|
85
73
|
name: module.name,
|
|
86
74
|
version: module.version,
|
|
87
75
|
artifactKind: "registry",
|
|
76
|
+
registry: target.registry,
|
|
88
77
|
layers: await digestPayload(payload),
|
|
89
78
|
inlines: attributeInputs(workspace, payload.buildInputs, module, byDir),
|
|
90
79
|
imports: payload.relativeImports
|
|
@@ -107,12 +96,13 @@ async function registryEvidence(workspace, module, byDir, builder, options, chan
|
|
|
107
96
|
* change reaches the deployed app regardless, and the immutable `:<version>` tag
|
|
108
97
|
* is what a version move is for.
|
|
109
98
|
*/
|
|
110
|
-
async function imageEvidence(module, changed) {
|
|
99
|
+
async function imageEvidence(module, target, changed) {
|
|
111
100
|
return {
|
|
112
101
|
key: module.key,
|
|
113
102
|
name: module.name,
|
|
114
103
|
version: module.version,
|
|
115
104
|
artifactKind: "image",
|
|
105
|
+
registry: target.registry,
|
|
116
106
|
layers: { image: await imageDigest(module) },
|
|
117
107
|
inlines: new Map(),
|
|
118
108
|
imports: [],
|
|
@@ -205,14 +195,19 @@ function ownerOf(file, byDir) {
|
|
|
205
195
|
dir = parent;
|
|
206
196
|
}
|
|
207
197
|
}
|
|
208
|
-
/** Paths under a module that never reach its artifact, so editing one is not a
|
|
209
|
-
* semantic change worth a changelog line. Kept deliberately short: this rule no
|
|
210
|
-
* longer decides a version, so a false positive costs one sentence and the old
|
|
211
|
-
* per-language guesswork bought nothing. */
|
|
212
|
-
const NON_ARTIFACT_PATHS = [/^docs\//, /^plans\//, /^tests\//, /^README\.md$/, /^CHANGELOG\.md$/];
|
|
213
198
|
/**
|
|
214
199
|
* Modules with a change of their own on this branch.
|
|
215
200
|
*
|
|
201
|
+
* Which of a module's paths are not release-relevant is that module's resolved
|
|
202
|
+
* `ignore` list — the workspace's, or its entry's override, or the built-in
|
|
203
|
+
* default — matched module-relative and gitignore-style. It no longer decides a
|
|
204
|
+
* version, so a false positive costs one sentence rather than a spurious
|
|
205
|
+
* republish.
|
|
206
|
+
*
|
|
207
|
+
* Attribution is to the NEAREST enclosing module, matching how build inputs are
|
|
208
|
+
* already attributed: the shortest matching key is the wrong answer the moment a
|
|
209
|
+
* nested module would be judged against an enclosing entry's ignore list.
|
|
210
|
+
*
|
|
216
211
|
* No merge base — a shallow clone, a fresh repo — means the reading cannot be
|
|
217
212
|
* taken, and guessing would ask for a changelog entry at random. The digest is
|
|
218
213
|
* unaffected: it compares against the ledger, not against a ref, which is why it
|
|
@@ -230,13 +225,14 @@ function changedModules(workspace, baseRef) {
|
|
|
230
225
|
catch {
|
|
231
226
|
return new Set();
|
|
232
227
|
}
|
|
228
|
+
const nearestFirst = [...workspace.modules].sort((a, b) => b.key.length - a.key.length);
|
|
233
229
|
const changed = new Set();
|
|
234
230
|
for (const file of diff.split("\n").map((line) => line.trim()).filter(Boolean)) {
|
|
235
|
-
const module =
|
|
231
|
+
const module = nearestFirst.find((candidate) => file.startsWith(`${candidate.key}/`));
|
|
236
232
|
if (!module)
|
|
237
233
|
continue;
|
|
238
234
|
const rest = file.slice(module.key.length + 1);
|
|
239
|
-
if (
|
|
235
|
+
if (matchesPatterns(rest, module.settings.ignore, lastMatchIndex))
|
|
240
236
|
continue;
|
|
241
237
|
changed.add(module.key);
|
|
242
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/release/evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/release/evidence.ts"],"names":[],"mappings":"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"}
|