| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Meta checkout manager supporting both Subversion and GIT.""" | 6 """Meta checkout manager supporting both Subversion and GIT.""" |
| 7 # Files | 7 # Files |
| 8 # .gclient : Current client configuration, written by 'config' command. | 8 # .gclient : Current client configuration, written by 'config' command. |
| 9 # Format is a Python script defining 'solutions', a list whose | 9 # Format is a Python script defining 'solutions', a list whose |
| 10 # entries each are maps binding the strings "name" and "url" | 10 # entries each are maps binding the strings "name" and "url" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 | 80 |
| 81 import copy | 81 import copy |
| 82 import json | 82 import json |
| 83 import logging | 83 import logging |
| 84 import optparse | 84 import optparse |
| 85 import os | 85 import os |
| 86 import platform | 86 import platform |
| 87 import posixpath | 87 import posixpath |
| 88 import pprint | 88 import pprint |
| 89 import re | 89 import re |
| 90 import socket |
| 90 import sys | 91 import sys |
| 91 import time | 92 import time |
| 92 import urllib | 93 import urllib |
| 93 import urlparse | 94 import urlparse |
| 94 | 95 |
| 95 import breakpad # pylint: disable=W0611 | 96 import breakpad # pylint: disable=W0611 |
| 96 | 97 |
| 97 import fix_encoding | 98 import fix_encoding |
| 98 import gclient_scm | 99 import gclient_scm |
| 99 import gclient_utils | 100 import gclient_utils |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 self._used_scm.RunCommand('updatesingle', | 662 self._used_scm.RunCommand('updatesingle', |
| 662 options, args + [parsed_url.GetFilename()], file_list) | 663 options, args + [parsed_url.GetFilename()], file_list) |
| 663 else: | 664 else: |
| 664 # Create a shallow copy to mutate revision. | 665 # Create a shallow copy to mutate revision. |
| 665 options = copy.copy(options) | 666 options = copy.copy(options) |
| 666 options.revision = revision_overrides.get(self.name) | 667 options.revision = revision_overrides.get(self.name) |
| 667 self.maybeGetParentRevision( | 668 self.maybeGetParentRevision( |
| 668 command, options, parsed_url, self.parent.name, revision_overrides) | 669 command, options, parsed_url, self.parent.name, revision_overrides) |
| 669 self._used_scm = gclient_scm.CreateSCM( | 670 self._used_scm = gclient_scm.CreateSCM( |
| 670 parsed_url, self.root.root_dir, self.name) | 671 parsed_url, self.root.root_dir, self.name) |
| 672 |
| 673 def enable_deletion_of_conflicting_checkouts(): |
| 674 """Determines whether to enable new checkout deletion behavior. |
| 675 |
| 676 Initially, enables the experimental functionality on a small set of |
| 677 bots. |
| 678 """ |
| 679 # TODO(borenet): Remove this hack as soon as we've verified that it |
| 680 # doesn't cause the bots to break. |
| 681 return (os.environ.get('CHROME_HEADLESS') and |
| 682 socket.gethostname() in ('vm859-m1', 'build1-m1', 'vm630-m1')) |
| 683 |
| 684 # When updating, determine whether the destination directory contains a |
| 685 # checkout of the desired repository. If not, avoid conflicts by |
| 686 # deleting the directory before running the update. |
| 687 if command == 'update' and enable_deletion_of_conflicting_checkouts(): |
| 688 logging.warning('Experimental deletion of mismatching checkouts ' |
| 689 'enabled.') |
| 690 actual_remote_url = self._used_scm.GetRemoteURL(options) |
| 691 url, _ = gclient_utils.SplitUrlRevision(parsed_url) |
| 692 url = url.rstrip('/') |
| 693 dest_dir = os.path.join(self.root.root_dir, self.name) |
| 694 if os.path.isdir(dest_dir) and actual_remote_url != url: |
| 695 if options.force: |
| 696 logging.warning('%s does not contain a checkout of %s. Removing ' |
| 697 ' %s' % (dest_dir, url, dest_dir)) |
| 698 gclient_utils.rmtree(dest_dir) |
| 699 else: |
| 700 raise gclient_utils.Error('%s does not contain a checkout of %s ' |
| 701 '(found %s instead). Please fix the ' |
| 702 'solution manually or run with --force ' |
| 703 'to delete automatically.' % ( |
| 704 dest_dir, url, actual_remote_url)) |
| 705 |
| 671 self._got_revision = self._used_scm.RunCommand(command, options, args, | 706 self._got_revision = self._used_scm.RunCommand(command, options, args, |
| 672 file_list) | 707 file_list) |
| 673 if file_list: | 708 if file_list: |
| 674 file_list = [os.path.join(self.name, f.strip()) for f in file_list] | 709 file_list = [os.path.join(self.name, f.strip()) for f in file_list] |
| 675 | 710 |
| 676 # TODO(phajdan.jr): We should know exactly when the paths are absolute. | 711 # TODO(phajdan.jr): We should know exactly when the paths are absolute. |
| 677 # Convert all absolute paths to relative. | 712 # Convert all absolute paths to relative. |
| 678 for i in range(len(file_list or [])): | 713 for i in range(len(file_list or [])): |
| 679 # It depends on the command being executed (like runhooks vs sync). | 714 # It depends on the command being executed (like runhooks vs sync). |
| 680 if not os.path.isabs(file_list[i]): | 715 if not os.path.isabs(file_list[i]): |
| (...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1919 raise | 1954 raise |
| 1920 except (gclient_utils.Error, subprocess2.CalledProcessError), e: | 1955 except (gclient_utils.Error, subprocess2.CalledProcessError), e: |
| 1921 print >> sys.stderr, 'Error: %s' % str(e) | 1956 print >> sys.stderr, 'Error: %s' % str(e) |
| 1922 return 1 | 1957 return 1 |
| 1923 | 1958 |
| 1924 | 1959 |
| 1925 if '__main__' == __name__: | 1960 if '__main__' == __name__: |
| 1926 sys.exit(Main(sys.argv[1:])) | 1961 sys.exit(Main(sys.argv[1:])) |
| 1927 | 1962 |
| 1928 # vim: ts=2:sw=2:tw=80:et: | 1963 # vim: ts=2:sw=2:tw=80:et: |
| OLD | NEW |