19 lines · 769 B
import { forkPullNeedsApproval, forkRunNeedsApproval } from "../pull-events";
import type { RepoRow } from "~/lib/types";

/**
 * A push to a fork PR runs code from its author, the head repository's owner and the pusher, so CI is approved
 * automatically only when all of them could write to the base. Neither a trusted pusher on an untrusted fork
 * nor an untrusted pusher on a trusted author's fork skips approval.
 */
export async function forkPushNeedsApproval(
  baseRepo: RepoRow,
  headRepo: RepoRow,
  authorId: string,
  pusherId: string | null,
): Promise<boolean> {
  if (baseRepo.id === headRepo.id) return false;
  if (await forkPullNeedsApproval(baseRepo, headRepo, authorId)) return true;
  return forkRunNeedsApproval(baseRepo, headRepo, pusherId);
}