build-raptor 0.131.0 → 0.133.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 (214) hide show
  1. package/dist/deps/brand/brand.d.ts +5 -0
  2. package/dist/deps/brand/brand.js +3 -0
  3. package/dist/deps/brand/index.d.ts +1 -0
  4. package/dist/deps/brand/index.js +18 -0
  5. package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
  6. package/dist/deps/build-failed-error/build-failed-error.js +13 -0
  7. package/dist/deps/build-failed-error/index.d.ts +1 -0
  8. package/dist/deps/build-failed-error/index.js +18 -0
  9. package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
  10. package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
  11. package/dist/deps/build-raptor-api/index.d.ts +2 -0
  12. package/dist/deps/build-raptor-api/index.js +19 -0
  13. package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
  14. package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
  15. package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
  16. package/dist/deps/build-raptor-core/breakdown.js +99 -0
  17. package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
  18. package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
  19. package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
  20. package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
  21. package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
  22. package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
  23. package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
  24. package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
  25. package/dist/deps/build-raptor-core/engine.d.ts +66 -0
  26. package/dist/deps/build-raptor-core/engine.js +285 -0
  27. package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
  28. package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
  29. package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
  30. package/dist/deps/build-raptor-core/execution-plan.js +66 -0
  31. package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
  32. package/dist/deps/build-raptor-core/execution-record.js +3 -0
  33. package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
  34. package/dist/deps/build-raptor-core/execution-type.js +3 -0
  35. package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
  36. package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
  37. package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
  38. package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
  39. package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
  40. package/dist/deps/build-raptor-core/fingerprint.js +13 -0
  41. package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
  42. package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
  43. package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
  44. package/dist/deps/build-raptor-core/hasher.js +93 -0
  45. package/dist/deps/build-raptor-core/index.d.ts +9 -0
  46. package/dist/deps/build-raptor-core/index.js +26 -0
  47. package/dist/deps/build-raptor-core/model.d.ts +17 -0
  48. package/dist/deps/build-raptor-core/model.js +40 -0
  49. package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
  50. package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
  51. package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
  52. package/dist/deps/build-raptor-core/performance-report.js +3 -0
  53. package/dist/deps/build-raptor-core/phase.d.ts +1 -0
  54. package/dist/deps/build-raptor-core/phase.js +3 -0
  55. package/dist/deps/build-raptor-core/planner.d.ts +12 -0
  56. package/dist/deps/build-raptor-core/planner.js +43 -0
  57. package/dist/deps/build-raptor-core/purger.d.ts +11 -0
  58. package/dist/deps/build-raptor-core/purger.js +65 -0
  59. package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
  60. package/dist/deps/build-raptor-core/slot-index.js +17 -0
  61. package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
  62. package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
  63. package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
  64. package/dist/deps/build-raptor-core/tar-stream.js +194 -0
  65. package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
  66. package/dist/deps/build-raptor-core/task-executor.js +321 -0
  67. package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
  68. package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
  69. package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
  70. package/dist/deps/build-raptor-core/task-store-event.js +3 -0
  71. package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
  72. package/dist/deps/build-raptor-core/task-store.js +302 -0
  73. package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
  74. package/dist/deps/build-raptor-core/task-summary.js +3 -0
  75. package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
  76. package/dist/deps/build-raptor-core/task-tracker.js +97 -0
  77. package/dist/deps/build-raptor-core/task.d.ts +30 -0
  78. package/dist/deps/build-raptor-core/task.js +90 -0
  79. package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
  80. package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
  81. package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
  82. package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
  83. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
  84. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
  85. package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
  86. package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
  87. package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
  88. package/dist/deps/build-raptor-core-testkit/index.js +20 -0
  89. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
  90. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
  91. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
  92. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
  93. package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
  94. package/dist/deps/build-run-id/build-run-id.js +13 -0
  95. package/dist/deps/build-run-id/index.d.ts +1 -0
  96. package/dist/deps/build-run-id/index.js +18 -0
  97. package/dist/deps/core-types/core-types.d.ts +29 -0
  98. package/dist/deps/core-types/core-types.js +81 -0
  99. package/dist/deps/core-types/index.d.ts +1 -0
  100. package/dist/deps/core-types/index.js +18 -0
  101. package/dist/deps/logger/index.d.ts +1 -0
  102. package/dist/deps/logger/index.js +18 -0
  103. package/dist/deps/logger/logger.d.ts +26 -0
  104. package/dist/deps/logger/logger.js +152 -0
  105. package/dist/deps/misc/arrays.d.ts +7 -0
  106. package/dist/deps/misc/arrays.js +67 -0
  107. package/dist/deps/misc/camelize-record.d.ts +6 -0
  108. package/dist/deps/misc/camelize-record.js +16 -0
  109. package/dist/deps/misc/clean-directory.d.ts +4 -0
  110. package/dist/deps/misc/clean-directory.js +80 -0
  111. package/dist/deps/misc/constructs.d.ts +106 -0
  112. package/dist/deps/misc/constructs.js +131 -0
  113. package/dist/deps/misc/directory-scanner.d.ts +49 -0
  114. package/dist/deps/misc/directory-scanner.js +165 -0
  115. package/dist/deps/misc/executor.d.ts +39 -0
  116. package/dist/deps/misc/executor.js +59 -0
  117. package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
  118. package/dist/deps/misc/file-system-storage-client.js +93 -0
  119. package/dist/deps/misc/folderify.d.ts +8 -0
  120. package/dist/deps/misc/folderify.js +86 -0
  121. package/dist/deps/misc/graph.d.ts +29 -0
  122. package/dist/deps/misc/graph.js +200 -0
  123. package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
  124. package/dist/deps/misc/in-memory-storage-client.js +75 -0
  125. package/dist/deps/misc/index.d.ts +20 -0
  126. package/dist/deps/misc/index.js +37 -0
  127. package/dist/deps/misc/int.d.ts +10 -0
  128. package/dist/deps/misc/int.js +29 -0
  129. package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
  130. package/dist/deps/misc/internal/graph-executor.js +93 -0
  131. package/dist/deps/misc/maps.d.ts +29 -0
  132. package/dist/deps/misc/maps.js +47 -0
  133. package/dist/deps/misc/misc.d.ts +23 -0
  134. package/dist/deps/misc/misc.js +94 -0
  135. package/dist/deps/misc/object-map.d.ts +10 -0
  136. package/dist/deps/misc/object-map.js +26 -0
  137. package/dist/deps/misc/promises.d.ts +39 -0
  138. package/dist/deps/misc/promises.js +78 -0
  139. package/dist/deps/misc/records.d.ts +11 -0
  140. package/dist/deps/misc/records.js +40 -0
  141. package/dist/deps/misc/slurp-dir.d.ts +1 -0
  142. package/dist/deps/misc/slurp-dir.js +14 -0
  143. package/dist/deps/misc/storage-client.d.ts +12 -0
  144. package/dist/deps/misc/storage-client.js +3 -0
  145. package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
  146. package/dist/deps/misc/stream-to-buffer.js +26 -0
  147. package/dist/deps/misc/strings.d.ts +12 -0
  148. package/dist/deps/misc/strings.js +68 -0
  149. package/dist/deps/misc/typed-publisher.d.ts +17 -0
  150. package/dist/deps/misc/typed-publisher.js +65 -0
  151. package/dist/deps/repo-protocol/index.d.ts +3 -0
  152. package/dist/deps/repo-protocol/index.js +20 -0
  153. package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
  154. package/dist/deps/repo-protocol/repo-protocol.js +3 -0
  155. package/dist/deps/repo-protocol/task-info.d.ts +18 -0
  156. package/dist/deps/repo-protocol/task-info.js +3 -0
  157. package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
  158. package/dist/deps/repo-protocol/test-run-summary.js +32 -0
  159. package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
  160. package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
  161. package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
  162. package/dist/deps/repo-protocol-toolbox/index.js +20 -0
  163. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
  164. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
  165. package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
  166. package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
  167. package/dist/deps/reporter-output/index.d.ts +1 -0
  168. package/dist/deps/reporter-output/index.js +18 -0
  169. package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
  170. package/dist/deps/reporter-output/reporter-output.js +25 -0
  171. package/dist/deps/s3-storage-client/creds.d.ts +4 -0
  172. package/dist/deps/s3-storage-client/creds.js +3 -0
  173. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
  174. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
  175. package/dist/deps/s3-storage-client/index.d.ts +2 -0
  176. package/dist/deps/s3-storage-client/index.js +19 -0
  177. package/dist/deps/s3-storage-client/main.d.ts +1 -0
  178. package/dist/deps/s3-storage-client/main.js +20 -0
  179. package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
  180. package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
  181. package/dist/deps/task-name/index.d.ts +1 -0
  182. package/dist/deps/task-name/index.js +18 -0
  183. package/dist/deps/task-name/task-name.d.ts +17 -0
  184. package/dist/deps/task-name/task-name.js +44 -0
  185. package/dist/deps/unit-metadata/index.d.ts +1 -0
  186. package/dist/deps/unit-metadata/index.js +18 -0
  187. package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
  188. package/dist/deps/unit-metadata/unit-metadata.js +32 -0
  189. package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
  190. package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
  191. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
  192. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
  193. package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
  194. package/dist/deps/yarn-repo-protocol/index.js +19 -0
  195. package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
  196. package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
  197. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
  198. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
  199. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
  200. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
  201. package/dist/src/build-raptor-cli.d.ts +60 -0
  202. package/dist/src/build-raptor-cli.js +514 -0
  203. package/dist/src/index.d.ts +1 -0
  204. package/dist/src/index.js +20 -0
  205. package/dist/src/main.d.ts +2 -0
  206. package/dist/src/main.js +23 -0
  207. package/dist/src/register-asset-request.d.ts +18 -0
  208. package/dist/src/register-asset-request.js +11 -0
  209. package/dist/src/task-execution-visualizer.d.ts +17 -0
  210. package/dist/src/task-execution-visualizer.js +116 -0
  211. package/package.json +17 -14
  212. package/build-raptor.js +0 -7259
  213. package/index.d.ts +0 -22
  214. package/index.js +0 -7231
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TaskStore = exports.BlobId = void 0;
37
+ const build_failed_error_1 = require("build-failed-error");
38
+ const core_types_1 = require("core-types");
39
+ const fs = __importStar(require("fs"));
40
+ const fs_1 = require("fs");
41
+ const fse = __importStar(require("fs-extra"));
42
+ const misc_1 = require("misc");
43
+ const path = __importStar(require("path"));
44
+ const stream = __importStar(require("stream"));
45
+ const Tmp = __importStar(require("tmp-promise"));
46
+ const util = __importStar(require("util"));
47
+ const zlib = __importStar(require("zlib"));
48
+ const zod_1 = require("zod");
49
+ const tar_stream_1 = require("./tar-stream");
50
+ const pipeline = util.promisify(stream.pipeline);
51
+ const unzip = util.promisify(zlib.unzip);
52
+ const Metadata = zod_1.z.object({
53
+ /**
54
+ * An array of output locations (paths in repo)
55
+ */
56
+ outputs: zod_1.z.string().array(),
57
+ /**
58
+ * A record that maps output locations (path in repo) to content hashes. Include output location that were defined in
59
+ * the TaskInfo with isPublic: true. This allows downloading the content from a content-addressable storage.
60
+ */
61
+ publicFiles: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).default({}),
62
+ });
63
+ function validate(input) {
64
+ if (input.length === 0) {
65
+ throw new Error(`Bad BlobId: <${input}>`);
66
+ }
67
+ }
68
+ const BlobId = (s) => {
69
+ validate(s);
70
+ return s;
71
+ };
72
+ exports.BlobId = BlobId;
73
+ class TaskStore {
74
+ constructor(repoRootDir, client, logger, publisher, trace) {
75
+ this.repoRootDir = repoRootDir;
76
+ this.client = client;
77
+ this.logger = logger;
78
+ this.publisher = publisher;
79
+ this.trace = trace;
80
+ this.logger.info(`TaskStore created`);
81
+ }
82
+ async putBlob(content, hint) {
83
+ const ret = blobIdOf(content);
84
+ if (content.length === 0) {
85
+ return ret;
86
+ }
87
+ const key = { type: 'blob', blobId: ret };
88
+ if (await this.client.objectExists(key)) {
89
+ return ret;
90
+ }
91
+ this.trace?.push(`putting object: ${JSON.stringify(ret)} (hint: ${hint})=> ${content.length}`);
92
+ await this.client.putObject(key, content);
93
+ this.logger.info(`>>> uploaded ${hint}`);
94
+ return ret;
95
+ }
96
+ async getBlob(blobId) {
97
+ const nothing = emptyBuffer();
98
+ if (blobId === blobIdOf(nothing)) {
99
+ return nothing;
100
+ }
101
+ return await this.client.getObject({ type: 'blob', blobId }, 'buffer');
102
+ }
103
+ async getIfExists(k) {
104
+ const exists = await this.client.objectExists(k);
105
+ if (!exists) {
106
+ return undefined;
107
+ }
108
+ return await this.client.getObject(k, 'string');
109
+ }
110
+ async putVerdict(taskName, fingerprint, verdict, blobId) {
111
+ const key = { type: 'verdict', taskName, fingerprint, verdict, version: 2 };
112
+ // we put the key in the content for debugging purposes: it allows humans to understand what this object is
113
+ // about when inspecting underlying storage (the key underwhich the object is stored key is likely to be hashed so
114
+ // it is totally unreadable).
115
+ await this.client.putObject(key, JSON.stringify({ key, blobId }));
116
+ }
117
+ async getVerdict(taskName, fingerprint) {
118
+ const baseKey = { type: 'verdict', taskName, fingerprint, version: 2 };
119
+ const [ok, fail] = await Promise.all([
120
+ this.getIfExists({ ...baseKey, verdict: 'OK' }),
121
+ this.getIfExists({ ...baseKey, verdict: 'FAIL' }),
122
+ ]);
123
+ const getBlobId = (content) => {
124
+ const parsed = JSON.parse(content);
125
+ // TODO(imaman): use zod to validate parsed
126
+ return (0, exports.BlobId)(parsed.blobId);
127
+ };
128
+ if (ok && fail) {
129
+ return ['FLAKY', getBlobId(ok)];
130
+ }
131
+ if (ok) {
132
+ return ['OK', getBlobId(ok)];
133
+ }
134
+ if (fail) {
135
+ return ['FAIL', getBlobId(fail)];
136
+ }
137
+ return ['UNKNOWN', blobIdOf(emptyBuffer())];
138
+ }
139
+ async bundle(outputs) {
140
+ if (!outputs.length) {
141
+ return { buffer: emptyBuffer(), publicFiles: {} };
142
+ }
143
+ this.trace?.push(`bundling ${JSON.stringify(outputs)}`);
144
+ const pairs = await (0, misc_1.promises)(outputs.filter(o => o.isPublic))
145
+ .map(async (o) => {
146
+ const resolved = this.repoRootDir.resolve(o.pathInRepo);
147
+ const stat = fs.statSync(resolved);
148
+ if (!stat.isFile()) {
149
+ throw new build_failed_error_1.BuildFailedError(`cannot publish an output location that is not a file: "${o.pathInRepo.val}"`);
150
+ }
151
+ const content = fs.readFileSync(resolved);
152
+ const h = await this.client.putContentAddressable(content);
153
+ return [o.pathInRepo.val, h];
154
+ })
155
+ .reify(STORAGE_CONCURRENCY);
156
+ const m = { outputs: outputs.map(o => o.pathInRepo.val), publicFiles: Object.fromEntries(pairs) };
157
+ const metadataBuf = Buffer.from(JSON.stringify(Metadata.parse(m)), 'utf-8');
158
+ if (metadataBuf.length > 100000) {
159
+ // Just for sanity.
160
+ throw new Error('metadata is too big');
161
+ }
162
+ const lenBuf = Buffer.alloc(LEN_BUF_SIZE);
163
+ lenBuf.writeInt32BE(metadataBuf.length);
164
+ const tempFile = await Tmp.file();
165
+ const pack = tar_stream_1.TarStream.pack();
166
+ const scanner = new misc_1.DirectoryScanner(this.repoRootDir.resolve());
167
+ for (const curr of outputs.filter(o => !o.isPublic)) {
168
+ const o = curr.pathInRepo;
169
+ const exists = await fse.pathExists(this.repoRootDir.resolve(o));
170
+ if (!exists) {
171
+ // TODO(imaman): turn this into a user-build-error? move it out of this file?
172
+ throw new Error(`Output location <${o}> does not exist (under <${this.repoRootDir}>)`);
173
+ }
174
+ await scanner.scanTree(o.val, (p, content, stat) => {
175
+ if (stat.isDirectory()) {
176
+ return;
177
+ }
178
+ if (!stat.isSymbolicLink() && !stat.isFile()) {
179
+ throw new Error(`Cannot handle non-files in output: ${p} (under ${this.repoRootDir})`);
180
+ }
181
+ const resolved = this.repoRootDir.resolve((0, core_types_1.PathInRepo)(p));
182
+ // the return value of fs.stat() and friends has counterintuitive behavior: .mtimeMs will undeterministically
183
+ // include fractions of ms (e.g., 1690808418692.3323). Thus we're sticking with .mtime.getTime(). Similarly for
184
+ // atime, ctime.
185
+ const { mtime, atime, ctime } = fs.statSync(resolved);
186
+ this.trace?.push(`adding an entry: ${stat.mode.toString(8)} ${p} ${mtime.toISOString()}`);
187
+ if (stat.isSymbolicLink()) {
188
+ const linkTarget = content.toString('utf-8');
189
+ const resolved = path.isAbsolute(linkTarget) ? linkTarget : path.join(path.dirname(p), linkTarget);
190
+ const normalized = path.normalize(resolved);
191
+ pack.symlink({ from: p, mtime, to: normalized });
192
+ }
193
+ else {
194
+ pack.entry({ path: p, mode: stat.mode, mtime, ctime, atime }, content);
195
+ }
196
+ });
197
+ }
198
+ const b = pack.toBuffer();
199
+ this.trace?.push(`digest of b is ${(0, misc_1.computeObjectHash)({ data: b.toString('hex') })}`);
200
+ const source = stream.Readable.from(b);
201
+ const gzip = zlib.createGzip();
202
+ const destination = (0, fs_1.createWriteStream)(tempFile.path);
203
+ await pipeline(source, gzip, destination);
204
+ const gzipped = await fse.readFile(tempFile.path);
205
+ this.trace?.push(`gzipped is ${gzipped.length} long`);
206
+ const ret = Buffer.concat([lenBuf, metadataBuf, gzipped]);
207
+ this.trace?.push(`bundling digest of ret is ${(0, misc_1.computeObjectHash)({ data: ret.toString('hex') })}`);
208
+ return { buffer: ret, publicFiles: m.publicFiles };
209
+ }
210
+ async unbundle(buf) {
211
+ if (buf.length === 0) {
212
+ return { files: [], publicFiles: {} };
213
+ }
214
+ const metadataLen = buf.slice(0, LEN_BUF_SIZE).readInt32BE();
215
+ const unparsed = JSON.parse(buf.slice(LEN_BUF_SIZE, LEN_BUF_SIZE + metadataLen).toString('utf-8'));
216
+ const metadata = Metadata.parse(unparsed);
217
+ const outputs = metadata.outputs.map(at => (0, core_types_1.PathInRepo)(at));
218
+ const removeOutputDir = async (o) => await fse.rm(this.repoRootDir.resolve(o), { recursive: true, force: true });
219
+ await (0, misc_1.promises)(outputs)
220
+ .map(async (o) => await removeOutputDir(o))
221
+ .reify(20);
222
+ const source = buf.slice(LEN_BUF_SIZE + metadataLen);
223
+ const unzipped = await unzip(source);
224
+ try {
225
+ await tar_stream_1.TarStream.extract(unzipped, this.repoRootDir.resolve(), this.logger);
226
+ }
227
+ catch (e) {
228
+ throw new Error(`unbundling a buffer (${buf.length} bytes) has failed: ${e}`);
229
+ }
230
+ await (0, misc_1.promises)(Object.keys(metadata.publicFiles)).forEach(STORAGE_CONCURRENCY, async (pir) => {
231
+ const pathInRepo = (0, core_types_1.PathInRepo)(pir);
232
+ const resolved = this.repoRootDir.resolve(pathInRepo);
233
+ const hash = metadata.publicFiles[pathInRepo.val];
234
+ if (!hash) {
235
+ throw new Error(`hash not found for "${pathInRepo}"`);
236
+ }
237
+ const buf = await this.client.getContentAddressable(hash);
238
+ fs.writeFileSync(resolved, buf);
239
+ });
240
+ return { files: outputs, publicFiles: metadata.publicFiles };
241
+ }
242
+ /**
243
+ * Use only from tests
244
+ */
245
+ async recordTaskForTesting(taskName, fingerprint, outputs, verdict) {
246
+ await this.recordTask(taskName, fingerprint, outputs.map(o => ({ pathInRepo: o, isPublic: false })), verdict);
247
+ }
248
+ async recordTask(taskName, fingerprint, outputs, verdict) {
249
+ const { blobId, publicFiles } = await this.recordBlob(taskName, outputs);
250
+ this.logger.info(`task=${taskName}, outputs=${JSON.stringify(outputs)}, publicFiles=${JSON.stringify(publicFiles)}`);
251
+ this.putVerdict(taskName, fingerprint, verdict, blobId);
252
+ await Promise.all([
253
+ this.publisher?.publish('taskStore', {
254
+ opcode: 'RECORDED',
255
+ taskName,
256
+ blobId,
257
+ fingerprint,
258
+ files: [...outputs.map(o => o.pathInRepo.val)],
259
+ }),
260
+ this.publisher?.publish('publicFiles', { taskName, publicFiles }),
261
+ ]);
262
+ }
263
+ async recordBlob(taskName, outputs) {
264
+ const { buffer, publicFiles } = await this.bundle(outputs);
265
+ const blobId = await this.putBlob(buffer, taskName);
266
+ return { blobId, publicFiles };
267
+ }
268
+ async restoreTask(taskName, fingerprint) {
269
+ const [verdict, blobId] = await this.getVerdict(taskName, fingerprint);
270
+ const { files, publicFiles } = await this.restoreBlob(blobId);
271
+ await Promise.all([
272
+ this.publisher?.publish('taskStore', {
273
+ opcode: 'RESTORED',
274
+ taskName,
275
+ blobId,
276
+ fingerprint,
277
+ files: files.map(o => o.val),
278
+ }),
279
+ this.publisher?.publish('publicFiles', { taskName, publicFiles }),
280
+ ]);
281
+ return verdict;
282
+ }
283
+ async restoreBlob(blobId) {
284
+ const buf = await this.getBlob(blobId);
285
+ const ret = await this.unbundle(buf);
286
+ return ret;
287
+ }
288
+ async checkVerdict(taskName, fingerprint) {
289
+ const [verdict] = await this.getVerdict(taskName, fingerprint);
290
+ return verdict;
291
+ }
292
+ }
293
+ exports.TaskStore = TaskStore;
294
+ function emptyBuffer() {
295
+ return Buffer.from('');
296
+ }
297
+ function blobIdOf(buf) {
298
+ return (0, exports.BlobId)((0, misc_1.computeHash)(buf));
299
+ }
300
+ const LEN_BUF_SIZE = 8;
301
+ const STORAGE_CONCURRENCY = 100;
302
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDJEQUFxRDtBQUNyRCwyQ0FBaUQ7QUFDakQsdUNBQXdCO0FBQ3hCLDJCQUFzQztBQUN0Qyw4Q0FBK0I7QUFFL0IsK0JBQXFIO0FBQ3JILDJDQUE0QjtBQUM1QiwrQ0FBZ0M7QUFFaEMsaURBQWtDO0FBQ2xDLDJDQUE0QjtBQUM1QiwyQ0FBNEI7QUFDNUIsNkJBQXVCO0FBR3ZCLDZDQUF3QztBQUt4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV4QyxNQUFNLFFBQVEsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hCOztPQUVHO0lBQ0gsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUU7SUFDM0I7OztPQUdHO0lBQ0gsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Q0FDMUQsQ0FBQyxDQUFBO0FBS0YsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxHQUFHLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0FBQ0gsQ0FBQztBQUVNLE1BQU0sTUFBTSxHQUEwQixDQUFDLENBQVMsRUFBRSxFQUFFO0lBQ3pELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNYLE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBSFksUUFBQSxNQUFNLFVBR2xCO0FBRUQsTUFBYSxTQUFTO0lBQ3BCLFlBQ1csV0FBcUIsRUFDYixNQUFxQixFQUNyQixNQUFjLEVBQ2QsU0FBMEMsRUFDMUMsS0FBZ0I7UUFKeEIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFDYixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFpQztRQUMxQyxVQUFLLEdBQUwsS0FBSyxDQUFXO1FBRWpDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBZSxFQUFFLElBQVk7UUFDakQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFBO1FBQ3pDLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUM5RixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN4QyxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDN0IsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxPQUFPLENBQUE7UUFDaEIsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBTTtRQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUN0QixRQUFrQixFQUNsQixXQUF3QixFQUN4QixPQUFzQixFQUN0QixNQUFjO1FBRWQsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQTtRQUMzRSwyR0FBMkc7UUFDM0csa0hBQWtIO1FBQ2xILDZCQUE2QjtRQUM3QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FDdEIsUUFBa0IsRUFDbEIsV0FBd0I7UUFFeEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO1FBQ3RFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUNsRCxDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbEMsMkNBQTJDO1lBQzNDLE9BQU8sSUFBQSxjQUFNLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQTtRQUVELElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNqQyxDQUFDO1FBRUQsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUVELElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2xDLENBQUM7UUFFRCxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBMkI7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQTtRQUNuRCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUV2RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDMUQsR0FBRyxDQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsRUFBRTtZQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUN2RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLHFDQUFnQixDQUFDLDBEQUEwRCxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7WUFDM0csQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzFELE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQVUsQ0FBQTtRQUN2QyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUU3QixNQUFNLENBQUMsR0FBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFBO1FBQzNHLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0UsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLG1CQUFtQjtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDeEMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDekMsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFakMsTUFBTSxJQUFJLEdBQUcsc0JBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLHVCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNoRSxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUE7WUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDaEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLDZFQUE2RTtnQkFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUE7WUFDeEYsQ0FBQztZQUNELE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDdkIsT0FBTTtnQkFDUixDQUFDO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO2dCQUN4RixDQUFDO2dCQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUEsdUJBQVUsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUV4RCw2R0FBNkc7Z0JBQzdHLCtHQUErRztnQkFDL0csZ0JBQWdCO2dCQUNoQixNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNyRCxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7Z0JBRXpGLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7b0JBQzFCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO29CQUNsRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7Z0JBQ2xELENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUN4RSxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixJQUFBLHdCQUFpQixFQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBQSxzQkFBaUIsRUFBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDcEQsTUFBTSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUV6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUE7UUFFckQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUN6RCxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyw2QkFBNkIsSUFBQSx3QkFBaUIsRUFBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakcsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNwRCxDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFXO1FBQ2hDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUE7UUFDdkMsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRTVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ2xHLE1BQU0sUUFBUSxHQUFhLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFBLHVCQUFVLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUUxRCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQUUsQ0FBYSxFQUFFLEVBQUUsQ0FDOUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxNQUFNLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQzthQUNwQixHQUFHLENBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsTUFBTSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRVosTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUE7UUFDcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxzQkFBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDNUUsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLENBQUMsTUFBTSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMvRSxDQUFDO1FBRUQsTUFBTSxJQUFBLGVBQVEsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUMsR0FBRyxFQUFDLEVBQUU7WUFDekYsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBVSxFQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixVQUFVLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZELENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDekQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDakMsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FDeEIsUUFBa0IsRUFDbEIsV0FBd0IsRUFDeEIsT0FBcUIsRUFDckIsT0FBc0I7UUFFdEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUNuQixRQUFRLEVBQ1IsV0FBVyxFQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUN0RCxPQUFPLENBQ1IsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLE9BQTJCLEVBQzNCLE9BQXNCO1FBRXRCLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLFFBQVEsYUFBYSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDcEgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN2RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUNuQyxNQUFNLEVBQUUsVUFBVTtnQkFDbEIsUUFBUTtnQkFDUixNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsS0FBSyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMvQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO1NBQ2xFLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWtCLEVBQUUsT0FBMkI7UUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWtCLEVBQUUsV0FBd0I7UUFDNUQsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzdELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQ25DLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixRQUFRO2dCQUNSLE1BQU07Z0JBQ04sV0FBVztnQkFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7YUFDN0IsQ0FBQztZQUNGLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUNsRSxDQUFDLENBQUE7UUFDRixPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDcEMsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFrQixFQUFFLFdBQXdCO1FBQzdELE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQzlELE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7Q0FDRjtBQXZSRCw4QkF1UkM7QUFFRCxTQUFTLFdBQVc7SUFDbEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3hCLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFXO0lBQzNCLE9BQU8sSUFBQSxjQUFNLEVBQUMsSUFBQSxrQkFBVyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDakMsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQTtBQUN0QixNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQSJ9
@@ -0,0 +1,12 @@
1
+ import { TaskName } from 'task-name';
2
+ import { ExecutionType } from './execution-type';
3
+ import { SlotIndex } from './slot-index';
4
+ export interface TaskSummary {
5
+ taskName: TaskName;
6
+ outputFile?: string;
7
+ verdict: 'OK' | 'FAIL' | 'CRASH' | 'UNKNOWN';
8
+ execution: ExecutionType;
9
+ startedAt: SlotIndex;
10
+ endedAt: SlotIndex;
11
+ rootCause?: TaskName;
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdW1tYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rhc2stc3VtbWFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,23 @@
1
+ import { ExitStatus } from 'repo-protocol';
2
+ import { TaskName } from 'task-name';
3
+ import { ExecutionPlan } from './execution-plan';
4
+ import { PerformanceReport } from './performance-report';
5
+ import { Task } from './task';
6
+ export declare class TaskTracker {
7
+ private readonly plan;
8
+ private numRunning;
9
+ private readonly usedConcurrencyLevles;
10
+ private numExecuted;
11
+ private counter;
12
+ constructor(plan: ExecutionPlan);
13
+ tasks(): Task[];
14
+ getDependencyTasks(tn: TaskName): Task[];
15
+ hasVerdict(taskName: TaskName): boolean;
16
+ getPerformanceReport(): PerformanceReport;
17
+ changeStatus(taskName: TaskName, status: 'RUNNING' | 'DONE'): void;
18
+ registerCachedVerdict(taskName: TaskName, cachedVerdict: 'OK' | 'FLAKY' | 'FAIL'): void;
19
+ registerVerdict(taskName: TaskName, status: ExitStatus, outputFile: string): void;
20
+ getTask(tn: TaskName): Task;
21
+ get successful(): boolean;
22
+ private propagateFailure;
23
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskTracker = void 0;
4
+ const misc_1 = require("misc");
5
+ const slot_index_1 = require("./slot-index");
6
+ class TaskTracker {
7
+ constructor(plan) {
8
+ this.plan = plan;
9
+ this.numRunning = 0;
10
+ this.usedConcurrencyLevles = [];
11
+ this.numExecuted = 0;
12
+ this.counter = (0, slot_index_1.SlotIndex)(0);
13
+ }
14
+ tasks() {
15
+ return this.plan.tasks();
16
+ }
17
+ getDependencyTasks(tn) {
18
+ return this.plan.taskGraph.neighborsOf(tn).map(tn => this.getTask(tn));
19
+ }
20
+ hasVerdict(taskName) {
21
+ return (0, misc_1.switchOn)(this.getTask(taskName).record.verdict, {
22
+ UNKNOWN: () => false,
23
+ OK: () => true,
24
+ FAIL: () => true,
25
+ CRASH: () => true,
26
+ });
27
+ }
28
+ getPerformanceReport() {
29
+ return {
30
+ maxUsedConcurrency: Math.max(...this.usedConcurrencyLevles),
31
+ numExecuted: this.numExecuted,
32
+ usedConcurrencyLevles: this.usedConcurrencyLevles,
33
+ };
34
+ }
35
+ changeStatus(taskName, status) {
36
+ const t = this.getTask(taskName);
37
+ this.counter = (0, slot_index_1.SlotIndex)(this.counter, (0, misc_1.switchOn)(status, { RUNNING: () => (0, misc_1.Int)(0), DONE: () => (0, misc_1.Int)(1) }));
38
+ t.changeStatus(status, this.counter);
39
+ if (status === 'RUNNING') {
40
+ this.numRunning += 1;
41
+ this.numExecuted += 1;
42
+ this.usedConcurrencyLevles.push(this.numRunning);
43
+ return;
44
+ }
45
+ if (status === 'DONE') {
46
+ this.numRunning -= 1;
47
+ return;
48
+ }
49
+ (0, misc_1.shouldNeverHappen)(status);
50
+ }
51
+ registerCachedVerdict(taskName, cachedVerdict) {
52
+ const task = this.getTask(taskName);
53
+ if (cachedVerdict === 'OK' || cachedVerdict === 'FLAKY') {
54
+ task.assignVerdict('OK', 'CACHED');
55
+ return;
56
+ }
57
+ if (cachedVerdict == 'FAIL') {
58
+ task.assignVerdict('FAIL', 'CACHED');
59
+ this.propagateFailure(taskName);
60
+ return;
61
+ }
62
+ (0, misc_1.shouldNeverHappen)(cachedVerdict);
63
+ }
64
+ registerVerdict(taskName, status, outputFile) {
65
+ const task = this.getTask(taskName);
66
+ task.assignVerdict(status, 'EXECUTED');
67
+ (0, misc_1.switchOn)(status, {
68
+ CRASH: () => { },
69
+ FAIL: () => task.setOutputFile(outputFile),
70
+ OK: () => task.setOutputFile(outputFile),
71
+ });
72
+ (0, misc_1.switchOn)(status, {
73
+ CRASH: () => { },
74
+ FAIL: () => this.propagateFailure(taskName),
75
+ OK: () => { },
76
+ });
77
+ }
78
+ getTask(tn) {
79
+ return this.plan.getTask(tn);
80
+ }
81
+ get successful() {
82
+ return this.tasks().every(t => t.record.verdict === 'OK');
83
+ }
84
+ propagateFailure(taskName) {
85
+ const toFail = this.plan.errorPropagationGraph.traverseFrom(taskName, { direction: 'backwards' });
86
+ for (const t of toFail) {
87
+ if (t === taskName) {
88
+ // TODO(imaman): not tested
89
+ continue;
90
+ }
91
+ const r = this.getTask(t);
92
+ r.assignVerdict('FAIL', 'CANNOT_START', taskName);
93
+ }
94
+ }
95
+ }
96
+ exports.TaskTracker = TaskTracker;
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay10cmFja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rhc2stdHJhY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBdUQ7QUFNdkQsNkNBQXdDO0FBR3hDLE1BQWEsV0FBVztJQU10QixZQUE2QixJQUFtQjtRQUFuQixTQUFJLEdBQUosSUFBSSxDQUFlO1FBTHhDLGVBQVUsR0FBRyxDQUFDLENBQUE7UUFDTCwwQkFBcUIsR0FBYSxFQUFFLENBQUE7UUFDN0MsZ0JBQVcsR0FBRyxDQUFDLENBQUE7UUFDZixZQUFPLEdBQWMsSUFBQSxzQkFBUyxFQUFDLENBQUMsQ0FBQyxDQUFBO0lBRVUsQ0FBQztJQUVwRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFZO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsVUFBVSxDQUFDLFFBQWtCO1FBQzNCLE9BQU8sSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3BCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1lBQ2QsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7WUFDaEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7U0FDbEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELG9CQUFvQjtRQUNsQixPQUFPO1lBQ0wsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdB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
@@ -0,0 +1,30 @@
1
+ import { PathInRepo } from 'core-types';
2
+ import { OutputLocation, TaskInfo } from 'repo-protocol';
3
+ import { TaskName } from 'task-name';
4
+ import { ExecutionRecord } from './execution-record';
5
+ import { Fingerprint } from './fingerprint';
6
+ import { Phase } from './phase';
7
+ import { SlotIndex } from './slot-index';
8
+ export declare class Task {
9
+ private readonly buildRunId;
10
+ readonly taskInfo: TaskInfo;
11
+ readonly labels: readonly string[];
12
+ readonly name: TaskName;
13
+ readonly id: string;
14
+ private fingerprint;
15
+ private readonly executionRecord;
16
+ readonly inputs: readonly PathInRepo[];
17
+ constructor(buildRunId: string, taskInfo: TaskInfo, inputs: PathInRepo[], labels: readonly string[]);
18
+ get unitId(): import("modules/unit-metadata/dist/src").UnitId;
19
+ changeStatus(status: 'RUNNING' | 'DONE', counter: SlotIndex): void;
20
+ getFingerprint(): Fingerprint;
21
+ computeFingerprint(fingerprintsOfInputs: Fingerprint[]): void;
22
+ setPhase(phase: Phase): void;
23
+ getPhase(): Phase;
24
+ hasPhase(): boolean;
25
+ get record(): ExecutionRecord;
26
+ get outputLocations(): OutputLocation[];
27
+ assignVerdict(verdict: 'OK' | 'FAIL' | 'CRASH', executionType: 'EXECUTED' | 'CACHED' | 'CANNOT_START', rootCause?: TaskName): void;
28
+ setOutputFile(outputFile: string): void;
29
+ getDurationMillis(): number | undefined;
30
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Task = void 0;
4
+ const misc_1 = require("misc");
5
+ const task_name_1 = require("task-name");
6
+ const fingerprint_1 = require("./fingerprint");
7
+ const slot_index_1 = require("./slot-index");
8
+ class Task {
9
+ constructor(buildRunId, taskInfo, inputs, labels) {
10
+ this.buildRunId = buildRunId;
11
+ this.taskInfo = taskInfo;
12
+ this.labels = labels;
13
+ this.inputs = (0, misc_1.uniqueBy)((0, misc_1.sortBy)(inputs, t => t.val), t => t.val);
14
+ this.name = taskInfo.taskName;
15
+ this.id = (0, misc_1.computeObjectHash)({ buildRunId: this.buildRunId, name: this.name });
16
+ this.executionRecord = {
17
+ verdict: 'UNKNOWN',
18
+ executionType: 'UNKNOWN',
19
+ startedAt: (0, slot_index_1.SlotIndex)(-1),
20
+ endedAt: (0, slot_index_1.SlotIndex)(-1),
21
+ phases: [],
22
+ };
23
+ }
24
+ get unitId() {
25
+ return (0, task_name_1.TaskName)().undo(this.name).unitId;
26
+ }
27
+ changeStatus(status, counter) {
28
+ if (status === 'RUNNING') {
29
+ this.executionRecord.startedAt = counter;
30
+ }
31
+ else if (status === 'DONE') {
32
+ this.executionRecord.endedAt = counter;
33
+ }
34
+ else {
35
+ (0, misc_1.shouldNeverHappen)(status);
36
+ }
37
+ }
38
+ getFingerprint() {
39
+ return this.fingerprint ?? (0, misc_1.failMe)(`fingerprint not set in ${this.name}`);
40
+ }
41
+ computeFingerprint(fingerprintsOfInputs) {
42
+ if (this.fingerprint !== undefined) {
43
+ throw new Error(`Fingerprint was already set in ${this.name}`);
44
+ }
45
+ const fp = (0, misc_1.computeObjectHash)({
46
+ fingerprintsOfInputs,
47
+ info: this.taskInfo, // eslint-disable-line @typescript-eslint/consistent-type-assertions
48
+ });
49
+ this.fingerprint = (0, fingerprint_1.Fingerprint)(fp);
50
+ }
51
+ setPhase(phase) {
52
+ this.executionRecord.phases.push({ phase, timestampMillis: Date.now() });
53
+ }
54
+ getPhase() {
55
+ const pos = this.executionRecord.phases.length - 1;
56
+ return pos >= 0 ? this.executionRecord.phases[pos].phase : 'UNSTARTED';
57
+ }
58
+ hasPhase() {
59
+ return this.executionRecord.phases.length > 0;
60
+ }
61
+ get record() {
62
+ return this.executionRecord;
63
+ }
64
+ get outputLocations() {
65
+ return this.taskInfo.outputLocations ?? [];
66
+ }
67
+ assignVerdict(verdict, executionType, rootCause) {
68
+ this.executionRecord.verdict = verdict;
69
+ this.executionRecord.executionType = executionType;
70
+ this.executionRecord.rootCause = rootCause;
71
+ }
72
+ setOutputFile(outputFile) {
73
+ this.executionRecord.outputFile = outputFile;
74
+ }
75
+ getDurationMillis() {
76
+ const phases = this.executionRecord.phases;
77
+ if (phases.length < 2) {
78
+ return undefined;
79
+ }
80
+ // Find the first RUNNING phase and the last phase
81
+ const runningPhase = phases.find(p => p.phase === 'RUNNING');
82
+ const lastPhase = phases[phases.length - 1];
83
+ if (!runningPhase) {
84
+ return undefined;
85
+ }
86
+ return lastPhase.timestampMillis - runningPhase.timestampMillis;
87
+ }
88
+ }
89
+ exports.Task = Task;
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtCQUErRjtBQUUvRix5Q0FBb0M7QUFJcEMsK0NBQTJDO0FBRTNDLDZDQUF3QztBQUV4QyxNQUFhLElBQUk7SUFPZixZQUNtQixVQUFrQixFQUMxQixRQUFrQixFQUMzQixNQUFvQixFQUNYLE1BQXlCO1FBSGpCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVsQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUVsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUEsZUFBUSxFQUNwQixJQUFBLGFBQU0sRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FDWCxDQUFBO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFBO1FBQzdCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBQSx3QkFBaUIsRUFBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLFNBQVMsRUFBRSxJQUFBLHNCQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTyxFQUFFLElBQUEsc0JBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFBLG9CQUFRLEdBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FB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
@@ -0,0 +1,13 @@
1
+ import { PathInRepo } from 'core-types';
2
+ import { TaskName } from 'task-name';
3
+ export interface TaskOutputRegistry {
4
+ lookup(outputLoc: PathInRepo): TaskName | undefined;
5
+ wideLookup(outputLoc: PathInRepo): TaskName[];
6
+ }
7
+ export declare class UpdateableTaskOutputRegistry implements TaskOutputRegistry {
8
+ private readonly map;
9
+ constructor();
10
+ add(taskName: TaskName, outputLoc: PathInRepo): void;
11
+ lookup(outputLoc: PathInRepo): TaskName | undefined;
12
+ wideLookup(outputLoc: PathInRepo): TaskName[];
13
+ }