5185f3365c
* refactor(cli.ts): call isHookCalled function asynchronously feat(githook.ts): add support for git core hooks path and fallback to default symlink url if not found feat(utils/git.ts): add getCoreHooksPath function to retrieve the path of the core hooks directory. * refactor(githook.ts): remove console.log statement from hookCommand function * feat(prepare-commit-msg-hook.ts): add isStageAllFlag parameter to prepareCommitMessageHook function to stage all changes if flag is true * refactor(githook.ts): use path.join to join path segments instead of string concatenation style(githook.ts): format code with prettier
67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
import fs from 'fs/promises';
|
|
import chalk from 'chalk';
|
|
import { intro, outro, spinner } from '@clack/prompts';
|
|
import { getChangedFiles, getDiff, getStagedFiles, gitAdd } from '../utils/git';
|
|
import { getConfig } from './config';
|
|
import { generateCommitMessageWithChatCompletion } from '../generateCommitMessageFromGitDiff';
|
|
|
|
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 `oc` again');
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
const staged = await getStagedFiles();
|
|
|
|
if (!staged) return;
|
|
|
|
intro('opencommit');
|
|
|
|
const config = getConfig();
|
|
|
|
if (!config?.OPENAI_API_KEY) {
|
|
throw new Error(
|
|
'No OPEN_AI_API exists. Set your OPEN_AI_API=<key> in ~/.opencommit'
|
|
);
|
|
}
|
|
|
|
const spin = spinner();
|
|
spin.start('Generating commit message');
|
|
const commitMessage = await generateCommitMessageWithChatCompletion(
|
|
await getDiff({ files: staged })
|
|
);
|
|
if (typeof commitMessage !== 'string') {
|
|
spin.stop('Error');
|
|
throw new Error(commitMessage.error);
|
|
} else 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);
|
|
}
|
|
};
|