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 | |
91 import sys | 90 import sys |
92 import time | 91 import time |
93 import urllib | 92 import urllib |
94 import urlparse | 93 import urlparse |
95 | 94 |
96 import breakpad # pylint: disable=W0611 | 95 import breakpad # pylint: disable=W0611 |
97 | 96 |
98 import fix_encoding | 97 import fix_encoding |
99 import gclient_scm | 98 import gclient_scm |
100 import gclient_utils | 99 import gclient_utils |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 self._used_scm.RunCommand('updatesingle', | 661 self._used_scm.RunCommand('updatesingle', |
663 options, args + [parsed_url.GetFilename()], file_list) | 662 options, args + [parsed_url.GetFilename()], file_list) |
664 else: | 663 else: |
665 # Create a shallow copy to mutate revision. | 664 # Create a shallow copy to mutate revision. |
666 options = copy.copy(options) | 665 options = copy.copy(options) |
667 options.revision = revision_overrides.get(self.name) | 666 options.revision = revision_overrides.get(self.name) |
668 self.maybeGetParentRevision( | 667 self.maybeGetParentRevision( |
669 command, options, parsed_url, self.parent.name, revision_overrides) | 668 command, options, parsed_url, self.parent.name, revision_overrides) |
670 self._used_scm = gclient_scm.CreateSCM( | 669 self._used_scm = gclient_scm.CreateSCM( |
671 parsed_url, self.root.root_dir, self.name) | 670 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 if not os.environ.get('CHROME_HEADLESS'): | |
682 return False | |
683 hostname = socket.gethostname() | |
684 logging.warning('Hostname of this machine: %s' % hostname) | |
685 return hostname in ('vm859-m1', 'build1-m1', 'vm630-m1') | |
686 | |
687 # When updating, determine whether the destination directory contains a | |
688 # checkout of the desired repository. If not, avoid conflicts by | |
689 # deleting the directory before running the update. | |
690 if command == 'update' and enable_deletion_of_conflicting_checkouts(): | |
691 logging.warning('Experimental deletion of mismatching checkouts ' | |
692 'enabled.') | |
693 actual_remote_url = self._used_scm.GetRemoteURL(options) | |
694 url, _ = gclient_utils.SplitUrlRevision(parsed_url) | |
695 url = url.rstrip('/') | |
696 dest_dir = os.path.join(self.root.root_dir, self.name) | |
697 if os.path.isdir(dest_dir) and actual_remote_url != url: | |
698 if options.force: | |
699 logging.warning('%s does not contain a checkout of %s. Removing ' | |
700 ' %s' % (dest_dir, url, dest_dir)) | |
701 gclient_utils.rmtree(dest_dir) | |
702 else: | |
703 raise gclient_utils.Error('%s does not contain a checkout of %s ' | |
704 '(found %s instead). Please fix the ' | |
705 'solution manually or run with --force ' | |
706 'to delete automatically.' % ( | |
707 dest_dir, url, actual_remote_url)) | |
708 | |
709 self._got_revision = self._used_scm.RunCommand(command, options, args, | 671 self._got_revision = self._used_scm.RunCommand(command, options, args, |
710 file_list) | 672 file_list) |
711 if file_list: | 673 if file_list: |
712 file_list = [os.path.join(self.name, f.strip()) for f in file_list] | 674 file_list = [os.path.join(self.name, f.strip()) for f in file_list] |
713 | 675 |
714 # TODO(phajdan.jr): We should know exactly when the paths are absolute. | 676 # TODO(phajdan.jr): We should know exactly when the paths are absolute. |
715 # Convert all absolute paths to relative. | 677 # Convert all absolute paths to relative. |
716 for i in range(len(file_list or [])): | 678 for i in range(len(file_list or [])): |
717 # It depends on the command being executed (like runhooks vs sync). | 679 # It depends on the command being executed (like runhooks vs sync). |
718 if not os.path.isabs(file_list[i]): | 680 if not os.path.isabs(file_list[i]): |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1957 raise | 1919 raise |
1958 except (gclient_utils.Error, subprocess2.CalledProcessError), e: | 1920 except (gclient_utils.Error, subprocess2.CalledProcessError), e: |
1959 print >> sys.stderr, 'Error: %s' % str(e) | 1921 print >> sys.stderr, 'Error: %s' % str(e) |
1960 return 1 | 1922 return 1 |
1961 | 1923 |
1962 | 1924 |
1963 if '__main__' == __name__: | 1925 if '__main__' == __name__: |
1964 sys.exit(Main(sys.argv[1:])) | 1926 sys.exit(Main(sys.argv[1:])) |
1965 | 1927 |
1966 # vim: ts=2:sw=2:tw=80:et: | 1928 # vim: ts=2:sw=2:tw=80:et: |
OLD | NEW |