@ue-shed/map-history 0.1.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.
- package/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/baseline-materialization.d.ts +17 -0
- package/dist/baseline-materialization.d.ts.map +1 -0
- package/dist/baseline-materialization.js +86 -0
- package/dist/baseline-materialization.js.map +1 -0
- package/dist/diff.d.ts +7 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +159 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/fast-history-target.d.ts +61 -0
- package/dist/fast-history-target.d.ts.map +1 -0
- package/dist/fast-history-target.js +248 -0
- package/dist/fast-history-target.js.map +1 -0
- package/dist/historical-project-tree.d.ts +18 -0
- package/dist/historical-project-tree.d.ts.map +1 -0
- package/dist/historical-project-tree.js +123 -0
- package/dist/historical-project-tree.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/map-history.d.ts +24 -0
- package/dist/map-history.d.ts.map +1 -0
- package/dist/map-history.js +365 -0
- package/dist/map-history.js.map +1 -0
- package/dist/package-correlation.d.ts +16 -0
- package/dist/package-correlation.d.ts.map +1 -0
- package/dist/package-correlation.js +76 -0
- package/dist/package-correlation.js.map +1 -0
- package/dist/perforce-map-scope.d.ts +56 -0
- package/dist/perforce-map-scope.d.ts.map +1 -0
- package/dist/perforce-map-scope.js +284 -0
- package/dist/perforce-map-scope.js.map +1 -0
- package/dist/perforce.d.ts +105 -0
- package/dist/perforce.d.ts.map +1 -0
- package/dist/perforce.js +441 -0
- package/dist/perforce.js.map +1 -0
- package/dist/playback.d.ts +60 -0
- package/dist/playback.d.ts.map +1 -0
- package/dist/playback.js +168 -0
- package/dist/playback.js.map +1 -0
- package/dist/revision-materialization.d.ts +14 -0
- package/dist/revision-materialization.d.ts.map +1 -0
- package/dist/revision-materialization.js +68 -0
- package/dist/revision-materialization.js.map +1 -0
- package/dist/revision-plan.d.ts +44 -0
- package/dist/revision-plan.d.ts.map +1 -0
- package/dist/revision-plan.js +84 -0
- package/dist/revision-plan.js.map +1 -0
- package/dist/schema.d.ts +7964 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +292 -0
- package/dist/schema.js.map +1 -0
- package/dist/submitted-change-selection.d.ts +22 -0
- package/dist/submitted-change-selection.d.ts.map +1 -0
- package/dist/submitted-change-selection.js +101 -0
- package/dist/submitted-change-selection.js.map +1 -0
- package/package.json +57 -0
package/dist/playback.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { actorIdentityKey, actorIdentityOf, savedWorldPositionsEqual } from "./diff.js";
|
|
2
|
+
function compareText(left, right) {
|
|
3
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
4
|
+
}
|
|
5
|
+
function playbackActor(actor, identity = actorIdentityOf(actor)) {
|
|
6
|
+
return { actor, identity, key: actorIdentityKey(identity) };
|
|
7
|
+
}
|
|
8
|
+
function ambiguousIdentityDiagnostic(key) {
|
|
9
|
+
return {
|
|
10
|
+
code: "ambiguous_actor_identity",
|
|
11
|
+
message: `Playback withheld ambiguous actor identity ${key}.`,
|
|
12
|
+
retrySafe: false
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function stateFromActors(actors) {
|
|
16
|
+
const indexed = new Map();
|
|
17
|
+
const ambiguous = new Set();
|
|
18
|
+
for (const actor of actors) {
|
|
19
|
+
const entry = playbackActor(actor);
|
|
20
|
+
if (ambiguous.has(entry.key))
|
|
21
|
+
continue;
|
|
22
|
+
if (indexed.has(entry.key)) {
|
|
23
|
+
indexed.delete(entry.key);
|
|
24
|
+
ambiguous.add(entry.key);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
indexed.set(entry.key, entry);
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
actors: indexed,
|
|
31
|
+
diagnostics: [...ambiguous].sort(compareText).map(ambiguousIdentityDiagnostic)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function writeAfterChange(actors, change) {
|
|
35
|
+
switch (change.kind) {
|
|
36
|
+
case "actor_added":
|
|
37
|
+
actors.set(actorIdentityKey(change.identity), playbackActor(change.after, change.identity));
|
|
38
|
+
return;
|
|
39
|
+
case "actor_removed":
|
|
40
|
+
actors.delete(actorIdentityKey(change.identity));
|
|
41
|
+
return;
|
|
42
|
+
case "snapshot_coverage_changed":
|
|
43
|
+
return;
|
|
44
|
+
default:
|
|
45
|
+
actors.set(actorIdentityKey(change.identity), playbackActor(change.after, change.identity));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function writeBeforeChange(actors, change) {
|
|
49
|
+
switch (change.kind) {
|
|
50
|
+
case "actor_added":
|
|
51
|
+
actors.delete(actorIdentityKey(change.identity));
|
|
52
|
+
return;
|
|
53
|
+
case "actor_removed":
|
|
54
|
+
actors.set(actorIdentityKey(change.identity), playbackActor(change.before, change.identity));
|
|
55
|
+
return;
|
|
56
|
+
case "snapshot_coverage_changed":
|
|
57
|
+
return;
|
|
58
|
+
default:
|
|
59
|
+
actors.set(actorIdentityKey(change.identity), playbackActor(change.before, change.identity));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function orderedActors(state) {
|
|
63
|
+
return [...state.actors.values()].sort((left, right) => compareText(left.key, right.key));
|
|
64
|
+
}
|
|
65
|
+
function savedWorldActorsEqual(left, right) {
|
|
66
|
+
return (left.actorGuid === right.actorGuid &&
|
|
67
|
+
left.actorPath === right.actorPath &&
|
|
68
|
+
left.classPath === right.classPath &&
|
|
69
|
+
left.label === right.label &&
|
|
70
|
+
left.packageName === right.packageName &&
|
|
71
|
+
savedWorldPositionsEqual(left.position, right.position));
|
|
72
|
+
}
|
|
73
|
+
function initialSnapshot(history) {
|
|
74
|
+
if (history.rangeStartSnapshot !== undefined)
|
|
75
|
+
return history.rangeStartSnapshot;
|
|
76
|
+
if (history.baseline.status === "map_not_yet_created")
|
|
77
|
+
return undefined;
|
|
78
|
+
throw new Error("Map History has a baseline but no rangeStartSnapshot. Re-run the scan with a playback-capable Map History producer.");
|
|
79
|
+
}
|
|
80
|
+
/** Creates the actor state immediately before the requested history range. */
|
|
81
|
+
export function createMapHistoryPlaybackState(input) {
|
|
82
|
+
return stateFromActors(initialSnapshot(input.history)?.actors ?? []);
|
|
83
|
+
}
|
|
84
|
+
/** Applies one submitted map revision to a playback state without mutating the prior state. */
|
|
85
|
+
export function applyMapHistoryRevision(input) {
|
|
86
|
+
const actors = new Map(input.state.actors);
|
|
87
|
+
for (const change of input.revision.changes)
|
|
88
|
+
writeAfterChange(actors, change);
|
|
89
|
+
return { actors, diagnostics: input.state.diagnostics };
|
|
90
|
+
}
|
|
91
|
+
/** Reverts one submitted map revision without mutating the later playback state. */
|
|
92
|
+
export function revertMapHistoryRevision(input) {
|
|
93
|
+
const actors = new Map(input.state.actors);
|
|
94
|
+
for (const change of [...input.revision.changes].reverse())
|
|
95
|
+
writeBeforeChange(actors, change);
|
|
96
|
+
return { actors, diagnostics: input.state.diagnostics };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Reconstructs the range-start frame or the saved state immediately after one in-range submitted
|
|
100
|
+
* changelist. This performs no Perforce or filesystem work and retains only the requested state.
|
|
101
|
+
*/
|
|
102
|
+
export function mapHistoryPlaybackFrameAt(input) {
|
|
103
|
+
const startSnapshot = initialSnapshot(input.history);
|
|
104
|
+
let state = createMapHistoryPlaybackState({ history: input.history });
|
|
105
|
+
if (input.revisionIndex === undefined) {
|
|
106
|
+
return {
|
|
107
|
+
actors: orderedActors(state),
|
|
108
|
+
completeness: startSnapshot?.completeness ?? "complete",
|
|
109
|
+
diagnostics: [...(startSnapshot?.diagnostics ?? []), ...state.diagnostics],
|
|
110
|
+
kind: "range_start",
|
|
111
|
+
state,
|
|
112
|
+
unclassifiedPackageChanges: []
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (!Number.isInteger(input.revisionIndex) ||
|
|
116
|
+
input.revisionIndex < 0 ||
|
|
117
|
+
input.revisionIndex >= input.history.revisions.length) {
|
|
118
|
+
throw new RangeError(`Map History revision index ${input.revisionIndex} is outside this result.`);
|
|
119
|
+
}
|
|
120
|
+
for (let index = 0; index <= input.revisionIndex; index += 1) {
|
|
121
|
+
const revision = input.history.revisions[index];
|
|
122
|
+
if (revision === undefined)
|
|
123
|
+
throw new Error(`Missing Map History revision ${index}.`);
|
|
124
|
+
state = applyMapHistoryRevision({ revision, state });
|
|
125
|
+
}
|
|
126
|
+
const revision = input.history.revisions[input.revisionIndex];
|
|
127
|
+
if (revision === undefined)
|
|
128
|
+
throw new Error(`Missing Map History revision ${input.revisionIndex}.`);
|
|
129
|
+
return {
|
|
130
|
+
actors: orderedActors(state),
|
|
131
|
+
completeness: revision.completeness,
|
|
132
|
+
diagnostics: [...revision.diagnostics, ...state.diagnostics],
|
|
133
|
+
kind: "revision",
|
|
134
|
+
revision,
|
|
135
|
+
revisionIndex: input.revisionIndex,
|
|
136
|
+
state,
|
|
137
|
+
unclassifiedPackageChanges: revision.unclassifiedPackageChanges
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Returns `undefined` when a complete comparison is impossible; otherwise verifies that replayed
|
|
142
|
+
* actor facts exactly equal the retained end-of-range saved-world projection.
|
|
143
|
+
*/
|
|
144
|
+
export function mapHistoryPlaybackMatchesRangeEnd(input) {
|
|
145
|
+
const snapshot = input.history.rangeEndSnapshot;
|
|
146
|
+
if (snapshot === undefined || snapshot.completeness !== "complete")
|
|
147
|
+
return undefined;
|
|
148
|
+
const frame = mapHistoryPlaybackFrameAt({
|
|
149
|
+
history: input.history,
|
|
150
|
+
revisionIndex: input.history.revisions.length === 0 ? undefined : input.history.revisions.length - 1
|
|
151
|
+
});
|
|
152
|
+
if (frame.completeness !== "complete")
|
|
153
|
+
return undefined;
|
|
154
|
+
const expected = stateFromActors(snapshot.actors);
|
|
155
|
+
if (expected.diagnostics.length > 0 || frame.state.diagnostics.length > 0)
|
|
156
|
+
return false;
|
|
157
|
+
if (frame.state.actors.size !== expected.actors.size)
|
|
158
|
+
return false;
|
|
159
|
+
for (const [key, expectedActor] of expected.actors) {
|
|
160
|
+
const actualActor = frame.state.actors.get(key);
|
|
161
|
+
if (actualActor === undefined ||
|
|
162
|
+
!savedWorldActorsEqual(actualActor.actor, expectedActor.actor)) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=playback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playback.js","sourceRoot":"","sources":["../src/playback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { HistoricalProjectTree } from "./historical-project-tree.js";
|
|
3
|
+
import { MapHistoryError } from "./errors.js";
|
|
4
|
+
import { PerforceHistorySource } from "./perforce.js";
|
|
5
|
+
import type { ScopedRevisionPlan } from "./revision-plan.js";
|
|
6
|
+
/** Materializes exact Perforce revisions and applies their scoped mutations atomically to one tree. */
|
|
7
|
+
export declare function materializePlannedRevision(options: {
|
|
8
|
+
readonly change: number;
|
|
9
|
+
readonly concurrency: number;
|
|
10
|
+
readonly maxFiles: number;
|
|
11
|
+
readonly plan: ScopedRevisionPlan;
|
|
12
|
+
readonly tree: HistoricalProjectTree;
|
|
13
|
+
}): Effect.Effect<number, MapHistoryError, PerforceHistorySource>;
|
|
14
|
+
//# sourceMappingURL=revision-materialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-materialization.d.ts","sourceRoot":"","sources":["../src/revision-materialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAA0B,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA4BlF,uGAAuG;AACvG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;CACrC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAuDhE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { MapHistoryError } from "./errors.js";
|
|
3
|
+
import { PerforceHistorySource } from "./perforce.js";
|
|
4
|
+
function materializationError(message, recovery) {
|
|
5
|
+
return new MapHistoryError({
|
|
6
|
+
kind: "materialization",
|
|
7
|
+
message,
|
|
8
|
+
recovery,
|
|
9
|
+
retrySafe: false
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function materializedKey(file) {
|
|
13
|
+
return `${file.depotPath}\u0000${file.revision}`;
|
|
14
|
+
}
|
|
15
|
+
function perforceFile(change, file) {
|
|
16
|
+
return {
|
|
17
|
+
action: file.action,
|
|
18
|
+
changelist: change,
|
|
19
|
+
depotPath: file.depotPath,
|
|
20
|
+
revision: file.revision,
|
|
21
|
+
type: file.type
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Materializes exact Perforce revisions and applies their scoped mutations atomically to one tree. */
|
|
25
|
+
export function materializePlannedRevision(options) {
|
|
26
|
+
return Effect.fn("MapHistory.materializePlannedRevision")(function* () {
|
|
27
|
+
if (options.plan.kind === "invalid")
|
|
28
|
+
return yield* Effect.fail(options.plan.error);
|
|
29
|
+
const materializedFiles = options.plan.files.filter((file) => file.action !== "delete");
|
|
30
|
+
if (materializedFiles.length > options.maxFiles) {
|
|
31
|
+
return yield* Effect.fail(new MapHistoryError({
|
|
32
|
+
kind: "resource_limit",
|
|
33
|
+
message: `Changelist ${options.change} needs ${materializedFiles.length} materialized files, exceeding the limit of ${options.maxFiles}.`,
|
|
34
|
+
recovery: "Narrow the selected map scope or raise maxMaterializedFiles explicitly.",
|
|
35
|
+
retrySafe: false
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
const source = yield* PerforceHistorySource;
|
|
39
|
+
const materialized = materializedFiles.length === 0
|
|
40
|
+
? []
|
|
41
|
+
: (yield* source.materializeDepotFiles({
|
|
42
|
+
concurrency: options.concurrency,
|
|
43
|
+
directory: options.tree.materializationRoot,
|
|
44
|
+
files: materializedFiles.map((file) => perforceFile(options.change, file)),
|
|
45
|
+
maxFiles: options.maxFiles
|
|
46
|
+
})).files;
|
|
47
|
+
const localPaths = new Map(materialized.map((file) => [materializedKey(file.file), file.localPath]));
|
|
48
|
+
const mutations = [];
|
|
49
|
+
for (const file of options.plan.files) {
|
|
50
|
+
if (file.action === "delete") {
|
|
51
|
+
mutations.push({ action: "delete", projectRelativePath: file.projectRelativePath });
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const localPath = localPaths.get(materializedKey(file));
|
|
55
|
+
if (localPath === undefined) {
|
|
56
|
+
return yield* Effect.fail(materializationError(`Perforce did not materialize ${file.depotPath}#${file.revision}.`, "Check the exact depot revision and retry the historical reconstruction."));
|
|
57
|
+
}
|
|
58
|
+
mutations.push({
|
|
59
|
+
action: file.action,
|
|
60
|
+
materializedPath: localPath,
|
|
61
|
+
projectRelativePath: file.projectRelativePath
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
yield* options.tree.applyRevision(mutations);
|
|
65
|
+
return materializedFiles.length;
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=revision-materialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-materialization.js","sourceRoot":"","sources":["../src/revision-materialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PerforceChangedFile } from "./perforce.js";
|
|
2
|
+
import { MapHistoryError } from "./errors.js";
|
|
3
|
+
export interface ScopedPerforceFile {
|
|
4
|
+
readonly depotPath: string;
|
|
5
|
+
readonly packageName: string;
|
|
6
|
+
readonly projectRelativePath: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PlannedPackageChange {
|
|
9
|
+
readonly action: string;
|
|
10
|
+
readonly afterRevision: number | null;
|
|
11
|
+
readonly beforeRevision: number | null;
|
|
12
|
+
readonly depotPath: string;
|
|
13
|
+
readonly packageName: string;
|
|
14
|
+
}
|
|
15
|
+
export type PlannedRevisionFile = {
|
|
16
|
+
readonly action: "delete";
|
|
17
|
+
readonly depotPath: string;
|
|
18
|
+
readonly packageName: string;
|
|
19
|
+
readonly projectRelativePath: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly action: "add" | "edit";
|
|
22
|
+
readonly depotPath: string;
|
|
23
|
+
readonly packageName: string;
|
|
24
|
+
readonly projectRelativePath: string;
|
|
25
|
+
readonly revision: number;
|
|
26
|
+
readonly type: string;
|
|
27
|
+
};
|
|
28
|
+
export type ScopedRevisionPlan = {
|
|
29
|
+
readonly kind: "ready";
|
|
30
|
+
readonly packageChanges: readonly PlannedPackageChange[];
|
|
31
|
+
readonly files: readonly PlannedRevisionFile[];
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: "invalid";
|
|
34
|
+
readonly error: MapHistoryError;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Reduces a described changelist to exact, already-resolved map files. Files outside the selected
|
|
38
|
+
* map scope cannot enter the historical project tree.
|
|
39
|
+
*/
|
|
40
|
+
export declare function planScopedRevision(options: {
|
|
41
|
+
readonly files: readonly PerforceChangedFile[];
|
|
42
|
+
readonly scope: readonly ScopedPerforceFile[];
|
|
43
|
+
}): ScopedRevisionPlan;
|
|
44
|
+
//# sourceMappingURL=revision-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-plan.d.ts","sourceRoot":"","sources":["../src/revision-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,mBAAmB,GAC5B;IACA,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACpC,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACrB,CAAC;AAEL,MAAM,MAAM,kBAAkB,GAC3B;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC9C,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC;AA+BjE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC9C,GAAG,kBAAkB,CA+DrB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { MapHistoryError } from "./errors.js";
|
|
2
|
+
function planError(message, recovery) {
|
|
3
|
+
return {
|
|
4
|
+
kind: "invalid",
|
|
5
|
+
error: new MapHistoryError({
|
|
6
|
+
kind: "materialization",
|
|
7
|
+
message,
|
|
8
|
+
recovery,
|
|
9
|
+
retrySafe: false
|
|
10
|
+
})
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function isDeletion(action) {
|
|
14
|
+
return action === "delete" || action === "move/delete" || action === "purge";
|
|
15
|
+
}
|
|
16
|
+
function isAddition(action) {
|
|
17
|
+
return action === "add" || action === "branch" || action === "move/add";
|
|
18
|
+
}
|
|
19
|
+
function beforeRevision(action, revision) {
|
|
20
|
+
if (isAddition(action) || revision === null || revision <= 1)
|
|
21
|
+
return null;
|
|
22
|
+
return revision - 1;
|
|
23
|
+
}
|
|
24
|
+
function compareText(left, right) {
|
|
25
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reduces a described changelist to exact, already-resolved map files. Files outside the selected
|
|
29
|
+
* map scope cannot enter the historical project tree.
|
|
30
|
+
*/
|
|
31
|
+
export function planScopedRevision(options) {
|
|
32
|
+
const scopeByDepotPath = new Map(options.scope.map((file) => [file.depotPath, file]));
|
|
33
|
+
const targets = new Set();
|
|
34
|
+
const files = [];
|
|
35
|
+
const packageChanges = [];
|
|
36
|
+
for (const described of options.files) {
|
|
37
|
+
const scoped = scopeByDepotPath.get(described.depotPath);
|
|
38
|
+
if (scoped === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
const target = scoped.projectRelativePath.toLocaleLowerCase("en-US");
|
|
41
|
+
if (targets.has(target)) {
|
|
42
|
+
return planError(`Changelist contains multiple updates for ${scoped.projectRelativePath}.`, "Resolve the changelist file records before reconstructing history.");
|
|
43
|
+
}
|
|
44
|
+
targets.add(target);
|
|
45
|
+
const deletion = isDeletion(described.action);
|
|
46
|
+
const revision = described.revision;
|
|
47
|
+
const type = described.type;
|
|
48
|
+
if (!deletion && (revision === null || type === null)) {
|
|
49
|
+
return planError(`Changelist file ${described.depotPath} has no exact revision metadata.`, "Perforce must report a numeric revision and file type before history can materialize it.");
|
|
50
|
+
}
|
|
51
|
+
const priorRevision = beforeRevision(described.action, described.revision);
|
|
52
|
+
packageChanges.push({
|
|
53
|
+
action: described.action,
|
|
54
|
+
afterRevision: deletion ? null : revision,
|
|
55
|
+
beforeRevision: priorRevision,
|
|
56
|
+
depotPath: described.depotPath,
|
|
57
|
+
packageName: scoped.packageName
|
|
58
|
+
});
|
|
59
|
+
if (deletion) {
|
|
60
|
+
files.push({
|
|
61
|
+
action: "delete",
|
|
62
|
+
depotPath: described.depotPath,
|
|
63
|
+
packageName: scoped.packageName,
|
|
64
|
+
projectRelativePath: scoped.projectRelativePath
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (revision === null || type === null) {
|
|
69
|
+
return planError(`Changelist file ${described.depotPath} has no exact revision metadata.`, "Perforce must report a numeric revision and file type before history can materialize it.");
|
|
70
|
+
}
|
|
71
|
+
files.push({
|
|
72
|
+
action: isAddition(described.action) ? "add" : "edit",
|
|
73
|
+
depotPath: described.depotPath,
|
|
74
|
+
packageName: scoped.packageName,
|
|
75
|
+
projectRelativePath: scoped.projectRelativePath,
|
|
76
|
+
revision,
|
|
77
|
+
type
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
files.sort((left, right) => compareText(left.projectRelativePath, right.projectRelativePath));
|
|
81
|
+
packageChanges.sort((left, right) => compareText(left.depotPath, right.depotPath));
|
|
82
|
+
return { files, kind: "ready", packageChanges };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=revision-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-plan.js","sourceRoot":"","sources":["../src/revision-plan.ts"],"names":[],"mappings":"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"}
|