mirror of
https://github.com/getpaseo/paseo.git
synced 2026-11-06 16:34:36 +00:00
112 lines
4.0 KiB
TypeScript
112 lines
4.0 KiB
TypeScript
import { performance } from "node:perf_hooks";
|
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
import { resolve } from "node:path";
|
|
import {
|
|
encodeDiffFrame,
|
|
DiffOpcode,
|
|
type DiffFrame,
|
|
} from "@getpaseo/protocol/binary-frames/index";
|
|
import { DiffSubscriptions } from "../src/server/diff/index.js";
|
|
import { createFileObserver } from "../src/server/file-observer/index.js";
|
|
import { runGitCommand } from "../src/utils/run-git-command.js";
|
|
import { parseAndHighlightDiff } from "../src/server/utils/diff-highlighter.js";
|
|
import { validateWSOutboundMessage } from "@getpaseo/protocol/validation/ws-outbound";
|
|
|
|
const cwd = resolve(import.meta.dirname, "../../..");
|
|
const artifacts = resolve(cwd, ".artifacts/diff-subscription");
|
|
await mkdir(artifacts, { recursive: true });
|
|
const pinnedHead = "3ed57e9dd";
|
|
const observer = createFileObserver();
|
|
const engine = new DiffSubscriptions({
|
|
async requestWorkingTreeWatch(root, changed) {
|
|
const watch = await observer.subscribe(root, () => changed(), {
|
|
ignore: [resolve(root, ".git")],
|
|
});
|
|
return {
|
|
repoRoot: root,
|
|
unsubscribe: async () => {
|
|
await watch.unsubscribe();
|
|
},
|
|
};
|
|
},
|
|
});
|
|
try {
|
|
for (const count of [1, 30]) {
|
|
const [base, head] = await Promise.all([
|
|
runGitCommand(["rev-parse", `${pinnedHead}~${count}`], { cwd }),
|
|
runGitCommand(["rev-parse", pinnedHead], { cwd }),
|
|
]);
|
|
const started = performance.now();
|
|
const frames: DiffFrame[] = [];
|
|
const encoded: Uint8Array[] = [];
|
|
const subscription = await engine.subscribe(
|
|
{
|
|
cwd,
|
|
base: { kind: "rev", rev: base.stdout.trim() },
|
|
head: { kind: "rev", rev: head.stdout.trim() },
|
|
},
|
|
async (frame) => {
|
|
frames.push(frame);
|
|
encoded.push(encodeDiffFrame(frame));
|
|
},
|
|
);
|
|
await subscription.start();
|
|
const coldMs = performance.now() - started;
|
|
await subscription.release();
|
|
const raw = await runGitCommand(["diff", base.stdout.trim(), head.stdout.trim()], {
|
|
cwd,
|
|
maxOutputBytes: 50 * 1024 * 1024,
|
|
});
|
|
const contentAt = async (sha: string, path: string) => {
|
|
const result = await runGitCommand(["show", `${sha}:${path}`], {
|
|
cwd,
|
|
acceptExitCodes: [0, 128],
|
|
});
|
|
return result.exitCode === 0 ? result.stdout : null;
|
|
};
|
|
const legacyFiles = await parseAndHighlightDiff(raw.stdout, cwd, {
|
|
getOldFileContent: (file) => contentAt(base.stdout.trim(), file.path),
|
|
getNewFileContent: (file) => contentAt(head.stdout.trim(), file.path),
|
|
});
|
|
const legacy = JSON.stringify({
|
|
type: "session",
|
|
message: {
|
|
type: "checkout_diff_update",
|
|
payload: { cwd, subscriptionId: "benchmark", files: legacyFiles, error: null },
|
|
},
|
|
});
|
|
const parseStart = performance.now();
|
|
const validation = validateWSOutboundMessage(JSON.parse(legacy));
|
|
if (!validation.success) throw validation.error;
|
|
const jsonParseValidationMs = performance.now() - parseStart;
|
|
const begin = frames.find((frame) => frame.opcode === DiffOpcode.Begin);
|
|
const end = frames.findLast((frame) => frame.opcode === DiffOpcode.End);
|
|
if (!begin || begin.opcode !== DiffOpcode.Begin || !end || end.opcode !== DiffOpcode.End)
|
|
throw new Error("Revision was not delimited");
|
|
if (end.error) throw new Error(end.error.message);
|
|
const metrics = {
|
|
pinnedHead: head.stdout.trim(),
|
|
count,
|
|
files: begin.entries.length,
|
|
rawPatchBytes: Buffer.byteLength(raw.stdout),
|
|
encodedBytes: encoded.reduce((sum, bytes) => sum + bytes.length, 0),
|
|
legacyJsonBytes: Buffer.byteLength(legacy),
|
|
coldMs,
|
|
jsonParseValidationMs,
|
|
omitted: end.omitted,
|
|
};
|
|
console.log(JSON.stringify(metrics));
|
|
await writeFile(
|
|
resolve(artifacts, `corpus-${count}.json`),
|
|
JSON.stringify({
|
|
metrics,
|
|
legacy,
|
|
frames: encoded.map((bytes) => Buffer.from(bytes).toString("base64")),
|
|
}),
|
|
);
|
|
}
|
|
} finally {
|
|
await engine.close();
|
|
await observer.close();
|
|
}
|