changeset 3397:64c194492aad beta

--version command should be safe, and bare no modifications - improved subprocess calls error detection - fixed I/O read on closed file errors
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 25 Feb 2013 17:16:45 +0100
parents 3faf7a7eebb3
children 1ca82b6a6349
files rhodecode/lib/subprocessio.py rhodecode/lib/utils.py rhodecode/lib/vcs/backends/git/repository.py
diffstat 3 files changed, 28 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/subprocessio.py	Mon Feb 25 16:49:05 2013 +0100
+++ b/rhodecode/lib/subprocessio.py	Mon Feb 25 17:16:45 2013 +0100
@@ -119,7 +119,11 @@
         kr = self.keep_reading
         da = self.data_added
         go = self.go
-        b = s.read(cs)
+
+        try:
+            b = s.read(cs)
+        except ValueError:
+            b = ''
 
         while b and go.is_set():
             if len(t) > ccm:
@@ -372,7 +376,9 @@
             bg_out.stop()
             bg_err.stop()
             err = '%s' % ''.join(bg_err)
-            raise EnvironmentError("Subprocess exited due to an error:\n" + err)
+            if err:
+                raise EnvironmentError("Subprocess exited due to an error:\n" + err)
+            raise EnvironmentError("Subprocess exited with non 0 ret code:%s" % _returncode)
 
         self.process = _p
         self.output = bg_out
--- a/rhodecode/lib/utils.py	Mon Feb 25 16:49:05 2013 +0100
+++ b/rhodecode/lib/utils.py	Mon Feb 25 17:16:45 2013 +0100
@@ -748,7 +748,8 @@
     from rhodecode.lib.vcs.backends.git.repository import GitRepository
     from distutils.version import StrictVersion
 
-    stdout, stderr = GitRepository._run_git_command('--version')
+    stdout, stderr = GitRepository._run_git_command('--version', _bare=True,
+                                                    _safe=True)
 
     ver = (stdout.split(' ')[-1] or '').strip() or '0.0.0'
     if len(ver.split('.')) > 3:
--- a/rhodecode/lib/vcs/backends/git/repository.py	Mon Feb 25 16:49:05 2013 +0100
+++ b/rhodecode/lib/vcs/backends/git/repository.py	Mon Feb 25 17:16:45 2013 +0100
@@ -102,7 +102,17 @@
         :param opts: env options to pass into Subprocess command
         """
 
-        _copts = ['-c', 'core.quotepath=false', ]
+        if '_bare' in opts:
+            _copts = []
+            del opts['_bare']
+        else:
+            _copts = ['-c', 'core.quotepath=false', ]
+        safe_call = False
+        if '_safe' in opts:
+            #no exc on failure
+            del opts['_safe']
+            safe_call = True
+
         _str_cmd = False
         if isinstance(cmd, basestring):
             cmd = [cmd]
@@ -126,9 +136,13 @@
             _opts.update(opts)
             p = subprocessio.SubprocessIOChunker(cmd, **_opts)
         except (EnvironmentError, OSError), err:
-            log.error(traceback.format_exc())
-            raise RepositoryError("Couldn't run git command (%s).\n"
-                                  "Original error was:%s" % (cmd, err))
+            tb_err = ("Couldn't run git command (%s).\n"
+                      "Original error was:%s\n" % (cmd, err))
+            log.error(tb_err)
+            if safe_call:
+                return '', err
+            else:
+                raise RepositoryError(tb_err)
 
         return ''.join(p.output), ''.join(p.error)