diff --git a/src/utils/git.ts b/src/utils/git.ts index 7ccdc35..902d61a 100644 --- a/src/utils/git.ts +++ b/src/utils/git.ts @@ -1,7 +1,7 @@ import { execa } from 'execa'; import { readFileSync } from 'fs'; import ignore, { Ignore } from 'ignore'; - +import { join } from 'path'; import { outro, spinner } from '@clack/prompts'; export const assertGitRepo = async () => { @@ -16,41 +16,44 @@ export const assertGitRepo = async () => { // (file) => `:(exclude)${file}` // ); -export const getOpenCommitIgnore = (): Ignore => { +export const getOpenCommitIgnore = async (): Promise => { + const gitDir = await getGitDir(); + const ig = ignore(); try { - ig.add(readFileSync('.opencommitignore').toString().split('\n')); + ig.add( + readFileSync(join(gitDir, '.opencommitignore')).toString().split('\n') + ); } catch (e) {} return ig; }; export const getCoreHooksPath = async (): Promise => { - const { stdout } = await execa('git', ['config', 'core.hooksPath']); + const gitDir = await getGitDir(); + + const { stdout } = await execa('git', ['config', 'core.hooksPath'], { + cwd: gitDir + }); return stdout; }; export const getStagedFiles = async (): Promise => { - const { stdout: gitDir } = await execa('git', [ - 'rev-parse', - '--show-toplevel' - ]); + const gitDir = await getGitDir(); - const { stdout: files } = await execa('git', [ - 'diff', - '--name-only', - '--cached', - '--relative', - gitDir - ]); + const { stdout: files } = await execa( + 'git', + ['diff', '--name-only', '--cached', '--relative'], + { cwd: gitDir } + ); if (!files) return []; const filesList = files.split('\n'); - const ig = getOpenCommitIgnore(); + const ig = await getOpenCommitIgnore(); const allowedFiles = filesList.filter((file) => !ig.ignores(file)); if (!allowedFiles) return []; @@ -59,12 +62,17 @@ export const getStagedFiles = async (): Promise => { }; export const getChangedFiles = async (): Promise => { - const { stdout: modified } = await execa('git', ['ls-files', '--modified']); - const { stdout: others } = await execa('git', [ - 'ls-files', - '--others', - '--exclude-standard' - ]); + const gitDir = await getGitDir(); + + const { stdout: modified } = await execa('git', ['ls-files', '--modified'], { + cwd: gitDir + }); + + const { stdout: others } = await execa( + 'git', + ['ls-files', '--others', '--exclude-standard'], + { cwd: gitDir } + ); const files = [...modified.split('\n'), ...others.split('\n')].filter( (file) => !!file @@ -74,16 +82,20 @@ export const getChangedFiles = async (): Promise => { }; export const gitAdd = async ({ files }: { files: string[] }) => { + const gitDir = await getGitDir(); + const gitAddSpinner = spinner(); gitAddSpinner.start('Adding files to commit'); - await execa('git', ['add', ...files]); + await execa('git', ['add', ...files], { cwd: gitDir }); gitAddSpinner.stop(`Staged ${files.length} files`); }; export const getDiff = async ({ files }: { files: string[] }) => { + const gitDir = await getGitDir(); + const lockFiles = files.filter( (file) => file.includes('.lock') || @@ -108,12 +120,20 @@ export const getDiff = async ({ files }: { files: string[] }) => { (file) => !file.includes('.lock') && !file.includes('-lock.') ); - const { stdout: diff } = await execa('git', [ - 'diff', - '--staged', - '--', - ...filesWithoutLocks - ]); + const { stdout: diff } = await execa( + 'git', + ['diff', '--staged', '--', ...filesWithoutLocks], + { cwd: gitDir } + ); return diff; }; + +export const getGitDir = async (): Promise => { + const { stdout: gitDir } = await execa('git', [ + 'rev-parse', + '--show-toplevel' + ]); + + return gitDir; +};