Compare commits
3 Commits
12e71a0af7
...
d0506381f5
| Author | SHA1 | Date | |
|---|---|---|---|
| d0506381f5 | |||
| 14df49b110 | |||
| 962b76d20f |
@@ -645,15 +645,6 @@ async function handleCommit(
|
||||
autoMode: boolean,
|
||||
dryRun: boolean,
|
||||
): Promise<"done" | "back"> {
|
||||
const config = await loadConfig();
|
||||
|
||||
if (!config.apiKey) {
|
||||
console.error(
|
||||
` ${RED}Error: API key not set. Run ${BOLD}gai config${RESET}${RED} to configure.${RESET}`,
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (!(await isGitRepo())) {
|
||||
console.error(` ${RED}Error: Not a git repository.${RESET}`);
|
||||
process.exit(1);
|
||||
@@ -663,7 +654,7 @@ async function handleCommit(
|
||||
const unstagedFiles = await getUnstagedFiles();
|
||||
|
||||
if (stagedFiles.length === 0 && unstagedFiles.length === 0) {
|
||||
console.log(" Nothing to commit.");
|
||||
console.log(` ${DIM}Nothing to commit. No staged or unstaged changes.${RESET}`);
|
||||
return "done";
|
||||
}
|
||||
|
||||
@@ -687,10 +678,19 @@ async function handleCommit(
|
||||
|
||||
const diff = await getStagedDiff();
|
||||
if (!diff) {
|
||||
console.log(" No staged changes to commit.");
|
||||
console.log(` ${DIM}Nothing to commit. No staged changes to commit.${RESET}`);
|
||||
return "done";
|
||||
}
|
||||
|
||||
const config = await loadConfig();
|
||||
|
||||
if (!config.apiKey) {
|
||||
console.error(
|
||||
` ${RED}Error: API key not set. Run ${BOLD}gai config${RESET}${RED} to configure.${RESET}`,
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const MAX_DIFF_SIZE = 15000;
|
||||
const truncatedDiff =
|
||||
diff.length > MAX_DIFF_SIZE
|
||||
@@ -816,10 +816,13 @@ async function handlePR(draft: boolean): Promise<"done" | "back"> {
|
||||
const commits = await getBranchCommits(baseBranch);
|
||||
|
||||
if (commits.length === 0) {
|
||||
console.error(
|
||||
` ${RED}Error: No commits on ${branchName} compared to ${baseBranch}. Commit something first.${RESET}`,
|
||||
);
|
||||
process.exit(1);
|
||||
const choice = await selectOne({
|
||||
title: "No commits to compare",
|
||||
subtitle: `No commits on ${branchName} compared to ${baseBranch}. Commit something first.`,
|
||||
items: [{ label: "Back", value: "back" as const }],
|
||||
});
|
||||
if (choice === null) process.exit(0);
|
||||
return "done";
|
||||
}
|
||||
|
||||
console.log(
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
import { mkdtempSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { tmpdir } from "node:os";
|
||||
import { test, expect, describe } from "bun:test";
|
||||
|
||||
async function run(command: string[], cwd: string, env: Record<string, string> = {}) {
|
||||
const proc = Bun.spawn(command, {
|
||||
cwd,
|
||||
stdout: "pipe",
|
||||
stderr: "pipe",
|
||||
env: {
|
||||
PATH: process.env.PATH ?? "",
|
||||
HOME: env.HOME ?? process.env.HOME ?? "",
|
||||
...env,
|
||||
},
|
||||
});
|
||||
|
||||
const [exitCode, stdout, stderr] = await Promise.all([
|
||||
proc.exited,
|
||||
new Response(proc.stdout).text(),
|
||||
new Response(proc.stderr).text(),
|
||||
]);
|
||||
|
||||
return { exitCode, stdout, stderr };
|
||||
}
|
||||
|
||||
describe("commit command", () => {
|
||||
test("clean repository exits without requiring API key", async () => {
|
||||
const repo = mkdtempSync(join(tmpdir(), "gai-clean-repo-"));
|
||||
const home = mkdtempSync(join(tmpdir(), "gai-empty-home-"));
|
||||
|
||||
const init = await run(["git", "init"], repo, { HOME: home });
|
||||
expect(init.exitCode).toBe(0);
|
||||
|
||||
const result = await run(
|
||||
["bun", "run", join(import.meta.dir, "..", "index.ts"), "commit"],
|
||||
repo,
|
||||
{
|
||||
HOME: home,
|
||||
GAI_API_KEY: "",
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.exitCode).toBe(0);
|
||||
expect(result.stdout).toContain("Nothing to commit");
|
||||
expect(result.stdout).toContain("No staged or unstaged changes");
|
||||
expect(result.stderr).not.toContain("API key not set");
|
||||
expect(result.stderr).not.toContain("requires a TTY");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user