Skip to content

Commit 9db4798

Browse files
committed
Extract duplicated sourceFromInput into shared SourceControlProvider module
Move the identical sourceFromInput function from both BitbucketSourceControlProvider and GitLabSourceControlProvider into SourceControlProvider.ts, alongside the SourceControlRefSelector type it operates on. Both providers now import the shared implementation.
1 parent 82f7b50 commit 9db4798

3 files changed

Lines changed: 16 additions & 30 deletions

File tree

apps/server/src/sourceControl/BitbucketSourceControlProvider.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Effect, Layer, Option } from "effect";
22
import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";
33

44
import { BitbucketCli, type BitbucketCliError } from "./BitbucketCli.ts";
5-
import { SourceControlProvider, type SourceControlRefSelector } from "./SourceControlProvider.ts";
5+
import { SourceControlProvider, sourceFromInput } from "./SourceControlProvider.ts";
66
import type { NormalizedBitbucketPullRequestRecord } from "./bitbucketPullRequests.ts";
77

88
function providerError(operation: string, cause: BitbucketCliError): SourceControlProviderError {
@@ -36,20 +36,6 @@ function toChangeRequest(summary: NormalizedBitbucketPullRequestRecord): ChangeR
3636
};
3737
}
3838

39-
function sourceFromInput(input: {
40-
readonly headSelector: string;
41-
readonly source?: SourceControlRefSelector;
42-
}): SourceControlRefSelector | undefined {
43-
if (input.source) {
44-
return input.source;
45-
}
46-
47-
const match = /^([^:/\s]+):(.+)$/u.exec(input.headSelector.trim());
48-
const owner = match?.[1]?.trim();
49-
const refName = match?.[2]?.trim();
50-
return owner && refName ? { owner, refName } : undefined;
51-
}
52-
5339
export const make = Effect.fn("makeBitbucketSourceControlProvider")(function* () {
5440
const bitbucket = yield* BitbucketCli;
5541

apps/server/src/sourceControl/GitLabSourceControlProvider.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Effect, Layer, Option } from "effect";
22
import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";
33

44
import { GitLabCli, type GitLabCliError, type GitLabMergeRequestSummary } from "./GitLabCli.ts";
5-
import { SourceControlProvider, type SourceControlRefSelector } from "./SourceControlProvider.ts";
5+
import { SourceControlProvider, sourceFromInput } from "./SourceControlProvider.ts";
66

77
function providerError(operation: string, cause: GitLabCliError): SourceControlProviderError {
88
return new SourceControlProviderError({
@@ -35,20 +35,6 @@ function toChangeRequest(summary: GitLabMergeRequestSummary): ChangeRequest {
3535
};
3636
}
3737

38-
function sourceFromInput(input: {
39-
readonly headSelector: string;
40-
readonly source?: SourceControlRefSelector;
41-
}): SourceControlRefSelector | undefined {
42-
if (input.source) {
43-
return input.source;
44-
}
45-
46-
const match = /^([^:/\s]+):(.+)$/u.exec(input.headSelector.trim());
47-
const owner = match?.[1]?.trim();
48-
const refName = match?.[2]?.trim();
49-
return owner && refName ? { owner, refName } : undefined;
50-
}
51-
5238
export const make = Effect.fn("makeGitLabSourceControlProvider")(function* () {
5339
const gitlab = yield* GitLabCli;
5440

apps/server/src/sourceControl/SourceControlProvider.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ export interface SourceControlProviderShape {
6262
}) => Effect.Effect<void, SourceControlProviderError>;
6363
}
6464

65+
export function sourceFromInput(input: {
66+
readonly headSelector: string;
67+
readonly source?: SourceControlRefSelector;
68+
}): SourceControlRefSelector | undefined {
69+
if (input.source) {
70+
return input.source;
71+
}
72+
73+
const match = /^([^:/\s]+):(.+)$/u.exec(input.headSelector.trim());
74+
const owner = match?.[1]?.trim();
75+
const refName = match?.[2]?.trim();
76+
return owner && refName ? { owner, refName } : undefined;
77+
}
78+
6579
export class SourceControlProvider extends Context.Service<
6680
SourceControlProvider,
6781
SourceControlProviderShape

0 commit comments

Comments
 (0)