Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: gclient.py

Issue 113319: Finally implement the code to automatically switch checkout when there is no ... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # 2 #
3 # Copyright 2008 Google Inc. All Rights Reserved. 3 # Copyright 2008 Google Inc. All Rights Reserved.
4 # 4 #
5 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License. 6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at 7 # You may obtain a copy of the License at
8 # 8 #
9 # http://www.apache.org/licenses/LICENSE-2.0 9 # http://www.apache.org/licenses/LICENSE-2.0
10 # 10 #
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 745
746 def update(self, options, args, file_list): 746 def update(self, options, args, file_list):
747 """Runs SCM to update or transparently checkout the working copy. 747 """Runs SCM to update or transparently checkout the working copy.
748 748
749 All updated files will be appended to file_list. 749 All updated files will be appended to file_list.
750 750
751 Raises: 751 Raises:
752 Error: if can't get URL for relative path. 752 Error: if can't get URL for relative path.
753 """ 753 """
754 # Only update if git is not controlling the directory. 754 # Only update if git is not controlling the directory.
755 git_path = os.path.join(self._root_dir, self.relpath, '.git') 755 checkout_path = os.path.join(self._root_dir, self.relpath)
756 git_path = os.path.join(checkout_path, '.git')
756 if options.path_exists(git_path): 757 if options.path_exists(git_path):
757 print("________ found .git directory; skipping %s" % self.relpath) 758 print("________ found .git directory; skipping %s" % self.relpath)
758 return 759 return
759 760
760 if args: 761 if args:
761 raise Error("Unsupported argument(s): %s" % ",".join(args)) 762 raise Error("Unsupported argument(s): %s" % ",".join(args))
762 763
763 url = self.url 764 url = self.url
764 components = url.split("@") 765 components = url.split("@")
765 revision = None 766 revision = None
766 forced_revision = False 767 forced_revision = False
767 if options.revision: 768 if options.revision:
768 # Override the revision number. 769 # Override the revision number.
769 url = '%s@%s' % (components[0], str(options.revision)) 770 url = '%s@%s' % (components[0], str(options.revision))
770 revision = int(options.revision) 771 revision = int(options.revision)
771 forced_revision = True 772 forced_revision = True
772 elif len(components) == 2: 773 elif len(components) == 2:
773 revision = int(components[1]) 774 revision = int(components[1])
774 forced_revision = True 775 forced_revision = True
775 776
776 rev_str = "" 777 rev_str = ""
777 if revision: 778 if revision:
778 rev_str = ' at %d' % revision 779 rev_str = ' at %d' % revision
779 780
780 if not options.path_exists(os.path.join(self._root_dir, self.relpath)): 781 if not options.path_exists(checkout_path):
781 # We need to checkout. 782 # We need to checkout.
782 command = ['checkout', url, os.path.join(self._root_dir, self.relpath)] 783 command = ['checkout', url, checkout_path]
783 if revision: 784 if revision:
784 command.extend(['--revision', str(revision)]) 785 command.extend(['--revision', str(revision)])
785 RunSVNAndGetFileList(command, self._root_dir, file_list) 786 RunSVNAndGetFileList(command, self._root_dir, file_list)
786 return 787 return
787 788
788 # Get the existing scm url and the revision number of the current checkout. 789 # Get the existing scm url and the revision number of the current checkout.
789 from_info = CaptureSVNInfo(os.path.join(self._root_dir, self.relpath, '.'), 790 from_info = CaptureSVNInfo(os.path.join(checkout_path, '.'), '.')
790 '.')
791 791
792 if options.manually_grab_svn_rev: 792 if options.manually_grab_svn_rev:
793 # Retrieve the current HEAD version because svn is slow at null updates. 793 # Retrieve the current HEAD version because svn is slow at null updates.
794 if not revision: 794 if not revision:
795 from_info_live = CaptureSVNInfo(from_info['URL'], '.') 795 from_info_live = CaptureSVNInfo(from_info['URL'], '.')
796 revision = int(from_info_live['Revision']) 796 revision = int(from_info_live['Revision'])
797 rev_str = ' at %d' % revision 797 rev_str = ' at %d' % revision
798 798
799 if from_info['URL'] != components[0]: 799 if from_info['URL'] != components[0]:
800 to_info = CaptureSVNInfo(url, '.') 800 to_info = CaptureSVNInfo(url, '.')
801 if from_info['Repository Root'] != to_info['Repository Root']: 801 can_switch = ((from_info['Repository Root'] != to_info['Repository Root'])
802 and (from_info['UUID'] == to_info['UUID']))
803 if can_switch:
804 print("\n_____ relocating %s to a new checkout" % self.relpath)
802 # We have different roots, so check if we can switch --relocate. 805 # We have different roots, so check if we can switch --relocate.
803 # Subversion only permits this if the repository UUIDs match. 806 # Subversion only permits this if the repository UUIDs match.
804 if from_info['UUID'] != to_info['UUID']:
805 raise Error("Can't switch the checkout to %s; UUID don't match. That "
806 "simply means in theory, gclient should verify you don't "
807 "have a local change, remove the old checkout and do a "
808 "fresh new checkout of the new repo. Contributions are "
809 "welcome." % url)
810
811 # Perform the switch --relocate, then rewrite the from_url 807 # Perform the switch --relocate, then rewrite the from_url
812 # to reflect where we "are now." (This is the same way that 808 # to reflect where we "are now." (This is the same way that
813 # Subversion itself handles the metadata when switch --relocate 809 # Subversion itself handles the metadata when switch --relocate
814 # is used.) This makes the checks below for whether we 810 # is used.) This makes the checks below for whether we
815 # can update to a revision or have to switch to a different 811 # can update to a revision or have to switch to a different
816 # branch work as expected. 812 # branch work as expected.
817 # TODO(maruel): TEST ME ! 813 # TODO(maruel): TEST ME !
818 command = ["switch", "--relocate", 814 command = ["switch", "--relocate",
819 from_info['Repository Root'], 815 from_info['Repository Root'],
820 to_info['Repository Root'], 816 to_info['Repository Root'],
821 self.relpath] 817 self.relpath]
822 RunSVN(command, self._root_dir) 818 RunSVN(command, self._root_dir)
823 from_info['URL'] = from_info['URL'].replace( 819 from_info['URL'] = from_info['URL'].replace(
824 from_info['Repository Root'], 820 from_info['Repository Root'],
825 to_info['Repository Root']) 821 to_info['Repository Root'])
822 else:
823 if CaptureSVNStatus(checkout_path):
824 raise Error("Can't switch the checkout to %s; UUID don't match and "
825 "there is local changes in %s. Delete the directory and "
826 "try again." % (url, checkout_path))
827 # Ok delete it.
828 print("\n_____ switching %s to a new checkout" % self.relpath)
829 RemoveDirectory(checkout_path)
830 # We need to checkout.
831 command = ['checkout', url, checkout_path]
832 if revision:
833 command.extend(['--revision', str(revision)])
834 RunSVNAndGetFileList(command, self._root_dir, file_list)
835 return
836
826 837
827 # If the provided url has a revision number that matches the revision 838 # If the provided url has a revision number that matches the revision
828 # number of the existing directory, then we don't need to bother updating. 839 # number of the existing directory, then we don't need to bother updating.
829 if not options.force and from_info['Revision'] == revision: 840 if not options.force and from_info['Revision'] == revision:
830 if options.verbose or not forced_revision: 841 if options.verbose or not forced_revision:
831 print("\n_____ %s%s" % (self.relpath, rev_str)) 842 print("\n_____ %s%s" % (self.relpath, rev_str))
832 return 843 return
833 844
834 command = ["update", os.path.join(self._root_dir, self.relpath)] 845 command = ["update", checkout_path]
835 if revision: 846 if revision:
836 command.extend(['--revision', str(revision)]) 847 command.extend(['--revision', str(revision)])
837 RunSVNAndGetFileList(command, self._root_dir, file_list) 848 RunSVNAndGetFileList(command, self._root_dir, file_list)
838 849
839 def revert(self, options, args, file_list): 850 def revert(self, options, args, file_list):
840 """Reverts local modifications. Subversion specific. 851 """Reverts local modifications. Subversion specific.
841 852
842 All reverted files will be appended to file_list, even if Subversion 853 All reverted files will be appended to file_list, even if Subversion
843 doesn't know about them. 854 doesn't know about them.
844 """ 855 """
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
1711 1722
1712 if "__main__" == __name__: 1723 if "__main__" == __name__:
1713 try: 1724 try:
1714 result = Main(sys.argv) 1725 result = Main(sys.argv)
1715 except Error, e: 1726 except Error, e:
1716 print >> sys.stderr, "Error: %s" % str(e) 1727 print >> sys.stderr, "Error: %s" % str(e)
1717 result = 1 1728 result = 1
1718 sys.exit(result) 1729 sys.exit(result)
1719 1730
1720 # vim: ts=2:sw=2:tw=80:et: 1731 # vim: ts=2:sw=2:tw=80:et:
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698