59 lines
2.3 KiB
TypeScript
59 lines
2.3 KiB
TypeScript
import { writeFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { type } from "arktype";
|
|
import { log } from "../utils/cli.ts";
|
|
import { formatFilesWithLineNumbers, type DiffFile } from "./checkout.ts";
|
|
import type { ToolContext } from "./server.ts";
|
|
import { execute, tool } from "./shared.ts";
|
|
|
|
export const CommitInfo = type({
|
|
sha: type.string.describe("the commit SHA (full or abbreviated) to fetch"),
|
|
});
|
|
|
|
export function CommitInfoTool(ctx: ToolContext) {
|
|
return tool({
|
|
name: "get_commit_info",
|
|
description:
|
|
"Retrieve commit metadata and diff via Gitea API. Returns diffPath pointing to formatted diff file. " +
|
|
'Example: `get_commit_info({ sha: "2a6ab5d" })`.',
|
|
parameters: CommitInfo,
|
|
execute: execute(async ({ sha }) => {
|
|
const result = await ctx.gitea.rest.repository.repoGetSingleCommit({
|
|
owner: ctx.repo.owner,
|
|
repo: ctx.repo.name,
|
|
sha,
|
|
});
|
|
const data = result.data;
|
|
|
|
// The SDK's CommitAffectedFiles type omits `patch`, which Gitea does return
|
|
// in practice. Cast explicitly so we can pass it to formatFilesWithLineNumbers.
|
|
const files: DiffFile[] = (data.files ?? []).map((f) => ({
|
|
filename: f.filename,
|
|
patch: (f as unknown as { patch?: string }).patch,
|
|
}));
|
|
|
|
const formatResult = formatFilesWithLineNumbers(files);
|
|
const tempDir = process.env.SHOCKBOT_TEMP_DIR;
|
|
if (!tempDir) {
|
|
throw new Error("SHOCKBOT_TEMP_DIR not set - get_commit_info must run in shockbot action context");
|
|
}
|
|
const diffFile = join(tempDir, `commit-${sha.slice(0, 7)}.diff`);
|
|
writeFileSync(diffFile, formatResult.content);
|
|
log.debug(`wrote commit diff to ${diffFile} (${formatResult.content.length} bytes)`);
|
|
|
|
return {
|
|
sha: data.sha,
|
|
message: data.commit?.message,
|
|
author: data.author?.login ?? data.commit?.author?.name ?? null,
|
|
committer: data.committer?.login ?? data.commit?.committer?.name ?? null,
|
|
date: data.commit?.author?.date ?? data.commit?.committer?.date ?? "",
|
|
url: data.html_url,
|
|
parents: (data.parents ?? []).map((p) => p.sha),
|
|
stats: data.stats ?? { additions: 0, deletions: 0, total: 0 },
|
|
fileCount: files.length,
|
|
diffFile,
|
|
};
|
|
}),
|
|
});
|
|
}
|