From 4a771adc5352dd3876dd2ef3d0c52c8e803fc084 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 10 Jun 2015 16:59:00 +0200 Subject: fix(remote): assert fetch respec is set It turns out we can't deal do fetches if no refspec is set as git will change the format of the fetch return values, providing less information than usual. A test was added to show that such a case will fail, and an assertion will assure we don't attempt to fetch/pull if there is no refspec for 'fetch'. Closes #296 --- git/remote.py | 14 ++++++++++++++ git/test/test_remote.py | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/git/remote.py b/git/remote.py index 6126e3cc..c9da1979 100644 --- a/git/remote.py +++ b/git/remote.py @@ -604,6 +604,18 @@ class Remote(LazyMixin, Iterable): raise return output + def _assert_refspec(self): + """Turns out we can't deal with remotes if the refspec is missing""" + config = self.config_reader + try: + if config.get_value('fetch', default=type) is type: + msg = "Remote '%s' has no refspec set.\n" + msg += "You can set it as follows:" + msg += " 'git config --add \"remote.%s.fetch +refs/heads/*:refs/heads/*\"'." % self.name + raise AssertionError(msg) + finally: + config.release() + def fetch(self, refspec=None, progress=None, **kwargs): """Fetch the latest changes for this remote @@ -631,6 +643,7 @@ class Remote(LazyMixin, Iterable): :note: As fetch does not provide progress information to non-ttys, we cannot make it available here unfortunately as in the 'push' method.""" + self._assert_refspec() kwargs = add_progress(kwargs, self.repo.git, progress) if isinstance(refspec, list): args = refspec @@ -651,6 +664,7 @@ class Remote(LazyMixin, Iterable): :param progress: see 'push' method :param kwargs: Additional arguments to be passed to git-pull :return: Please see 'fetch' method """ + self._assert_refspec() kwargs = add_progress(kwargs, self.repo.git, progress) proc = self.repo.git.pull(self, refspec, with_extended_output=True, as_process=True, v=True, **kwargs) res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress()) diff --git a/git/test/test_remote.py b/git/test/test_remote.py index af854988..6c37614d 100644 --- a/git/test/test_remote.py +++ b/git/test/test_remote.py @@ -494,6 +494,11 @@ class TestRemote(TestBase): fetch_info_line_fmt = "c437ee5deb8d00cf02f03720693e4c802e99f390 not-for-merge %s '0.3' of " fetch_info_line_fmt += "git://github.com/gitpython-developers/GitPython" remote_info_line_fmt = "* [new branch] nomatter -> %s" + + self.failUnlessRaises(ValueError, FetchInfo._from_line, self.rorepo, + remote_info_line_fmt % "refs/something/branch", + "269c498e56feb93e408ed4558c8138d750de8893\t\t/Users/ben/test/foo\n") + fi = FetchInfo._from_line(self.rorepo, remote_info_line_fmt % "local/master", fetch_info_line_fmt % 'remote-tracking branch') -- cgit v1.2.1