Commit 83273549 authored by maruel@chromium.org's avatar maruel@chromium.org

Enforce 15 minutes timeout for all operations and 30 minutes for checkouts.

svn commit likes to hang indefinitely whenever the svnserve server forgets
about the client. This changes ensures the commit queue won't be blocked by
this problem.

Add --quiet to the git fetch command but do not capture anymore.


R=petermayo@chromium.org
BUG=


Review URL: https://chromiumcodereview.appspot.com/11358165

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@166725 0039d316-1c4b-4281-b951-d872f2087c98
parent fc490ffc
......@@ -22,6 +22,13 @@ import scm
import subprocess2
# Default timeout of 15 minutes.
GLOBAL_TIMEOUT = 15*60
# Use a larger timeout for checkout since it can be a genuinely slower
# operation.
FETCH_TIMEOUT = 30*60
def get_code_review_setting(path, key,
codereview_settings_file='codereview.settings'):
"""Parses codereview.settings and return the value for the key if present.
......@@ -197,7 +204,8 @@ class RawCheckout(CheckoutBase):
cmd,
stdin=p.get(False),
stderr=subprocess2.STDOUT,
cwd=self.project_path))
cwd=self.project_path,
timeout=GLOBAL_TIMEOUT))
elif p.is_new and not os.path.exists(filepath):
# There is only a header. Just create the file.
open(filepath, 'w').close()
......@@ -276,8 +284,10 @@ class SvnMixIn(object):
"""Runs svn and throws an exception if the command failed."""
kwargs.setdefault('cwd', self.project_path)
kwargs.setdefault('stdout', self.VOID)
kwargs.setdefault('timeout', GLOBAL_TIMEOUT)
return subprocess2.check_call_out(
self._add_svn_flags(args, False), **kwargs)
self._add_svn_flags(args, False),
**kwargs)
def _check_output_svn(self, args, credentials=True, **kwargs):
"""Runs svn and throws an exception if the command failed.
......@@ -288,6 +298,7 @@ class SvnMixIn(object):
return subprocess2.check_output(
self._add_svn_flags(args, True, credentials),
stderr=subprocess2.STDOUT,
timeout=GLOBAL_TIMEOUT,
**kwargs)
@staticmethod
......@@ -387,7 +398,10 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
]
stdout.append(
subprocess2.check_output(
cmd, stdin=p.get(False), cwd=self.project_path))
cmd,
stdin=p.get(False),
cwd=self.project_path,
timeout=GLOBAL_TIMEOUT))
elif p.is_new and not os.path.exists(filepath):
# There is only a header. Just create the file if it doesn't
# exist.
......@@ -483,11 +497,14 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
logging.info(
'Directory %s is not present, checking it out.' % self.project_path)
self._check_call_svn(
['checkout', self.svn_url, self.project_path] + flags, cwd=None)
['checkout', self.svn_url, self.project_path] + flags,
cwd=None,
timeout=FETCH_TIMEOUT)
else:
# TODO(maruel): This command will shell out without a timeout.
scm.SVN.Revert(self.project_path, no_ignore=True)
# Revive files that were deleted in scm.SVN.Revert().
self._check_call_svn(['update', '--force'] + flags)
self._check_call_svn(['update', '--force'] + flags, timeout=FETCH_TIMEOUT)
return self._get_revision()
def _get_revision(self):
......@@ -537,8 +554,7 @@ class GitCheckoutBase(CheckoutBase):
try:
revision = self._check_output_git(['rev-parse', revision])
except subprocess.CalledProcessError:
self._check_call_git(
['fetch', self.remote, self.remote_branch, '--quiet'])
self._fetch_remote()
revision = self._check_output_git(['rev-parse', revision])
self._check_call_git(['checkout', '--force', '--quiet', revision])
else:
......@@ -649,18 +665,23 @@ class GitCheckoutBase(CheckoutBase):
def _check_call_git(self, args, **kwargs):
kwargs.setdefault('cwd', self.project_path)
kwargs.setdefault('stdout', self.VOID)
return subprocess2.check_call_out(['git'] + args, **kwargs)
kwargs.setdefault('timeout', GLOBAL_TIMEOUT)
return subprocess2.check_call_out(
['git'] + args, **kwargs)
def _call_git(self, args, **kwargs):
"""Like check_call but doesn't throw on failure."""
kwargs.setdefault('cwd', self.project_path)
kwargs.setdefault('stdout', self.VOID)
return subprocess2.call(['git'] + args, **kwargs)
return subprocess2.call(['git'] + args, timeout=GLOBAL_TIMEOUT, **kwargs)
def _check_output_git(self, args, **kwargs):
kwargs.setdefault('cwd', self.project_path)
return subprocess2.check_output(
['git'] + args, stderr=subprocess2.STDOUT, **kwargs)
['git'] + args,
stderr=subprocess2.STDOUT,
timeout=GLOBAL_TIMEOUT,
**kwargs)
def _branches(self):
"""Returns the list of branches and the active one."""
......@@ -695,7 +716,9 @@ class GitCheckout(GitCheckoutBase):
"""Git checkout implementation."""
def _fetch_remote(self):
# git fetch is always verbose even with -q -q so redirect its output.
self._check_output_git(['fetch', self.remote, self.remote_branch])
self._check_call_git(
['fetch', self.remote, self.remote_branch, '--quiet'],
timeout=FETCH_TIMEOUT)
class ReadOnlyCheckout(object):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment