summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Pietraszkiewicz <ppietraszkiewicz@psi.de>2016-04-13 17:00:34 +0200
committerPiotr Pietraszkiewicz <ppietraszkiewicz@psi.de>2016-04-13 17:00:34 +0200
commitaf74966685e1d1f18390a783f6b8d26b3b1c26d1 (patch)
tree0efc9096f51722761b0aa6595cf6a22ed4c0b8a5
parent9debf6b0aafb6f7781ea9d1383c86939a1aacde3 (diff)
downloadgitpython-af74966685e1d1f18390a783f6b8d26b3b1c26d1.tar.gz
fix(index): avoid recursing endlessly in add()
Issue #407
-rw-r--r--git/index/base.py14
-rw-r--r--git/test/test_index.py11
2 files changed, 22 insertions, 3 deletions
diff --git a/git/index/base.py b/git/index/base.py
index f80eb290..3e68f843 100644
--- a/git/index/base.py
+++ b/git/index/base.py
@@ -380,9 +380,17 @@ class IndexFile(LazyMixin, diff.Diffable, Serializable):
# resolve globs if possible
if '?' in path or '*' in path or '[' in path:
- for f in self._iter_expand_paths(glob.glob(abs_path)):
- yield f.replace(rs, '')
- continue
+ resolved_paths = glob.glob(abs_path)
+ # not abs_path in resolved_paths:
+ # a glob() resolving to the same path we are feeding it with
+ # is a glob() that failed to resolve. If we continued calling
+ # ourselves we'd endlessly recurse. If the condition below
+ # evaluates to true then we are likely dealing with a file
+ # whose name contains wildcard characters.
+ if abs_path not in resolved_paths:
+ for f in self._iter_expand_paths(glob.glob(abs_path)):
+ yield f.replace(rs, '')
+ continue
# END glob handling
try:
for root, dirs, files in os.walk(abs_path, onerror=raise_exc):
diff --git a/git/test/test_index.py b/git/test/test_index.py
index a928fe5e..7546f6be 100644
--- a/git/test/test_index.py
+++ b/git/test/test_index.py
@@ -796,3 +796,14 @@ class TestIndex(TestBase):
r = Repo.init(rw_dir)
r.index.add([fp])
r.index.commit('Added orig and prestable')
+
+ @with_rw_directory
+ def test_add_a_file_with_wildcard_chars(self, rw_dir):
+ # see issue #407
+ fp = os.path.join(rw_dir, '[.exe')
+ with open(fp, "w") as f:
+ f.write(b'something')
+
+ r = Repo.init(rw_dir)
+ r.index.add([fp])
+ r.index.commit('Added [.exe')