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,321 @@
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.TaskExecutor = void 0;
37
+ const build_failed_error_1 = require("build-failed-error");
38
+ const fse = __importStar(require("fs-extra"));
39
+ const misc_1 = require("misc");
40
+ const path = __importStar(require("path"));
41
+ const task_name_1 = require("task-name");
42
+ /**
43
+ * An object that is reponsible for executing a task.
44
+ */
45
+ class TaskExecutor {
46
+ constructor(model, tracker, logger, repoProtocol, taskStore, taskOutputDir, eventPublisher, fingerprintLedger, purger, testCaching, tasksToDiagnose) {
47
+ this.model = model;
48
+ this.tracker = tracker;
49
+ this.logger = logger;
50
+ this.repoProtocol = repoProtocol;
51
+ this.taskStore = taskStore;
52
+ this.taskOutputDir = taskOutputDir;
53
+ this.eventPublisher = eventPublisher;
54
+ this.fingerprintLedger = fingerprintLedger;
55
+ this.purger = purger;
56
+ this.testCaching = testCaching;
57
+ this.tasksToDiagnose = tasksToDiagnose;
58
+ }
59
+ /**
60
+ * @param taskName
61
+ * @param fingerprintDeps other tasks whose fingerprint need to be part of the fingerprint of `taskName`.
62
+ */
63
+ async executeTask(taskName, fingerprintDeps) {
64
+ const ste = new SingleTaskExecutor(taskName, fingerprintDeps, this.model, this.tracker, this.logger, this.repoProtocol, this.taskStore, this.taskOutputDir, this.eventPublisher, this.fingerprintLedger, this.purger, this.testCaching, this.tasksToDiagnose.includes(taskName));
65
+ await ste.executeTask();
66
+ }
67
+ }
68
+ exports.TaskExecutor = TaskExecutor;
69
+ class SingleTaskExecutor {
70
+ /**
71
+ * @param taskName
72
+ * @param fingerprintDeps other tasks whose fingerprint need to be part of the fingerprint of `taskName`.
73
+ * @param model
74
+ * @param tracker
75
+ * @param logger
76
+ * @param repoProtocol
77
+ * @param taskStore
78
+ * @param taskOutputDir
79
+ * @param eventPublisher
80
+ * @param fingerprintLedger
81
+ * @param purger
82
+ * @param testCaching
83
+ * @param shouldDiagnose
84
+ */
85
+ constructor(taskName, fingerprintDeps, model, tracker, logger, repoProtocol, taskStore, taskOutputDir, eventPublisher, fingerprintLedger, purger, testCaching, shouldDiagnose) {
86
+ this.taskName = taskName;
87
+ this.fingerprintDeps = fingerprintDeps;
88
+ this.model = model;
89
+ this.tracker = tracker;
90
+ this.logger = logger;
91
+ this.repoProtocol = repoProtocol;
92
+ this.taskStore = taskStore;
93
+ this.taskOutputDir = taskOutputDir;
94
+ this.eventPublisher = eventPublisher;
95
+ this.fingerprintLedger = fingerprintLedger;
96
+ this.purger = purger;
97
+ this.testCaching = testCaching;
98
+ this.shouldDiagnose = shouldDiagnose;
99
+ this.phasePublisher = new misc_1.TypedPublisher();
100
+ this.isTest = (0, task_name_1.TaskName)().undo(this.taskName).taskKind === 'test';
101
+ }
102
+ diagnose(message) {
103
+ if (!this.shouldDiagnose) {
104
+ return;
105
+ }
106
+ this.logger.print(`[${this.taskName}] ${message}`);
107
+ }
108
+ get task() {
109
+ return this.tracker.getTask(this.taskName);
110
+ }
111
+ get unit() {
112
+ return this.model.getUnit(this.task.unitId);
113
+ }
114
+ async postProcess(status, outputFile, time) {
115
+ // Since outputFile's content can be big, read it only if this task is "diagnosed".
116
+ if (this.shouldDiagnose) {
117
+ const content = fse.readFileSync(outputFile, 'utf-8');
118
+ this.diagnose(`content of ${outputFile} is ${content}`);
119
+ }
120
+ // TODO(imaman): cover (await is dropped)
121
+ await this.eventPublisher.publish('executionEnded', {
122
+ taskName: this.taskName,
123
+ status,
124
+ outputFile,
125
+ time,
126
+ pathInRepo: this.unit.pathInRepo.val,
127
+ });
128
+ }
129
+ async computeFingerprint() {
130
+ const fps = [];
131
+ const t = this.task;
132
+ // TODO(imaman): test coverage for the sort-by
133
+ // TODO(imaman): concurrent loop
134
+ this.diagnose(`deps are ${JSON.stringify(this.fingerprintDeps)}, info.deps=${JSON.stringify(t.taskInfo.deps)}`);
135
+ for (const d of this.fingerprintDeps) {
136
+ const dep = this.tracker.getTask(d);
137
+ fps.push(dep.getFingerprint());
138
+ }
139
+ const parts = {};
140
+ this.diagnose(`inputs are: ${t.inputs}`);
141
+ for (const loc of t.inputs) {
142
+ const fingerprint = await this.model.fingerprintOfDir(loc);
143
+ fps.push(fingerprint);
144
+ parts[loc.val] = fingerprint;
145
+ }
146
+ t.computeFingerprint(fps);
147
+ const ret = t.getFingerprint();
148
+ this.fingerprintLedger.updateTask(t.name, ret, parts);
149
+ return ret;
150
+ }
151
+ async validateOutputs() {
152
+ const t = this.task;
153
+ const missing = await (0, misc_1.promises)(t.outputLocations)
154
+ .filter(async (loc) => {
155
+ const resolved = this.model.rootDir.resolve(loc.pathInRepo);
156
+ const exists = await fse.pathExists(resolved);
157
+ return !exists;
158
+ })
159
+ .reify(100);
160
+ if (!missing.length) {
161
+ return;
162
+ }
163
+ const formatted = missing.map(at => ` - ${at.pathInRepo}`).join('\n');
164
+ this.logger.info(`missing outputs for task ${t.name}: ${JSON.stringify(missing)}`);
165
+ throw new build_failed_error_1.BuildFailedError(`Task ${this.taskName} failed to produce the following outputs:\n${formatted}`);
166
+ }
167
+ /**
168
+ * Exectues the task.
169
+ */
170
+ async executeTask() {
171
+ try {
172
+ const t = this.task;
173
+ if (this.tracker.hasVerdict(t.name)) {
174
+ return;
175
+ }
176
+ await this.runPhases();
177
+ }
178
+ catch (e) {
179
+ this.logger.error(`Task ${this.taskName} is exiting with an error`, e);
180
+ throw e;
181
+ }
182
+ }
183
+ get dir() {
184
+ return this.model.rootDir.resolve(this.unit.pathInRepo);
185
+ }
186
+ get fp() {
187
+ return this.fp_ ?? (0, misc_1.failMe)(`fingerprint was not set on task ${this.taskName}`);
188
+ }
189
+ /**
190
+ * Determines whether this executor can execute its task. It is possible that several executors will try to run the
191
+ * same task. This method ensures that exactly one such executor will actually execute it.
192
+ * @returns true if the task should be executed by this executor, false otherwise.
193
+ */
194
+ grabExecutionRights() {
195
+ // This method cannot be async, because it should do a compare-and-set on the task's phase in an atomic manner.
196
+ // This atomicity ensures that a task will only be executed once.
197
+ if (this.task.hasPhase()) {
198
+ return false;
199
+ }
200
+ this.task.setPhase('UNSTARTED');
201
+ return true;
202
+ }
203
+ async runPhases() {
204
+ const rightsGrabbed = this.grabExecutionRights();
205
+ if (!rightsGrabbed) {
206
+ await this.eventPublisher.awaitFor('taskPhaseEnded', e => e.taskName === this.taskName && e.phase === 'TERMINAL');
207
+ return;
208
+ }
209
+ this.tracker.changeStatus(this.taskName, 'RUNNING');
210
+ let phase = 'RUNNING';
211
+ while (true) {
212
+ this.task.setPhase(phase);
213
+ await this.eventPublisher.publish('taskPhaseEnded', { taskName: this.taskName, phase });
214
+ if (phase === 'TERMINAL') {
215
+ break;
216
+ }
217
+ phase = await this.executePhase(phase);
218
+ await this.phasePublisher.publish('phase', phase);
219
+ }
220
+ }
221
+ async executePhase(phase) {
222
+ this.logger.info(`Running ${phase} of ${this.taskName}`);
223
+ this.diagnose(`Running phase ${phase}`);
224
+ const t = this.task;
225
+ // TODO(imaman): some of the phases are essentially a no-op and can be eliminated.
226
+ if (phase === 'UNSTARTED') {
227
+ return 'RUNNING';
228
+ }
229
+ if (phase === 'RUNNING') {
230
+ return 'COMPUTE_FINGERPRINT';
231
+ }
232
+ if (phase === 'COMPUTE_FINGERPRINT') {
233
+ this.fp_ = await this.computeFingerprint();
234
+ this.diagnose(`fingerprint is ${this.fp_}`);
235
+ return 'POSSIBLY_RESTORE_OUTPUTS';
236
+ }
237
+ if (phase === 'POSSIBLY_RESTORE_OUTPUTS') {
238
+ const earlierVerdict = await this.getVerdict();
239
+ this.diagnose(`earlierVerdict is ${earlierVerdict}`);
240
+ const useCaching = this.task.taskInfo.useCaching ?? true;
241
+ if (earlierVerdict === 'UNKNOWN' || (this.isTest && !this.testCaching) || !useCaching) {
242
+ await this.purgeOutputs(false);
243
+ return 'RUN_IT';
244
+ }
245
+ await this.purgeOutputs(true);
246
+ await this.restoreOutputs();
247
+ if (earlierVerdict === 'FAIL') {
248
+ return 'RUN_IT';
249
+ }
250
+ if (earlierVerdict === 'OK' || earlierVerdict === 'FLAKY') {
251
+ this.tracker.registerCachedVerdict(t.name, earlierVerdict);
252
+ return 'SKIP';
253
+ }
254
+ (0, misc_1.shouldNeverHappen)(earlierVerdict);
255
+ }
256
+ if (phase === 'SKIP') {
257
+ await this.eventPublisher.publish('executionSkipped', t.name);
258
+ return 'TERMINAL';
259
+ }
260
+ if (phase === 'RUN_IT') {
261
+ this.diagnose('running it');
262
+ await this.runIt();
263
+ return 'TERMINAL';
264
+ }
265
+ if (phase === 'TERMINAL') {
266
+ throw new Error(`task ${t.name} is already in state ${phase}`);
267
+ }
268
+ (0, misc_1.shouldNeverHappen)(phase);
269
+ }
270
+ async restoreOutputs() {
271
+ this.diagnose(`restoring outputs`);
272
+ const t = this.task;
273
+ await this.taskStore.restoreTask(t.name, this.fp);
274
+ this.diagnose(`task restored`);
275
+ }
276
+ async getVerdict() {
277
+ const earlierVerdict = await this.taskStore.checkVerdict(this.task.name, this.fp);
278
+ return earlierVerdict;
279
+ }
280
+ async runIt() {
281
+ const t = this.task;
282
+ const t0 = Date.now();
283
+ await this.eventPublisher.publish('executionStarted', t.name);
284
+ const outputFile = path.join(this.taskOutputDir, `${t.id}.stdout`);
285
+ const status = await this.repoProtocol.execute(t.name, outputFile, this.model.buildRunId);
286
+ await this.postProcess(status, outputFile, Date.now() - t0);
287
+ this.diagnose(`status=${status}`);
288
+ if (status === 'CRASH') {
289
+ throw new Error(`Task ${JSON.stringify(t.name)} crashed`);
290
+ }
291
+ const outputs = t.outputLocations.map(at => ({ isPublic: false, ...at }));
292
+ if (status === 'OK') {
293
+ await this.validateOutputs();
294
+ this.diagnose(`registering verdict`);
295
+ this.tracker.registerVerdict(t.name, status, outputFile);
296
+ this.diagnose(`recording outputs: ${JSON.stringify(outputs)}`);
297
+ await this.taskStore.recordTask(t.name, this.fp, outputs, 'OK');
298
+ this.diagnose(`...outputs recorded`);
299
+ return;
300
+ }
301
+ if (status === 'FAIL') {
302
+ this.tracker.registerVerdict(t.name, status, outputFile);
303
+ // TODO(imaman): should not record outputs if task has failed.
304
+ await this.taskStore.recordTask(t.name, this.fp, outputs, status);
305
+ return;
306
+ }
307
+ (0, misc_1.shouldNeverHappen)(status);
308
+ }
309
+ async purgeOutputs(isRestore) {
310
+ if (isRestore) {
311
+ return;
312
+ }
313
+ this.diagnose(`purging outputs`);
314
+ const taskNames = [this.taskName];
315
+ const tasks = taskNames.map(tn => this.tracker.getTask(tn));
316
+ await (0, misc_1.promises)(tasks).forEach(20, async (task) => {
317
+ await this.purger.purgeOutputsOfTask(task);
318
+ });
319
+ }
320
+ }
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrLWV4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJEQUFxRDtBQUNyRCw4Q0FBK0I7QUFFL0IsK0JBQTBFO0FBQzFFLDJDQUE0QjtBQUU1Qix5Q0FBb0M7QUFXcEM7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFDdkIsWUFDbUIsS0FBWSxFQUNaLE9BQW9CLEVBQ3BCLE1BQWMsRUFDZCxZQUEwQixFQUMxQixTQUFvQixFQUNwQixhQUFxQixFQUNyQixjQUFpRCxFQUNqRCxpQkFBb0MsRUFDcEMsTUFBYyxFQUNkLFdBQW9CLEVBQ3BCLGVBQXlCO1FBVnpCLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQ3JCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQztRQUNqRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBVTtJQUN6QyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFrQixFQUFFLGVBQTJCO1FBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUksa0JBQWtCLENBQ2hDLFFBQVEsRUFDUixlQUFlLEVBQ2YsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLFNBQVMsRUFDZCxJ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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
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
+ const core_types_1 = require("core-types");
37
+ const fs = __importStar(require("fs"));
38
+ const logger_1 = require("logger");
39
+ const misc_1 = require("misc");
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const task_store_1 = require("./task-store");
43
+ function print(...args) {
44
+ console.log(...args); // eslint-disable-line no-console
45
+ }
46
+ async function main(args) {
47
+ if (args.length !== 3) {
48
+ print(`Usage: ${path.basename(__filename)} <blob-id>`);
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ const sc = await misc_1.FilesystemStorageClient.create(path.join(os.homedir(), '.build-raptor/storage'));
53
+ const blobId = (0, task_store_1.BlobId)(args[2].trim());
54
+ const outputDir = path.join(process.cwd(), blobId);
55
+ const taskStore = new task_store_1.TaskStore((0, core_types_1.RepoRoot)(outputDir), sc, (0, logger_1.createNopLogger)());
56
+ fs.mkdirSync(outputDir);
57
+ await taskStore.restoreBlob(blobId);
58
+ print(`Blob restored to ${outputDir}`);
59
+ }
60
+ main(process.argv);
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdG9yZS1jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFzay1zdG9yZS1jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBcUM7QUFDckMsdUNBQXdCO0FBQ3hCLG1DQUF3QztBQUN4QywrQkFBOEM7QUFDOUMsdUNBQXdCO0FBQ3hCLDJDQUE0QjtBQUU1Qiw2Q0FBZ0Q7QUFFaEQsU0FBUyxLQUFLLENBQUMsR0FBRyxJQUFlO0lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQSxDQUFDLGlDQUFpQztBQUN4RCxDQUFDO0FBRUQsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFjO0lBQ2hDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUN0RCxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUNwQixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sRUFBRSxHQUFHLE1BQU0sOEJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQTtJQUVqRyxNQUFNLE1BQU0sR0FBRyxJQUFBLG1CQUFNLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7SUFFckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxzQkFBUyxDQUFDLElBQUEscUJBQVEsRUFBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBQSx3QkFBZSxHQUFFLENBQUMsQ0FBQTtJQUMzRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZCLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxLQUFLLENBQUMsb0JBQW9CLFNBQVMsRUFBRSxDQUFDLENBQUE7QUFDeEMsQ0FBQztBQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEifQ==
@@ -0,0 +1,17 @@
1
+ import { TaskName } from 'task-name';
2
+ export type TaskStoreEvent = {
3
+ taskStore: {
4
+ opcode: 'RECORDED' | 'RESTORED';
5
+ taskName: TaskName;
6
+ blobId: string;
7
+ fingerprint: string;
8
+ files: string[];
9
+ };
10
+ publicFiles: {
11
+ taskName: TaskName;
12
+ /**
13
+ * Maps path-in-repo to the hash of the contnet of the file
14
+ */
15
+ publicFiles: Record<string, string>;
16
+ };
17
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdG9yZS1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrLXN0b3JlLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,41 @@
1
+ import { Brand } from 'brand';
2
+ import { PathInRepo, RepoRoot } from 'core-types';
3
+ import { Logger } from 'logger';
4
+ import { StorageClient, TypedPublisher } from 'misc';
5
+ import { TaskName } from 'task-name';
6
+ import { Fingerprint } from './fingerprint';
7
+ import { TaskStoreEvent } from './task-store-event';
8
+ type OutputDescriptor = {
9
+ pathInRepo: PathInRepo;
10
+ isPublic: boolean;
11
+ };
12
+ export type BlobId = Brand<string, 'BlobId'>;
13
+ export declare const BlobId: (s: string) => BlobId;
14
+ export declare class TaskStore {
15
+ readonly repoRootDir: RepoRoot;
16
+ private readonly client;
17
+ private readonly logger;
18
+ private readonly publisher?;
19
+ private readonly trace?;
20
+ constructor(repoRootDir: RepoRoot, client: StorageClient, logger: Logger, publisher?: TypedPublisher<TaskStoreEvent> | undefined, trace?: string[] | undefined);
21
+ private putBlob;
22
+ private getBlob;
23
+ private getIfExists;
24
+ private putVerdict;
25
+ private getVerdict;
26
+ private bundle;
27
+ private unbundle;
28
+ /**
29
+ * Use only from tests
30
+ */
31
+ recordTaskForTesting(taskName: TaskName, fingerprint: Fingerprint, outputs: PathInRepo[], verdict: 'OK' | 'FAIL'): Promise<void>;
32
+ recordTask(taskName: TaskName, fingerprint: Fingerprint, outputs: OutputDescriptor[], verdict: 'OK' | 'FAIL'): Promise<void>;
33
+ private recordBlob;
34
+ restoreTask(taskName: TaskName, fingerprint: Fingerprint): Promise<'FAIL' | 'OK' | 'FLAKY' | 'UNKNOWN'>;
35
+ restoreBlob(blobId: BlobId): Promise<{
36
+ files: PathInRepo[];
37
+ publicFiles: Record<string, string>;
38
+ }>;
39
+ checkVerdict(taskName: TaskName, fingerprint: Fingerprint): Promise<'FAIL' | 'OK' | 'FLAKY' | 'UNKNOWN'>;
40
+ }
41
+ export {};