Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions apps/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"@t3tools/source-control-azure-devops": "workspace:*",
"@t3tools/source-control-core": "workspace:*",
"@t3tools/source-control-forgejo": "workspace:*",
"@t3tools/source-control-gitlab": "workspace:*",
"effect": "catalog:",
"jose": "catalog:",
"node-pty": "^1.2.0-beta.15",
Expand All @@ -64,6 +65,7 @@
"@t3tools/contracts": "workspace:*",
"@t3tools/provider-testing": "workspace:*",
"@t3tools/shared": "workspace:*",
"@t3tools/source-control-testing": "workspace:*",
"@t3tools/ssh": "workspace:*",
"@t3tools/tailscale": "workspace:*",
"@t3tools/web": "workspace:*",
Expand Down
2 changes: 0 additions & 2 deletions apps/server/scripts/evaluate-thread-titles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import {
import * as ThreadTitleLinks from "../src/textGeneration/ThreadTitleLinks.ts";
import * as SourceControlProviderRegistry from "../src/sourceControl/SourceControlProviderRegistry.ts";
import * as GitHubApi from "../src/sourceControl/GitHubApi.ts";
import * as GitLabCli from "../src/sourceControl/GitLabCli.ts";
import * as SourceControlBuiltInDrivers from "../src/sourceControl/builtInDrivers.ts";
import * as BitbucketApi from "../src/sourceControl/BitbucketApi.ts";
import * as ServerSettings from "../src/serverSettings.ts";
Expand Down Expand Up @@ -152,7 +151,6 @@ await Effect.runPromise(
Layer.provide(
Layer.mergeAll(
GitHubApi.layerWithDependencies,
GitLabCli.layer,
SourceControlBuiltInDrivers.layer,
// No saved credentials here; Bitbucket falls back to T3CODE_BITBUCKET_* variables.
BitbucketApi.layer,
Expand Down
22 changes: 13 additions & 9 deletions apps/server/src/git/GitManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ import {
} from "@t3tools/contracts";
import * as DateTime from "effect/DateTime";
import { decodeGitHubPullRequestListJson } from "../sourceControl/gitHubPullRequests.ts";
import * as GitLabCli from "../sourceControl/GitLabCli.ts";
import * as GitLabCli from "@t3tools/source-control-gitlab/server/GitLabCli";
import type * as SourceControlHost from "@t3tools/source-control-core/server/SourceControlHost";
import * as TestSourceControlHost from "@t3tools/source-control-testing/TestSourceControlHost";
import * as TextGeneration from "../textGeneration/TextGeneration.ts";
import * as GitVcsDriver from "../vcs/GitVcsDriver.ts";
import * as VcsProcess from "../vcs/VcsProcess.ts";
Expand All @@ -53,7 +55,7 @@ import * as VcsProjectConfig from "../vcs/VcsProjectConfig.ts";
import * as VcsStatusBroadcaster from "../vcs/VcsStatusBroadcaster.ts";
import * as BackgroundPolicy from "../background/BackgroundPolicy.ts";
import * as GitWorkflowService from "./GitWorkflowService.ts";
import * as GitLabSourceControlProvider from "../sourceControl/GitLabSourceControlProvider.ts";
import * as GitLabSourceControlProvider from "@t3tools/source-control-gitlab/server/GitLabSourceControlProvider";
import {
ForgejoPullRequestSchema,
toForgejoChangeRequest,
Expand Down Expand Up @@ -2108,17 +2110,19 @@ it.layer(layerGitManagerTest)("GitManager", (it) => {
source_project: { path_with_namespace: "Group/Subgroup/Fork" },
},
]);
const calls: VcsProcess.VcsProcessInput[] = [];
const calls: SourceControlHost.SourceControlProcessInput[] = [];
const provider = yield* GitLabSourceControlProvider.make.pipe(
Effect.provide(
GitLabCli.layer.pipe(
Layer.provide(
Layer.mock(VcsProcess.VcsProcess)({
run: (input) =>
Effect.sync(() => {
calls.push(input);
return fakeGhOutput(output);
}),
TestSourceControlHost.layer({
process: {
run: (input) =>
Effect.sync(() => {
calls.push(input);
return fakeGhOutput(output);
}),
},
}),
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import * as AzureDevOpsCli from "@t3tools/source-control-azure-devops/server/Azu
import * as BitbucketApi from "../sourceControl/BitbucketApi.ts";
import * as GitHubApi from "../sourceControl/GitHubApi.ts";
import * as SourceControlRateLimit from "@t3tools/source-control-core/server/SourceControlRateLimit";
import * as GitLabCli from "../sourceControl/GitLabCli.ts";
import * as GitLabCli from "@t3tools/source-control-gitlab/server/GitLabCli";
import { azureDevOpsProviderFailure } from "@t3tools/source-control-azure-devops/server/AzureDevOpsPullRequestProvider";
import { bitbucketProviderFailure } from "./BitbucketPullRequestProvider.ts";
import { gitHubProviderFailure } from "./GitHubPullRequestProvider.ts";
import { gitLabProviderFailure } from "./GitLabPullRequestProvider.ts";
import { gitLabProviderFailure } from "@t3tools/source-control-gitlab/server/GitLabPullRequestProvider";

const cause = new Error("redacted provider failure");

Expand Down
5 changes: 0 additions & 5 deletions apps/server/src/pullRequest/PullRequestProviderRegistry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,10 @@ import type { SourceControlProviderKind } from "@t3tools/contracts";

import * as BitbucketApi from "../sourceControl/BitbucketApi.ts";
import * as GitHubApi from "../sourceControl/GitHubApi.ts";
import * as GitLabCli from "../sourceControl/GitLabCli.ts";
import * as BitbucketPullRequestApi from "./BitbucketPullRequestApi.ts";
import * as BitbucketPullRequestProvider from "./BitbucketPullRequestProvider.ts";
import * as GitHubPullRequestApi from "./GitHubPullRequestApi.ts";
import * as GitHubPullRequestProvider from "./GitHubPullRequestProvider.ts";
import * as GitLabPullRequestCli from "./GitLabPullRequestCli.ts";
import * as GitLabPullRequestProvider from "./GitLabPullRequestProvider.ts";
import * as BuiltInDrivers from "../sourceControl/builtInDrivers.ts";
import type { PullRequestProviderApi } from "@t3tools/source-control-core/server/PullRequestProvider";

Expand Down Expand Up @@ -44,7 +41,6 @@ export function fromProviders(
export const make = Effect.gen(function* () {
const providers = yield* Effect.all([
GitHubPullRequestProvider.make,
GitLabPullRequestProvider.make,
BitbucketPullRequestProvider.make,
]);
const drivers = yield* Effect.forEach(BuiltInDrivers.BUILT_IN_SOURCE_CONTROL_DRIVERS, (driver) =>
Expand All @@ -65,7 +61,6 @@ export const layer = Layer.effect(PullRequestProviderRegistry, make).pipe(
),
),
),
Layer.provide(GitLabPullRequestCli.layer.pipe(Layer.provide(GitLabCli.layer))),
Layer.provide(BuiltInDrivers.layer),
Layer.provide(BitbucketPullRequestApi.layer.pipe(Layer.provide(BitbucketApi.layer))),
);
2 changes: 0 additions & 2 deletions apps/server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ import * as CheckpointDiffQuery from "./checkpointing/CheckpointDiffQuery.ts";
import * as CheckpointStore from "./checkpointing/CheckpointStore.ts";
import * as BitbucketApi from "./sourceControl/BitbucketApi.ts";
import * as GitHubApi from "./sourceControl/GitHubApi.ts";
import * as GitLabCli from "./sourceControl/GitLabCli.ts";
import * as ForgejoCli from "@t3tools/source-control-forgejo/server/ForgejoCli";
import * as SourceControlBuiltInDrivers from "./sourceControl/builtInDrivers.ts";
import * as TextGeneration from "./textGeneration/TextGeneration.ts";
Expand Down Expand Up @@ -302,7 +301,6 @@ const layerSourceControlProviderRegistry = SourceControlProviderRegistry.layer.p
Layer.mergeAll(
BitbucketApi.layer,
GitHubApi.layerWithDependencies,
GitLabCli.layer,
SourceControlBuiltInDrivers.layer,
),
),
Expand Down
4 changes: 3 additions & 1 deletion apps/server/src/sourceControl/SourceControlDiscovery.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ import * as AzureDevOpsCli from "@t3tools/source-control-azure-devops/server/Azu
import * as AzureDevOpsPullRequestCli from "@t3tools/source-control-azure-devops/server/AzureDevOpsPullRequestCli";
import * as BitbucketApi from "./BitbucketApi.ts";
import * as GitHubApi from "./GitHubApi.ts";
import * as GitLabCli from "./GitLabCli.ts";
import * as GitLabCli from "@t3tools/source-control-gitlab/server/GitLabCli";
import * as GitLabPullRequestCli from "@t3tools/source-control-gitlab/server/GitLabPullRequestCli";
import * as ForgejoCli from "@t3tools/source-control-forgejo/server/ForgejoCli";
import * as ForgejoSourceControlProvider from "@t3tools/source-control-forgejo/server/ForgejoSourceControlProvider";
import * as ForgejoPullRequestProvider from "@t3tools/source-control-forgejo/server/ForgejoPullRequestProvider";
Expand All @@ -46,6 +47,7 @@ const layerSourceControlProviderRegistryTest = (input: {
Layer.mock(GitHubApi.GitHubApi)({}),
Layer.mock(GitVcsDriver.GitVcsDriver)({}),
Layer.mock(GitLabCli.GitLabCli)({}),
Layer.mock(GitLabPullRequestCli.GitLabPullRequestCli)({}),
Layer.mock(ForgejoCli.ForgejoCli)({ listLogins: () => Effect.succeed([]) }),
Layer.mock(VcsDriverRegistry.VcsDriverRegistry)({}),
Layer.mock(VcsProcess.VcsProcess)(input.process),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import * as BitbucketApi from "./BitbucketApi.ts";
import * as GitVcsDriver from "../vcs/GitVcsDriver.ts";
import * as GitHubApi from "./GitHubApi.ts";
import * as GitHubCredentials from "./GitHubCredentials.ts";
import * as GitLabCli from "./GitLabCli.ts";
import * as GitLabCli from "@t3tools/source-control-gitlab/server/GitLabCli";
import * as GitLabPullRequestCli from "@t3tools/source-control-gitlab/server/GitLabPullRequestCli";
import * as ForgejoCli from "@t3tools/source-control-forgejo/server/ForgejoCli";
import * as SourceControlProviderRegistry from "./SourceControlProviderRegistry.ts";
import * as ServerSourceControlHost from "./ServerSourceControlHost.ts";
Expand Down Expand Up @@ -114,6 +115,7 @@ function makeRegistry(input: {
}),
Layer.mock(GitVcsDriver.GitVcsDriver)({}),
Layer.mock(GitLabCli.GitLabCli)(input.gitlab ?? {}),
Layer.mock(GitLabPullRequestCli.GitLabPullRequestCli)({}),
Layer.mock(ForgejoCli.ForgejoCli)({ listLogins: () => Effect.succeed([]) }),
ServerConfig.layerTest(process.cwd(), {
prefix: "t3-source-control-registry-test-",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/source

import * as BitbucketSourceControlProvider from "./BitbucketSourceControlProvider.ts";
import * as GitHubSourceControlProvider from "./GitHubSourceControlProvider.ts";
import * as GitLabSourceControlProvider from "./GitLabSourceControlProvider.ts";
import * as BuiltInDrivers from "./builtInDrivers.ts";
import * as SourceControlProvider from "@t3tools/source-control-core/server/SourceControlProvider";
import {
Expand Down Expand Up @@ -306,7 +305,6 @@ export const makeWithProviders = Effect.fn("makeSourceControlProviderRegistryWit
export const make = Effect.gen(function* () {
const github = yield* GitHubSourceControlProvider.make;
const githubDiscovery = yield* GitHubSourceControlProvider.makeDiscovery;
const gitlab = yield* GitLabSourceControlProvider.make;
const bitbucket = yield* BitbucketSourceControlProvider.make;
const bitbucketDiscovery = yield* BitbucketSourceControlProvider.makeDiscovery;
const drivers = yield* Effect.forEach(BuiltInDrivers.BUILT_IN_SOURCE_CONTROL_DRIVERS, (driver) =>
Expand All @@ -326,11 +324,6 @@ export const make = Effect.gen(function* () {
provider: github,
discovery: githubDiscovery,
},
{
kind: "gitlab",
provider: gitlab,
discovery: GitLabSourceControlProvider.discovery,
},
{
kind: "bitbucket",
provider: bitbucket,
Expand Down
6 changes: 5 additions & 1 deletion apps/server/src/sourceControl/builtInDrivers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@ import * as AzureDevOpsPullRequestCli from "@t3tools/source-control-azure-devops
import * as AzureDevOpsDriver from "@t3tools/source-control-azure-devops/server/driver";
import * as ForgejoCli from "@t3tools/source-control-forgejo/server/ForgejoCli";
import * as ForgejoDriver from "@t3tools/source-control-forgejo/server/driver";
import * as GitLabCli from "@t3tools/source-control-gitlab/server/GitLabCli";
import * as GitLabPullRequestCli from "@t3tools/source-control-gitlab/server/GitLabPullRequestCli";
import * as GitLabDriver from "@t3tools/source-control-gitlab/server/driver";
import type { SourceControlDriver } from "@t3tools/source-control-core/server/driver";
import * as Layer from "effect/Layer";

import * as ServerSourceControlHost from "./ServerSourceControlHost.ts";

const drivers = [AzureDevOpsDriver.driver, ForgejoDriver.driver];
const drivers = [GitLabDriver.driver, AzureDevOpsDriver.driver, ForgejoDriver.driver];

/** Every service a built-in driver's `make` needs; the server's layers must provide them all. */
export type BuiltInSourceControlDriversEnv =
Expand All @@ -31,4 +34,5 @@ export const BUILT_IN_SOURCE_CONTROL_DRIVERS: ReadonlyArray<
export const layer = Layer.mergeAll(
AzureDevOpsPullRequestCli.layer.pipe(Layer.provideMerge(AzureDevOpsCli.layer)),
ForgejoCli.layer,
GitLabPullRequestCli.layer.pipe(Layer.provideMerge(GitLabCli.layer)),
).pipe(Layer.provideMerge(ServerSourceControlHost.layer));
2 changes: 0 additions & 2 deletions apps/server/src/ws.ts
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,6 @@ import * as SourceControlDiscovery from "./sourceControl/SourceControlDiscovery.
import * as SourceControlRepositoryService from "./sourceControl/SourceControlRepositoryService.ts";
import * as BitbucketApi from "./sourceControl/BitbucketApi.ts";
import * as GitHubApi from "./sourceControl/GitHubApi.ts";
import * as GitLabCli from "./sourceControl/GitLabCli.ts";
import * as SourceControlBuiltInDrivers from "./sourceControl/builtInDrivers.ts";
import * as SourceControlProviderRegistry from "./sourceControl/SourceControlProviderRegistry.ts";
import * as GitVcsDriver from "./vcs/GitVcsDriver.ts";
Expand Down Expand Up @@ -3205,7 +3204,6 @@ export const layer = Layer.unwrap(
Layer.mergeAll(
BitbucketApi.layer,
GitHubApi.layerWithDependencies,
GitLabCli.layer,
SourceControlBuiltInDrivers.layer,
),
),
Expand Down
4 changes: 2 additions & 2 deletions docs/internals/pull-request-file-revisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ one. No type distinguishes those meanings and no single file states the whole pa
this page is for.

The failure is on record rather than hypothetical. The interface doc above
[GitLab's `getFileRevisions`](../../apps/server/src/pullRequest/GitLabPullRequestCli.ts) once said
[GitLab's `getFileRevisions`](../../packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts) once said
the opposite of the code beneath it, because it described a missing path the way the layer below
means it. Anything written against that reading would treat a version the host declined to give as
a file the change request deleted, which reports every file a reader has cleared as changed across
Expand All @@ -30,7 +30,7 @@ What "never got to look at" is belongs to the host, and the contract cannot know
- [Bitbucket](../../apps/server/src/pullRequest/BitbucketPullRequestApi.ts) reads them off the
pull request's own patch, the only place it states a file's version, so a patch cut short at the
byte ceiling leaves the paths past the cut out.
- [GitLab](../../apps/server/src/pullRequest/GitLabPullRequestCli.ts) asks in batches, so a batch
- [GitLab](../../packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts) asks in batches, so a batch
it could not read leaves that batch's paths out.

Those three facts stay with their providers. The contract states only that absence means the read
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"tc": "vp run -r --concurrency-limit 2 typecheck",
"lint": "vp lint --report-unused-disable-directives",
"knip": "knip --preprocessor ./scripts/knip-schemas.ts",
"knip:check": "knip --include files,dependencies --no-config-hints && knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-forgejo --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints",
"knip:check": "knip --include files,dependencies --no-config-hints && knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-forgejo --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints",
"knip:production": "knip --production --preprocessor ./scripts/knip-schemas.ts",
"lint:mobile": "node scripts/mobile-native-static-check.ts",
"test": "vp run -r test",
Expand Down
55 changes: 55 additions & 0 deletions packages/source-control-gitlab/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"name": "@t3tools/source-control-gitlab",
"private": true,
"type": "module",
"exports": {
"./server/driver": {
"types": "./src/server/driver.ts",
"import": "./src/server/driver.ts"
},
"./server/gitLabAuthStatus": {
"types": "./src/server/gitLabAuthStatus.ts",
"import": "./src/server/gitLabAuthStatus.ts"
},
"./server/GitLabCli": {
"types": "./src/server/GitLabCli.ts",
"import": "./src/server/GitLabCli.ts"
},
"./server/gitLabMergeRequestJson": {
"types": "./src/server/gitLabMergeRequestJson.ts",
"import": "./src/server/gitLabMergeRequestJson.ts"
},
"./server/gitLabMergeRequests": {
"types": "./src/server/gitLabMergeRequests.ts",
"import": "./src/server/gitLabMergeRequests.ts"
},
"./server/GitLabPullRequestCli": {
"types": "./src/server/GitLabPullRequestCli.ts",
"import": "./src/server/GitLabPullRequestCli.ts"
},
"./server/GitLabPullRequestProvider": {
"types": "./src/server/GitLabPullRequestProvider.ts",
"import": "./src/server/GitLabPullRequestProvider.ts"
},
"./server/GitLabSourceControlProvider": {
"types": "./src/server/GitLabSourceControlProvider.ts",
"import": "./src/server/GitLabSourceControlProvider.ts"
}
},
"scripts": {
"typecheck": "tsc --noEmit",
"test": "vp test run --config ../../vite.config.ts --dir ."
},
"dependencies": {
"@t3tools/contracts": "workspace:*",
"@t3tools/shared": "workspace:*",
"@t3tools/source-control-core": "workspace:*",
"effect": "catalog:"
},
"devDependencies": {
"@effect/vitest": "catalog:",
"@t3tools/source-control-testing": "workspace:*",
"@types/node": "catalog:",
"vite-plus": "catalog:"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,16 @@ import { ChildProcessSpawner } from "effect/process";

import { VcsProcessExitError } from "@t3tools/contracts";

import * as VcsProcess from "../vcs/VcsProcess.ts";
import type * as SourceControlHost from "@t3tools/source-control-core/server/SourceControlHost";
import * as TestSourceControlHost from "@t3tools/source-control-testing/TestSourceControlHost";
import * as GitLabCli from "./GitLabCli.ts";

const mockedRun = vi.fn<VcsProcess.VcsProcess["Service"]["run"]>();
const mockedRun = vi.fn<SourceControlHost.SourceControlHost["Service"]["process"]["run"]>();
const layer = it.layer(
GitLabCli.layer.pipe(
Layer.provide(
Layer.mock(VcsProcess.VcsProcess)({
run: mockedRun,
}),
),
),
GitLabCli.layer.pipe(Layer.provide(TestSourceControlHost.layer({ process: { run: mockedRun } }))),
);

function processOutput(stdout: string): VcsProcess.VcsProcessOutput {
function processOutput(stdout: string): SourceControlHost.SourceControlProcessOutput {
return {
exitCode: ChildProcessSpawner.ExitCode(0),
stdout,
Expand Down
Loading
Loading