diff --git a/package-lock.json b/package-lock.json index 126b2a27d..2e4b596ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2253,14 +2253,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2281,8 +2279,7 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", @@ -2433,7 +2430,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2441,14 +2437,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2467,7 +2461,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2561,7 +2554,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2647,8 +2639,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2754,8 +2745,7 @@ "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -4420,7 +4410,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { diff --git a/src/installer/__tests__/gitRevParse.ts b/src/installer/__tests__/gitRevParse.ts index 4668ce65f..794f42eb7 100644 --- a/src/installer/__tests__/gitRevParse.ts +++ b/src/installer/__tests__/gitRevParse.ts @@ -5,12 +5,12 @@ import gitRevParse from '../gitRevParse' const root = path.join(__dirname, '../../..') describe('gitRevParse', (): void => { - it('should return topLevel and gitDir', (): void => { + it('should return topLevel and absoluteGitDir', (): void => { expect(gitRevParse()).toStrictEqual({ // Git rev-parse uses a different separator on Linux/MacOS and Windows // slash is used to normalized the returned value for tests topLevel: slash(root), - gitDir: slash(path.join(root, '.git')) + absoluteGitDir: slash(path.join(root, '.git')) }) }) }) diff --git a/src/installer/bin.ts b/src/installer/bin.ts index f951a3560..bf3f189f5 100644 --- a/src/installer/bin.ts +++ b/src/installer/bin.ts @@ -21,17 +21,17 @@ try { ) // Get top level and git dir - const { topLevel, gitDir } = gitRevParse() + const { topLevel, absoluteGitDir } = gitRevParse() // Debug debug(`topLevel: ${topLevel}`) - debug(`gitDir: ${gitDir}`) + debug(`gitDir: ${absoluteGitDir}`) // Install or uninstall if (action === 'install') { - install(topLevel, gitDir, huskyDir, isCI) + install(topLevel, absoluteGitDir, huskyDir, isCI) } else { - uninstall(gitDir, huskyDir) + uninstall(absoluteGitDir, huskyDir) } } catch (error) { console.log(error.message.trim()) diff --git a/src/installer/gitRevParse.ts b/src/installer/gitRevParse.ts index a1d8454bf..3bea4cc48 100644 --- a/src/installer/gitRevParse.ts +++ b/src/installer/gitRevParse.ts @@ -3,22 +3,31 @@ import execa from 'execa' export default function(): { topLevel: string - gitDir: string + absoluteGitDir: string } { + let result try { - const { stdout } = execa.sync('git', [ + result = execa.sync('git', [ 'rev-parse', '--show-toplevel', '--absolute-git-dir' ]) - - const [topLevel, gitDir] = stdout - .trim() - .split('\n') - // Normalize for Windows - .map(slash) - return { topLevel, gitDir } } catch (error) { throw new Error(error.stderr) } + + const [topLevel, absoluteGitDir] = result.stdout + .trim() + .split('\n') + // Normalize for Windows + .map(slash) + + // Git rev-parse returns unknown options as is. + // If we get --absolute-git-dir in the output, + // it probably means that an older version of Git has been used. + if (absoluteGitDir === '--absolute-git-dir') { + throw new Error('Husky requires Git >= 2.13.2, please updade Git') + } + + return { topLevel, absoluteGitDir } }