@git.zone/tsrust 1.9.0 → 1.10.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.
Files changed (49) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/index.d.ts +1 -0
  3. package/dist_ts/index.js +2 -1
  4. package/dist_ts/mod_artifact/classes.artifactassembler.d.ts +6 -0
  5. package/dist_ts/mod_artifact/classes.artifactassembler.js +169 -6
  6. package/dist_ts/mod_artifact/index.d.ts +1 -1
  7. package/dist_ts/mod_artifact/index.js +2 -2
  8. package/dist_ts/mod_cargo/classes.cargorunner.js +8 -5
  9. package/dist_ts/mod_cli/classes.tsrustcli.d.ts +1 -0
  10. package/dist_ts/mod_cli/classes.tsrustcli.js +42 -3
  11. package/dist_ts/mod_cli/helpers.codesign.d.ts +2 -0
  12. package/dist_ts/mod_cli/helpers.codesign.js +48 -0
  13. package/dist_ts/mod_cli/helpers.targets.d.ts +2 -0
  14. package/dist_ts/mod_cli/helpers.targets.js +1 -1
  15. package/dist_ts/mod_matrix/classes.matrixcommandrunner.d.ts +25 -0
  16. package/dist_ts/mod_matrix/classes.matrixcommandrunner.js +266 -0
  17. package/dist_ts/mod_matrix/classes.nativematrixbuilder.d.ts +64 -0
  18. package/dist_ts/mod_matrix/classes.nativematrixbuilder.js +1084 -0
  19. package/dist_ts/mod_matrix/helpers.matrixconfig.d.ts +30 -0
  20. package/dist_ts/mod_matrix/helpers.matrixconfig.js +129 -0
  21. package/dist_ts/mod_matrix/index.d.ts +3 -0
  22. package/dist_ts/mod_matrix/index.js +4 -0
  23. package/dist_ts/mod_provenance/classes.gitstate.d.ts +1 -0
  24. package/dist_ts/mod_provenance/classes.gitstate.js +13 -3
  25. package/dist_ts/mod_provenance/classes.provenancestore.d.ts +1 -0
  26. package/dist_ts/mod_provenance/classes.provenancestore.js +5 -1
  27. package/dist_ts/mod_provenance/index.d.ts +1 -1
  28. package/dist_ts/mod_provenance/index.js +2 -2
  29. package/dist_ts/mod_toolchain/classes.toolchainmanager.d.ts +6 -0
  30. package/dist_ts/mod_toolchain/classes.toolchainmanager.js +211 -40
  31. package/package.json +2 -2
  32. package/readme.hints.md +12 -1
  33. package/readme.md +70 -3
  34. package/ts/00_commitinfo_data.ts +1 -1
  35. package/ts/index.ts +1 -0
  36. package/ts/mod_artifact/classes.artifactassembler.ts +201 -5
  37. package/ts/mod_artifact/index.ts +2 -0
  38. package/ts/mod_cargo/classes.cargorunner.ts +9 -4
  39. package/ts/mod_cli/classes.tsrustcli.ts +51 -2
  40. package/ts/mod_cli/helpers.codesign.ts +71 -0
  41. package/ts/mod_cli/helpers.targets.ts +3 -0
  42. package/ts/mod_matrix/classes.matrixcommandrunner.ts +294 -0
  43. package/ts/mod_matrix/classes.nativematrixbuilder.ts +1472 -0
  44. package/ts/mod_matrix/helpers.matrixconfig.ts +222 -0
  45. package/ts/mod_matrix/index.ts +23 -0
  46. package/ts/mod_provenance/classes.gitstate.ts +13 -2
  47. package/ts/mod_provenance/classes.provenancestore.ts +4 -0
  48. package/ts/mod_provenance/index.ts +1 -0
  49. package/ts/mod_toolchain/classes.toolchainmanager.ts +236 -43
