--- import BaseLayout from "@/layouts/BaseLayout.astro"; import { getDatabase, schema } from "@/db"; import { desc, eq } from "drizzle-orm"; import { GitMerge, Plus, Trash2, Edit2, ShieldCheck, Clock, CheckCircle2 } from "lucide-react"; const user = Astro.locals.user; if (!user) { return Astro.redirect("/login"); } const db = getDatabase(); const repoId = Astro.url.searchParams.get("repo") || ""; let repositories: { id: string; name: string; fullName?: string; owner: string }[] = []; try { const repos = await db.query.repositories.findMany({ where: eq(schema.repositories.ownerId, user.id), columns: { id: true, name: true }, with: { owner: { columns: { username: true } } }, }); repositories = repos.map((r) => ({ id: r.id, name: r.name, owner: r.owner.username, fullName: `${r.owner.username}/${r.name}`, })); } catch (e) {} const selectedRepo = repositories.find((repo) => repo.id === repoId) || null; const parseList = (value?: string | null) => { if (!value) return [] as string[]; try { const parsed = JSON.parse(value); if (Array.isArray(parsed)) return parsed as string[]; } catch (e) {} return value.split(",").map((item) => item.trim()).filter(Boolean); }; interface AutoMergeRule { id: string; name: string; description?: string | null; matchLabels?: string | null; requiredLabels?: string | null; requiredChecks?: string | null; minApprovals?: number | null; requireCodeOwner?: boolean | null; allowDraft?: boolean | null; minTimeInQueueMinutes?: number | null; mergeMethod?: string | null; isEnabled?: boolean | null; matchCount?: number | null; } let rules: AutoMergeRule[] = []; try { if (repoId) { const dbRules = await db.query.autoMergeRules.findMany({ where: eq(schema.autoMergeRules.repositoryId, repoId), orderBy: [desc(schema.autoMergeRules.createdAt)], }); rules = dbRules as AutoMergeRule[]; } } catch (e) {} ---

Auto-Merge Rules

Control when auto-merge can proceed

{repoId && ( )}
{!repoId ? (

Select a Repository

Choose a repository to manage auto-merge rules

) : (
{rules.length === 0 ? (

No Rules Yet

Create your first auto-merge policy

) : (
{rules.map((rule) => (
{rule.name} {rule.isEnabled === false && ( Disabled )} {rule.mergeMethod && ( {rule.mergeMethod} )}
{rule.description && (

{rule.description}

)}
{parseList(rule.requiredLabels).length > 0 && ( Labels: {parseList(rule.requiredLabels).join(", ")} )} {parseList(rule.requiredChecks).length > 0 && ( Checks: {parseList(rule.requiredChecks).join(", ")} )} {(rule.minApprovals || 0) > 0 && ( Approvals: {rule.minApprovals} )} {(rule.minTimeInQueueMinutes || 0) > 0 && ( Delay: {rule.minTimeInQueueMinutes}m )}
))}
)}
)}