| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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: |
| OLD | NEW |