mirror of
https://github.com/getpaseo/paseo.git
synced 2026-08-14 12:23:16 +00:00
test(server): real-fs coverage for Linux walker gitignore skip (#806)
Adds a primitive test that initialises a real git repo, writes a .gitignore covering an ignored subtree, and asserts the Linux working tree walker registers watchers for kept directories but not for gitignored ones. Exercises the real `git ls-files -o -i --directory --exclude-standard` shell-out the new code path depends on.
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { execSync } from "node:child_process";
|
import { execSync } from "node:child_process";
|
||||||
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
||||||
|
import { readdir } from "node:fs/promises";
|
||||||
import { tmpdir } from "node:os";
|
import { tmpdir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
||||||
@@ -11,11 +12,13 @@ import {
|
|||||||
import {
|
import {
|
||||||
getCheckoutDiff as getCheckoutDiffUncached,
|
getCheckoutDiff as getCheckoutDiffUncached,
|
||||||
getCheckoutStatus as getCheckoutStatusUncached,
|
getCheckoutStatus as getCheckoutStatusUncached,
|
||||||
|
resolveAbsoluteGitDir as resolveAbsoluteGitDirReal,
|
||||||
type CheckoutDiffCompare,
|
type CheckoutDiffCompare,
|
||||||
type CheckoutDiffResult,
|
type CheckoutDiffResult,
|
||||||
type CheckoutStatusGit,
|
type CheckoutStatusGit,
|
||||||
type PullRequestStatusResult,
|
type PullRequestStatusResult,
|
||||||
} from "../utils/checkout-git.js";
|
} from "../utils/checkout-git.js";
|
||||||
|
import { runGitCommand as runGitCommandReal } from "../utils/run-git-command.js";
|
||||||
import {
|
import {
|
||||||
WorkspaceGitServiceImpl,
|
WorkspaceGitServiceImpl,
|
||||||
type WorkspaceGitRuntimeSnapshot,
|
type WorkspaceGitRuntimeSnapshot,
|
||||||
@@ -207,6 +210,7 @@ interface CreateServiceOptions {
|
|||||||
runGitFetch?: ReturnType<typeof vi.fn>;
|
runGitFetch?: ReturnType<typeof vi.fn>;
|
||||||
runGitCommand?: ReturnType<typeof vi.fn>;
|
runGitCommand?: ReturnType<typeof vi.fn>;
|
||||||
watch?: ReturnType<typeof vi.fn>;
|
watch?: ReturnType<typeof vi.fn>;
|
||||||
|
readdir?: ReturnType<typeof vi.fn>;
|
||||||
now?: () => Date;
|
now?: () => Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1454,4 +1458,48 @@ describe("WorkspaceGitServiceImpl D2 read methods", () => {
|
|||||||
|
|
||||||
service.dispose();
|
service.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Linux working tree walker excludes gitignored directories", async () => {
|
||||||
|
const originalPlatform = process.platform;
|
||||||
|
Object.defineProperty(process, "platform", { configurable: true, value: "linux" });
|
||||||
|
|
||||||
|
const tempDir = realpathSync(mkdtempSync(join(tmpdir(), "workspace-git-service-ignored-")));
|
||||||
|
const repoDir = join(tempDir, "repo");
|
||||||
|
mkdirSync(join(repoDir, "ignored", "deep"), { recursive: true });
|
||||||
|
mkdirSync(join(repoDir, "kept"), { recursive: true });
|
||||||
|
execSync("git init -b main", { cwd: repoDir, stdio: "pipe" });
|
||||||
|
writeFileSync(join(repoDir, ".gitignore"), "ignored/\n");
|
||||||
|
writeFileSync(join(repoDir, "ignored", "log.txt"), "noise\n");
|
||||||
|
writeFileSync(join(repoDir, "ignored", "deep", "log.txt"), "noise\n");
|
||||||
|
writeFileSync(join(repoDir, "kept", "file.txt"), "keep\n");
|
||||||
|
|
||||||
|
const watchedPaths: string[] = [];
|
||||||
|
const watchSpy = (watchPath: string) => {
|
||||||
|
watchedPaths.push(watchPath);
|
||||||
|
return { close: vi.fn(), on: vi.fn().mockReturnThis() };
|
||||||
|
};
|
||||||
|
|
||||||
|
const service = createService({
|
||||||
|
watch: watchSpy as never,
|
||||||
|
readdir: readdir as never,
|
||||||
|
runGitCommand: runGitCommandReal as never,
|
||||||
|
getCheckoutStatus: getCheckoutStatusUncached as never,
|
||||||
|
resolveAbsoluteGitDir: resolveAbsoluteGitDirReal as never,
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const subscription = await service.requestWorkingTreeWatch(repoDir, vi.fn());
|
||||||
|
|
||||||
|
const ignoredRoot = join(repoDir, "ignored");
|
||||||
|
expect(watchedPaths.filter((path) => path.startsWith(ignoredRoot))).toEqual([]);
|
||||||
|
expect(watchedPaths).toContain(repoDir);
|
||||||
|
expect(watchedPaths).toContain(join(repoDir, "kept"));
|
||||||
|
|
||||||
|
subscription.unsubscribe();
|
||||||
|
} finally {
|
||||||
|
service.dispose();
|
||||||
|
rmSync(tempDir, { recursive: true, force: true });
|
||||||
|
Object.defineProperty(process, "platform", { configurable: true, value: originalPlatform });
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user