Skip to content

Commit 6942656

Browse files
committed
Index._iter_expand_paths: fixed tiny error with large impact, there was code using a / in a hardcoded fashion, leading to absolute paths where the caller expected relative ones
1 parent cbb5886 commit 6942656

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

lib/git/ext/gitdb

Submodule gitdb updated from 425ecf0 to 18152fe

lib/git/index/base.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ def _iter_expand_paths(self, paths):
370370
def raise_exc(e):
371371
raise e
372372
r = self.repo.working_tree_dir
373-
rs = r + '/'
373+
rs = r + os.sep
374374
for path in paths:
375375
abs_path = path
376376
if not os.path.isabs(abs_path):
@@ -667,7 +667,6 @@ def add(self, items, force=True, fprogress=lambda *args: None, path_rewriter=Non
667667
# paths can be git-added, for everything else we use git-update-index
668668
entries_added = list()
669669
paths, entries = self._preprocess_add_items(items)
670-
671670
if paths and path_rewriter:
672671
for path in paths:
673672
abspath = os.path.abspath(path)

test/git/test_index.py

+20-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def _assert_fprogress(self, entries):
2424
assert len(entries) == len(self._fprogress_map)
2525
for path, call_count in self._fprogress_map.iteritems():
2626
assert call_count == 2
27+
# END for each item in progress map
2728
self._reset_progress()
2829

2930
def _fprogress(self, path, done, item):
@@ -44,6 +45,13 @@ def _fprogress_add(self, path, done, item):
4445
def _reset_progress(self):
4546
# maps paths to the count of calls
4647
self._fprogress_map = dict()
48+
49+
def _assert_entries(self, entries):
50+
for entry in entries:
51+
assert isinstance(entry, BaseIndexEntry)
52+
assert not os.path.isabs(entry.path)
53+
assert not "\\" in entry.path
54+
# END for each entry
4755

4856
def test_index_file_base(self):
4957
# read from file
@@ -172,7 +180,7 @@ def test_index_merge_tree(self, rw_repo):
172180
# sha for it ( which makes things faster of course )
173181
manifest_fake_entry = BaseIndexEntry((manifest_entry[0], "\0"*20, 0, manifest_entry[3]))
174182
# try write flag
175-
rw_repo.index.add([manifest_fake_entry], write=False)
183+
self._assert_entries(rw_repo.index.add([manifest_fake_entry], write=False))
176184
# add actually resolves the null-hex-sha for us as a feature, but we can
177185
# edit the index manually
178186
assert rw_repo.index.entries[manifest_key].binsha != Object.NULL_BIN_SHA
@@ -420,22 +428,25 @@ def mixed_iterator():
420428
# re-add all files in lib
421429
# get the lib folder back on disk, but get an index without it
422430
index.reset(new_commit.parents[0], working_tree=True).reset(new_commit, working_tree=False)
423-
lib_file_path = "lib/git/__init__.py"
431+
lib_file_path = os.path.join("lib", "git", "__init__.py")
424432
assert (lib_file_path, 0) not in index.entries
425433
assert os.path.isfile(os.path.join(rw_repo.working_tree_dir, lib_file_path))
426434

427435
# directory
428436
entries = index.add(['lib'], fprogress=self._fprogress_add)
437+
self._assert_entries(entries)
429438
self._assert_fprogress(entries)
430439
assert len(entries)>1
431440

432441
# glob
433-
entries = index.reset(new_commit).add(['lib/git/*.py'], fprogress=self._fprogress_add)
442+
entries = index.reset(new_commit).add([os.path.join('lib', 'git', '*.py')], fprogress=self._fprogress_add)
443+
self._assert_entries(entries)
434444
self._assert_fprogress(entries)
435445
assert len(entries) == 14
436446

437447
# same file
438-
entries = index.reset(new_commit).add(['lib/git/head.py']*2, fprogress=self._fprogress_add)
448+
entries = index.reset(new_commit).add([os.path.abspath(os.path.join('lib', 'git', 'head.py'))]*2, fprogress=self._fprogress_add)
449+
self._assert_entries(entries)
439450
assert entries[0].mode & 0644 == 0644
440451
# would fail, test is too primitive to handle this case
441452
# self._assert_fprogress(entries)
@@ -448,6 +459,7 @@ def mixed_iterator():
448459
# blob from older revision overrides current index revision
449460
old_blob = new_commit.parents[0].tree.blobs[0]
450461
entries = index.reset(new_commit).add([old_blob], fprogress=self._fprogress_add)
462+
self._assert_entries(entries)
451463
self._assert_fprogress(entries)
452464
assert index.entries[(old_blob.path,0)].hexsha == old_blob.hexsha and len(entries) == 1
453465

@@ -460,6 +472,7 @@ def mixed_iterator():
460472
new_file_relapath = "my_new_file"
461473
new_file_path = self._make_file(new_file_relapath, "hello world", rw_repo)
462474
entries = index.reset(new_commit).add([BaseIndexEntry((010644, null_bin_sha, 0, new_file_relapath))], fprogress=self._fprogress_add)
475+
self._assert_entries(entries)
463476
self._assert_fprogress(entries)
464477
assert len(entries) == 1 and entries[0].hexsha != null_hex_sha
465478

@@ -470,6 +483,7 @@ def mixed_iterator():
470483
link_file = os.path.join(rw_repo.working_tree_dir, basename)
471484
os.symlink(target, link_file)
472485
entries = index.reset(new_commit).add([link_file], fprogress=self._fprogress_add)
486+
self._assert_entries(entries)
473487
self._assert_fprogress(entries)
474488
assert len(entries) == 1 and S_ISLNK(entries[0].mode)
475489
assert S_ISLNK(index.entries[index.entry_key("my_real_symlink", 0)].mode)
@@ -484,6 +498,7 @@ def mixed_iterator():
484498
fake_symlink_path = self._make_file(fake_symlink_relapath, link_target, rw_repo)
485499
fake_entry = BaseIndexEntry((0120000, null_bin_sha, 0, fake_symlink_relapath))
486500
entries = index.reset(new_commit).add([fake_entry], fprogress=self._fprogress_add)
501+
self._assert_entries(entries)
487502
self._assert_fprogress(entries)
488503
assert entries[0].hexsha != null_hex_sha
489504
assert len(entries) == 1 and S_ISLNK(entries[0].mode)
@@ -571,7 +586,7 @@ def make_paths():
571586
# END for each new file
572587
# END path producer
573588
paths = list(make_paths())
574-
index.add(paths, path_rewriter=rewriter)
589+
self._assert_entries(index.add(paths, path_rewriter=rewriter))
575590

576591
for filenum in range(len(paths)):
577592
assert index.entry_key(str(filenum), 0) in index.entries

0 commit comments

Comments
 (0)