cli/src/commands/ci-runs.tsblame
View source
59e66671import { spinner, log } from "@clack/prompts";
69d1a722import { hubRequest } from "../api.js";
69d1a723import { getRepoSlug } from "../config.js";
0d9d7234import { STATUS_COLORS, colorStatus, formatDuration, formatTime } from "../format.js";
69d1a725
69d1a726interface PipelineRun {
69d1a727 id: number;
69d1a728 pipeline_name: string;
69d1a729 status: string;
69d1a7210 trigger_ref: string | null;
69d1a7211 commit_id: string | null;
69d1a7212 started_at: string | null;
69d1a7213 finished_at: string | null;
69d1a7214 duration_ms: number | null;
69d1a7215 created_at: string;
69d1a7216}
69d1a7217
69d1a7218export async function ciRuns(args: string[]) {
69d1a7219 const slug = await getRepoSlug(args);
69d1a7220
69d1a7221 const statusIdx = args.indexOf("--status");
69d1a7222 const status = statusIdx !== -1 ? args[statusIdx + 1] : undefined;
69d1a7223
69d1a7224 const limitIdx = args.indexOf("--limit");
69d1a7225 const limit = limitIdx !== -1 ? args[limitIdx + 1] : "10";
69d1a7226
69d1a7227 const params = new URLSearchParams();
69d1a7228 if (status) params.set("status", status);
69d1a7229 if (limit) params.set("limit", limit);
69d1a7230
69d1a7231 const qs = params.toString() ? `?${params}` : "";
59e666732
59e666733 const s = spinner();
59e666734 s.start("Fetching pipeline runs");
69d1a7235 const { runs } = await hubRequest<{ runs: PipelineRun[] }>(
69d1a7236 `/api/repos/${slug}/canopy/runs${qs}`
69d1a7237 );
59e666738 s.stop(`${runs.length} run${runs.length !== 1 ? "s" : ""}`);
69d1a7239
69d1a7240 if (runs.length === 0) {
59e666741 log.info("No pipeline runs.");
69d1a7242 return;
69d1a7243 }
69d1a7244
69d1a7245 // Table header
69d1a7246 console.log(
69d1a7247 `${"ID".padEnd(6)}${"Pipeline".padEnd(22)}${"Status".padEnd(18)}${"Branch".padEnd(14)}${"Duration".padEnd(10)}Created`
69d1a7248 );
69d1a7249 console.log("-".repeat(90));
69d1a7250
69d1a7251 for (const run of runs) {
69d1a7252 const id = String(run.id).padEnd(6);
69d1a7253 const name = (run.pipeline_name || "-").slice(0, 20).padEnd(22);
69d1a7254 const st = colorStatus(run.status).padEnd(18 + (STATUS_COLORS[run.status] ? 9 : 0));
69d1a7255 const branch = (run.trigger_ref || "-").slice(0, 12).padEnd(14);
69d1a7256 const dur = formatDuration(run.duration_ms).padEnd(10);
69d1a7257 const time = formatTime(run.created_at);
69d1a7258 console.log(`${id}${name}${st}${branch}${dur}${time}`);
69d1a7259 }
69d1a7260}