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

Side by Side Diff: gclient.py

Issue 195913002: gclient: in managed mode, warn if .gclient has a mismatched URL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Move to _CheckConfig method, use atexit Created 6 years, 9 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 | gclient_scm.py » ('j') | 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/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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 # 71 #
72 # If the "target_os_only" key is also present and true, then *only* the 72 # If the "target_os_only" key is also present and true, then *only* the
73 # operating systems listed in "target_os" will be used. 73 # operating systems listed in "target_os" will be used.
74 # 74 #
75 # Example: 75 # Example:
76 # target_os = [ "ios" ] 76 # target_os = [ "ios" ]
77 # target_os_only = True 77 # target_os_only = True
78 78
79 __version__ = '0.7' 79 __version__ = '0.7'
80 80
81 import atexit
borenet 2014/03/14 13:30:57 Is atexit acceptable for this? It would be nice to
iannucci 2014/03/17 17:38:40 Hm. I would probably wrap atexit instead of direct
borenet 2014/03/17 17:41:33 Alternatively, I can just call the _CheckConfig me
81 import copy 82 import copy
82 import json 83 import json
83 import logging 84 import logging
84 import optparse 85 import optparse
85 import os 86 import os
86 import platform 87 import platform
87 import posixpath 88 import posixpath
88 import pprint 89 import pprint
89 import re 90 import re
90 import sys 91 import sys
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 if options.deps_os: 1038 if options.deps_os:
1038 enforced_os = options.deps_os.split(',') 1039 enforced_os = options.deps_os.split(',')
1039 else: 1040 else:
1040 enforced_os = [self.DEPS_OS_CHOICES.get(sys.platform, 'unix')] 1041 enforced_os = [self.DEPS_OS_CHOICES.get(sys.platform, 'unix')]
1041 if 'all' in enforced_os: 1042 if 'all' in enforced_os:
1042 enforced_os = self.DEPS_OS_CHOICES.itervalues() 1043 enforced_os = self.DEPS_OS_CHOICES.itervalues()
1043 self._enforced_os = tuple(set(enforced_os)) 1044 self._enforced_os = tuple(set(enforced_os))
1044 self._root_dir = root_dir 1045 self._root_dir = root_dir
1045 self.config_content = None 1046 self.config_content = None
1046 1047
1048 def _CheckConfig(self):
1049 """Verify that the config matches any existing checkout."""
1050 for dep in self.dependencies:
1051 if dep.managed:
1052 scm = gclient_scm.CreateSCM(dep.url, self.root_dir, dep.name)
1053 actual_url = scm.GetActualRemoteURL()
1054 if actual_url and not scm.DoesRemoteURLMatch():
1055 def print_warning():
1056 print >> sys.stderr, ('''
1057 ################################################################################
1058 ################################### WARNING! ###################################
1059 ################################################################################
1060
1061 Your .gclient file seems to be broken. The requested URL is different from what
1062 is actually checked out in %(checkout_path)s. In the future this will be an
1063 error.
1064
1065 Expected: %(expected_url)s (%(expected_scm)s)
1066 Actual: %(actual_url)s (%(actual_scm)s)
1067
1068 You should ensure that the URL listed in .gclient is correct and either change
1069 it or fix the checkout. If you're managing your own git checkout in
1070 %(checkout_path)s but the URL in .gclient is for an svn repository, you probably
1071 want to set 'managed': False in .gclient.
1072
1073 ################################################################################
1074 ################################################################################
1075 ################################################################################
1076 ''' % {'checkout_path': os.path.join(self.root_dir, dep.name),
1077 'expected_url': dep.url,
1078 'expected_scm': gclient_scm.GetScmName(dep.url),
1079 'actual_url': actual_url,
1080 'actual_scm': gclient_scm.GetScmName(actual_url)})
1081
1082 atexit.register(print_warning)
1083
1047 def SetConfig(self, content): 1084 def SetConfig(self, content):
1048 assert not self.dependencies 1085 assert not self.dependencies
1049 config_dict = {} 1086 config_dict = {}
1050 self.config_content = content 1087 self.config_content = content
1051 try: 1088 try:
1052 exec(content, config_dict) 1089 exec(content, config_dict)
1053 except SyntaxError, e: 1090 except SyntaxError, e:
1054 gclient_utils.SyntaxErrorToError('.gclient', e) 1091 gclient_utils.SyntaxErrorToError('.gclient', e)
1055 1092
1056 # Append any target OS that is not already being enforced to the tuple. 1093 # Append any target OS that is not already being enforced to the tuple.
(...skipping 18 matching lines...) Expand all
1075 s.get('managed', True), 1112 s.get('managed', True),
1076 s.get('custom_deps', {}), 1113 s.get('custom_deps', {}),
1077 s.get('custom_vars', {}), 1114 s.get('custom_vars', {}),
1078 s.get('custom_hooks', []), 1115 s.get('custom_hooks', []),
1079 s.get('deps_file', 'DEPS'), 1116 s.get('deps_file', 'DEPS'),
1080 True)) 1117 True))
1081 except KeyError: 1118 except KeyError:
1082 raise gclient_utils.Error('Invalid .gclient file. Solution is ' 1119 raise gclient_utils.Error('Invalid .gclient file. Solution is '
1083 'incomplete: %s' % s) 1120 'incomplete: %s' % s)
1084 self.add_dependencies_and_close(deps_to_add, config_dict.get('hooks', [])) 1121 self.add_dependencies_and_close(deps_to_add, config_dict.get('hooks', []))
1122 self._CheckConfig()
1085 logging.info('SetConfig() done') 1123 logging.info('SetConfig() done')
1086 1124
1087 def SaveConfig(self): 1125 def SaveConfig(self):
1088 gclient_utils.FileWrite(os.path.join(self.root_dir, 1126 gclient_utils.FileWrite(os.path.join(self.root_dir,
1089 self._options.config_filename), 1127 self._options.config_filename),
1090 self.config_content) 1128 self.config_content)
1091 1129
1092 @staticmethod 1130 @staticmethod
1093 def LoadCurrentConfig(options): 1131 def LoadCurrentConfig(options):
1094 """Searches for and loads a .gclient file relative to the current working 1132 """Searches for and loads a .gclient file relative to the current working
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after
1687 raise gclient_utils.Error('client not configured; see \'gclient config\'') 1725 raise gclient_utils.Error('client not configured; see \'gclient config\'')
1688 1726
1689 if options.revisions and options.head: 1727 if options.revisions and options.head:
1690 # TODO(maruel): Make it a parser.error if it doesn't break any builder. 1728 # TODO(maruel): Make it a parser.error if it doesn't break any builder.
1691 print('Warning: you cannot use both --head and --revision') 1729 print('Warning: you cannot use both --head and --revision')
1692 1730
1693 if options.verbose: 1731 if options.verbose:
1694 # Print out the .gclient file. This is longer than if we just printed the 1732 # Print out the .gclient file. This is longer than if we just printed the
1695 # client dict, but more legible, and it might contain helpful comments. 1733 # client dict, but more legible, and it might contain helpful comments.
1696 print(client.config_content) 1734 print(client.config_content)
1735
1697 ret = client.RunOnDeps('update', args) 1736 ret = client.RunOnDeps('update', args)
1698 if options.output_json: 1737 if options.output_json:
1699 slns = {} 1738 slns = {}
1700 for d in client.subtree(True): 1739 for d in client.subtree(True):
1701 normed = d.name.replace('\\', '/').rstrip('/') + '/' 1740 normed = d.name.replace('\\', '/').rstrip('/') + '/'
1702 slns[normed] = { 1741 slns[normed] = {
1703 'revision': d.got_revision, 1742 'revision': d.got_revision,
1704 'scm': d.used_scm.name if d.used_scm else None, 1743 'scm': d.used_scm.name if d.used_scm else None,
1705 } 1744 }
1706 with open(options.output_json, 'wb') as f: 1745 with open(options.output_json, 'wb') as f:
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 raise 1960 raise
1922 except (gclient_utils.Error, subprocess2.CalledProcessError), e: 1961 except (gclient_utils.Error, subprocess2.CalledProcessError), e:
1923 print >> sys.stderr, 'Error: %s' % str(e) 1962 print >> sys.stderr, 'Error: %s' % str(e)
1924 return 1 1963 return 1
1925 1964
1926 1965
1927 if '__main__' == __name__: 1966 if '__main__' == __name__:
1928 sys.exit(Main(sys.argv[1:])) 1967 sys.exit(Main(sys.argv[1:]))
1929 1968
1930 # vim: ts=2:sw=2:tw=80:et: 1969 # vim: ts=2:sw=2:tw=80:et:
OLDNEW
« no previous file with comments | « no previous file | gclient_scm.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698