From 2d1f3816714d0397099c4529300e08f839b6a8e1 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 8 Feb 2019 11:44:33 +0100 Subject: [PATCH 1/3] allow calling index.add, index.move and index.remove with single items added testing for it closes #813 --- git/index/base.py | 46 ++++++++++++++++++++++++++---------------- git/test/test_index.py | 9 ++++++++- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/git/index/base.py b/git/index/base.py index 04a3934d6..c34fe78a5 100644 --- a/git/index/base.py +++ b/git/index/base.py @@ -569,16 +569,23 @@ def _preprocess_add_items(self, items): """ Split the items into two lists of path strings and BaseEntries. """ paths = [] entries = [] - - for item in items: - if isinstance(item, string_types): - paths.append(self._to_relative_path(item)) - elif isinstance(item, (Blob, Submodule)): - entries.append(BaseIndexEntry.from_blob(item)) - elif isinstance(item, BaseIndexEntry): - entries.append(item) - else: - raise TypeError("Invalid Type: %r" % item) + + if isinstance(items, string_types): + paths.append(self._to_relative_path(items)) + elif isinstance(items, (Blob, Submodule)): + entries.append(BaseIndexEntry.from_blob(items)) + elif isinstance(items, BaseIndexEntry): + entries.append(items) + else: + for item in items: + if isinstance(item, string_types): + paths.append(self._to_relative_path(item)) + elif isinstance(item, (Blob, Submodule)): + entries.append(BaseIndexEntry.from_blob(item)) + elif isinstance(item, BaseIndexEntry): + entries.append(item) + else: + raise TypeError("Invalid Type: %r" % item) # END for each item return (paths, entries) @@ -801,13 +808,18 @@ def _items_to_rela_paths(self, items): """Returns a list of repo-relative paths from the given items which may be absolute or relative paths, entries or blobs""" paths = [] - for item in items: - if isinstance(item, (BaseIndexEntry, (Blob, Submodule))): - paths.append(self._to_relative_path(item.path)) - elif isinstance(item, string_types): - paths.append(self._to_relative_path(item)) - else: - raise TypeError("Invalid item type: %r" % item) + if isinstance(items, (BaseIndexEntry, (Blob, Submodule))): + paths.append(self._to_relative_path(items.path)) + elif isinstance(items, string_types): + paths.append(self._to_relative_path(items)) + else: + for item in items: + if isinstance(item, (BaseIndexEntry, (Blob, Submodule))): + paths.append(self._to_relative_path(item.path)) + elif isinstance(item, string_types): + paths.append(self._to_relative_path(item)) + else: + raise TypeError("Invalid item type: %r" % item) # END for each item return paths diff --git a/git/test/test_index.py b/git/test/test_index.py index a30d314b5..6195e76b4 100644 --- a/git/test/test_index.py +++ b/git/test/test_index.py @@ -772,7 +772,14 @@ def test_compare_write_tree(self, rw_repo): orig_tree = commit.tree self.assertEqual(index.write_tree(), orig_tree) # END for each commit - + + @with_rw_repo('HEAD', bare=False) + def test_index_single_addremove(self, rw_repo): + path = osp.join('git', 'test', 'test_index.py') + self._assert_entries(rw_repo.index.add(path)) + deleted_files = rw_repo.index.remove(path) + assert deleted_files + def test_index_new(self): B = self.rorepo.tree("6d9b1f4f9fa8c9f030e3207e7deacc5d5f8bba4e") H = self.rorepo.tree("25dca42bac17d511b7e2ebdd9d1d679e7626db5f") From e36f324b054e3ae7b56aa4890beb68a0e955635e Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 19 Sep 2019 10:04:09 +0200 Subject: [PATCH 2/3] fixed code repetition --- git/index/base.py | 59 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/git/index/base.py b/git/index/base.py index c34fe78a5..9ca663f4a 100644 --- a/git/index/base.py +++ b/git/index/base.py @@ -569,25 +569,23 @@ def _preprocess_add_items(self, items): """ Split the items into two lists of path strings and BaseEntries. """ paths = [] entries = [] - - if isinstance(items, string_types): - paths.append(self._to_relative_path(items)) - elif isinstance(items, (Blob, Submodule)): - entries.append(BaseIndexEntry.from_blob(items)) - elif isinstance(items, BaseIndexEntry): - entries.append(items) - else: - for item in items: - if isinstance(item, string_types): - paths.append(self._to_relative_path(item)) - elif isinstance(item, (Blob, Submodule)): - entries.append(BaseIndexEntry.from_blob(item)) - elif isinstance(item, BaseIndexEntry): - entries.append(item) - else: - raise TypeError("Invalid Type: %r" % item) + # check if is iterable, else put in list + try: + test_item = iter(items) + except TypeError: + items = [items] + + for item in items: + if isinstance(item, string_types): + paths.append(self._to_relative_path(item)) + elif isinstance(item, (Blob, Submodule)): + entries.append(BaseIndexEntry.from_blob(item)) + elif isinstance(item, BaseIndexEntry): + entries.append(item) + else: + raise TypeError("Invalid Type: %r" % item) # END for each item - return (paths, entries) + return paths, entries def _store_path(self, filepath, fprogress): """Store file at filepath in the database and return the base index entry @@ -808,18 +806,19 @@ def _items_to_rela_paths(self, items): """Returns a list of repo-relative paths from the given items which may be absolute or relative paths, entries or blobs""" paths = [] - if isinstance(items, (BaseIndexEntry, (Blob, Submodule))): - paths.append(self._to_relative_path(items.path)) - elif isinstance(items, string_types): - paths.append(self._to_relative_path(items)) - else: - for item in items: - if isinstance(item, (BaseIndexEntry, (Blob, Submodule))): - paths.append(self._to_relative_path(item.path)) - elif isinstance(item, string_types): - paths.append(self._to_relative_path(item)) - else: - raise TypeError("Invalid item type: %r" % item) + # check if is iterable, else put in list + try: + test_item = iter(items) + except TypeError: + items = [items] + + for item in items: + if isinstance(item, (BaseIndexEntry, (Blob, Submodule))): + paths.append(self._to_relative_path(item.path)) + elif isinstance(item, string_types): + paths.append(self._to_relative_path(item)) + else: + raise TypeError("Invalid item type: %r" % item) # END for each item return paths From 0f40fccae0e4319f51cb47bf13bf390117bce462 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 13 Oct 2019 10:25:02 +0200 Subject: [PATCH 3/3] As string is iterable, changed to isinstance check test now works --- .gitignore | 2 ++ .gitmodules | 6 +++--- git/index/base.py | 12 ++++-------- git/test/test_index.py | 8 +++++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index ff1992dcf..1fa8458bc 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ nbproject /*egg-info /.tox /.vscode/ +.idea/ +.cache/ diff --git a/.gitmodules b/.gitmodules index 4a3f37c25..251eeeec4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "gitdb"] - url = https://github.com/gitpython-developers/gitdb.git - path = git/ext/gitdb +[submodule "gitdb"] + url = https://github.com/gitpython-developers/gitdb.git + path = git/ext/gitdb diff --git a/git/index/base.py b/git/index/base.py index 9ca663f4a..378a9d792 100644 --- a/git/index/base.py +++ b/git/index/base.py @@ -569,10 +569,8 @@ def _preprocess_add_items(self, items): """ Split the items into two lists of path strings and BaseEntries. """ paths = [] entries = [] - # check if is iterable, else put in list - try: - test_item = iter(items) - except TypeError: + # if it is a string put in list + if isinstance(items, str): items = [items] for item in items: @@ -806,10 +804,8 @@ def _items_to_rela_paths(self, items): """Returns a list of repo-relative paths from the given items which may be absolute or relative paths, entries or blobs""" paths = [] - # check if is iterable, else put in list - try: - test_item = iter(items) - except TypeError: + # if string put in list + if isinstance(items, str): items = [items] for item in items: diff --git a/git/test/test_index.py b/git/test/test_index.py index 6195e76b4..393158f7f 100644 --- a/git/test/test_index.py +++ b/git/test/test_index.py @@ -775,9 +775,11 @@ def test_compare_write_tree(self, rw_repo): @with_rw_repo('HEAD', bare=False) def test_index_single_addremove(self, rw_repo): - path = osp.join('git', 'test', 'test_index.py') - self._assert_entries(rw_repo.index.add(path)) - deleted_files = rw_repo.index.remove(path) + fp = osp.join(rw_repo.working_dir, 'testfile.txt') + with open(fp, 'w') as fs: + fs.write(u'content of testfile') + self._assert_entries(rw_repo.index.add(fp)) + deleted_files = rw_repo.index.remove(fp) assert deleted_files def test_index_new(self):