diff --git a/git/index/base.py b/git/index/base.py index 14a3117aa..04a3934d6 100644 --- a/git/index/base.py +++ b/git/index/base.py @@ -561,10 +561,9 @@ def _to_relative_path(self, path): return path if self.repo.bare: raise InvalidGitRepositoryError("require non-bare repository") - relative_path = path.replace(self.repo.working_tree_dir + os.sep, "") - if relative_path == path: + if not path.startswith(self.repo.working_tree_dir): raise ValueError("Absolute path %r is not in git repository at %r" % (path, self.repo.working_tree_dir)) - return relative_path + return os.path.relpath(path, self.repo.working_tree_dir) def _preprocess_add_items(self, items): """ Split the items into two lists of path strings and BaseEntries. """ diff --git a/git/test/test_index.py b/git/test/test_index.py index 9be4031d1..a30d314b5 100644 --- a/git/test/test_index.py +++ b/git/test/test_index.py @@ -838,6 +838,21 @@ def test_add_a_file_with_wildcard_chars(self, rw_dir): r.index.add([fp]) r.index.commit('Added [.exe') + def test__to_relative_path_at_root(self): + root = osp.abspath(os.sep) + + class Mocked(object): + bare = False + git_dir = root + working_tree_dir = root + + repo = Mocked() + path = os.path.join(root, 'file') + index = IndexFile(repo) + + rel = index._to_relative_path(path) + self.assertEqual(rel, os.path.relpath(path, root)) + @with_rw_repo('HEAD', bare=True) def test_pre_commit_hook_success(self, rw_repo): index = rw_repo.index