@git.zone/tsrust 1.8.0 → 1.9.1
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/mod_artifact/classes.artifactassembler.d.ts +48 -0
- package/dist_ts/mod_artifact/classes.artifactassembler.js +842 -0
- package/dist_ts/mod_artifact/index.d.ts +1 -0
- package/dist_ts/mod_artifact/index.js +2 -0
- package/dist_ts/mod_cli/classes.tsrustcli.d.ts +5 -2
- package/dist_ts/mod_cli/classes.tsrustcli.js +122 -75
- package/dist_ts/mod_cli/helpers.codesign.d.ts +2 -0
- package/dist_ts/mod_cli/helpers.codesign.js +48 -0
- package/dist_ts/mod_cli/helpers.targets.d.ts +20 -0
- package/dist_ts/mod_cli/helpers.targets.js +106 -0
- package/dist_ts/mod_cli/index.d.ts +1 -0
- package/dist_ts/mod_cli/index.js +2 -1
- package/dist_ts/mod_elf/classes.provenance.d.ts +2 -1
- package/dist_ts/mod_elf/classes.provenance.js +0 -0
- package/dist_ts/mod_provenance/classes.gitstate.d.ts +7 -0
- package/dist_ts/mod_provenance/classes.gitstate.js +34 -0
- package/dist_ts/mod_provenance/classes.provenancestore.d.ts +11 -0
- package/dist_ts/mod_provenance/classes.provenancestore.js +184 -0
- package/dist_ts/mod_provenance/helpers.owneridentity.d.ts +2 -0
- package/dist_ts/mod_provenance/helpers.owneridentity.js +57 -0
- package/dist_ts/mod_provenance/index.d.ts +3 -0
- package/dist_ts/mod_provenance/index.js +4 -0
- package/package.json +3 -3
- package/readme.hints.md +6 -3
- package/readme.md +77 -5
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +2 -0
- package/ts/mod_artifact/classes.artifactassembler.ts +1028 -0
- package/ts/mod_artifact/index.ts +6 -0
- package/ts/mod_cli/classes.tsrustcli.ts +179 -95
- package/ts/mod_cli/helpers.codesign.ts +71 -0
- package/ts/mod_cli/helpers.targets.ts +141 -0
- package/ts/mod_cli/index.ts +10 -0
- package/ts/mod_elf/classes.provenance.ts +0 -0
- package/ts/mod_provenance/classes.gitstate.ts +49 -0
- package/ts/mod_provenance/classes.provenancestore.ts +194 -0
- package/ts/mod_provenance/helpers.owneridentity.ts +57 -0
- package/ts/mod_provenance/index.ts +10 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export const targetAliasMap = {
|
|
2
|
+
linux_amd64: 'x86_64-unknown-linux-gnu',
|
|
3
|
+
linux_arm64: 'aarch64-unknown-linux-gnu',
|
|
4
|
+
linux_amd64_musl: 'x86_64-unknown-linux-musl',
|
|
5
|
+
linux_arm64_musl: 'aarch64-unknown-linux-musl',
|
|
6
|
+
macos_amd64: 'x86_64-apple-darwin',
|
|
7
|
+
macos_arm64: 'aarch64-apple-darwin',
|
|
8
|
+
};
|
|
9
|
+
const tripleToFriendlyMap = Object.fromEntries(Object.entries(targetAliasMap).map(([friendly, triple]) => [triple, friendly]));
|
|
10
|
+
const supportedHostKeys = new Set([
|
|
11
|
+
'linux',
|
|
12
|
+
'macos',
|
|
13
|
+
'linux_amd64',
|
|
14
|
+
'linux_arm64',
|
|
15
|
+
'macos_amd64',
|
|
16
|
+
'macos_arm64',
|
|
17
|
+
]);
|
|
18
|
+
export function resolveTargetAlias(nameArg) {
|
|
19
|
+
return targetAliasMap[nameArg] || nameArg;
|
|
20
|
+
}
|
|
21
|
+
export function friendlyTargetName(tripleArg) {
|
|
22
|
+
return tripleToFriendlyMap[tripleArg] || tripleArg.replace(/-/g, '_');
|
|
23
|
+
}
|
|
24
|
+
function validateTargetName(nameArg) {
|
|
25
|
+
if (!nameArg ||
|
|
26
|
+
nameArg.length > 255 ||
|
|
27
|
+
!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(nameArg)) {
|
|
28
|
+
throw new Error(`Invalid Rust target name: ${JSON.stringify(nameArg)}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function normalizeTargets(targetsArg, labelArg) {
|
|
32
|
+
if (!Array.isArray(targetsArg)) {
|
|
33
|
+
throw new Error(`${labelArg} must be an array of Rust target names`);
|
|
34
|
+
}
|
|
35
|
+
const byTriple = new Map();
|
|
36
|
+
const tripleByFriendly = new Map();
|
|
37
|
+
for (const target of targetsArg) {
|
|
38
|
+
if (typeof target !== 'string') {
|
|
39
|
+
throw new Error(`${labelArg} must contain only Rust target names`);
|
|
40
|
+
}
|
|
41
|
+
validateTargetName(target);
|
|
42
|
+
const triple = resolveTargetAlias(target);
|
|
43
|
+
validateTargetName(triple);
|
|
44
|
+
const friendly = friendlyTargetName(triple);
|
|
45
|
+
validateTargetName(friendly);
|
|
46
|
+
const collidingTriple = tripleByFriendly.get(friendly);
|
|
47
|
+
if (collidingTriple && collidingTriple !== triple) {
|
|
48
|
+
throw new Error(`${labelArg} targets ${collidingTriple} and ${triple} share output suffix ${friendly}`);
|
|
49
|
+
}
|
|
50
|
+
tripleByFriendly.set(friendly, triple);
|
|
51
|
+
byTriple.set(triple, { triple, friendly });
|
|
52
|
+
}
|
|
53
|
+
return [...byTriple.values()];
|
|
54
|
+
}
|
|
55
|
+
function validateTargetsByHost(configArg) {
|
|
56
|
+
if (configArg.targets !== undefined) {
|
|
57
|
+
normalizeTargets(configArg.targets, 'targets');
|
|
58
|
+
}
|
|
59
|
+
if (configArg.targetsByHost === undefined)
|
|
60
|
+
return;
|
|
61
|
+
if (!configArg.targetsByHost ||
|
|
62
|
+
typeof configArg.targetsByHost !== 'object' ||
|
|
63
|
+
Array.isArray(configArg.targetsByHost)) {
|
|
64
|
+
throw new Error('targetsByHost must be an object keyed by supported build hosts');
|
|
65
|
+
}
|
|
66
|
+
for (const [host, targets] of Object.entries(configArg.targetsByHost)) {
|
|
67
|
+
if (!supportedHostKeys.has(host)) {
|
|
68
|
+
throw new Error(`Unsupported targetsByHost key: ${host}`);
|
|
69
|
+
}
|
|
70
|
+
if (!Array.isArray(targets) || targets.length === 0) {
|
|
71
|
+
throw new Error(`targetsByHost.${host} must be a non-empty target array`);
|
|
72
|
+
}
|
|
73
|
+
normalizeTargets(targets, `targetsByHost.${host}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function hostFamily(hostTripleArg) {
|
|
77
|
+
if (hostTripleArg.includes('-linux-'))
|
|
78
|
+
return 'linux';
|
|
79
|
+
if (hostTripleArg.endsWith('-apple-darwin'))
|
|
80
|
+
return 'macos';
|
|
81
|
+
throw new Error(`Unsupported Rust host triple for targetsByHost: ${hostTripleArg}`);
|
|
82
|
+
}
|
|
83
|
+
export function resolveBuildTargets(configArg, hostTripleArg, cliTargetsArg) {
|
|
84
|
+
validateTargetsByHost(configArg);
|
|
85
|
+
if (cliTargetsArg !== undefined) {
|
|
86
|
+
if (cliTargetsArg.length === 0) {
|
|
87
|
+
throw new Error('--target requires at least one target');
|
|
88
|
+
}
|
|
89
|
+
return normalizeTargets(cliTargetsArg, '--target');
|
|
90
|
+
}
|
|
91
|
+
const exactHost = friendlyTargetName(hostTripleArg);
|
|
92
|
+
const configured = configArg.targetsByHost?.[exactHost] ||
|
|
93
|
+
configArg.targetsByHost?.[hostFamily(hostTripleArg)] ||
|
|
94
|
+
configArg.targets ||
|
|
95
|
+
[];
|
|
96
|
+
return normalizeTargets(configured, 'targets');
|
|
97
|
+
}
|
|
98
|
+
export function configuredAssemblyTargets(configArg) {
|
|
99
|
+
validateTargetsByHost(configArg);
|
|
100
|
+
const configured = [
|
|
101
|
+
...(configArg.targets || []),
|
|
102
|
+
...Object.values(configArg.targetsByHost || {}).flat(),
|
|
103
|
+
];
|
|
104
|
+
return normalizeTargets(configured, 'configured assembly targets');
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy50YXJnZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2NsaS9oZWxwZXJzLnRhcmdldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUEyQjtJQUNwRCxXQUFXLEVBQUUsMEJBQTBCO0lBQ3ZDLFdBQVcsRUFBRSwyQkFBMkI7SUFDeEMsZ0JBQWdCLEVBQUUsMkJBQTJCO0lBQzdDLGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxXQUFXLEVBQUUscUJBQXFCO0lBQ2xDLFdBQVcsRUFBRSxzQkFBc0I7Q0FDcEMsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FDL0UsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDaEMsT0FBTztJQUNQLE9BQU87SUFDUCxhQUFhO0lBQ2IsYUFBYTtJQUNiLGFBQWE7SUFDYixhQUFhO0NBQ2QsQ0FBQyxDQUFDO0FBa0JILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFlO0lBQ2hELE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQztBQUM1QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQWlCO0lBQ2xELE9BQU8sbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsT0FBZTtJQUN6QyxJQUNFLENBQUMsT0FBTztRQUNSLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRztRQUNw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
|
package/dist_ts/mod_cli/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { TsRustCli, runCli } from './classes.tsrustcli.js';
|
|
2
|
-
|
|
2
|
+
export { configuredAssemblyTargets, friendlyTargetName, normalizeTargets, resolveBuildTargets, resolveTargetAlias, targetAliasMap, } from './helpers.targets.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsY0FBYyxHQUdmLE1BQU0sc0JBQXNCLENBQUMifQ==
|
|
@@ -10,11 +10,12 @@ export interface ITsrustBuildInfo {
|
|
|
10
10
|
projectName: string;
|
|
11
11
|
projectVersion: string;
|
|
12
12
|
gitCommit: string;
|
|
13
|
+
gitDirty?: boolean;
|
|
13
14
|
builtAt: string;
|
|
14
15
|
tsrustVersion: string;
|
|
15
16
|
}
|
|
16
17
|
export declare class ProvenanceStamper {
|
|
17
|
-
/**
|
|
18
|
+
/** @deprecated New builds use hash-bound sidecars so binaries remain byte-identical. */
|
|
18
19
|
static stamp(binaryPath: string, info: ITsrustBuildInfo): Promise<void>;
|
|
19
20
|
/**
|
|
20
21
|
* Reads the most recent provenance trailer from a binary.
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface IGitSnapshot {
|
|
2
|
+
available: boolean;
|
|
3
|
+
commit: string;
|
|
4
|
+
status: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function captureGitSnapshot(cwdArg: string): Promise<IGitSnapshot>;
|
|
7
|
+
export declare function assertGitSnapshotUnchanged(beforeArg: IGitSnapshot, afterArg: IGitSnapshot): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as childProcess from 'child_process';
|
|
2
|
+
import * as util from 'util';
|
|
3
|
+
const execFile = util.promisify(childProcess.execFile);
|
|
4
|
+
export async function captureGitSnapshot(cwdArg) {
|
|
5
|
+
let commit;
|
|
6
|
+
try {
|
|
7
|
+
const result = await execFile('git', ['-C', cwdArg, 'rev-parse', 'HEAD'], {
|
|
8
|
+
encoding: 'utf8',
|
|
9
|
+
});
|
|
10
|
+
commit = result.stdout.trim();
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return { available: false, commit: 'unknown', status: '' };
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const status = await execFile('git', ['-C', cwdArg, 'status', '--porcelain=v1', '--untracked-files=all'], { encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 });
|
|
17
|
+
return {
|
|
18
|
+
available: true,
|
|
19
|
+
commit,
|
|
20
|
+
status: status.stdout,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new Error('Failed to inspect Git worktree state');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function assertGitSnapshotUnchanged(beforeArg, afterArg) {
|
|
28
|
+
if (beforeArg.available !== afterArg.available ||
|
|
29
|
+
beforeArg.commit !== afterArg.commit ||
|
|
30
|
+
beforeArg.status !== afterArg.status) {
|
|
31
|
+
throw new Error('Git source state changed while Cargo was building');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRzdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9wcm92ZW5hbmNlL2NsYXNzZXMuZ2l0c3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFRdkQsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQ3JELElBQUksTUFBYyxDQUFDO0lBQ25CLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ3hFLFFBQVEsRUFBRSxNQUFNO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQzNCLEtBQUssRUFDTCxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLEVBQ25FLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FDbEQsQ0FBQztRQUNGLE9BQU87WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLE1BQU07WUFDTixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLFNBQXVCLEVBQ3ZCLFFBQXNCO0lBRXRCLElBQ0UsU0FBUyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsU0FBUztRQUMxQyxTQUFTLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO1FBQ3BDLFNBQVMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFDcEMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUN2RSxDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ITsrustBuildInfo } from '../mod_elf/index.js';
|
|
2
|
+
export declare const PROVENANCE_SIDECAR_SUFFIX = ".tsrust-build.json";
|
|
3
|
+
export declare class ProvenanceStore {
|
|
4
|
+
static sidecarPath(binaryPathArg: string): string;
|
|
5
|
+
static sha256(binaryPathArg: string): Promise<string>;
|
|
6
|
+
static write(binaryPathArg: string, infoArg: ITsrustBuildInfo): Promise<string>;
|
|
7
|
+
private static readExistingSidecar;
|
|
8
|
+
private static recoverTemporaryFiles;
|
|
9
|
+
static readSidecar(binaryPathArg: string): Promise<ITsrustBuildInfo>;
|
|
10
|
+
static read(binaryPathArg: string): Promise<ITsrustBuildInfo | undefined>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import * as crypto from 'crypto';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { ProvenanceStamper } from '../mod_elf/index.js';
|
|
5
|
+
import { getHostIdentity, isLocalProcessRunning } from './helpers.owneridentity.js';
|
|
6
|
+
const SIDECAR_FORMAT = 'tsrust.build-provenance.v2';
|
|
7
|
+
export const PROVENANCE_SIDECAR_SUFFIX = '.tsrust-build.json';
|
|
8
|
+
function isBuildInfo(valueArg) {
|
|
9
|
+
if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg))
|
|
10
|
+
return false;
|
|
11
|
+
const value = valueArg;
|
|
12
|
+
return (typeof value.binary === 'string' &&
|
|
13
|
+
typeof value.target === 'string' &&
|
|
14
|
+
typeof value.projectName === 'string' &&
|
|
15
|
+
typeof value.projectVersion === 'string' &&
|
|
16
|
+
typeof value.gitCommit === 'string' &&
|
|
17
|
+
typeof value.builtAt === 'string' &&
|
|
18
|
+
typeof value.tsrustVersion === 'string' &&
|
|
19
|
+
(value.gitDirty === undefined || typeof value.gitDirty === 'boolean'));
|
|
20
|
+
}
|
|
21
|
+
export class ProvenanceStore {
|
|
22
|
+
static sidecarPath(binaryPathArg) {
|
|
23
|
+
return `${binaryPathArg}${PROVENANCE_SIDECAR_SUFFIX}`;
|
|
24
|
+
}
|
|
25
|
+
static async sha256(binaryPathArg) {
|
|
26
|
+
const binary = await fs.promises.lstat(binaryPathArg);
|
|
27
|
+
if (!binary.isFile() || binary.isSymbolicLink()) {
|
|
28
|
+
throw new Error(`Provenance binary is not a regular file: ${binaryPathArg}`);
|
|
29
|
+
}
|
|
30
|
+
const digest = crypto.createHash('sha256');
|
|
31
|
+
await new Promise((resolve, reject) => {
|
|
32
|
+
const stream = fs.createReadStream(binaryPathArg);
|
|
33
|
+
stream.on('data', (chunk) => digest.update(chunk));
|
|
34
|
+
stream.on('error', reject);
|
|
35
|
+
stream.on('end', resolve);
|
|
36
|
+
});
|
|
37
|
+
return digest.digest('hex');
|
|
38
|
+
}
|
|
39
|
+
static async write(binaryPathArg, infoArg) {
|
|
40
|
+
if (!isBuildInfo(infoArg)) {
|
|
41
|
+
throw new Error('Provenance build information has an invalid shape');
|
|
42
|
+
}
|
|
43
|
+
const binary = await fs.promises.lstat(binaryPathArg);
|
|
44
|
+
if (!binary.isFile() || binary.isSymbolicLink()) {
|
|
45
|
+
throw new Error(`Provenance binary is not a regular file: ${binaryPathArg}`);
|
|
46
|
+
}
|
|
47
|
+
const sidecarPath = ProvenanceStore.sidecarPath(binaryPathArg);
|
|
48
|
+
await ProvenanceStore.recoverTemporaryFiles(sidecarPath);
|
|
49
|
+
const existing = await ProvenanceStore.readExistingSidecar(binaryPathArg);
|
|
50
|
+
if (existing) {
|
|
51
|
+
if (JSON.stringify(existing) === JSON.stringify(infoArg))
|
|
52
|
+
return sidecarPath;
|
|
53
|
+
throw new Error(`Provenance sidecar already exists with different build information: ${sidecarPath}`);
|
|
54
|
+
}
|
|
55
|
+
const record = {
|
|
56
|
+
format: SIDECAR_FORMAT,
|
|
57
|
+
binarySha256: await ProvenanceStore.sha256(binaryPathArg),
|
|
58
|
+
buildInfo: infoArg,
|
|
59
|
+
};
|
|
60
|
+
const temporaryPath = `${sidecarPath}.${getHostIdentity()}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
61
|
+
let temporary;
|
|
62
|
+
try {
|
|
63
|
+
temporary = await fs.promises.open(temporaryPath, 'wx', 0o600);
|
|
64
|
+
await temporary.writeFile(`${JSON.stringify(record, null, 2)}\n`, 'utf8');
|
|
65
|
+
await temporary.chmod(0o644);
|
|
66
|
+
await temporary.sync();
|
|
67
|
+
await temporary.close();
|
|
68
|
+
temporary = undefined;
|
|
69
|
+
try {
|
|
70
|
+
await fs.promises.link(temporaryPath, sidecarPath);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error.code !== 'EEXIST')
|
|
74
|
+
throw error;
|
|
75
|
+
const concurrentlyWritten = await ProvenanceStore.readSidecar(binaryPathArg);
|
|
76
|
+
if (JSON.stringify(concurrentlyWritten) !== JSON.stringify(infoArg)) {
|
|
77
|
+
throw new Error(`Concurrent provenance write disagreed for ${binaryPathArg}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await fs.promises.unlink(temporaryPath);
|
|
81
|
+
const directory = await fs.promises.open(path.dirname(sidecarPath), 'r');
|
|
82
|
+
try {
|
|
83
|
+
await directory.sync();
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
await directory.close();
|
|
87
|
+
}
|
|
88
|
+
return sidecarPath;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await Promise.allSettled([
|
|
92
|
+
temporary?.close() || Promise.resolve(),
|
|
93
|
+
fs.promises.rm(temporaryPath, { force: true }),
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
static async readExistingSidecar(binaryPathArg) {
|
|
98
|
+
try {
|
|
99
|
+
return await ProvenanceStore.readSidecar(binaryPathArg);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error.code === 'ENOENT')
|
|
103
|
+
return undefined;
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
static async recoverTemporaryFiles(sidecarPathArg) {
|
|
108
|
+
const directoryPath = path.dirname(sidecarPathArg);
|
|
109
|
+
const temporaryPrefix = `${path.basename(sidecarPathArg)}.`;
|
|
110
|
+
const entries = await fs.promises.readdir(directoryPath, { withFileTypes: true });
|
|
111
|
+
for (const entry of entries) {
|
|
112
|
+
if (!entry.name.startsWith(temporaryPrefix) || !entry.name.endsWith('.tmp')) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!entry.isFile())
|
|
116
|
+
continue;
|
|
117
|
+
const suffix = entry.name.slice(temporaryPrefix.length, -'.tmp'.length);
|
|
118
|
+
const [hostIdentity, pidText, identifier, ...unexpected] = suffix.split('.');
|
|
119
|
+
const pid = Number(pidText);
|
|
120
|
+
if (unexpected.length > 0 ||
|
|
121
|
+
!/^[a-f0-9]{64}$/.test(hostIdentity || '') ||
|
|
122
|
+
!Number.isSafeInteger(pid) ||
|
|
123
|
+
!/^[a-f0-9-]{36}$/.test(identifier || '') ||
|
|
124
|
+
hostIdentity !== getHostIdentity() ||
|
|
125
|
+
isLocalProcessRunning(pid)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const temporaryPath = path.join(directoryPath, entry.name);
|
|
129
|
+
try {
|
|
130
|
+
const temporary = await fs.promises.lstat(temporaryPath);
|
|
131
|
+
if (temporary.isFile() && !temporary.isSymbolicLink()) {
|
|
132
|
+
await fs.promises.rm(temporaryPath, { force: true });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error.code !== 'ENOENT')
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
static async readSidecar(binaryPathArg) {
|
|
142
|
+
const sidecarPath = ProvenanceStore.sidecarPath(binaryPathArg);
|
|
143
|
+
const sidecar = await fs.promises.lstat(sidecarPath);
|
|
144
|
+
if (!sidecar.isFile() || sidecar.isSymbolicLink()) {
|
|
145
|
+
throw new Error(`Provenance sidecar is not a regular file: ${sidecarPath}`);
|
|
146
|
+
}
|
|
147
|
+
let parsed;
|
|
148
|
+
try {
|
|
149
|
+
parsed = JSON.parse(await fs.promises.readFile(sidecarPath, 'utf8'));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
throw new Error(`Provenance sidecar is invalid JSON: ${sidecarPath}`);
|
|
153
|
+
}
|
|
154
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
155
|
+
throw new Error(`Provenance sidecar has an invalid shape: ${sidecarPath}`);
|
|
156
|
+
}
|
|
157
|
+
const record = parsed;
|
|
158
|
+
if (record.format !== SIDECAR_FORMAT ||
|
|
159
|
+
typeof record.binarySha256 !== 'string' ||
|
|
160
|
+
!/^[a-f0-9]{64}$/.test(record.binarySha256) ||
|
|
161
|
+
!isBuildInfo(record.buildInfo)) {
|
|
162
|
+
throw new Error(`Provenance sidecar has an unsupported shape: ${sidecarPath}`);
|
|
163
|
+
}
|
|
164
|
+
const actualSha256 = await ProvenanceStore.sha256(binaryPathArg);
|
|
165
|
+
if (actualSha256 !== record.binarySha256) {
|
|
166
|
+
throw new Error(`Provenance sidecar hash does not match ${binaryPathArg}`);
|
|
167
|
+
}
|
|
168
|
+
return record.buildInfo;
|
|
169
|
+
}
|
|
170
|
+
static async read(binaryPathArg) {
|
|
171
|
+
const sidecarPath = ProvenanceStore.sidecarPath(binaryPathArg);
|
|
172
|
+
try {
|
|
173
|
+
await fs.promises.lstat(sidecarPath);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error.code === 'ENOENT') {
|
|
177
|
+
return ProvenanceStamper.read(binaryPathArg);
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
return ProvenanceStore.readSidecar(binaryPathArg);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcm92ZW5hbmNlc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfcHJvdmVuYW5jZS9jbGFzc2VzLnByb3ZlbmFuY2VzdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEYsTUFBTSxjQUFjLEdBQUcsNEJBQTRCLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsb0JBQW9CLENBQUM7QUFROUQsU0FBUyxXQUFXLENBQUMsUUFBaUI7SUFDcEMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2RixNQUFNLEtBQUssR0FBRyxRQUFtQyxDQUFDO0lBQ2xELE9BQU8sQ0FDTCxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUTtRQUNoQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUTtRQUNoQyxPQUFPLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUTtRQUNyQyxPQUFPLEtBQUssQ0FBQyxjQUFjLEtBQUssUUFBUTtRQUN4QyxPQUFPLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUTtRQUNuQyxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxhQUFhLEtBQUssUUFBUTtRQUN2QyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJ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
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as childProcess from 'child_process';
|
|
2
|
+
import * as crypto from 'crypto';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
let cachedHostIdentity;
|
|
6
|
+
function readBootIdentity() {
|
|
7
|
+
if (process.platform === 'linux') {
|
|
8
|
+
try {
|
|
9
|
+
return fs.readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim();
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// Fall through to the portable host fingerprint.
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (process.platform === 'darwin') {
|
|
16
|
+
try {
|
|
17
|
+
return childProcess.execFileSync('/usr/sbin/sysctl', ['-n', 'kern.boottime'], {
|
|
18
|
+
encoding: 'utf8',
|
|
19
|
+
}).trim();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Fall through to the portable host fingerprint.
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return String(Math.round((Date.now() - os.uptime() * 1000) / 60_000));
|
|
26
|
+
}
|
|
27
|
+
export function getHostIdentity() {
|
|
28
|
+
if (cachedHostIdentity)
|
|
29
|
+
return cachedHostIdentity;
|
|
30
|
+
const macAddresses = Object.values(os.networkInterfaces())
|
|
31
|
+
.flat()
|
|
32
|
+
.map((address) => address?.mac.toLowerCase())
|
|
33
|
+
.filter((address) => !!address && address !== '00:00:00:00:00:00')
|
|
34
|
+
.sort();
|
|
35
|
+
cachedHostIdentity = crypto
|
|
36
|
+
.createHash('sha256')
|
|
37
|
+
.update(JSON.stringify({
|
|
38
|
+
platform: process.platform,
|
|
39
|
+
hostname: os.hostname(),
|
|
40
|
+
bootIdentity: readBootIdentity(),
|
|
41
|
+
macAddresses,
|
|
42
|
+
}))
|
|
43
|
+
.digest('hex');
|
|
44
|
+
return cachedHostIdentity;
|
|
45
|
+
}
|
|
46
|
+
export function isLocalProcessRunning(pidArg) {
|
|
47
|
+
if (!Number.isSafeInteger(pidArg) || pidArg <= 0)
|
|
48
|
+
return false;
|
|
49
|
+
try {
|
|
50
|
+
process.kill(pidArg, 0);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return error.code !== 'ESRCH';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5vd25lcmlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX3Byb3ZlbmFuY2UvaGVscGVycy5vd25lcmlkZW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLElBQUksa0JBQXNDLENBQUM7QUFFM0MsU0FBUyxnQkFBZ0I7SUFDdkIsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxpQ0FBaUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaURBQWlEO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQztZQUNILE9BQU8sWUFBWSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsRUFBRTtnQkFDNUUsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGlEQUFpRDtRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlO0lBQzdCLElBQUksa0JBQWtCO1FBQUUsT0FBTyxrQkFBa0IsQ0FBQztJQUNsRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQ3ZELElBQUksRUFBRTtTQUNOLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM1QyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxtQkFBbUIsQ0FBQztTQUNwRixJQUFJLEVBQUUsQ0FBQztJQUNWLGtCQUFrQixHQUFHLE1BQU07U0FDeEIsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUNwQixNQUFNLENBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNiLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUN2QixZQUFZLEVBQUUsZ0JBQWdCLEVBQUU7UUFDaEMsWUFBWTtLQUNiLENBQUMsQ0FDSDtTQUNBLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBYztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9ELElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFRLEtBQStCLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztJQUMzRCxDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { captureGitSnapshot, assertGitSnapshotUnchanged, type IGitSnapshot, } from './classes.gitstate.js';
|
|
2
|
+
export { ProvenanceStore, PROVENANCE_SIDECAR_SUFFIX, } from './classes.provenancestore.js';
|
|
3
|
+
export { getHostIdentity, isLocalProcessRunning } from './helpers.owneridentity.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { captureGitSnapshot, assertGitSnapshotUnchanged, } from './classes.gitstate.js';
|
|
2
|
+
export { ProvenanceStore, PROVENANCE_SIDECAR_SUFFIX, } from './classes.provenancestore.js';
|
|
3
|
+
export { getHostIdentity, isLocalProcessRunning } from './helpers.owneridentity.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfcHJvdmVuYW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLDBCQUEwQixHQUUzQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxlQUFlLEVBQ2YseUJBQXlCLEdBQzFCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tsrust",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A tool for compiling Rust projects, detecting Cargo workspaces, building with cargo, and placing binaries in a conventional dist_rust directory.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"@push.rocks/smartconfig": "^6.1.1",
|
|
35
35
|
"@push.rocks/smartfile": "^13.1.3",
|
|
36
36
|
"@push.rocks/smartpath": "^6.0.0",
|
|
37
|
-
"@push.rocks/smartshell": "^
|
|
38
|
-
"smol-toml": "^1.
|
|
37
|
+
"@push.rocks/smartshell": "^4.1.1",
|
|
38
|
+
"smol-toml": "^1.7.1"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@git.zone/tsbuild": "^4.4.2",
|
package/readme.hints.md
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# tsrust hints
|
|
2
2
|
|
|
3
3
|
## Architecture
|
|
4
|
-
- Follows tsbuild patterns
|
|
5
|
-
- Uses smartcli for CLI, smartshell for
|
|
6
|
-
-
|
|
4
|
+
- Follows tsbuild patterns for the `cli.js` entry point and TypeScript module layout.
|
|
5
|
+
- Uses smartcli for CLI dispatch, smartshell for Cargo execution, native `child_process.execFile` for Git snapshots, and smol-toml for TOML parsing.
|
|
6
|
+
- `mod_artifact` owns strict multi-host assembly; `mod_provenance` owns byte-preserving, hash-bound sidecars and Git source snapshots.
|
|
7
7
|
|
|
8
8
|
## Key patterns
|
|
9
9
|
- smartshell `.exec()` streams output to terminal (non-silent)
|
|
10
10
|
- smartshell `.execSilent()` captures output without printing
|
|
11
11
|
- Cargo workspace detection: check for `[workspace]` section in Cargo.toml
|
|
12
12
|
- Binary targets: look for `[[bin]]` entries in member crate Cargo.toml files
|
|
13
|
+
- New builds never append provenance to binaries. Keep legacy `ProvenanceStamper` reads for tsrust 1.7/1.8 artifacts, but use `ProvenanceStore` sidecars for all writes.
|
|
14
|
+
- Host target precedence is CLI, exact host, OS family, legacy targets, then native. Assembly uses the union of all configured targets unless repeated CLI `--target` values define an explicit matrix, and rejects dirty or incomplete matrices.
|
|
15
|
+
- Assembly owns only `dist_rust/`, `.nogit/tsrust-assembly*`, and transient `.nogit/.tsrust-assembly-*.tmp` owner records. Its atomically linked owner lock, serialized recovery claim, and phase journal recover readable, owner-consistent transactions; malformed or inconsistent state fails closed.
|