diff --git a/git/objects/submodule/base.py b/git/objects/submodule/base.py index c6c6d6996..90f796bdb 100644 --- a/git/objects/submodule/base.py +++ b/git/objects/submodule/base.py @@ -836,7 +836,7 @@ def remove(self, module=True, force=False, configuration=True, dry_run=False): num_branches_with_new_commits += len(mod.git.cherry(rref)) != 0 # END for each remote ref # not a single remote branch contained all our commits - if num_branches_with_new_commits == len(rrefs): + if len(rrefs) and num_branches_with_new_commits == len(rrefs): raise InvalidGitRepositoryError( "Cannot delete module at %s as there are new commits" % mod.working_tree_dir) # END handle new commits diff --git a/git/test/lib/helper.py b/git/test/lib/helper.py index a85ac2fd6..2d21f5bf7 100644 --- a/git/test/lib/helper.py +++ b/git/test/lib/helper.py @@ -94,8 +94,8 @@ def wrapper(self): try: return func(self, path) except Exception: - log.info.write("Test %s.%s failed, output is at %r\n", - type(self).__name__, func.__name__, path) + log.info("Test %s.%s failed, output is at %r\n", + type(self).__name__, func.__name__, path) keep = True raise finally: @@ -107,6 +107,8 @@ def wrapper(self): gc.collect() if not keep: rmtree(path) + wrapper.__name__ = func.__name__ + return wrapper def with_rw_repo(working_tree_ref, bare=False): diff --git a/git/test/test_submodule.py b/git/test/test_submodule.py index bfa0379d1..6dcf18311 100644 --- a/git/test/test_submodule.py +++ b/git/test/test_submodule.py @@ -317,8 +317,8 @@ def _do_base_tests(self, rwrepo): # forcibly delete the child repository prev_count = len(sm.children()) self.failUnlessRaises(ValueError, csm.remove, force=True) - # We removed sm, which removed all submodules. Howver, the instance we have - # still points to the commit prior to that, where it still existed + # We removed sm, which removed all submodules. However, the instance we + # have still points to the commit prior to that, where it still existed csm.set_parent_commit(csm.repo.commit(), check=False) assert not csm.exists() assert not csm.module_exists() @@ -801,6 +801,24 @@ def assert_exists(sm, value=True): assert os.path.isdir(sm_module_path) == dry_run # end for each dry-run mode + @with_rw_directory + def test_remove_norefs(self, rwdir): + parent = git.Repo.init(os.path.join(rwdir, 'parent')) + sm_name = 'mymodules/myname' + sm = parent.create_submodule(sm_name, sm_name, url=self._small_repo_url()) + assert sm.exists() + + parent.index.commit("Added submodule") + + assert sm.repo is parent # yoh was surprised since expected sm repo!! + # so created a new instance for submodule + smrepo = git.Repo(os.path.join(rwdir, 'parent', sm.path)) + # Adding a remote without fetching so would have no references + smrepo.create_remote('special', 'git@server-shouldnotmatter:repo.git') + # And we should be able to remove it just fine + sm.remove() + assert not sm.exists() + @with_rw_directory def test_rename(self, rwdir): parent = git.Repo.init(os.path.join(rwdir, 'parent'))