Skip to content
Source
Sign inSign up

VcsDriver.ts

89 lines3.0 KB

1import * as Context from "effect/Context";
2import type * as Effect from "effect/Effect";
3​
4import type {
5 VcsError,
6 VcsInitInput,
7 VcsListRemotesResult,
8 VcsListWorkspaceFilesResult,
9 VcsRepositoryIdentity,
10} from "@t3tools/contracts";
11import { CheckpointRef } from "@t3tools/contracts";
12import * as VcsProcess from "./VcsProcess.ts";
13​
14export interface VcsCaptureCheckpointInput {
15 readonly cwd: string;
16 readonly checkpointRef: CheckpointRef;
18​
19export interface VcsRestoreCheckpointInput {
20 readonly cwd: string;
21 readonly checkpointRef: CheckpointRef;
22 readonly fallbackToHead?: boolean;
24​
25export const CHECKPOINT_DIFF_MAX_OUTPUT_BYTES = 10_000_000;
26​
27export interface VcsDiffCheckpointsInput {
28 readonly cwd: string;
29 readonly fromCheckpointRef: CheckpointRef;
30 readonly toCheckpointRef: CheckpointRef;
31 readonly fallbackFromToHead?: boolean;
32 readonly ignoreWhitespace: boolean;
33 readonly format?: "patch" | "numstat";
34 /** Maximum bytes collected from the diff command. */
35 readonly maxOutputBytes?: number;
36 /** An empty list yields an empty diff. */
37 readonly filePaths?: ReadonlyArray<string>;
39​
40export interface VcsListAuthoredPathsInput {
41 readonly cwd: string;
42 readonly fromCheckpointRef: CheckpointRef;
43 readonly toCheckpointRef: CheckpointRef;
45​
46export interface VcsDeleteCheckpointRefsInput {
47 readonly cwd: string;
48 readonly checkpointRefs: ReadonlyArray<CheckpointRef>;
50​
51export interface VcsCheckpointOps {
52 readonly captureCheckpoint: (input: VcsCaptureCheckpointInput) => Effect.Effect<void, VcsError>;
53 readonly hasCheckpointRef: (
54 input: Omit<VcsRestoreCheckpointInput, "fallbackToHead">,
55 ) => Effect.Effect<boolean, VcsError>;
56 readonly restoreCheckpoint: (
57 input: VcsRestoreCheckpointInput,
58 ) => Effect.Effect<boolean, VcsError>;
59 readonly diffCheckpoints: (input: VcsDiffCheckpointsInput) => Effect.Effect<string, VcsError>;
60 readonly listAuthoredPaths: (
61 input: VcsListAuthoredPathsInput,
62 ) => Effect.Effect<ReadonlySet<string> | null, VcsError>;
63 readonly deleteCheckpointRefs: (
64 input: VcsDeleteCheckpointRefsInput,
65 ) => Effect.Effect<void, VcsError>;
67​
68export class VcsDriver extends Context.Service<
69 VcsDriver,
70 {
71 readonly execute: (
72 input: Omit<VcsProcess.VcsProcessInput, "command">,
73 ) => Effect.Effect<VcsProcess.VcsProcessOutput, VcsError>;
74 readonly checkpoints: VcsCheckpointOps;
75 readonly detectRepository: (
76 cwd: string,
77 ) => Effect.Effect<VcsRepositoryIdentity | null, VcsError>;
78 readonly isInsideWorkTree: (cwd: string) => Effect.Effect<boolean, VcsError>;
79 readonly listWorkspaceFiles: (
80 cwd: string,
81 ) => Effect.Effect<VcsListWorkspaceFilesResult, VcsError>;
82 readonly listRemotes: (cwd: string) => Effect.Effect<VcsListRemotesResult, VcsError>;
83 readonly filterIgnoredPaths: (
84 cwd: string,
85 relativePaths: ReadonlyArray<string>,
86 ) => Effect.Effect<ReadonlyArray<string>, VcsError>;
87 readonly initRepository: (input: VcsInitInput) => Effect.Effect<void, VcsError>;
88 }
89>()("t3/vcs/VcsDriver") {}