hammerkit 1.21.1 → 1.22.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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.awaitRunningNeeds = exports.awaitRunningNeed = exports.awaitCompleted = exports.awaitCompletedDependencies = exports.awaitNoRequirements = exports.awaitDependentNeed = exports.awaitRequirement = void 0;
|
|
3
|
+
exports.awaitRunningNeeds = exports.awaitRunningNeed = exports.awaitCompleted = exports.awaitCompletedDependencies = exports.transitiveDeps = exports.awaitNoRequirements = exports.awaitDependentNeed = exports.awaitRequirement = void 0;
|
|
4
4
|
const work_item_1 = require("../planner/work-item");
|
|
5
5
|
const state_resolver_1 = require("./state-resolver");
|
|
6
6
|
// Resolve true once any requirer is `ready` (about to run). With
|
|
@@ -42,8 +42,26 @@ async function awaitNoRequirements(svc, abort) {
|
|
|
42
42
|
}));
|
|
43
43
|
}
|
|
44
44
|
exports.awaitNoRequirements = awaitNoRequirements;
|
|
45
|
+
// The dependencies and, recursively, theirs, each once.
|
|
46
|
+
function transitiveDeps(deps) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const visit = (items) => {
|
|
49
|
+
for (const item of items) {
|
|
50
|
+
if (!seen.has(item)) {
|
|
51
|
+
seen.add(item);
|
|
52
|
+
visit(item.deps);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
visit(deps);
|
|
57
|
+
return [...seen];
|
|
58
|
+
}
|
|
59
|
+
exports.transitiveDeps = transitiveDeps;
|
|
60
|
+
// Waits for the whole dependency closure, not only the direct dependencies: a
|
|
61
|
+
// cached direct dependency completes at once, while the dependencies it
|
|
62
|
+
// skipped past are still being restored for the item about to run.
|
|
45
63
|
async function awaitCompletedDependencies(work, deps, abort) {
|
|
46
|
-
for (const dep of deps) {
|
|
64
|
+
for (const dep of transitiveDeps(deps)) {
|
|
47
65
|
work.status.write('debug', `await completion of ${dep.name} with state ${dep.state.current.type}`);
|
|
48
66
|
await awaitCompleted(work, dep, abort);
|
|
49
67
|
}
|
|
@@ -5,6 +5,7 @@ const plan_work_tasks_1 = require("../planner/utils/plan-work-tasks");
|
|
|
5
5
|
const execute_work_service_1 = require("./execute-work-service");
|
|
6
6
|
const execute_work_task_1 = require("./execute-work-task");
|
|
7
7
|
const execute_init_task_1 = require("./execute-init-task");
|
|
8
|
+
const await_completed_dependencies_1 = require("./await-completed-dependencies");
|
|
8
9
|
async function executeWorkTree(work, environment, options) {
|
|
9
10
|
const itemPromises = [];
|
|
10
11
|
const dependents = skippableDependents(work, options);
|
|
@@ -67,9 +68,13 @@ function skippableDependents(work, options) {
|
|
|
67
68
|
result.set(task.name, []);
|
|
68
69
|
}
|
|
69
70
|
}
|
|
71
|
+
// A dependent also needs everything its dependencies need: a cached `build`
|
|
72
|
+
// does not restore the `install` a re-running `test` uses at run time. So a
|
|
73
|
+
// task is a dependent of its whole dependency closure, requested tasks
|
|
74
|
+
// included in the walk (they are cached or run on their own).
|
|
70
75
|
const items = [...(0, plan_work_tasks_1.iterateWorkTasks)(work), ...(0, plan_work_tasks_1.iterateWorkServices)(work)];
|
|
71
76
|
for (const item of items) {
|
|
72
|
-
for (const dep of item.deps) {
|
|
77
|
+
for (const dep of (0, await_completed_dependencies_1.transitiveDeps)(item.deps)) {
|
|
73
78
|
if (work.requested.includes(dep.name)) {
|
|
74
79
|
continue;
|
|
75
80
|
}
|
package/package.json
CHANGED