diff --git a/lib/resolveGitRepo.js b/lib/resolveGitRepo.js index 03d04ed55..79dfff61d 100644 --- a/lib/resolveGitRepo.js +++ b/lib/resolveGitRepo.js @@ -26,6 +26,11 @@ const resolveGitConfigDir = async (gitDir) => { } const determineGitDir = (cwd, relativeDir) => { + // if relative dir and cwd have different endings normalize it + // this happens under windows, where normalize is unable to normalize git's output + if (relativeDir && relativeDir.endsWith(path.sep)) { + relativeDir = relativeDir.slice(0, -1) + } if (relativeDir) { // the current working dir is inside the git top-level directory return normalize(cwd.substring(0, cwd.lastIndexOf(relativeDir))) @@ -65,3 +70,6 @@ const resolveGitRepo = async (cwd = process.cwd()) => { } module.exports = resolveGitRepo + +// exported for test +module.exports.determineGitDir = determineGitDir diff --git a/test/resolveGitRepo.spec.js b/test/resolveGitRepo.spec.js index 46086ab41..e36e44559 100644 --- a/test/resolveGitRepo.spec.js +++ b/test/resolveGitRepo.spec.js @@ -1,7 +1,7 @@ import normalize from 'normalize-path' import path from 'path' -import resolveGitRepo from '../lib/resolveGitRepo' +import resolveGitRepo, { determineGitDir } from '../lib/resolveGitRepo' /** * resolveGitRepo runs execa, so the mock needs to be disabled for these tests @@ -48,4 +48,27 @@ describe('resolveGitRepo', () => { const { gitDir } = await resolveGitRepo({ cwd: '/' }) // assume root is not a git directory expect(gitDir).toEqual(null) }) + + describe('determineGitDir', () => { + it('should resolve to current working dir when relative dir is empty', () => { + const cwd = process.cwd() + const relativeDir = undefined + const rootDir = determineGitDir(cwd, relativeDir) + expect(rootDir).toEqual(normalize(cwd)) + }) + + it('should resolve to parent dir when relative dir is child', () => { + const relativeDir = 'bar' + const cwd = process.cwd() + path.sep + 'bar' + const rootDir = determineGitDir(cwd, relativeDir) + expect(rootDir).toEqual(normalize(process.cwd())) + }) + + it('should resolve to parent dir when relative dir is child and child has trailing dir separator', () => { + const relativeDir = 'bar' + path.sep + const cwd = process.cwd() + path.sep + 'bar' + const rootDir = determineGitDir(cwd, relativeDir) + expect(rootDir).toEqual(normalize(process.cwd())) + }) + }) })