diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2016-02-07 12:20:04 +0100 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2016-02-07 12:20:04 +0100 |
commit | f8775f9b8e40b18352399445dba99dd1d805e8c6 (patch) | |
tree | 49e0c4abff2ceb73aab5d420e682e012b25c798a | |
parent | 9b10d5e75570ac6325d1c7e2b32882112330359a (diff) | |
download | gitpython-f8775f9b8e40b18352399445dba99dd1d805e8c6.tar.gz |
fix(cmd): prevent deadlock on clone/fetch/pull
We keep stdout closed, which seems to have the side-effect of
stdout being connected to your TTY, in case you run a terminal.
However, this shold also prevent deadlocks, as only stderr is used.
The alternative would have been to try to fetch lines concurrently,
and we have been there.
For clone(), `communicate()` is used, and with some luck this will
just do the right thing. Even though last time I checked, it
didn't ... ? Lets see.
Stab at #72
-rw-r--r-- | git/cmd.py | 6 | ||||
-rw-r--r-- | git/config.py | 9 | ||||
-rw-r--r-- | git/remote.py | 4 |
3 files changed, 7 insertions, 12 deletions
@@ -279,8 +279,10 @@ class Git(LazyMixin): self.proc = None if proc.stdin: proc.stdin.close() - proc.stdout.close() - proc.stderr.close() + if proc.stdout: + proc.stdout.close() + if proc.stderr: + proc.stderr.close() # did the process finish already so we have a return code ? if proc.poll() is not None: diff --git a/git/config.py b/git/config.py index ea5e17be..51b15989 100644 --- a/git/config.py +++ b/git/config.py @@ -160,14 +160,7 @@ class GitConfigParser(with_metaclass(MetaParserBuilder, cp.RawConfigParser, obje OPTVALUEONLY = re.compile(optvalueonly_source) - OPTCRE = re.compile( - optvalueonly_source # very permissive, incuding leading whitespace - + r'\s*(?P<vi>[:=])\s*' # any number of space/tab, - # followed by separator - # (either : or =), followed - # by any # space/tab - + r'(?P<value>.*)$' # everything up to eol - ) + OPTCRE = re.compile(optvalueonly_source + r'\s*(?P<vi>[:=])\s*' + r'(?P<value>.*)$') del optvalueonly_source diff --git a/git/remote.py b/git/remote.py index c1969768..1baacb1b 100644 --- a/git/remote.py +++ b/git/remote.py @@ -650,7 +650,7 @@ class Remote(LazyMixin, Iterable): else: args = [refspec] - proc = self.repo.git.fetch(self, *args, with_extended_output=True, as_process=True, with_stdout=False, v=True, + proc = self.repo.git.fetch(self, *args, as_process=True, with_stdout=False, v=True, **kwargs) res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress()) if hasattr(self.repo.odb, 'update_cache'): @@ -667,7 +667,7 @@ class Remote(LazyMixin, Iterable): :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) + proc = self.repo.git.pull(self, refspec, with_stdout=False, as_process=True, v=True, **kwargs) res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress()) if hasattr(self.repo.odb, 'update_cache'): self.repo.odb.update_cache() |