Skip to content
Open
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: 1 addition & 1 deletion src/domain/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ export class CodeHostDecodeError extends Schema.TaggedErrorClass<CodeHostDecodeE
args: Array.from(args),
output,
detail,
message: `${tool} ${args.join(" ")} returned invalid JSON`,
message: `${tool} ${args.join(" ")} returned unexpected output: ${detail}`,
});
}
}
Expand Down
21 changes: 18 additions & 3 deletions src/services/code-host/GitHub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,13 @@ class PullView extends Schema.Class<PullView>("PullView")({
title: Schema.String,
body: Schema.String,
headRefName: Schema.String,
headRepository: Schema.NullOr(Schema.Struct({ nameWithOwner: Schema.String })),
headRepository: Schema.NullOr(
Schema.Struct({
name: Schema.optional(Schema.String),
nameWithOwner: Schema.optional(Schema.String),
}),
),
headRepositoryOwner: Schema.optional(Schema.NullOr(Schema.Struct({ login: Schema.String }))),
baseRefName: Schema.String,
url: Schema.String,
isDraft: Schema.Boolean,
Expand Down Expand Up @@ -93,13 +99,22 @@ const listRef = (row: PullListData) =>
draft: row.draft,
});

const nameWithOwner = (row: PullView): string | null => {
const repo = row.headRepository;
if (!repo) return null;
if (repo.nameWithOwner) return repo.nameWithOwner.toLowerCase();
const owner = row.headRepositoryOwner?.login;
if (owner && repo.name) return `${owner}/${repo.name}`.toLowerCase();
return null;
};

const meta = (row: PullView) =>
pullMeta({
number: row.number,
title: row.title,
body: row.body,
head: row.headRefName,
headRepository: row.headRepository?.nameWithOwner.toLowerCase() ?? null,
headRepository: nameWithOwner(row),
base: row.baseRefName,
url: row.url,
draft: row.isDraft,
Expand Down Expand Up @@ -151,7 +166,7 @@ export const layer = Layer.effect(
"view",
`${pr}`,
"--json",
"number,title,body,headRefName,headRepository,baseRefName,url,isDraft,labels",
"number,title,body,headRefName,headRepository,headRepositoryOwner,baseRefName,url,isDraft,labels",
];
return run(args).pipe(
Effect.catchIf(missingPull, () => Effect.fail(new CodeHostChangeNotFoundError(pr))),
Expand Down
31 changes: 31 additions & 0 deletions tests/stack.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1719,6 +1719,37 @@ describe("GitHub", () => {
);
});

it.effect("composes headRepository from headRepositoryOwner on older gh versions", () => {
const proc = Layer.succeed(
Proc.Service,
Proc.Service.of({
exec: () =>
Effect.succeed(
JSON.stringify({
number: 42,
title: "old-gh",
body: "body",
headRefName: "feature/x",
headRepository: { id: "R_kg", name: "Project" },
headRepositoryOwner: { id: "MDE", login: "Fork-Owner" },
baseRefName: "main",
url: "u",
isDraft: false,
labels: [],
}),
),
}),
);

return Effect.gen(function* () {
const github = yield* CodeHost.Service;
const meta = yield* github.change(42);
expect(meta.headRepository).toBe("fork-owner/project");
}).pipe(
Effect.provide(CodeHostGitHub.layer.pipe(Layer.provideMerge(cfg), Layer.provideMerge(proc))),
);
});

it.effect("resolves a created GitHub fork PR by its returned URL", () => {
const calls: Array<ReadonlyArray<string>> = [];
const proc = Layer.succeed(
Expand Down