summaryrefslogtreecommitdiff
path: root/model/pipeline.ts
diff options
context:
space:
mode:
Diffstat (limited to 'model/pipeline.ts')
-rw-r--r--model/pipeline.ts76
1 files changed, 76 insertions, 0 deletions
diff --git a/model/pipeline.ts b/model/pipeline.ts
new file mode 100644
index 0000000..06361a4
--- /dev/null
+++ b/model/pipeline.ts
@@ -0,0 +1,76 @@
+import type { FetchCodeJob, Job } from "./mod.ts";
+
+export interface Pipeline {
+ getStages(): ReadonlyArray<PipelineStage>;
+ serialize(): string;
+}
+
+export interface PipelineStage {
+ readonly parallelJobs: Array<Job>;
+}
+
+export interface PipelineBuilder {
+ addStage(stage: PipelineStage): PipelineBuilder;
+ build(): Pipeline;
+}
+
+export class PipelineImpl implements Pipeline {
+ constructor(private readonly serialJobs: ReadonlyArray<PipelineStage>) {}
+
+ public getStages() {
+ return this.serialJobs;
+ }
+
+ public serialize() {
+ return JSON.stringify(this.serialJobs);
+ }
+
+ public static from(s: string): Pipeline {
+ return new PipelineImpl(JSON.parse(s));
+ }
+}
+
+abstract class BasePipelineBuilder implements PipelineBuilder {
+ protected readonly stages: Array<PipelineStage> = [];
+
+ public addStage(stage: PipelineStage): PipelineBuilder {
+ this.stages.push(stage);
+ return this;
+ }
+
+ public build() {
+ return new PipelineImpl(this.stages);
+ }
+}
+
+export class DefaultGitHookPipelineBuilder extends BasePipelineBuilder {
+ constructor(
+ private readonly remoteUrl = Deno.env.get("remote")!,
+ rev = Deno.env.get("rev")!,
+ private readonly ref = Deno.env.get("ref")!,
+ ) {
+ super();
+
+ this.addStage({
+ parallelJobs: [
+ <FetchCodeJob> {
+ type: "fetch_code",
+ arguments: {
+ remoteUrl,
+ checkout: rev,
+ path: this.getSourceDestination(),
+ },
+ },
+ ],
+ });
+ }
+
+ public getSourceDestination() {
+ return this.remoteUrl.split("/").at(-1) ?? "src";
+ }
+
+ public getBranch(): string | undefined {
+ const branchRefPrefix = "refs/heads/";
+ return this.ref.split(branchRefPrefix).at(1);
+ }
+}