| OLD | NEW | 
|    1 # Copyright (c) 2010 The Chromium Authors. All rights reserved. |    1 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 
|    2 # Use of this source code is governed by a BSD-style license that can be |    2 # Use of this source code is governed by a BSD-style license that can be | 
|    3 # found in the LICENSE file. |    3 # found in the LICENSE file. | 
|    4  |    4  | 
|    5 """Gclient-specific SCM-specific operations.""" |    5 """Gclient-specific SCM-specific operations.""" | 
|    6  |    6  | 
|    7 import logging |    7 import logging | 
|    8 import os |    8 import os | 
|    9 import posixpath |    9 import posixpath | 
|   10 import re |   10 import re | 
|   11 import sys |   11 import sys | 
|   12 import time |   12 import time | 
|   13  |   13  | 
 |   14 import gclient_utils | 
|   14 import scm |   15 import scm | 
|   15 import gclient_utils |   16 import subprocess2 | 
|   16  |   17  | 
|   17  |   18  | 
|   18 class DiffFilterer(object): |   19 class DiffFilterer(object): | 
|   19   """Simple class which tracks which file is being diffed and |   20   """Simple class which tracks which file is being diffed and | 
|   20   replaces instances of its file name in the original and |   21   replaces instances of its file name in the original and | 
|   21   working copy lines of the svn/git diff output.""" |   22   working copy lines of the svn/git diff output.""" | 
|   22   index_string = "Index: " |   23   index_string = "Index: " | 
|   23   original_prefix = "--- " |   24   original_prefix = "--- " | 
|   24   working_prefix = "+++ " |   25   working_prefix = "+++ " | 
|   25  |   26  | 
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  488       clone_cmd.append('--no-checkout') |  489       clone_cmd.append('--no-checkout') | 
|  489       detach_head = True |  490       detach_head = True | 
|  490     if options.verbose: |  491     if options.verbose: | 
|  491       clone_cmd.append('--verbose') |  492       clone_cmd.append('--verbose') | 
|  492     clone_cmd.extend([url, self.checkout_path]) |  493     clone_cmd.extend([url, self.checkout_path]) | 
|  493  |  494  | 
|  494     for _ in range(3): |  495     for _ in range(3): | 
|  495       try: |  496       try: | 
|  496         self._Run(clone_cmd, options, cwd=self._root_dir) |  497         self._Run(clone_cmd, options, cwd=self._root_dir) | 
|  497         break |  498         break | 
|  498       except gclient_utils.Error, e: |  499       except (gclient_utils.Error, subprocess2.CalledProcessError), e: | 
|  499         # TODO(maruel): Hackish, should be fixed by moving _Run() to |  500         # TODO(maruel): Hackish, should be fixed by moving _Run() to | 
|  500         # CheckCall(). |  501         # CheckCall(). | 
|  501         # Too bad we don't have access to the actual output. |  502         # Too bad we don't have access to the actual output. | 
|  502         # We should check for "transfer closed with NNN bytes remaining to |  503         # We should check for "transfer closed with NNN bytes remaining to | 
|  503         # read". In the meantime, just make sure .git exists. |  504         # read". In the meantime, just make sure .git exists. | 
|  504         if (e.args[0] == 'git command clone returned 128' and |  505         if (e.args[0] == 'git command clone returned 128' and | 
|  505             os.path.exists(os.path.join(self.checkout_path, '.git'))): |  506             os.path.exists(os.path.join(self.checkout_path, '.git'))): | 
|  506           print(str(e)) |  507           print(str(e)) | 
|  507           print('Retrying...') |  508           print('Retrying...') | 
|  508           continue |  509           continue | 
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  743     if not os.path.exists(self.checkout_path): |  744     if not os.path.exists(self.checkout_path): | 
|  744       # We need to checkout. |  745       # We need to checkout. | 
|  745       command = ['checkout', url, self.checkout_path] |  746       command = ['checkout', url, self.checkout_path] | 
|  746       command = self._AddAdditionalUpdateFlags(command, options, revision) |  747       command = self._AddAdditionalUpdateFlags(command, options, revision) | 
|  747       self._RunAndGetFileList(command, options, file_list, self._root_dir) |  748       self._RunAndGetFileList(command, options, file_list, self._root_dir) | 
|  748       return |  749       return | 
|  749  |  750  | 
|  750     # Get the existing scm url and the revision number of the current checkout. |  751     # Get the existing scm url and the revision number of the current checkout. | 
|  751     try: |  752     try: | 
|  752       from_info = scm.SVN.CaptureInfo(os.path.join(self.checkout_path, '.')) |  753       from_info = scm.SVN.CaptureInfo(os.path.join(self.checkout_path, '.')) | 
|  753     except gclient_utils.Error: |  754     except (gclient_utils.Error, subprocess2.CalledProcessError): | 
|  754       raise gclient_utils.Error( |  755       raise gclient_utils.Error( | 
|  755           ('Can\'t update/checkout %s if an unversioned directory is present. ' |  756           ('Can\'t update/checkout %s if an unversioned directory is present. ' | 
|  756            'Delete the directory and try again.') % self.checkout_path) |  757            'Delete the directory and try again.') % self.checkout_path) | 
|  757  |  758  | 
|  758     # Look for locked directories. |  759     # Look for locked directories. | 
|  759     dir_info = scm.SVN.CaptureStatus(os.path.join(self.checkout_path, '.')) |  760     dir_info = scm.SVN.CaptureStatus(os.path.join(self.checkout_path, '.')) | 
|  760     if [True for d in dir_info |  761     if [True for d in dir_info | 
|  761         if d[0][2] == 'L' and d[1] == self.checkout_path]: |  762         if d[0][2] == 'L' and d[1] == self.checkout_path]: | 
|  762       # The current directory is locked, clean it up. |  763       # The current directory is locked, clean it up. | 
|  763       self._Run(['cleanup'], options) |  764       self._Run(['cleanup'], options) | 
|  764  |  765  | 
|  765     # Retrieve the current HEAD version because svn is slow at null updates. |  766     # Retrieve the current HEAD version because svn is slow at null updates. | 
|  766     if options.manually_grab_svn_rev and not revision: |  767     if options.manually_grab_svn_rev and not revision: | 
|  767       from_info_live = scm.SVN.CaptureInfo(from_info['URL']) |  768       from_info_live = scm.SVN.CaptureInfo(from_info['URL']) | 
|  768       revision = str(from_info_live['Revision']) |  769       revision = str(from_info_live['Revision']) | 
|  769       rev_str = ' at %s' % revision |  770       rev_str = ' at %s' % revision | 
|  770  |  771  | 
|  771     if from_info['URL'] != base_url: |  772     if from_info['URL'] != base_url: | 
|  772       # The repository url changed, need to switch. |  773       # The repository url changed, need to switch. | 
|  773       try: |  774       try: | 
|  774         to_info = scm.SVN.CaptureInfo(url) |  775         to_info = scm.SVN.CaptureInfo(url) | 
|  775       except gclient_utils.Error: |  776       except (gclient_utils.Error, subprocess2.CalledProcessError): | 
|  776         # The url is invalid or the server is not accessible, it's safer to bail |  777         # The url is invalid or the server is not accessible, it's safer to bail | 
|  777         # out right now. |  778         # out right now. | 
|  778         raise gclient_utils.Error('This url is unreachable: %s' % url) |  779         raise gclient_utils.Error('This url is unreachable: %s' % url) | 
|  779       can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) |  780       can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) | 
|  780                     and (from_info['UUID'] == to_info['UUID'])) |  781                     and (from_info['UUID'] == to_info['UUID'])) | 
|  781       if can_switch: |  782       if can_switch: | 
|  782         print('\n_____ relocating %s to a new checkout' % self.relpath) |  783         print('\n_____ relocating %s to a new checkout' % self.relpath) | 
|  783         # We have different roots, so check if we can switch --relocate. |  784         # We have different roots, so check if we can switch --relocate. | 
|  784         # Subversion only permits this if the repository UUIDs match. |  785         # Subversion only permits this if the repository UUIDs match. | 
|  785         # Perform the switch --relocate, then rewrite the from_url |  786         # Perform the switch --relocate, then rewrite the from_url | 
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  882       self._RunAndGetFileList(['update', '--revision', 'BASE'], options, |  883       self._RunAndGetFileList(['update', '--revision', 'BASE'], options, | 
|  883           file_list) |  884           file_list) | 
|  884     except OSError, e: |  885     except OSError, e: | 
|  885       # Maybe the directory disapeared meanwhile. Do not throw an exception. |  886       # Maybe the directory disapeared meanwhile. Do not throw an exception. | 
|  886       logging.error('Failed to update:\n%s' % str(e)) |  887       logging.error('Failed to update:\n%s' % str(e)) | 
|  887  |  888  | 
|  888   def revinfo(self, options, args, file_list): |  889   def revinfo(self, options, args, file_list): | 
|  889     """Display revision""" |  890     """Display revision""" | 
|  890     try: |  891     try: | 
|  891       return scm.SVN.CaptureRevision(self.checkout_path) |  892       return scm.SVN.CaptureRevision(self.checkout_path) | 
|  892     except gclient_utils.Error: |  893     except (gclient_utils.Error, subprocess2.CalledProcessError): | 
|  893       return None |  894       return None | 
|  894  |  895  | 
|  895   def runhooks(self, options, args, file_list): |  896   def runhooks(self, options, args, file_list): | 
|  896     self.status(options, args, file_list) |  897     self.status(options, args, file_list) | 
|  897  |  898  | 
|  898   def status(self, options, args, file_list): |  899   def status(self, options, args, file_list): | 
|  899     """Display status information.""" |  900     """Display status information.""" | 
|  900     command = ['status'] + args |  901     command = ['status'] + args | 
|  901     if not os.path.isdir(self.checkout_path): |  902     if not os.path.isdir(self.checkout_path): | 
|  902       # svn status won't work if the directory doesn't exist. |  903       # svn status won't work if the directory doesn't exist. | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|  933  |  934  | 
|  934     This method returns a new list to be used as a command.""" |  935     This method returns a new list to be used as a command.""" | 
|  935     new_command = command[:] |  936     new_command = command[:] | 
|  936     if revision: |  937     if revision: | 
|  937       new_command.extend(['--revision', str(revision).strip()]) |  938       new_command.extend(['--revision', str(revision).strip()]) | 
|  938     # --force was added to 'svn update' in svn 1.5. |  939     # --force was added to 'svn update' in svn 1.5. | 
|  939     if ((options.force or options.manually_grab_svn_rev) and |  940     if ((options.force or options.manually_grab_svn_rev) and | 
|  940         scm.SVN.AssertVersion("1.5")[0]): |  941         scm.SVN.AssertVersion("1.5")[0]): | 
|  941       new_command.append('--force') |  942       new_command.append('--force') | 
|  942     return new_command |  943     return new_command | 
| OLD | NEW |