OLD | NEW |
1 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2011 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 |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 ' '.join(args), kwargs['cwd'])) | 704 ' '.join(args), kwargs['cwd'])) |
705 gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs) | 705 gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs) |
706 | 706 |
707 | 707 |
708 class SVNWrapper(SCMWrapper): | 708 class SVNWrapper(SCMWrapper): |
709 """ Wrapper for SVN """ | 709 """ Wrapper for SVN """ |
710 | 710 |
711 def GetRevisionDate(self, revision): | 711 def GetRevisionDate(self, revision): |
712 """Returns the given revision's date in ISO-8601 format (which contains the | 712 """Returns the given revision's date in ISO-8601 format (which contains the |
713 time zone).""" | 713 time zone).""" |
714 date = scm.SVN.Capture(['propget', '--revprop', 'svn:date', '-r', revision, | 714 date = scm.SVN.Capture( |
715 os.path.join(self.checkout_path, '.')]) | 715 ['propget', '--revprop', 'svn:date', '-r', revision], |
| 716 os.path.join(self.checkout_path, '.')) |
716 return date.strip() | 717 return date.strip() |
717 | 718 |
718 def cleanup(self, options, args, file_list): | 719 def cleanup(self, options, args, file_list): |
719 """Cleanup working copy.""" | 720 """Cleanup working copy.""" |
720 self._Run(['cleanup'] + args, options) | 721 self._Run(['cleanup'] + args, options) |
721 | 722 |
722 def diff(self, options, args, file_list): | 723 def diff(self, options, args, file_list): |
723 # NOTE: This function does not currently modify file_list. | 724 # NOTE: This function does not currently modify file_list. |
724 if not os.path.isdir(self.checkout_path): | 725 if not os.path.isdir(self.checkout_path): |
725 raise gclient_utils.Error('Directory %s is not present.' % | 726 raise gclient_utils.Error('Directory %s is not present.' % |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 command = self._AddAdditionalUpdateFlags(command, options, revision) | 790 command = self._AddAdditionalUpdateFlags(command, options, revision) |
790 self._RunAndGetFileList(command, options, file_list, self._root_dir) | 791 self._RunAndGetFileList(command, options, file_list, self._root_dir) |
791 return | 792 return |
792 | 793 |
793 if not managed: | 794 if not managed: |
794 print ('________ unmanaged solution; skipping %s' % self.relpath) | 795 print ('________ unmanaged solution; skipping %s' % self.relpath) |
795 return | 796 return |
796 | 797 |
797 # Get the existing scm url and the revision number of the current checkout. | 798 # Get the existing scm url and the revision number of the current checkout. |
798 try: | 799 try: |
799 from_info = scm.SVN.CaptureInfo(os.path.join(self.checkout_path, '.')) | 800 from_info = scm.SVN.CaptureLocalInfo( |
| 801 [], os.path.join(self.checkout_path, '.')) |
800 except (gclient_utils.Error, subprocess2.CalledProcessError): | 802 except (gclient_utils.Error, subprocess2.CalledProcessError): |
801 raise gclient_utils.Error( | 803 raise gclient_utils.Error( |
802 ('Can\'t update/checkout %s if an unversioned directory is present. ' | 804 ('Can\'t update/checkout %s if an unversioned directory is present. ' |
803 'Delete the directory and try again.') % self.checkout_path) | 805 'Delete the directory and try again.') % self.checkout_path) |
804 | 806 |
805 if 'URL' not in from_info: | 807 if 'URL' not in from_info: |
806 raise gclient_utils.Error( | 808 raise gclient_utils.Error( |
807 ('gclient is confused. Couldn\'t get the url for %s.\n' | 809 ('gclient is confused. Couldn\'t get the url for %s.\n' |
808 'Try using @unmanaged.\n%s') % ( | 810 'Try using @unmanaged.\n%s') % ( |
809 self.checkout_path, from_info)) | 811 self.checkout_path, from_info)) |
810 | 812 |
811 # Look for locked directories. | 813 # Look for locked directories. |
812 dir_info = scm.SVN.CaptureStatus(os.path.join(self.checkout_path, '.')) | 814 dir_info = scm.SVN.CaptureStatus( |
| 815 None, os.path.join(self.checkout_path, '.')) |
813 if any(d[0][2] == 'L' for d in dir_info): | 816 if any(d[0][2] == 'L' for d in dir_info): |
814 try: | 817 try: |
815 self._Run(['cleanup', self.checkout_path], options) | 818 self._Run(['cleanup', self.checkout_path], options) |
816 except subprocess2.CalledProcessError, e: | 819 except subprocess2.CalledProcessError, e: |
817 # Get the status again, svn cleanup may have cleaned up at least | 820 # Get the status again, svn cleanup may have cleaned up at least |
818 # something. | 821 # something. |
819 dir_info = scm.SVN.CaptureStatus(os.path.join(self.checkout_path, '.')) | 822 dir_info = scm.SVN.CaptureStatus( |
| 823 None, os.path.join(self.checkout_path, '.')) |
820 | 824 |
821 # Try to fix the failures by removing troublesome files. | 825 # Try to fix the failures by removing troublesome files. |
822 for d in dir_info: | 826 for d in dir_info: |
823 if d[0][2] == 'L': | 827 if d[0][2] == 'L': |
824 if d[0][0] == '!' and options.force: | 828 if d[0][0] == '!' and options.force: |
825 print 'Removing troublesome path %s' % d[1] | 829 print 'Removing troublesome path %s' % d[1] |
826 gclient_utils.rmtree(d[1]) | 830 gclient_utils.rmtree(d[1]) |
827 else: | 831 else: |
828 print 'Not removing troublesome path %s automatically.' % d[1] | 832 print 'Not removing troublesome path %s automatically.' % d[1] |
829 if d[0][0] == '!': | 833 if d[0][0] == '!': |
830 print 'You can pass --force to enable automatic removal.' | 834 print 'You can pass --force to enable automatic removal.' |
831 raise e | 835 raise e |
832 | 836 |
833 # Retrieve the current HEAD version because svn is slow at null updates. | 837 # Retrieve the current HEAD version because svn is slow at null updates. |
834 if options.manually_grab_svn_rev and not revision: | 838 if options.manually_grab_svn_rev and not revision: |
835 from_info_live = scm.SVN.CaptureInfo(from_info['URL']) | 839 from_info_live = scm.SVN.CaptureRemoteInfo(from_info['URL']) |
836 revision = str(from_info_live['Revision']) | 840 revision = str(from_info_live['Revision']) |
837 rev_str = ' at %s' % revision | 841 rev_str = ' at %s' % revision |
838 | 842 |
839 if from_info['URL'] != base_url: | 843 if from_info['URL'] != base_url: |
840 # The repository url changed, need to switch. | 844 # The repository url changed, need to switch. |
841 try: | 845 try: |
842 to_info = scm.SVN.CaptureInfo(url) | 846 to_info = scm.SVN.CaptureRemoteInfo(url) |
843 except (gclient_utils.Error, subprocess2.CalledProcessError): | 847 except (gclient_utils.Error, subprocess2.CalledProcessError): |
844 # The url is invalid or the server is not accessible, it's safer to bail | 848 # The url is invalid or the server is not accessible, it's safer to bail |
845 # out right now. | 849 # out right now. |
846 raise gclient_utils.Error('This url is unreachable: %s' % url) | 850 raise gclient_utils.Error('This url is unreachable: %s' % url) |
847 can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) | 851 can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) |
848 and (from_info['UUID'] == to_info['UUID'])) | 852 and (from_info['UUID'] == to_info['UUID'])) |
849 if can_switch: | 853 if can_switch: |
850 print('\n_____ relocating %s to a new checkout' % self.relpath) | 854 print('\n_____ relocating %s to a new checkout' % self.relpath) |
851 # We have different roots, so check if we can switch --relocate. | 855 # We have different roots, so check if we can switch --relocate. |
852 # Subversion only permits this if the repository UUIDs match. | 856 # Subversion only permits this if the repository UUIDs match. |
853 # Perform the switch --relocate, then rewrite the from_url | 857 # Perform the switch --relocate, then rewrite the from_url |
854 # to reflect where we "are now." (This is the same way that | 858 # to reflect where we "are now." (This is the same way that |
855 # Subversion itself handles the metadata when switch --relocate | 859 # Subversion itself handles the metadata when switch --relocate |
856 # is used.) This makes the checks below for whether we | 860 # is used.) This makes the checks below for whether we |
857 # can update to a revision or have to switch to a different | 861 # can update to a revision or have to switch to a different |
858 # branch work as expected. | 862 # branch work as expected. |
859 # TODO(maruel): TEST ME ! | 863 # TODO(maruel): TEST ME ! |
860 command = ['switch', '--relocate', | 864 command = ['switch', '--relocate', |
861 from_info['Repository Root'], | 865 from_info['Repository Root'], |
862 to_info['Repository Root'], | 866 to_info['Repository Root'], |
863 self.relpath] | 867 self.relpath] |
864 self._Run(command, options, cwd=self._root_dir) | 868 self._Run(command, options, cwd=self._root_dir) |
865 from_info['URL'] = from_info['URL'].replace( | 869 from_info['URL'] = from_info['URL'].replace( |
866 from_info['Repository Root'], | 870 from_info['Repository Root'], |
867 to_info['Repository Root']) | 871 to_info['Repository Root']) |
868 else: | 872 else: |
869 if not options.force and not options.reset: | 873 if not options.force and not options.reset: |
870 # Look for local modifications but ignore unversioned files. | 874 # Look for local modifications but ignore unversioned files. |
871 for status in scm.SVN.CaptureStatus(self.checkout_path): | 875 for status in scm.SVN.CaptureStatus(None, self.checkout_path): |
872 if status[0] != '?': | 876 if status[0] != '?': |
873 raise gclient_utils.Error( | 877 raise gclient_utils.Error( |
874 ('Can\'t switch the checkout to %s; UUID don\'t match and ' | 878 ('Can\'t switch the checkout to %s; UUID don\'t match and ' |
875 'there is local changes in %s. Delete the directory and ' | 879 'there is local changes in %s. Delete the directory and ' |
876 'try again.') % (url, self.checkout_path)) | 880 'try again.') % (url, self.checkout_path)) |
877 # Ok delete it. | 881 # Ok delete it. |
878 print('\n_____ switching %s to a new checkout' % self.relpath) | 882 print('\n_____ switching %s to a new checkout' % self.relpath) |
879 gclient_utils.RemoveDirectory(self.checkout_path) | 883 gclient_utils.RemoveDirectory(self.checkout_path) |
880 # We need to checkout. | 884 # We need to checkout. |
881 command = ['checkout', url, self.checkout_path] | 885 command = ['checkout', url, self.checkout_path] |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 new_command.append('--force') | 1044 new_command.append('--force') |
1041 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1045 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
1042 new_command.extend(('--accept', 'theirs-conflict')) | 1046 new_command.extend(('--accept', 'theirs-conflict')) |
1043 elif options.manually_grab_svn_rev: | 1047 elif options.manually_grab_svn_rev: |
1044 new_command.append('--force') | 1048 new_command.append('--force') |
1045 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1049 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
1046 new_command.extend(('--accept', 'postpone')) | 1050 new_command.extend(('--accept', 'postpone')) |
1047 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1051 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
1048 new_command.extend(('--accept', 'postpone')) | 1052 new_command.extend(('--accept', 'postpone')) |
1049 return new_command | 1053 return new_command |
OLD | NEW |