mirror of
https://github.com/di-sukharev/opencommit.git
synced 2026-01-22 12:08:02 -05:00
* fix(prepare-commit-msg-hook): update error handling to provide clearer instructions for setting API keys and improve user guidance * build
72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import chalk from 'chalk';
|
|
import fs from 'fs/promises';
|
|
|
|
import { intro, outro, spinner } from '@clack/prompts';
|
|
|
|
import { generateCommitMessageByDiff } from '../generateCommitMessageFromGitDiff';
|
|
import { getChangedFiles, getDiff, getStagedFiles, gitAdd } from '../utils/git';
|
|
import { getConfig } from './config';
|
|
|
|
const [messageFilePath, commitSource] = process.argv.slice(2);
|
|
|
|
export const prepareCommitMessageHook = async (
|
|
isStageAllFlag: Boolean = false
|
|
) => {
|
|
try {
|
|
if (!messageFilePath) {
|
|
throw new Error(
|
|
'Commit message file path is missing. This file should be called from the "prepare-commit-msg" git hook'
|
|
);
|
|
}
|
|
|
|
if (commitSource) return;
|
|
|
|
if (isStageAllFlag) {
|
|
const changedFiles = await getChangedFiles();
|
|
|
|
if (changedFiles) await gitAdd({ files: changedFiles });
|
|
else {
|
|
outro('No changes detected, write some code and run `oco` again');
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
const staged = await getStagedFiles();
|
|
|
|
if (!staged) return;
|
|
|
|
intro('opencommit');
|
|
|
|
const config = getConfig();
|
|
|
|
if (
|
|
!config.OCO_OPENAI_API_KEY &&
|
|
!config.OCO_ANTHROPIC_API_KEY &&
|
|
!config.OCO_AZURE_API_KEY
|
|
) {
|
|
outro(
|
|
'No OCO_OPENAI_API_KEY or OCO_ANTHROPIC_API_KEY or OCO_AZURE_API_KEY exists. Set your key via `oco config set <key>=<value>, e.g. `oco config set OCO_OPENAI_API_KEY=<value>`. For more info see https://github.com/di-sukharev/opencommit'
|
|
);
|
|
return;
|
|
}
|
|
|
|
const spin = spinner();
|
|
spin.start('Generating commit message');
|
|
|
|
const commitMessage = await generateCommitMessageByDiff(
|
|
await getDiff({ files: staged })
|
|
);
|
|
spin.stop('Done');
|
|
|
|
const fileContent = await fs.readFile(messageFilePath);
|
|
|
|
await fs.writeFile(
|
|
messageFilePath,
|
|
commitMessage + '\n' + fileContent.toString()
|
|
);
|
|
} catch (error) {
|
|
outro(`${chalk.red('✖')} ${error}`);
|
|
process.exit(1);
|
|
}
|
|
};
|