diff --git a/gclient_scm.py b/gclient_scm.py index a76d2d0c2..925789db6 100644 --- a/gclient_scm.py +++ b/gclient_scm.py @@ -752,6 +752,12 @@ class SVNWrapper(SCMWrapper): "and try again." % checkout_path) + # Look for locked directories. + dir_info = scm.SVN.CaptureStatus(os.path.join(checkout_path, '.')) + if [True for d in dir_info if d[0][2] == 'L' and d[1] == checkout_path]: + # The current directory is locked, clean it up. + scm.SVN.Run(['cleanup'], checkout_path) + if options.manually_grab_svn_rev: # Retrieve the current HEAD version because svn is slow at null updates. if not revision: diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py index 4f971b282..92ea2be91 100755 --- a/tests/gclient_scm_test.py +++ b/tests/gclient_scm_test.py @@ -255,6 +255,11 @@ class SVNWrapperTestCase(BaseTestCase): } gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') ).AndReturn(False) + + # Verify no locked files. + gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.') + ).AndReturn([]) + # Checkout or update. gclient_scm.os.path.exists(base_path).AndReturn(True) gclient_scm.scm.SVN.CaptureInfo( @@ -295,6 +300,10 @@ class SVNWrapperTestCase(BaseTestCase): gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS') ).AndReturn(False) + # Verify no locked files. + gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.') + ).AndReturn([]) + # When checking out a single file, we issue an svn checkout and svn update. files_list = self.mox.CreateMockAnything() gclient_scm.scm.SVN.Run( @@ -363,6 +372,10 @@ class SVNWrapperTestCase(BaseTestCase): ).AndReturn(True) gclient_scm.os.remove(gclient_scm.os.path.join(base_path, 'DEPS')) + # Verify no locked files. + gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.') + ).AndReturn([]) + # When checking out a single file, we issue an svn checkout and svn update. files_list = self.mox.CreateMockAnything() gclient_scm.scm.SVN.Run( @@ -399,6 +412,10 @@ class SVNWrapperTestCase(BaseTestCase): gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn') ).AndReturn(True) + # Verify no locked files. + gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.') + ).AndReturn([]) + # Now we fall back on scm.update(). files_list = self.mox.CreateMockAnything() gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')