refactor(repository): add cache service (#28184)

This commit is contained in:
Shoubhit Dash
2026-05-18 21:25:38 +05:30
committed by GitHub
parent f7b5576bcc
commit 96192495ae
12 changed files with 64 additions and 35 deletions

View File

@@ -1,5 +1,5 @@
import path from "path"
import { Effect } from "effect"
import { Context, Effect, Layer } from "effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Flock } from "@opencode-ai/core/util/flock"
import { Git } from "@/git"
@@ -21,6 +21,18 @@ export type Result = {
branch?: string
}
export type EnsureInput = {
reference: RemoteReference
refresh?: boolean
branch?: string
}
export interface Interface {
ensure: (input: EnsureInput) => Effect.Effect<Result, unknown>
}
export class Service extends Context.Service<Service, Interface>()("@opencode/RepositoryCache") {}
function statusForRepository(input: { reuse: boolean; refresh?: boolean; branchMatches?: boolean }) {
if (!input.reuse) return "cloned" as const
if (input.branchMatches === false) return "refreshed" as const
@@ -43,12 +55,8 @@ function resetTarget(input: {
return "HEAD"
}
export const ensure = Effect.fn("RepositoryCache.ensure")(function* (
input: {
reference: RemoteReference
refresh?: boolean
branch?: string
},
const ensureWithServices = Effect.fn("RepositoryCache.ensureWithServices")(function* (
input: EnsureInput,
services: {
fs: AppFileSystem.Interface
git: Git.Interface
@@ -144,4 +152,28 @@ export const ensure = Effect.fn("RepositoryCache.ensure")(function* (
)
})
export const layer: Layer.Layer<Service, never, AppFileSystem.Service | Git.Service> = Layer.effect(
Service,
Effect.gen(function* () {
const fs = yield* AppFileSystem.Service
const git = yield* Git.Service
return Service.of({
ensure: Effect.fn("RepositoryCache.ensure")(function* (input) {
return yield* ensureWithServices(input, { fs, git })
}),
})
}),
)
export const defaultLayer: Layer.Layer<Service> = layer.pipe(
Layer.provide(AppFileSystem.defaultLayer),
Layer.provide(Git.defaultLayer),
)
export const ensure = Effect.fn("RepositoryCache.ensure")(function* (input: EnsureInput) {
const cache = yield* Service
return yield* cache.ensure(input)
})
export * as RepositoryCache from "./repository-cache"