8000 `IndexFile._to_relative_path` - fix case where absolute path gets str… · gitpython-developers/GitPython@2bbb6ee · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 2bbb6ee

Browse files
IndexFile._to_relative_path - fix case where absolute path gets stripped of trailing slash
1 parent fe7533e commit 2bbb6ee

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

git/index/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,10 @@ def _to_relative_path(self, path: PathLike) -> PathLike:
655655
raise InvalidGitRepositoryError("require non-bare repository")
656656
if not osp.normpath(str(path)).startswith(str(self.repo.working_tree_dir)):
657657
raise ValueError("Absolute path %r is not in git repository at %r" % (path, self.repo.working_tree_dir))
658-
return os.path.relpath(path, self.repo.working_tree_dir)
658+
result = os.path.relpath(path, self.repo.working_tree_dir)
659+
if str(path).endswith(os.sep) and not result.endswith(os.sep):
660+
result += os.sep
661+
return result
659662

660663
def _preprocess_add_items(
661664
self, items: Union[PathLike, Sequence[Union[PathLike, Blob, BaseIndexEntry, "Submodule"]]]

test/test_index.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import subprocess
1717
import sys
1818
import tempfile
19+
from unittest import mock
1920

2021
from gitdb.base import IStream
2122

@@ -1015,6 +1016,27 @@ class Mocked:
10151016
rel = index._to_relative_path(path)
10161017
self.assertEqual(rel, os.path.relpath(path, root))
10171018

1019+
def test__to_relative_path_absolute_trailing_slash(self):
1020+
repo_root = os.path.join(osp.abspath(os.sep), "directory1", "repo_root")
1021+
1022+
class Mocked:
1023+
bare = False
1024+
git_dir = repo_root
1025+
working_tree_dir = repo_root
1026+
1027+
repo = Mocked()
1028+
path = os.path.join(repo_root, "directory2/")
1029+
index = IndexFile(repo)
1030+
1031+
expected_path = "directory2/"
1032+
actual_path = index._to_relative_path(path)
1033+
self.assertEqual(expected_path, actual_path)
1034+
1035+
with mock.patch("git.index.base.os.path") as ospath_mock:
1036+
ospath_mock.relpath.return_value = "directory2/"
1037+
actual_path = index._to_relative_path(path)
1038+
self.assertEqual(expected_path, actual_path)
1039+
10181040
@pytest.mark.xfail(
10191041
type(_win_bash_status) is WinBashStatus.Absent,
10201042
reason="Can't run a hook on Windows without bash.exe.",

0 commit comments

Comments
 (0)
0