---
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) {}
---
Control when auto-merge can proceed Choose a repository to manage auto-merge rules Create your first auto-merge policy {rule.description}Auto-Merge Rules
Select a Repository
No Rules Yet