From 2a9701ac7c815be7617f8650bc1156a9965df0c2 Mon Sep 17 00:00:00 2001 From: Josh Abernathy Date: Mon, 22 Feb 2016 12:49:03 -0500 Subject: [PATCH] Merge pull request #10926 from atom/fix-case-sensitive-path-relativization Fix case-preserving path relativization --- spec/git-repository-async-spec.js | 8 ++++++++ src/git-repository-async.js | 23 +++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/spec/git-repository-async-spec.js b/spec/git-repository-async-spec.js index 9999afc63..fa5b0d711 100644 --- a/spec/git-repository-async-spec.js +++ b/spec/git-repository-async-spec.js @@ -590,6 +590,14 @@ describe('GitRepositoryAsync', () => { const relativizedPath = repo.relativize(`${workdir}/a/b.txt`, workdir) expect(relativizedPath).toBe('a/b.txt') }) + + it('preserves file case', () => { + repo.isCaseInsensitive = true + + const workdir = '/tmp/foo/bar/baz/' + const relativizedPath = repo.relativize(`${workdir}a/README.txt`, workdir) + expect(relativizedPath).toBe('a/README.txt') + }) }) describe('.getShortHead(path)', () => { diff --git a/src/git-repository-async.js b/src/git-repository-async.js index cf9f9d6fe..894b1216a 100644 --- a/src/git-repository-async.js +++ b/src/git-repository-async.js @@ -202,32 +202,35 @@ export default class GitRepositoryAsync { workingDirectory = workingDirectory.replace(/\/$/, '') + // Depending on where the paths come from, they may have a '/private/' + // prefix. Standardize by stripping that out. + _path = _path.replace(/^\/private\//i, '/') + workingDirectory = workingDirectory.replace(/^\/private\//i, '/') + + const originalPath = _path + const originalWorkingDirectory = workingDirectory if (this.isCaseInsensitive) { _path = _path.toLowerCase() workingDirectory = workingDirectory.toLowerCase() } - // Depending on where the paths come from, they may have a '/private/' - // prefix. Standardize by stripping that out. - _path = _path.replace(/^\/private\//, '/') - workingDirectory = workingDirectory.replace(/^\/private\//, '/') - - const originalPath = _path if (_path.indexOf(workingDirectory) === 0) { - return originalPath.substring(workingDirectory.length + 1) + return originalPath.substring(originalWorkingDirectory.length + 1) } else if (_path === workingDirectory) { return '' } if (openedWorkingDirectory) { + openedWorkingDirectory = openedWorkingDirectory.replace(/\/$/, '') + openedWorkingDirectory = openedWorkingDirectory.replace(/^\/private\//i, '/') + + const originalOpenedWorkingDirectory = openedWorkingDirectory if (this.isCaseInsensitive) { openedWorkingDirectory = openedWorkingDirectory.toLowerCase() } - openedWorkingDirectory = openedWorkingDirectory.replace(/\/$/, '') - openedWorkingDirectory = openedWorkingDirectory.replace(/^\/private\//, '/') if (_path.indexOf(openedWorkingDirectory) === 0) { - return originalPath.substring(openedWorkingDirectory.length + 1) + return originalPath.substring(originalOpenedWorkingDirectory.length + 1) } else if (_path === openedWorkingDirectory) { return '' }