| Index: checkout.py
|
| diff --git a/checkout.py b/checkout.py
|
| index e2e7e3ab9c97659b58814a35e3f363ae8fdd6281..49799d03df4ed29103fb56894c183b79802b97d9 100644
|
| --- a/checkout.py
|
| +++ b/checkout.py
|
| @@ -22,6 +22,18 @@ import scm
|
| import subprocess2
|
|
|
|
|
| +if sys.platform in ('cygwin', 'win32'):
|
| + # Disable timeouts on Windows since we can't have shells with timeouts.
|
| + GLOBAL_TIMEOUT = None
|
| + FETCH_TIMEOUT = None
|
| +else:
|
| + # 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 +209,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,6 +289,7 @@ 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)
|
|
|
| @@ -288,6 +302,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 +402,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.
|
| @@ -485,12 +503,14 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
|
|
|
| if os.path.isdir(self.project_path):
|
| # 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)
|
| else:
|
| 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)
|
| return self._get_revision()
|
|
|
| def _get_revision(self):
|
| @@ -652,16 +672,19 @@ class GitCheckoutBase(CheckoutBase):
|
| def _check_call_git(self, args, **kwargs):
|
| kwargs.setdefault('cwd', self.project_path)
|
| kwargs.setdefault('stdout', self.VOID)
|
| + 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)
|
| + kwargs.setdefault('timeout', GLOBAL_TIMEOUT)
|
| return subprocess2.call(['git'] + args, **kwargs)
|
|
|
| def _check_output_git(self, args, **kwargs):
|
| kwargs.setdefault('cwd', self.project_path)
|
| + kwargs.setdefault('timeout', GLOBAL_TIMEOUT)
|
| return subprocess2.check_output(
|
| ['git'] + args, stderr=subprocess2.STDOUT, **kwargs)
|
|
|
| @@ -698,7 +721,8 @@ 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_output_git(['fetch', self.remote, self.remote_branch],
|
| + timeout=FETCH_TIMEOUT)
|
|
|
|
|
| class ReadOnlyCheckout(object):
|
|
|