@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/perforce.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { Cache, Context, Effect, Layer, Option, Schema } from "effect";
|
|
2
|
+
import { P4Client, createP4Service } from "p4client-ts";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { MapHistoryError } from "./errors.js";
|
|
6
|
+
export class PerforceHistorySource extends Context.Service()("@ue-shed/map-history/PerforceHistorySource") {
|
|
7
|
+
}
|
|
8
|
+
/** The selected project root used to resolve local Perforce configuration and workspace context. */
|
|
9
|
+
export const PerforceProjectContext = Context.Service("@ue-shed/map-history/PerforceProjectContext");
|
|
10
|
+
const P4WhereRecord = Schema.Struct({
|
|
11
|
+
depotFile: Schema.optionalKey(Schema.String),
|
|
12
|
+
path: Schema.optionalKey(Schema.String),
|
|
13
|
+
unmap: Schema.optionalKey(Schema.String)
|
|
14
|
+
});
|
|
15
|
+
const decodeP4WhereRecords = Schema.decodeUnknownEffect(Schema.Array(P4WhereRecord));
|
|
16
|
+
const decodeP4TaggedRecords = Schema.decodeUnknownEffect(Schema.Array(Schema.Record(Schema.String, Schema.Unknown)));
|
|
17
|
+
const P4MaterializationFile = Schema.Struct({
|
|
18
|
+
action: Schema.NonEmptyString.pipe(Schema.brand("P4FileAction")),
|
|
19
|
+
changelist: Schema.Int.check(Schema.isGreaterThan(0)),
|
|
20
|
+
depotFile: Schema.NonEmptyString.pipe(Schema.brand("P4DepotPath")),
|
|
21
|
+
revision: Schema.Int.check(Schema.isGreaterThan(0)),
|
|
22
|
+
type: Schema.NonEmptyString
|
|
23
|
+
});
|
|
24
|
+
const decodeP4MaterializationFiles = Schema.decodeUnknownEffect(Schema.Array(P4MaterializationFile));
|
|
25
|
+
function optionalString(value) {
|
|
26
|
+
return value === null ? {} : { value };
|
|
27
|
+
}
|
|
28
|
+
function toSubmittedChange(change) {
|
|
29
|
+
const description = optionalString(change.description);
|
|
30
|
+
const submittedAt = optionalString(change.createdAtIso);
|
|
31
|
+
const user = optionalString(change.user);
|
|
32
|
+
return {
|
|
33
|
+
change: change.change,
|
|
34
|
+
...(description.value === undefined ? {} : { description: description.value }),
|
|
35
|
+
...(submittedAt.value === undefined ? {} : { submittedAt: submittedAt.value }),
|
|
36
|
+
...(user.value === undefined ? {} : { user: user.value })
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function toDepotFile(file) {
|
|
40
|
+
return {
|
|
41
|
+
action: file.action,
|
|
42
|
+
changelist: file.changelist,
|
|
43
|
+
depotPath: file.depotFile,
|
|
44
|
+
revision: file.revision,
|
|
45
|
+
type: file.type
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function toMapHistoryError(operation, cause) {
|
|
49
|
+
const tagged = cause;
|
|
50
|
+
const kind = tagged._tag === "P4MaterializationError"
|
|
51
|
+
? tagged.reason === "limit_exceeded"
|
|
52
|
+
? "resource_limit"
|
|
53
|
+
: "materialization"
|
|
54
|
+
: tagged._tag === "P4CommandError" && tagged.category === "authentication"
|
|
55
|
+
? "perforce_authentication"
|
|
56
|
+
: tagged._tag === "P4CommandError" &&
|
|
57
|
+
(tagged.category === "server_config" || tagged.category === "client")
|
|
58
|
+
? "perforce_configuration"
|
|
59
|
+
: "perforce_command";
|
|
60
|
+
return new MapHistoryError({
|
|
61
|
+
cause,
|
|
62
|
+
kind,
|
|
63
|
+
message: tagged.message ?? `${operation} failed.`,
|
|
64
|
+
recovery: kind === "perforce_authentication"
|
|
65
|
+
? "Authenticate with Perforce and retry."
|
|
66
|
+
: kind === "perforce_configuration"
|
|
67
|
+
? "Check the active Perforce server and client configuration."
|
|
68
|
+
: kind === "resource_limit"
|
|
69
|
+
? "Narrow the history range or raise the explicit operation limit."
|
|
70
|
+
: "Inspect the Perforce diagnostic and retry when it is safe.",
|
|
71
|
+
retrySafe: tagged._tag === "P4TimeoutError" ||
|
|
72
|
+
(tagged._tag === "P4CommandError" && tagged.category === "connection")
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function mapLineageError(kind, message) {
|
|
76
|
+
return new MapHistoryError({
|
|
77
|
+
kind,
|
|
78
|
+
message,
|
|
79
|
+
recovery: kind === "map_lineage_limit"
|
|
80
|
+
? "Choose a range with fewer direct map relocations."
|
|
81
|
+
: "Inspect the map's direct Perforce move records and resolve the ambiguity before retrying.",
|
|
82
|
+
retrySafe: false
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function taggedString(record, key) {
|
|
86
|
+
const value = record[key];
|
|
87
|
+
return typeof value === "string" ? value : undefined;
|
|
88
|
+
}
|
|
89
|
+
function positiveTaggedInt(record, key) {
|
|
90
|
+
const value = taggedString(record, key);
|
|
91
|
+
if (value === undefined)
|
|
92
|
+
return undefined;
|
|
93
|
+
const parsed = Number(value);
|
|
94
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
95
|
+
}
|
|
96
|
+
function directMovesFromFilelog(records) {
|
|
97
|
+
const moves = [];
|
|
98
|
+
for (const record of records) {
|
|
99
|
+
const depotPath = taggedString(record, "depotFile");
|
|
100
|
+
if (depotPath === undefined)
|
|
101
|
+
continue;
|
|
102
|
+
for (const key of Object.keys(record)) {
|
|
103
|
+
const match = /^action(\d+)$/u.exec(key);
|
|
104
|
+
if (match === null)
|
|
105
|
+
continue;
|
|
106
|
+
const revisionIndex = match[1];
|
|
107
|
+
const action = taggedString(record, key);
|
|
108
|
+
const change = positiveTaggedInt(record, `change${revisionIndex}`);
|
|
109
|
+
if (action === undefined || change === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
if (action === "move/add") {
|
|
112
|
+
for (const integrationKey of Object.keys(record)) {
|
|
113
|
+
const integration = new RegExp(`^how${revisionIndex},(\\d+)$`, "u").exec(integrationKey);
|
|
114
|
+
if (integration === null ||
|
|
115
|
+
taggedString(record, integrationKey) !== "moved from")
|
|
116
|
+
continue;
|
|
117
|
+
const fromDepotPath = taggedString(record, `file${revisionIndex},${integration[1]}`);
|
|
118
|
+
if (fromDepotPath !== undefined) {
|
|
119
|
+
moves.push({ change, fromDepotPath, toDepotPath: depotPath });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (action !== "move/delete")
|
|
125
|
+
continue;
|
|
126
|
+
for (const integrationKey of Object.keys(record)) {
|
|
127
|
+
const integration = /^how(\d+),(\d+)$/u.exec(integrationKey);
|
|
128
|
+
if (integration === null || taggedString(record, integrationKey) !== "moved into")
|
|
129
|
+
continue;
|
|
130
|
+
const toDepotPath = taggedString(record, `file${integration[1]},${integration[2]}`);
|
|
131
|
+
if (toDepotPath !== undefined) {
|
|
132
|
+
moves.push({ change, fromDepotPath: depotPath, toDepotPath });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const unique = new Map();
|
|
138
|
+
for (const move of moves) {
|
|
139
|
+
unique.set(`${move.change}\u0000${move.fromDepotPath}\u0000${move.toDepotPath}`, move);
|
|
140
|
+
}
|
|
141
|
+
return [...unique.values()];
|
|
142
|
+
}
|
|
143
|
+
function orderedDirectLineage(options) {
|
|
144
|
+
const outgoing = new Map();
|
|
145
|
+
const incoming = new Map();
|
|
146
|
+
for (const move of options.moves) {
|
|
147
|
+
const previousOutgoing = outgoing.get(move.fromDepotPath);
|
|
148
|
+
const previousIncoming = incoming.get(move.toDepotPath);
|
|
149
|
+
if ((previousOutgoing !== undefined &&
|
|
150
|
+
(previousOutgoing.toDepotPath !== move.toDepotPath ||
|
|
151
|
+
previousOutgoing.change !== move.change)) ||
|
|
152
|
+
(previousIncoming !== undefined &&
|
|
153
|
+
(previousIncoming.fromDepotPath !== move.fromDepotPath ||
|
|
154
|
+
previousIncoming.change !== move.change))) {
|
|
155
|
+
throw mapLineageError("ambiguous_map_lineage", `Perforce reported multiple direct move paths for ${options.selectedDepotPath}.`);
|
|
156
|
+
}
|
|
157
|
+
outgoing.set(move.fromDepotPath, move);
|
|
158
|
+
incoming.set(move.toDepotPath, move);
|
|
159
|
+
}
|
|
160
|
+
let oldest = options.selectedDepotPath;
|
|
161
|
+
const visitedBackwards = new Set([oldest]);
|
|
162
|
+
while (incoming.has(oldest)) {
|
|
163
|
+
const prior = incoming.get(oldest);
|
|
164
|
+
if (prior === undefined)
|
|
165
|
+
break;
|
|
166
|
+
oldest = prior.fromDepotPath;
|
|
167
|
+
if (visitedBackwards.has(oldest)) {
|
|
168
|
+
throw mapLineageError("ambiguous_map_lineage", `Perforce reported a direct-move cycle for ${options.selectedDepotPath}.`);
|
|
169
|
+
}
|
|
170
|
+
visitedBackwards.add(oldest);
|
|
171
|
+
}
|
|
172
|
+
const depotPaths = [oldest];
|
|
173
|
+
const orderedMoves = [];
|
|
174
|
+
const visitedForwards = new Set([oldest]);
|
|
175
|
+
while (outgoing.has(depotPaths.at(-1) ?? "")) {
|
|
176
|
+
const move = outgoing.get(depotPaths.at(-1) ?? "");
|
|
177
|
+
if (move === undefined)
|
|
178
|
+
break;
|
|
179
|
+
if (visitedForwards.has(move.toDepotPath)) {
|
|
180
|
+
throw mapLineageError("ambiguous_map_lineage", `Perforce reported a direct-move cycle for ${options.selectedDepotPath}.`);
|
|
181
|
+
}
|
|
182
|
+
orderedMoves.push(move);
|
|
183
|
+
depotPaths.push(move.toDepotPath);
|
|
184
|
+
visitedForwards.add(move.toDepotPath);
|
|
185
|
+
}
|
|
186
|
+
return { depotPaths, moves: orderedMoves };
|
|
187
|
+
}
|
|
188
|
+
function selectedProjectRoot() {
|
|
189
|
+
return Effect.map(Effect.serviceOption(PerforceProjectContext), (root) => Option.isSome(root) ? root.value : undefined);
|
|
190
|
+
}
|
|
191
|
+
function resolveBackend(backend) {
|
|
192
|
+
return Effect.gen(function* () {
|
|
193
|
+
if (typeof backend !== "function")
|
|
194
|
+
return backend;
|
|
195
|
+
return backend(yield* selectedProjectRoot());
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
export function makePerforceHistorySource(backend, resolveLocalPath = (localPath) => Effect.fail(new MapHistoryError({
|
|
199
|
+
kind: "perforce_configuration",
|
|
200
|
+
message: `The Perforce test source does not resolve ${localPath}.`,
|
|
201
|
+
recovery: "Provide a resolveLocalPath test implementation.",
|
|
202
|
+
retrySafe: false
|
|
203
|
+
})), resolveMapLineage) {
|
|
204
|
+
return PerforceHistorySource.of({
|
|
205
|
+
describeChangelist: Effect.fn("PerforceHistorySource.describeChangelist")(function* (change) {
|
|
206
|
+
const result = yield* (yield* resolveBackend(backend))
|
|
207
|
+
.describeChangelist(change)
|
|
208
|
+
.pipe(Effect.mapError((cause) => toMapHistoryError("describe changelist", cause)));
|
|
209
|
+
return {
|
|
210
|
+
...toSubmittedChange({ ...result, change }),
|
|
211
|
+
files: result.files.map((file) => ({
|
|
212
|
+
action: file.action,
|
|
213
|
+
depotPath: file.depotFile,
|
|
214
|
+
revision: file.revision,
|
|
215
|
+
type: file.type
|
|
216
|
+
})),
|
|
217
|
+
status: result.status
|
|
218
|
+
};
|
|
219
|
+
}),
|
|
220
|
+
listDepotFilesAtChange: Effect.fn("PerforceHistorySource.listDepotFilesAtChange")(function* (options) {
|
|
221
|
+
const result = yield* (yield* resolveBackend(backend))
|
|
222
|
+
.listDepotFilesAtChange(options)
|
|
223
|
+
.pipe(Effect.mapError((cause) => toMapHistoryError("list depot files", cause)));
|
|
224
|
+
return { files: result.items.map(toDepotFile), hasMore: result.hasMore };
|
|
225
|
+
}),
|
|
226
|
+
listSubmittedChangelists: Effect.fn("PerforceHistorySource.listSubmittedChangelists")(function* (options) {
|
|
227
|
+
const result = yield* (yield* resolveBackend(backend))
|
|
228
|
+
.listSubmittedChangelists(options)
|
|
229
|
+
.pipe(Effect.mapError((cause) => toMapHistoryError("list submitted changelists", cause)));
|
|
230
|
+
return {
|
|
231
|
+
hasMore: result.hasMore,
|
|
232
|
+
items: result.items.map(toSubmittedChange),
|
|
233
|
+
nextBeforeChange: result.nextBeforeChange
|
|
234
|
+
};
|
|
235
|
+
}),
|
|
236
|
+
materializeDepotFiles: Effect.fn("PerforceHistorySource.materializeDepotFiles")(function* (options) {
|
|
237
|
+
const files = yield* decodeP4MaterializationFiles(options.files.map((file) => ({
|
|
238
|
+
action: file.action,
|
|
239
|
+
changelist: file.changelist,
|
|
240
|
+
depotFile: file.depotPath,
|
|
241
|
+
revision: file.revision,
|
|
242
|
+
type: file.type
|
|
243
|
+
}))).pipe(Effect.mapError(() => new MapHistoryError({
|
|
244
|
+
kind: "materialization",
|
|
245
|
+
message: "Map History received invalid exact Perforce revision metadata.",
|
|
246
|
+
recovery: "Resolve valid depot revisions before materializing history.",
|
|
247
|
+
retrySafe: false
|
|
248
|
+
})));
|
|
249
|
+
const result = yield* (yield* resolveBackend(backend))
|
|
250
|
+
.materializeDepotFiles({ ...options, files })
|
|
251
|
+
.pipe(Effect.mapError((cause) => toMapHistoryError("materialize depot files", cause)));
|
|
252
|
+
return {
|
|
253
|
+
directory: result.directory,
|
|
254
|
+
files: result.items.map((item) => ({
|
|
255
|
+
file: toDepotFile(item.file),
|
|
256
|
+
localPath: item.localPath
|
|
257
|
+
})),
|
|
258
|
+
totalCount: result.totalCount
|
|
259
|
+
};
|
|
260
|
+
}),
|
|
261
|
+
resolveLocalPath,
|
|
262
|
+
...(resolveMapLineage === undefined ? {} : { resolveMapLineage })
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
function localRootKey(root) {
|
|
266
|
+
return resolve(root)
|
|
267
|
+
.replace(/[\\/]+$/u, "")
|
|
268
|
+
.toLocaleLowerCase("en-US");
|
|
269
|
+
}
|
|
270
|
+
const p4ConfigBypassPath = join(tmpdir(), "ue-shed-no-p4config");
|
|
271
|
+
/** Selects the client whose local workspace root is the selected project root. */
|
|
272
|
+
export function selectPerforceWorkspace(options) {
|
|
273
|
+
const matching = options.workspaces.filter((workspace) => localRootKey(workspace.root) === localRootKey(options.projectRoot));
|
|
274
|
+
if (matching.length === 1)
|
|
275
|
+
return matching[0]?.client;
|
|
276
|
+
return matching.some((workspace) => workspace.client === options.configuredClient)
|
|
277
|
+
? (options.configuredClient ?? undefined)
|
|
278
|
+
: undefined;
|
|
279
|
+
}
|
|
280
|
+
async function optionsForProject(options, projectRoot) {
|
|
281
|
+
if (projectRoot === undefined)
|
|
282
|
+
return options;
|
|
283
|
+
const projectOptions = { ...options, cwd: projectRoot };
|
|
284
|
+
const probe = new P4Client(projectOptions);
|
|
285
|
+
const localEnvironment = await probe
|
|
286
|
+
.getEnvironment({ mode: "local", refresh: true })
|
|
287
|
+
.catch(() => undefined);
|
|
288
|
+
const environment = await probe.getEnvironment({ refresh: true }).catch(() => undefined);
|
|
289
|
+
const configuredClient = localEnvironment?.p4Client ?? environment?.p4Client ?? null;
|
|
290
|
+
const user = environment?.p4User ?? localEnvironment?.p4User;
|
|
291
|
+
const workspaces = user === null || user === undefined
|
|
292
|
+
? []
|
|
293
|
+
: await probe
|
|
294
|
+
.listWorkspaces({
|
|
295
|
+
includeNonLocal: true,
|
|
296
|
+
refresh: true,
|
|
297
|
+
user
|
|
298
|
+
})
|
|
299
|
+
.catch(() => []);
|
|
300
|
+
const selectedClient = selectPerforceWorkspace({
|
|
301
|
+
configuredClient,
|
|
302
|
+
projectRoot,
|
|
303
|
+
workspaces
|
|
304
|
+
});
|
|
305
|
+
if (selectedClient === undefined)
|
|
306
|
+
return projectOptions;
|
|
307
|
+
return {
|
|
308
|
+
...projectOptions,
|
|
309
|
+
env: {
|
|
310
|
+
...(localEnvironment?.p4Port === null || localEnvironment?.p4Port === undefined
|
|
311
|
+
? {}
|
|
312
|
+
: { P4PORT: localEnvironment.p4Port }),
|
|
313
|
+
...(localEnvironment?.p4User === null || localEnvironment?.p4User === undefined
|
|
314
|
+
? {}
|
|
315
|
+
: { P4USER: localEnvironment.p4User }),
|
|
316
|
+
...options.env,
|
|
317
|
+
P4CONFIG: p4ConfigBypassPath,
|
|
318
|
+
P4CLIENT: selectedClient
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
export function perforceHistorySourceLayer(options = {}) {
|
|
323
|
+
return Layer.effect(PerforceHistorySource, Effect.gen(function* () {
|
|
324
|
+
const contexts = yield* Cache.makeWith((projectRoot) => Effect.tryPromise({
|
|
325
|
+
try: () => optionsForProject(options, projectRoot),
|
|
326
|
+
catch: (cause) => cause
|
|
327
|
+
}).pipe(Effect.map((resolvedOptions) => ({
|
|
328
|
+
client: new P4Client(resolvedOptions),
|
|
329
|
+
service: createP4Service(resolvedOptions)
|
|
330
|
+
}))), { capacity: 4 });
|
|
331
|
+
const contextForProject = (projectRoot) => Cache.get(contexts, projectRoot);
|
|
332
|
+
const backendForProject = (projectRoot) => {
|
|
333
|
+
const service = contextForProject(projectRoot);
|
|
334
|
+
return {
|
|
335
|
+
describeChangelist: (change) => service.pipe(Effect.flatMap((current) => current.service.describeChangelist(change))),
|
|
336
|
+
listDepotFilesAtChange: (request) => service.pipe(Effect.flatMap((current) => current.service.listDepotFilesAtChange(request))),
|
|
337
|
+
listSubmittedChangelists: (request) => service.pipe(Effect.flatMap((current) => current.service.listSubmittedChangelists(request))),
|
|
338
|
+
materializeDepotFiles: (request) => service.pipe(Effect.flatMap((current) => current.service.materializeDepotFiles(request)))
|
|
339
|
+
};
|
|
340
|
+
};
|
|
341
|
+
const where = Effect.fn("PerforceHistorySource.where")(function* (path) {
|
|
342
|
+
const projectRoot = yield* selectedProjectRoot();
|
|
343
|
+
const context = yield* contextForProject(projectRoot).pipe(Effect.mapError((cause) => toMapHistoryError("resolve Perforce path", cause)));
|
|
344
|
+
const raw = yield* Effect.tryPromise({
|
|
345
|
+
try: () => context.client.runTaggedJson(["where", path]),
|
|
346
|
+
catch: (cause) => toMapHistoryError("resolve Perforce path", cause)
|
|
347
|
+
});
|
|
348
|
+
const records = yield* decodeP4WhereRecords(raw).pipe(Effect.mapError(() => new MapHistoryError({
|
|
349
|
+
kind: "ambiguous_depot_mapping",
|
|
350
|
+
message: `Perforce returned an invalid mapping for ${path}.`,
|
|
351
|
+
recovery: "Check the Perforce client mapping and retry.",
|
|
352
|
+
retrySafe: false
|
|
353
|
+
})));
|
|
354
|
+
if (records.length !== 1 ||
|
|
355
|
+
records[0]?.depotFile === undefined ||
|
|
356
|
+
records[0].unmap !== undefined) {
|
|
357
|
+
return yield* Effect.fail(new MapHistoryError({
|
|
358
|
+
kind: "ambiguous_depot_mapping",
|
|
359
|
+
message: `Perforce could not map ${path} to exactly one depot file.`,
|
|
360
|
+
recovery: "Use a project path covered by one unambiguous Perforce client mapping.",
|
|
361
|
+
retrySafe: false
|
|
362
|
+
}));
|
|
363
|
+
}
|
|
364
|
+
return records[0];
|
|
365
|
+
});
|
|
366
|
+
const resolveLocalPath = Effect.fn("PerforceHistorySource.resolveLocalPath")(function* (localPath) {
|
|
367
|
+
const mapping = yield* where(localPath);
|
|
368
|
+
if (mapping.depotFile === undefined) {
|
|
369
|
+
return yield* Effect.fail(new MapHistoryError({
|
|
370
|
+
kind: "ambiguous_depot_mapping",
|
|
371
|
+
message: `Perforce did not return a depot path for ${localPath}.`,
|
|
372
|
+
recovery: "Check the Perforce client mapping and retry.",
|
|
373
|
+
retrySafe: false
|
|
374
|
+
}));
|
|
375
|
+
}
|
|
376
|
+
return { depotPath: mapping.depotFile };
|
|
377
|
+
});
|
|
378
|
+
const resolveMapLineage = Effect.fn("PerforceHistorySource.resolveMapLineage")(function* (request) {
|
|
379
|
+
const projectRoot = yield* selectedProjectRoot();
|
|
380
|
+
const context = yield* contextForProject(projectRoot).pipe(Effect.mapError((cause) => toMapHistoryError("resolve map lineage", cause)));
|
|
381
|
+
const pending = [request.depotPath];
|
|
382
|
+
const queried = new Set();
|
|
383
|
+
const discovered = new Map();
|
|
384
|
+
while (pending.length > 0) {
|
|
385
|
+
const depotPath = pending.shift();
|
|
386
|
+
if (depotPath === undefined || queried.has(depotPath))
|
|
387
|
+
continue;
|
|
388
|
+
queried.add(depotPath);
|
|
389
|
+
const raw = yield* Effect.tryPromise({
|
|
390
|
+
try: () => context.client.runTaggedJson([
|
|
391
|
+
"filelog",
|
|
392
|
+
"-i",
|
|
393
|
+
"-m",
|
|
394
|
+
String(request.maxRevisionRecords),
|
|
395
|
+
depotPath
|
|
396
|
+
]),
|
|
397
|
+
catch: (cause) => toMapHistoryError("resolve map lineage", cause)
|
|
398
|
+
});
|
|
399
|
+
const records = yield* decodeP4TaggedRecords(raw).pipe(Effect.mapError(() => mapLineageError("ambiguous_map_lineage", `Perforce returned invalid filelog records for ${depotPath}.`)));
|
|
400
|
+
for (const move of directMovesFromFilelog(records)) {
|
|
401
|
+
discovered.set(`${move.change}\u0000${move.fromDepotPath}\u0000${move.toDepotPath}`, move);
|
|
402
|
+
if (!queried.has(move.fromDepotPath))
|
|
403
|
+
pending.push(move.fromDepotPath);
|
|
404
|
+
if (!queried.has(move.toDepotPath))
|
|
405
|
+
pending.push(move.toDepotPath);
|
|
406
|
+
}
|
|
407
|
+
if (discovered.size > request.maxMoves) {
|
|
408
|
+
return yield* Effect.fail(mapLineageError("map_lineage_limit", `Map lineage exceeds the direct-move limit of ${request.maxMoves}.`));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
const ordered = yield* Effect.try({
|
|
412
|
+
try: () => orderedDirectLineage({
|
|
413
|
+
moves: [...discovered.values()],
|
|
414
|
+
selectedDepotPath: request.depotPath
|
|
415
|
+
}),
|
|
416
|
+
catch: (cause) => cause instanceof MapHistoryError
|
|
417
|
+
? cause
|
|
418
|
+
: mapLineageError("ambiguous_map_lineage", `Could not order the direct move lineage for ${request.depotPath}.`)
|
|
419
|
+
});
|
|
420
|
+
const locations = [];
|
|
421
|
+
for (const depotPath of ordered.depotPaths) {
|
|
422
|
+
const mapping = yield* where(depotPath);
|
|
423
|
+
if (mapping.path === undefined) {
|
|
424
|
+
return yield* Effect.fail(new MapHistoryError({
|
|
425
|
+
kind: "ambiguous_depot_mapping",
|
|
426
|
+
message: `Perforce did not return a workspace path for ${depotPath}.`,
|
|
427
|
+
recovery: "Check the Perforce client mapping and retry.",
|
|
428
|
+
retrySafe: false
|
|
429
|
+
}));
|
|
430
|
+
}
|
|
431
|
+
locations.push({ depotPath, localPath: mapping.path });
|
|
432
|
+
}
|
|
433
|
+
return { locations, moves: ordered.moves };
|
|
434
|
+
});
|
|
435
|
+
return makePerforceHistorySource(backendForProject, resolveLocalPath, resolveMapLineage);
|
|
436
|
+
}));
|
|
437
|
+
}
|
|
438
|
+
export function makePerforceHistorySourceTestLayer(source) {
|
|
439
|
+
return Layer.succeed(PerforceHistorySource, PerforceHistorySource.of(source));
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=perforce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perforce.js","sourceRoot":"","sources":["../src/perforce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { SavedWorldActor } from "@ue-shed/protocol";
|
|
2
|
+
import type { ActorIdentity, MapHistoryDiagnostic, PerforceMapHistoryDocument, PerforceMapRevision, UnclassifiedPackageChange } from "./schema.js";
|
|
3
|
+
export interface MapHistoryPlaybackActor {
|
|
4
|
+
readonly actor: SavedWorldActor;
|
|
5
|
+
readonly identity: ActorIdentity;
|
|
6
|
+
/** Stable GUID-first key shared with Map History changes and World Log selection. */
|
|
7
|
+
readonly key: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MapHistoryPlaybackState {
|
|
10
|
+
readonly actors: ReadonlyMap<string, MapHistoryPlaybackActor>;
|
|
11
|
+
/** Diagnostics caused by preserving actor identity while constructing the local playback state. */
|
|
12
|
+
readonly diagnostics: ReadonlyArray<MapHistoryDiagnostic>;
|
|
13
|
+
}
|
|
14
|
+
export type MapHistoryPlaybackFrame = {
|
|
15
|
+
readonly actors: ReadonlyArray<MapHistoryPlaybackActor>;
|
|
16
|
+
readonly completeness: "complete" | "partial";
|
|
17
|
+
readonly diagnostics: ReadonlyArray<MapHistoryDiagnostic>;
|
|
18
|
+
readonly kind: "range_start";
|
|
19
|
+
readonly state: MapHistoryPlaybackState;
|
|
20
|
+
readonly unclassifiedPackageChanges: ReadonlyArray<UnclassifiedPackageChange>;
|
|
21
|
+
} | {
|
|
22
|
+
readonly actors: ReadonlyArray<MapHistoryPlaybackActor>;
|
|
23
|
+
readonly completeness: "complete" | "partial";
|
|
24
|
+
readonly diagnostics: ReadonlyArray<MapHistoryDiagnostic>;
|
|
25
|
+
readonly kind: "revision";
|
|
26
|
+
readonly revision: PerforceMapRevision;
|
|
27
|
+
readonly revisionIndex: number;
|
|
28
|
+
readonly state: MapHistoryPlaybackState;
|
|
29
|
+
readonly unclassifiedPackageChanges: ReadonlyArray<UnclassifiedPackageChange>;
|
|
30
|
+
};
|
|
31
|
+
/** Creates the actor state immediately before the requested history range. */
|
|
32
|
+
export declare function createMapHistoryPlaybackState(input: {
|
|
33
|
+
readonly history: PerforceMapHistoryDocument;
|
|
34
|
+
}): MapHistoryPlaybackState;
|
|
35
|
+
/** Applies one submitted map revision to a playback state without mutating the prior state. */
|
|
36
|
+
export declare function applyMapHistoryRevision(input: {
|
|
37
|
+
readonly revision: PerforceMapRevision;
|
|
38
|
+
readonly state: MapHistoryPlaybackState;
|
|
39
|
+
}): MapHistoryPlaybackState;
|
|
40
|
+
/** Reverts one submitted map revision without mutating the later playback state. */
|
|
41
|
+
export declare function revertMapHistoryRevision(input: {
|
|
42
|
+
readonly revision: PerforceMapRevision;
|
|
43
|
+
readonly state: MapHistoryPlaybackState;
|
|
44
|
+
}): MapHistoryPlaybackState;
|
|
45
|
+
/**
|
|
46
|
+
* Reconstructs the range-start frame or the saved state immediately after one in-range submitted
|
|
47
|
+
* changelist. This performs no Perforce or filesystem work and retains only the requested state.
|
|
48
|
+
*/
|
|
49
|
+
export declare function mapHistoryPlaybackFrameAt(input: {
|
|
50
|
+
readonly history: PerforceMapHistoryDocument;
|
|
51
|
+
readonly revisionIndex: number | undefined;
|
|
52
|
+
}): MapHistoryPlaybackFrame;
|
|
53
|
+
/**
|
|
54
|
+
* Returns `undefined` when a complete comparison is impossible; otherwise verifies that replayed
|
|
55
|
+
* actor facts exactly equal the retained end-of-range saved-world projection.
|
|
56
|
+
*/
|
|
57
|
+
export declare function mapHistoryPlaybackMatchesRangeEnd(input: {
|
|
58
|
+
readonly history: PerforceMapHistoryDocument;
|
|
59
|
+
}): boolean | undefined;
|
|
60
|
+
//# sourceMappingURL=playback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playback.d.ts","sourceRoot":"","sources":["../src/playback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EACX,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,qFAAqF;IACrF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC9D,mGAAmG;IACnG,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC1D;AAED,MAAM,MAAM,uBAAuB,GAChC;IACA,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACxD,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,0BAA0B,EAAE,aAAa,CAAC,yBAAyB,CAAC,CAAC;CAC7E,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACxD,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,0BAA0B,EAAE,aAAa,CAAC,yBAAyB,CAAC,CAAC;CAC7E,CAAC;AA+GL,8EAA8E;AAC9E,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACpD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC7C,GAAG,uBAAuB,CAE1B;AAED,+FAA+F;AAC/F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC9C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;CACxC,GAAG,uBAAuB,CAI1B;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;CACxC,GAAG,uBAAuB,CAI1B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,GAAG,uBAAuB,CAwC1B;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACxD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC7C,GAAG,OAAO,GAAG,SAAS,CAsBtB"}
|