From 0857d33852b6b2f4d7bc470b4c97502c7f978180 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Tue, 3 Apr 2018 14:39:44 +0300 Subject: git: index: base: use os.path.relpath Fixes #743 Signed-off-by: Ruslan Kuprieiev --- git/index/base.py | 5 ++--- git/test/test_index.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/git/index/base.py b/git/index/base.py index 14a3117a..04a3934d 100644 --- a/git/index/base.py +++ b/git/index/base.py @@ -561,10 +561,9 @@ class IndexFile(LazyMixin, diff.Diffable, Serializable): 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 9be4031d..a30d314b 100644 --- a/git/test/test_index.py +++ b/git/test/test_index.py @@ -838,6 +838,21 @@ class TestIndex(TestBase): 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 -- cgit v1.2.1