summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2016-02-07 12:20:04 +0100
committerSebastian Thiel <byronimo@gmail.com>2016-02-07 12:20:04 +0100
commitf8775f9b8e40b18352399445dba99dd1d805e8c6 (patch)
tree49e0c4abff2ceb73aab5d420e682e012b25c798a
parent9b10d5e75570ac6325d1c7e2b32882112330359a (diff)
downloadgitpython-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.py6
-rw-r--r--git/config.py9
-rw-r--r--git/remote.py4
3 files changed, 7 insertions, 12 deletions
diff --git a/git/cmd.py b/git/cmd.py
index 9b2abc71..3fa24fff 100644
--- a/git/cmd.py
+++ b/git/cmd.py
@@ -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()