import { asCommitRefs } from './lib/Commits'; import type { AckCommitsEvent, Commit } from './types'; export type CommitValidation = { newCommits: readonly Commit[]; invalidRefs: Set; referencedCommits: Set; }; export function validateCommitOrder( commits: readonly Commit[], ): CommitValidation { const newCommitRefs = new Set(); const newCommits: Commit[] = []; const referencedCommits = new Set(); const invalidRefs = new Set(); function addReferencedCommit(ref?: string) { if (ref !== undefined && !newCommitRefs.has(ref)) { referencedCommits.add(ref); } } for (const commit of commits) { if (referencedCommits.has(commit.ref)) { invalidRefs.add(commit.ref); } else { newCommits.push(commit); newCommitRefs.add(commit.ref); const { baseRef, mergeRef } = asCommitRefs(commit); addReferencedCommit(baseRef); addReferencedCommit(mergeRef); } } return { newCommits, invalidRefs, referencedCommits }; } export function addInvalidRefsToAckEvent( ack: AckCommitsEvent, invalidRefs: Set, ): AckCommitsEvent { if (invalidRefs.size === 0) { return ack; } const refErrors = { ...ack.refErrors }; for (const ref of invalidRefs) { if (!(ref in refErrors)) { refErrors[ref] = { code: 'unknown-ref' }; } } return { ...ack, refErrors }; }