447a1170ce
Task 2 of the native-surfaces migration plan. GitBaselineAdapter resolves a
document's HEAD blob via the built-in vscode.git extension (hardened with a
.git/logs/HEAD watch that nudges repo.status(), since the git extension's own
watcher doesn't reliably notice out-of-band commits on non-workspace-folder
repos in the E2E host). DiffViewController is reworked into a baseline router:
head mode (git-tracked, never persisted, re-read on commit) vs snapshot mode
(captured on CoeditingRegistry entry, re-pinned by "Mark Changes as Reviewed"
— renamed from cowriting.pinDiffBaseline, D14). The shipped machine-landing
baseline advance (#48/INV-18) is retired: a landed Claude edit now stays a
visible change-since-baseline until commit or review (INV-7/D21). Legacy
on-disk reasons ("opened"/"machine-landing") migrate to "entered" via
BaselineStore.normalizeReason on load.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
49 lines
2.5 KiB
TypeScript
49 lines
2.5 KiB
TypeScript
import * as assert from "node:assert";
|
|
import { execFileSync } from "node:child_process";
|
|
import * as fs from "node:fs";
|
|
import * as os from "node:os";
|
|
import * as path from "node:path";
|
|
import * as vscode from "vscode";
|
|
import { activateApi, settle, settleUntil } from "./helpers";
|
|
|
|
suite("baseline router (PUC-1, INV-7/D13/D14)", () => {
|
|
test("snapshot mode: enter captures; markReviewed re-pins clean", async () => {
|
|
const api = await activateApi();
|
|
const doc = await vscode.workspace.openTextDocument({ language: "markdown", content: "one\n" });
|
|
const ed = await vscode.window.showTextDocument(doc);
|
|
await vscode.commands.executeCommand("cowriting.coeditDocument");
|
|
await settle();
|
|
assert.strictEqual(api.diffViewController.modeOf(doc.uri.toString()), "snapshot");
|
|
assert.strictEqual(api.diffViewController.getBaseline(doc.uri.toString())?.text, "one\n");
|
|
await ed.edit((b) => b.insert(new vscode.Position(1, 0), "two\n"));
|
|
await vscode.commands.executeCommand("cowriting.markReviewed");
|
|
const b = api.diffViewController.getBaseline(doc.uri.toString());
|
|
assert.strictEqual(b?.text, "one\ntwo\n");
|
|
assert.strictEqual(b?.reason, "pinned");
|
|
});
|
|
|
|
test("head mode: baseline = HEAD; commit advances it", async function () {
|
|
this.timeout(30000);
|
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "cw-git-"));
|
|
const git = (...a: string[]) => execFileSync("git", ["-C", dir, ...a], { encoding: "utf8" });
|
|
git("init", "-q");
|
|
fs.writeFileSync(path.join(dir, "doc.md"), "committed\n");
|
|
git("add", "doc.md");
|
|
git("-c", "user.name=t", "-c", "user.email=t@t", "commit", "-qm", "c1");
|
|
const api = await activateApi();
|
|
const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(path.join(dir, "doc.md")));
|
|
const ed = await vscode.window.showTextDocument(doc);
|
|
await vscode.commands.executeCommand("cowriting.coeditDocument");
|
|
await settleUntil(() => api.diffViewController.modeOf(doc.uri.toString()) === "head", 10000);
|
|
assert.strictEqual(api.diffViewController.getBaseline(doc.uri.toString())?.text, "committed\n");
|
|
await ed.edit((b) => b.insert(new vscode.Position(1, 0), "uncommitted\n"));
|
|
await doc.save();
|
|
git("-c", "user.name=t", "-c", "user.email=t@t", "commit", "-aqm", "c2");
|
|
await settleUntil(
|
|
() => api.diffViewController.getBaseline(doc.uri.toString())?.text === "committed\nuncommitted\n",
|
|
15000,
|
|
);
|
|
assert.strictEqual(api.diffViewController.getBaseline(doc.uri.toString())?.reason, "head");
|
|
});
|
|
});
|