106 lines · 4.5 KB · TypeScript
RawDownload
// @effect-diagnostics nodeBuiltinImport:off - builds real worktree layouts on disk.import * as NodeServices from "@effect/platform-node/NodeServices";import { assert, describe, it } from "@effect/vitest";import * as NodeFS from "node:fs";import * as NodeOS from "node:os";import * as NodePath from "node:path";import * as Effect from "effect/Effect"; import { resolveGitWorktreePath, resolveWorktreeT3Home } from "./devHome.ts"; const makeRepo = (  kind:    | "worktree"    | "checkout"    | "bare"    | "submodule"    | "unreadable-git-file"    | "bare-repo-worktree"    | "custom-common-dir-worktree",) =>  Effect.acquireRelease(    Effect.sync(() => {      const root = NodeFS.mkdtempSync(NodePath.join(NodeOS.tmpdir(), "t3-devhome-"));      if (kind === "worktree") {        NodeFS.writeFileSync(NodePath.join(root, ".git"), "gitdir: /elsewhere/.git/worktrees/x\n");      } else if (kind === "bare-repo-worktree") {        // `git worktree add` from a bare repo: the common dir is `<name>.git`.        NodeFS.writeFileSync(NodePath.join(root, ".git"), "gitdir: /srv/myrepo.git/worktrees/x\n");      } else if (kind === "custom-common-dir-worktree") {        // $GIT_COMMON_DIR need not be named `.git` at all.        NodeFS.writeFileSync(NodePath.join(root, ".git"), "gitdir: /srv/store/worktrees/x\n");      } else if (kind === "submodule") {        NodeFS.writeFileSync(NodePath.join(root, ".git"), "gitdir: ../.git/modules/sub\n");      } else if (kind === "unreadable-git-file") {        NodeFS.writeFileSync(NodePath.join(root, ".git"), "not a gitdir pointer\n");      } else if (kind === "checkout") {        NodeFS.mkdirSync(NodePath.join(root, ".git"));      }      const nested = NodePath.join(root, "apps", "web", "src");      NodeFS.mkdirSync(nested, { recursive: true });      return { root, nested };    }),    ({ root }) => Effect.sync(() => NodeFS.rmSync(root, { recursive: true, force: true })),  ); describe("resolveGitWorktreePath", () => {  it.effect("finds a worktree root from a nested directory", () =>    Effect.gen(function* () {      const { root, nested } = yield* makeRepo("worktree");      assert.equal(yield* resolveGitWorktreePath(nested), NodePath.resolve(root));    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );   it.effect("reports a main checkout as not a linked worktree", () =>    Effect.gen(function* () {      const { nested } = yield* makeRepo("checkout");      assert.equal(yield* resolveGitWorktreePath(nested), undefined);    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );   it.effect("reports a directory outside a repository", () =>    Effect.gen(function* () {      const { nested } = yield* makeRepo("bare");      assert.equal(yield* resolveGitWorktreePath(nested), undefined);    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );   it.effect("reports a submodule as not a linked worktree", () =>    Effect.gen(function* () {      const { nested } = yield* makeRepo("submodule");      assert.equal(yield* resolveGitWorktreePath(nested), undefined);    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );   it.effect("reports a .git file without a usable gitdir pointer", () =>    Effect.gen(function* () {      const { nested } = yield* makeRepo("unreadable-git-file");      assert.equal(yield* resolveGitWorktreePath(nested), undefined);    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );   it.effect("finds a worktree of a bare repository", () =>    Effect.gen(function* () {      const { root, nested } = yield* makeRepo("bare-repo-worktree");      assert.equal(yield* resolveGitWorktreePath(nested), NodePath.resolve(root));    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );   it.effect("finds a worktree whose common dir is not named .git", () =>    Effect.gen(function* () {      const { root, nested } = yield* makeRepo("custom-common-dir-worktree");      assert.equal(yield* resolveGitWorktreePath(nested), NodePath.resolve(root));    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );}); describe("resolveWorktreeT3Home", () => {  it.effect("answers with .t3 before the dev runner creates it", () =>    Effect.gen(function* () {      const { root, nested } = yield* makeRepo("worktree");      const home = yield* resolveWorktreeT3Home(nested);      assert.equal(home, NodePath.join(NodePath.resolve(root), ".t3"));      assert.isFalse(NodeFS.existsSync(home ?? ""));    }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)),  );});