mirror of
https://github.com/di-sukharev/opencommit.git
synced 2026-04-20 03:02:51 -04:00
The import of fileURLToPath from the url module is not used in the file, so it has been removed to improve code readability and maintainability.
85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
import fs from 'fs/promises';
|
|
import path from 'path';
|
|
import { command } from 'cleye';
|
|
import { assertGitRepo } from '../utils/git.js';
|
|
import { existsSync } from 'fs';
|
|
import chalk from 'chalk';
|
|
import { intro, outro } from '@clack/prompts';
|
|
|
|
const HOOK_NAME = 'prepare-commit-msg';
|
|
const SYMLINK_URL = `.git/hooks/${HOOK_NAME}`;
|
|
|
|
export const isHookCalled = process.argv[1].endsWith(`/${SYMLINK_URL}`);
|
|
|
|
const isHookExists = existsSync(SYMLINK_URL);
|
|
|
|
export const hookCommand = command(
|
|
{
|
|
name: 'hook',
|
|
parameters: ['<set/unset>']
|
|
},
|
|
async (argv) => {
|
|
const HOOK_URL = __filename;
|
|
|
|
try {
|
|
await assertGitRepo();
|
|
|
|
const { setUnset: mode } = argv._;
|
|
|
|
if (mode === 'set') {
|
|
intro(`setting opencommit as '${HOOK_NAME}' hook`);
|
|
|
|
if (isHookExists) {
|
|
let realPath;
|
|
try {
|
|
realPath = await fs.realpath(SYMLINK_URL);
|
|
} catch (error) {
|
|
outro(error as string);
|
|
realPath = null;
|
|
}
|
|
|
|
if (realPath === HOOK_URL)
|
|
return outro(`opencommit is already set as '${HOOK_NAME}'`);
|
|
|
|
throw new Error(
|
|
`Different ${HOOK_NAME} is already set. Remove it before setting opencommit as '${HOOK_NAME}' hook.`
|
|
);
|
|
}
|
|
|
|
await fs.mkdir(path.dirname(SYMLINK_URL), { recursive: true });
|
|
await fs.symlink(HOOK_URL, SYMLINK_URL, 'file');
|
|
await fs.chmod(SYMLINK_URL, 0o755);
|
|
|
|
return outro(`${chalk.green('✔')} Hook set`);
|
|
}
|
|
|
|
if (mode === 'unset') {
|
|
intro(`unsetting opencommit as '${HOOK_NAME}' hook`);
|
|
|
|
if (!isHookExists) {
|
|
return outro(
|
|
`opencommit wasn't previously set as '${HOOK_NAME}' hook, nothing to remove`
|
|
);
|
|
}
|
|
|
|
const realpath = await fs.realpath(SYMLINK_URL);
|
|
if (realpath !== HOOK_URL) {
|
|
return outro(
|
|
`opencommit wasn't previously set as '${HOOK_NAME}' hook, but different hook was, if you want to remove it — do it manually`
|
|
);
|
|
}
|
|
|
|
await fs.rm(SYMLINK_URL);
|
|
return outro(`${chalk.green('✔')} Hook is removed`);
|
|
}
|
|
|
|
throw new Error(
|
|
`unsupported mode: ${mode}. Supported modes are: 'set' or 'unset'`
|
|
);
|
|
} catch (error) {
|
|
outro(`${chalk.red('✖')} ${error}`);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
);
|