import type { ReleaseCommit, ReleaseCommitGroup } from './messages' /** 能勾选的提交:带不兼容迁移的不算 */ export function pickableShas(commits: ReleaseCommit[]): string[] { return commits.filter(c => !c.migration?.blocked).map(c => c.sha) } export function uniqueAuthors(groups: ReleaseCommitGroup[]): string[] { const out: string[] = [] for (const g of groups) { for (const a of g.authors) { if (!out.includes(a)) out.push(a) } } return out } export function filterCherryPickGroups( groups: ReleaseCommitGroup[], query: string, authors: ReadonlySet, ): ReleaseCommitGroup[] { const q = query.trim().toLowerCase() const out: ReleaseCommitGroup[] = [] for (const g of groups) { const commits = g.commits.filter(c => authors.has(c.author)) if (commits.length === 0) continue if (!q) { out.push({ ...g, authors: uniqueAuthors([{ ...g, commits }]), commits }) continue } const head = `#${g.pr ?? ''} ${g.title} ${g.authors.join(' ')}`.toLowerCase() if (head.includes(q)) { out.push({ ...g, authors: uniqueAuthors([{ ...g, commits }]), commits }) continue } const hit = commits.filter(c => `${c.subject} ${c.author} ${c.sha} ${c.date}`.toLowerCase().includes(q), ) if (hit.length > 0) out.push({ ...g, authors: uniqueAuthors([{ ...g, commits: hit }]), commits: hit }) } return out } export function groupContainingSha(groups: ReleaseCommitGroup[], sha: string | undefined): ReleaseCommitGroup | undefined { if (!sha) return undefined return groups.find(g => g.commits.some(c => c.sha === sha)) }