@@ -0,0 +1,266 @@
1
+ import * as childProcess from 'node:child_process';
2
+ import * as fs from 'node:fs';
3
+ const defaultCommandTimeoutMs = 60 * 60 * 1000;
4
+ const forceKillDelayMs = 10 * 1000;
5
+ const maximumCapturedOutputBytes = 16 * 1024 * 1024;
6
+ export class MatrixCommandRunner {
7
+ environment;
8
+ constructor(environment = process.env) {
9
+ this.environment = environment;
10
+ }
11
+ async execute(commandArg, argsArg, optionsArg = {}) {
12
+ if ([optionsArg.heartbeatStdin === true, optionsArg.input !== undefined, !!optionsArg.inputFile]
13
+ .filter(Boolean)
14
+ .length > 1) {
15
+ throw new Error('A matrix command can use only one stdin source');
16
+ }
17
+ if (optionsArg.capture && optionsArg.outputFile) {
18
+ throw new Error('A matrix command cannot capture stdout and write it to a file');
19
+ }
20
+ if (optionsArg.outputFile &&
21
+ (!Number.isSafeInteger(optionsArg.maximumOutputBytes) ||
22
+ (optionsArg.maximumOutputBytes || 0) <= 0)) {
23
+ throw new Error('A matrix output file requires a positive byte limit');
24
+ }
25
+ const capture = optionsArg.capture === true;
26
+ let inputFileDescriptor;
27
+ let outputFileDescriptor;
28
+ let child;
29
+ try {
30
+ if (optionsArg.inputFile) {
31
+ inputFileDescriptor = fs.openSync(optionsArg.inputFile, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
32
+ }
33
+ if (optionsArg.outputFile) {
34
+ outputFileDescriptor = fs.openSync(optionsArg.outputFile, fs.constants.O_WRONLY |
35
+ fs.constants.O_CREAT |
36
+ fs.constants.O_EXCL |
37
+ fs.constants.O_NOFOLLOW, 0o600);
38
+ }
39
+ const stdinMode = inputFileDescriptor ??
40
+ (optionsArg.heartbeatStdin || optionsArg.input !== undefined ? 'pipe' : 'ignore');
41
+ const stdoutMode = optionsArg.outputFile ? 'pipe' : capture ? 'pipe' : 'inherit';
42
+ child = childProcess.spawn(commandArg, argsArg, {
43
+ cwd: optionsArg.cwd || process.cwd(),
44
+ env: optionsArg.environment || this.environment,
45
+ stdio: [stdinMode, stdoutMode, capture ? 'pipe' : 'inherit'],
46
+ detached: true,
47
+ });
48
+ }
49
+ catch (error) {
50
+ if (inputFileDescriptor !== undefined)
51
+ fs.closeSync(inputFileDescriptor);
52
+ if (outputFileDescriptor !== undefined)
53
+ fs.closeSync(outputFileDescriptor);
54
+ throw error;
55
+ }
56
+ if (inputFileDescriptor !== undefined)
57
+ fs.closeSync(inputFileDescriptor);
58
+ let stdout = '';
59
+ let stderr = '';
60
+ let capturedOutputBytes = 0;
61
+ let timedOut = false;
62
+ let outputLimitExceeded = false;
63
+ let outputFileBytes = 0;
64
+ let outputFileError;
65
+ let forwardedSignal;
66
+ let forwardedSignalCount = 0;
67
+ let spawnError;
68
+ let stdinError;
69
+ let forceKillTimer;
70
+ let heartbeatTimer;
71
+ const killProcessGroup = (signalArg) => {
72
+ if (!child.pid)
73
+ return;
74
+ try {
75
+ process.kill(-child.pid, signalArg);
76
+ }
77
+ catch {
78
+ try {
79
+ child.kill(signalArg);
80
+ }
81
+ catch {
82
+ // The process may already have exited.
83
+ }
84
+ }
85
+ };
86
+ const terminateProcessGroup = (signalArg) => {
87
+ killProcessGroup(signalArg);
88
+ if (!forceKillTimer) {
89
+ forceKillTimer = setTimeout(() => killProcessGroup('SIGKILL'), forceKillDelayMs);
90
+ }
91
+ };
92
+ const processGroupExists = () => {
93
+ if (!child.pid)
94
+ return false;
95
+ try {
96
+ process.kill(-child.pid, 0);
97
+ return true;
98
+ }
99
+ catch (error) {
100
+ if (error.code === 'ESRCH')
101
+ return false;
102
+ throw error;
103
+ }
104
+ };
105
+ const waitForProcessGroupExit = async (timeoutMsArg) => {
106
+ const deadline = Date.now() + timeoutMsArg;
107
+ while (processGroupExists() && Date.now() < deadline) {
108
+ await new Promise((resolve) => setTimeout(resolve, 100));
109
+ }
110
+ return !processGroupExists();
111
+ };
112
+ const ensureProcessGroupStopped = async () => {
113
+ if (!processGroupExists())
114
+ return;
115
+ terminateProcessGroup('SIGTERM');
116
+ if (!(await waitForProcessGroupExit(forceKillDelayMs + 1000))) {
117
+ killProcessGroup('SIGKILL');
118
+ if (!(await waitForProcessGroupExit(2000))) {
119
+ throw new Error(`${commandArg} left a live descendant process group`);
120
+ }
121
+ }
122
+ };
123
+ const signalHandlers = new Map();
124
+ for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
125
+ const handler = () => {
126
+ forwardedSignal = signal;
127
+ forwardedSignalCount += 1;
128
+ if (forwardedSignalCount === 1)
129
+ terminateProcessGroup(signal);
130
+ else
131
+ killProcessGroup('SIGKILL');
132
+ };
133
+ signalHandlers.set(signal, handler);
134
+ process.on(signal, handler);
135
+ }
136
+ const timeout = setTimeout(() => {
137
+ timedOut = true;
138
+ terminateProcessGroup('SIGTERM');
139
+ }, optionsArg.timeoutMs || defaultCommandTimeoutMs);
140
+ if (optionsArg.heartbeatStdin) {
141
+ child.stdin?.on('error', () => {
142
+ // Process close handles a lost heartbeat channel.
143
+ });
144
+ const sendHeartbeat = () => {
145
+ if (!child.stdin?.destroyed)
146
+ child.stdin?.write('heartbeat\n');
147
+ };
148
+ sendHeartbeat();
149
+ heartbeatTimer = setInterval(sendHeartbeat, 1000);
150
+ }
151
+ else if (optionsArg.input !== undefined) {
152
+ child.stdin?.on('error', (errorArg) => {
153
+ stdinError = errorArg;
154
+ terminateProcessGroup('SIGTERM');
155
+ });
156
+ child.stdin?.end(optionsArg.input);
157
+ }
158
+ const captureChunk = (targetArg, chunkArg) => {
159
+ capturedOutputBytes += chunkArg.length;
160
+ if (capturedOutputBytes > maximumCapturedOutputBytes) {
161
+ outputLimitExceeded = true;
162
+ terminateProcessGroup('SIGTERM');
163
+ return;
164
+ }
165
+ if (targetArg === 'stdout')
166
+ stdout += chunkArg.toString('utf8');
167
+ else
168
+ stderr += chunkArg.toString('utf8');
169
+ };
170
+ if (optionsArg.outputFile) {
171
+ child.stdout?.on('data', (chunkArg) => {
172
+ if (outputLimitExceeded || outputFileError || outputFileDescriptor === undefined)
173
+ return;
174
+ if (outputFileBytes + chunkArg.length > (optionsArg.maximumOutputBytes || 0)) {
175
+ outputLimitExceeded = true;
176
+ terminateProcessGroup('SIGTERM');
177
+ return;
178
+ }
179
+ try {
180
+ let offset = 0;
181
+ while (offset < chunkArg.length) {
182
+ offset += fs.writeSync(outputFileDescriptor, chunkArg, offset, chunkArg.length - offset);
183
+ }
184
+ outputFileBytes += chunkArg.length;
185
+ }
186
+ catch (error) {
187
+ outputFileError = error;
188
+ terminateProcessGroup('SIGTERM');
189
+ }
190
+ });
191
+ }
192
+ else {
193
+ child.stdout?.on('data', (chunkArg) => captureChunk('stdout', chunkArg));
194
+ }
195
+ child.stderr?.on('data', (chunkArg) => captureChunk('stderr', chunkArg));
196
+ child.once('error', (errorArg) => {
197
+ spawnError = errorArg;
198
+ });
199
+ return new Promise((resolve, reject) => {
200
+ child.once('close', (codeArg, signalArg) => {
201
+ void (async () => {
202
+ try {
203
+ if (outputFileDescriptor !== undefined) {
204
+ try {
205
+ fs.fsyncSync(outputFileDescriptor);
206
+ fs.closeSync(outputFileDescriptor);
207
+ outputFileDescriptor = undefined;
208
+ }
209
+ catch (error) {
210
+ outputFileError = error;
211
+ }
212
+ }
213
+ await ensureProcessGroupStopped();
214
+ const exitCode = codeArg ?? -1;
215
+ if (timedOut) {
216
+ throw new Error(`${commandArg} exceeded its command timeout`);
217
+ }
218
+ if (outputLimitExceeded) {
219
+ throw new Error(`${commandArg} exceeded the captured output limit`);
220
+ }
221
+ if (forwardedSignal) {
222
+ throw new Error(`${commandArg} was interrupted by ${forwardedSignal}`);
223
+ }
224
+ if (spawnError)
225
+ throw spawnError;
226
+ if (stdinError)
227
+ throw stdinError;
228
+ if (outputFileError)
229
+ throw outputFileError;
230
+ if (!(optionsArg.allowedExitCodes || [0]).includes(exitCode)) {
231
+ if (capture && stdout)
232
+ process.stdout.write(stdout);
233
+ if (capture && stderr)
234
+ process.stderr.write(stderr);
235
+ throw new Error(`${commandArg} exited with ${signalArg ? `signal ${signalArg}` : `status ${exitCode}`}`);
236
+ }
237
+ resolve({ stdout, stderr, exitCode });
238
+ }
239
+ catch (error) {
240
+ reject(error);
241
+ }
242
+ finally {
243
+ clearTimeout(timeout);
244
+ if (forceKillTimer)
245
+ clearTimeout(forceKillTimer);
246
+ if (heartbeatTimer)
247
+ clearInterval(heartbeatTimer);
248
+ child.stdin?.end();
249
+ if (outputFileDescriptor !== undefined) {
250
+ try {
251
+ fs.closeSync(outputFileDescriptor);
252
+ }
253
+ catch {
254
+ // Preserve the command's primary error.
255
+ }
256
+ }
257
+ for (const [signal, handler] of signalHandlers) {
258
+ process.off(signal, handler);
259
+ }
260
+ }
261
+ })();
262
+ });
263
+ });
264
+ }
265
+ }
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYXRyaXhjb21tYW5kcnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX21hdHJpeC9jbGFzc2VzLm1hdHJpeGNvbW1hbmRydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQTZCOUIsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDbkMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUdwRCxNQUFNLE9BQU8sbUJBQW1CO0lBQ1Y7SUFBcEIsWUFBb0IsY0FBaUMsT0FBTyxDQUFDLEdBQUc7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQztJQUU3RCxLQUFLLENBQUMsT0FBTyxDQUNsQixVQUFrQixFQUNsQixPQUFpQixFQUNqQixhQUFvQyxFQUFFO1FBRXRDLElBQ0UsQ0FBQyxVQUFVLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRSxVQUFVLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQzthQUN6RixNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsTUFBTSxHQUFHLENBQUMsRUFDYixDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFDRSxVQUFVLENBQUMsVUFBVTtZQUNyQixDQUFD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
@@ -0,0 +1,64 @@
1
+ import { type IArtifactAssemblyResult } from '../mod_artifact/index.js';
2
+ import { type ITsrustConfig } from '../mod_cli/helpers.targets.js';
3
+ import { type IMatrixCommandRunner } from './classes.matrixcommandrunner.js';
4
+ import { type TMatrixHost } from './helpers.matrixconfig.js';
5
+ export interface INativeMatrixBuilderOptions {
6
+ workspace: string;
7
+ config: ITsrustConfig;
8
+ environment?: NodeJS.ProcessEnv;
9
+ commandRunner?: IMatrixCommandRunner;
10
+ }
11
+ export interface INativeMatrixCheckResult {
12
+ workers: TMatrixHost[];
13
+ targets: string[];
14
+ }
15
+ export interface INativeMatrixBuildResult extends INativeMatrixCheckResult {
16
+ gitCommit: string;
17
+ assembly: IArtifactAssemblyResult;
18
+ }
19
+ export declare class NativeMatrixBuilder {
20
+ private readonly workspace;
21
+ private readonly environment;
22
+ private readonly commandRunner;
23
+ private readonly plan;
24
+ constructor(optionsArg: INativeMatrixBuilderOptions);
25
+ check(): Promise<INativeMatrixCheckResult>;
26
+ build(): Promise<INativeMatrixBuildResult>;
27
+ private checkResult;
28
+ private assertForwardEnvironmentGrant;
29
+ private workerEnvironment;
30
+ private transportEnvironment;
31
+ private remainingBuildTimeout;
32
+ private assertInstalledTsrustVersion;
33
+ private assertPlanMatchesCommit;
34
+ private remoteWorkerEnvironmentFunction;
35
+ private assertBundleCompatibleSource;
36
+ private checkLocalWorker;
37
+ private checkLocalToolchain;
38
+ private checkLocalExecution;
39
+ private checkLocalLinuxCrossExecution;
40
+ private resolveSshWorker;
41
+ private checkSshWorker;
42
+ private remoteToolchainCapabilityCommand;
43
+ private remoteRootValidationCommands;
44
+ private remoteOwnershipValidationCommands;
45
+ private remoteExecutionProbeCommands;
46
+ private readBinaryTargets;
47
+ private detectRustDirectory;
48
+ private readProjectIdentity;
49
+ private assertProjectIdentityUnchanged;
50
+ private ensureLocalRunParent;
51
+ private buildLocalWorker;
52
+ private workerTsrustArgs;
53
+ private assertWorkerSource;
54
+ private assertArtifactDirectory;
55
+ private smokeLocalArtifacts;
56
+ private describeRemoteWorkspace;
57
+ private createRemoteWorkspace;
58
+ private buildSshWorker;
59
+ private remoteSmokeCommands;
60
+ private cleanupRemoteWorkspace;
61
+ private runRemoteTransferScript;
62
+ private runRemoteLoginScript;
63
+ private runRemoteOwnedScript;
64
+ }