Hook sys.stdio directly to the gsutil subprocess for the gsutil call
So that gsutil.py config works.
I would've preferred the execv solution, but apparently that didn't work on Windows :(
BUG=451551
Review URL: https://codereview.chromium.org/870093003
git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@293790 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gsutil.py b/gsutil.py
index 6578d78..f2f2b72 100755
--- a/gsutil.py
+++ b/gsutil.py
@@ -27,31 +27,10 @@
THIS_DIR, 'third_party', 'gsutil', 'gsutil')
-class SubprocessError(Exception):
- def __init__(self, message=None, code=0):
- super(SubprocessError, self).__init__(message)
- self.code = code
-
-
class InvalidGsutilError(Exception):
pass
-def call(args, verbose=True, **kwargs):
- kwargs['stdout'] = subprocess.PIPE
- kwargs['stderr'] = subprocess.STDOUT
- proc = subprocess.Popen(args, **kwargs)
- out = []
- for line in proc.stdout:
- out.append(line)
- if verbose:
- sys.stdout.write(line)
- code = proc.wait()
- if code:
- raise SubprocessError('%s failed with %s' % (args, code), code)
- return ''.join(out)
-
-
def download_gsutil(version, target_dir):
"""Downloads gsutil into the target_dir."""
filename = 'gsutil_%s.zip' % version
@@ -90,12 +69,9 @@
def check_gsutil(gsutil_bin):
"""Run gsutil version and make sure it runs."""
- try:
- call([sys.executable, gsutil_bin, 'version'], verbose=False)
- return True
- except SubprocessError:
- return False
-
+ return subprocess.call(
+ [sys.executable, gsutil_bin, 'version'],
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT) == 0
def ensure_gsutil(version, target):
bin_dir = os.path.join(target, 'gsutil_%s' % version)
@@ -127,11 +103,7 @@
else:
gsutil_bin = fallback
cmd = [sys.executable, gsutil_bin] + args
- try:
- call(cmd)
- except SubprocessError as e:
- return e.code
- return 0
+ return subprocess.call(cmd)
def parse_args():
diff --git a/tests/gsutil_test.py b/tests/gsutil_test.py
index 3064827..76570dd 100755
--- a/tests/gsutil_test.py
+++ b/tests/gsutil_test.py
@@ -7,16 +7,17 @@
import __builtin__
-import unittest
-import hashlib
-import zipfile
-import shutil
-import sys
import base64
-import tempfile
+import hashlib
import json
import os
+import shutil
+import subprocess
+import sys
+import tempfile
+import unittest
import urllib2
+import zipfile
# Add depot_tools to path
@@ -62,8 +63,6 @@
message = 'Expected:\n args: %s\n kwargs: %s\n' % (exp_args, exp_kwargs)
message += 'Got:\n args: %s\n kwargs: %s\n' % (args, kwargs)
raise TestError(message)
- if isinstance(exp_returns, Exception):
- raise exp_returns
return exp_returns
@@ -72,15 +71,15 @@
self.fake = FakeCall()
self.tempdir = tempfile.mkdtemp()
self.old_urlopen = getattr(urllib2, 'urlopen')
- self.old_call = getattr(gsutil, 'call')
+ self.old_call = getattr(subprocess, 'call')
setattr(urllib2, 'urlopen', self.fake)
- setattr(gsutil, 'call', self.fake)
+ setattr(subprocess, 'call', self.fake)
def tearDown(self):
self.assertEqual(self.fake.expectations, [])
shutil.rmtree(self.tempdir)
setattr(urllib2, 'urlopen', self.old_urlopen)
- setattr(gsutil, 'call', self.old_call)
+ setattr(subprocess, 'call', self.old_call)
def test_download_gsutil(self):
version = '4.2'
@@ -126,8 +125,8 @@
os.makedirs(gsutil_dir)
self.fake.add_expectation(
- [sys.executable, gsutil_bin, 'version'], verbose=False,
- _returns=gsutil.SubprocessError())
+ [sys.executable, gsutil_bin, 'version'], stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT, _returns=1)
with open(gsutil_bin, 'w') as f:
f.write('Foobar')
@@ -140,8 +139,8 @@
with open(tempzip, 'rb') as f:
self.fake.add_expectation(url, _returns=Buffer(f.read()))
self.fake.add_expectation(
- [sys.executable, gsutil_bin, 'version'], verbose=False,
- _returns=gsutil.SubprocessError())
+ [sys.executable, gsutil_bin, 'version'], stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT, _returns=1)
# This should delete the old bin and rewrite it with 'Fake gsutil'
self.assertRaises(
@@ -160,7 +159,8 @@
# Mock out call().
self.fake.add_expectation(
- [sys.executable, gsutil_bin, 'version'], verbose=False, _returns=True)
+ [sys.executable, gsutil_bin, 'version'],
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT, _returns=0)
with open(gsutil_bin, 'w') as f:
f.write('Foobar')