@ -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 ) :