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

Side by Side Diff: gclient.py

Issue 2099153003: Switch gclient config to default to unmanaged mode. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Update tests Created 4 years, 5 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
« no previous file with comments | « no previous file | tests/gclient_smoketest.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 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 custom_hooks, deps_file, should_process): 217 custom_hooks, deps_file, should_process):
218 GClientKeywords.__init__(self) 218 GClientKeywords.__init__(self)
219 219
220 # These are not mutable: 220 # These are not mutable:
221 self._parent = parent 221 self._parent = parent
222 self._deps_file = deps_file 222 self._deps_file = deps_file
223 self._url = url 223 self._url = url
224 # 'managed' determines whether or not this dependency is synced/updated by 224 # 'managed' determines whether or not this dependency is synced/updated by
225 # gclient after gclient checks it out initially. The difference between 225 # gclient after gclient checks it out initially. The difference between
226 # 'managed' and 'should_process' is that the user specifies 'managed' via 226 # 'managed' and 'should_process' is that the user specifies 'managed' via
227 # the --unmanaged command-line flag or a .gclient config, where 227 # the --managed command-line flag or a .gclient config, where
228 # 'should_process' is dynamically set by gclient if it goes over its 228 # 'should_process' is dynamically set by gclient if it goes over its
229 # recursion limit and controls gclient's behavior so it does not misbehave. 229 # recursion limit and controls gclient's behavior so it does not misbehave.
230 self._managed = managed 230 self._managed = managed
231 self._should_process = should_process 231 self._should_process = should_process
232 # This is a mutable value which has the list of 'target_os' OSes listed in 232 # This is a mutable value which has the list of 'target_os' OSes listed in
233 # the current deps file. 233 # the current deps file.
234 self.local_target_os = None 234 self.local_target_os = None
235 235
236 # These are only set in .gclient and not in DEPS files. 236 # These are only set in .gclient and not in DEPS files.
237 self._custom_vars = custom_vars or {} 237 self._custom_vars = custom_vars or {}
(...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 1245
1246 The .gclient file contains: 1246 The .gclient file contains:
1247 URL: %(expected_url)s (%(expected_scm)s) 1247 URL: %(expected_url)s (%(expected_scm)s)
1248 Cache mirror: %(mirror_string)s 1248 Cache mirror: %(mirror_string)s
1249 1249
1250 The local checkout in %(checkout_path)s reports: 1250 The local checkout in %(checkout_path)s reports:
1251 %(actual_url)s (%(actual_scm)s) 1251 %(actual_url)s (%(actual_scm)s)
1252 1252
1253 You should ensure that the URL listed in .gclient is correct and either change 1253 You should ensure that the URL listed in .gclient is correct and either change
1254 it or fix the checkout. If you're managing your own git checkout in 1254 it or fix the checkout. If you're managing your own git checkout in
1255 %(checkout_path)s but the URL in .gclient is for an svn repository, you probably 1255 %(checkout_path)s but the URL in .gclient is for an svn repository, you should
1256 want to set 'managed': False in .gclient. 1256 set 'managed': False in .gclient.
1257 ''' % {'checkout_path': os.path.join(self.root_dir, dep.name), 1257 ''' % {'checkout_path': os.path.join(self.root_dir, dep.name),
1258 'expected_url': dep.url, 1258 'expected_url': dep.url,
1259 'expected_scm': gclient_scm.GetScmName(dep.url), 1259 'expected_scm': gclient_scm.GetScmName(dep.url),
1260 'mirror_string' : mirror_string, 1260 'mirror_string' : mirror_string,
1261 'actual_url': actual_url, 1261 'actual_url': actual_url,
1262 'actual_scm': gclient_scm.GetScmName(actual_url)}) 1262 'actual_scm': gclient_scm.GetScmName(actual_url)})
1263 1263
1264 def SetConfig(self, content): 1264 def SetConfig(self, content):
1265 assert not self.dependencies 1265 assert not self.dependencies
1266 config_dict = {} 1266 config_dict = {}
(...skipping 26 matching lines...) Expand all
1293 'not specified') 1293 'not specified')
1294 1294
1295 deps_to_add = [] 1295 deps_to_add = []
1296 for s in config_dict.get('solutions', []): 1296 for s in config_dict.get('solutions', []):
1297 if s.get('safesync_url'): 1297 if s.get('safesync_url'):
1298 raise gclient_utils.Error('safesync_url is not supported anymore. ' 1298 raise gclient_utils.Error('safesync_url is not supported anymore. '
1299 'Please remove it from your .gclient file.') 1299 'Please remove it from your .gclient file.')
1300 try: 1300 try:
1301 deps_to_add.append(Dependency( 1301 deps_to_add.append(Dependency(
1302 self, s['name'], s['url'], 1302 self, s['name'], s['url'],
1303 s.get('managed', True), 1303 s.get('managed', False),
1304 s.get('custom_deps', {}), 1304 s.get('custom_deps', {}),
1305 s.get('custom_vars', {}), 1305 s.get('custom_vars', {}),
1306 s.get('custom_hooks', []), 1306 s.get('custom_hooks', []),
1307 s.get('deps_file', 'DEPS'), 1307 s.get('deps_file', 'DEPS'),
1308 True)) 1308 True))
1309 except KeyError: 1309 except KeyError:
1310 raise gclient_utils.Error('Invalid .gclient file. Solution is ' 1310 raise gclient_utils.Error('Invalid .gclient file. Solution is '
1311 'incomplete: %s' % s) 1311 'incomplete: %s' % s)
1312 self.add_dependencies_and_close(deps_to_add, config_dict.get('hooks', [])) 1312 self.add_dependencies_and_close(deps_to_add, config_dict.get('hooks', []))
1313 logging.info('SetConfig() done') 1313 logging.info('SetConfig() done')
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 ('You must specify the full solution name like --revision %s@%s\n' 1419 ('You must specify the full solution name like --revision %s@%s\n'
1420 'when you have multiple solutions setup in your .gclient file.\n' 1420 'when you have multiple solutions setup in your .gclient file.\n'
1421 'Other solutions present are: %s.') % ( 1421 'Other solutions present are: %s.') % (
1422 client.dependencies[0].name, 1422 client.dependencies[0].name,
1423 options.revisions[0], 1423 options.revisions[0],
1424 ', '.join(s.name for s in client.dependencies[1:])), 1424 ', '.join(s.name for s in client.dependencies[1:])),
1425 file=sys.stderr) 1425 file=sys.stderr)
1426 return client 1426 return client
1427 1427
1428 def SetDefaultConfig(self, solution_name, deps_file, solution_url, 1428 def SetDefaultConfig(self, solution_name, deps_file, solution_url,
1429 managed=True, cache_dir=None): 1429 managed=False, cache_dir=None):
1430 self.SetConfig(self.DEFAULT_CLIENT_FILE_TEXT % { 1430 self.SetConfig(self.DEFAULT_CLIENT_FILE_TEXT % {
1431 'solution_name': solution_name, 1431 'solution_name': solution_name,
1432 'solution_url': solution_url, 1432 'solution_url': solution_url,
1433 'deps_file': deps_file, 1433 'deps_file': deps_file,
1434 'managed': managed, 1434 'managed': managed,
1435 'cache_dir': cache_dir, 1435 'cache_dir': cache_dir,
1436 }) 1436 })
1437 1437
1438 def _SaveEntries(self): 1438 def _SaveEntries(self):
1439 """Creates a .gclient_entries file to record the list of unique checkouts. 1439 """Creates a .gclient_entries file to record the list of unique checkouts.
(...skipping 28 matching lines...) Expand all
1468 exec(gclient_utils.FileRead(filename), scope) 1468 exec(gclient_utils.FileRead(filename), scope)
1469 except SyntaxError as e: 1469 except SyntaxError as e:
1470 gclient_utils.SyntaxErrorToError(filename, e) 1470 gclient_utils.SyntaxErrorToError(filename, e)
1471 return scope['entries'] 1471 return scope['entries']
1472 1472
1473 def _EnforceRevisions(self): 1473 def _EnforceRevisions(self):
1474 """Checks for revision overrides.""" 1474 """Checks for revision overrides."""
1475 revision_overrides = {} 1475 revision_overrides = {}
1476 if not self._options.revisions: 1476 if not self._options.revisions:
1477 for s in self.dependencies: 1477 for s in self.dependencies:
1478 if not s.managed and not self._options.head: 1478 if not s.managed and not self._options.__dict__.get('head', False):
1479 self._options.revisions.append('%s@unmanaged' % s.name) 1479 self._options.revisions.append('%s@unmanaged' % s.name)
1480 if not self._options.revisions: 1480 if not self._options.revisions:
1481 return revision_overrides 1481 return revision_overrides
1482 solutions_names = [s.name for s in self.dependencies] 1482 solutions_names = [s.name for s in self.dependencies]
1483 for i, revision in enumerate(self._options.revisions): 1483 for i, revision in enumerate(self._options.revisions):
1484 if not '@' in revision: 1484 if not '@' in revision:
1485 # Support for --revision 123 1485 # Support for --revision 123
1486 name, rev = solutions_names[i], revision 1486 name, rev = solutions_names[i], revision
1487 else: 1487 else:
1488 name, rev = revision.split('@', 1) 1488 name, rev = revision.split('@', 1)
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1854 # options.output_config_file until after the (gclientfile xor spec) error 1854 # options.output_config_file until after the (gclientfile xor spec) error
1855 # check. 1855 # check.
1856 parser.remove_option('--gclientfile') 1856 parser.remove_option('--gclientfile')
1857 parser.add_option('--gclientfile', dest='output_config_file', 1857 parser.add_option('--gclientfile', dest='output_config_file',
1858 help='Specify an alternate .gclient file') 1858 help='Specify an alternate .gclient file')
1859 parser.add_option('--name', 1859 parser.add_option('--name',
1860 help='overrides the default name for the solution') 1860 help='overrides the default name for the solution')
1861 parser.add_option('--deps-file', default='DEPS', 1861 parser.add_option('--deps-file', default='DEPS',
1862 help='overrides the default name for the DEPS file for the' 1862 help='overrides the default name for the DEPS file for the'
1863 'main solutions and all sub-dependencies') 1863 'main solutions and all sub-dependencies')
1864 parser.add_option('--unmanaged', action='store_true', default=False, 1864 parser.add_option('--managed', action='store_true', default=False,
1865 help='overrides the default behavior to make it possible ' 1865 help='overrides the default behavior to make it possible '
1866 'to have the main solution untouched by gclient ' 1866 'to have the main solution managed by gclient '
1867 '(gclient will check out unmanaged dependencies but ' 1867 '(gclient will always auto-sync managed solutions '
1868 'will never sync them)') 1868 ' rather than leaving them untouched)')
1869 parser.add_option('--unmanaged', action='store_true', default=True,
1870 help='This flag is a no-op; unmanaged is now the default.')
1869 parser.add_option('--cache-dir', 1871 parser.add_option('--cache-dir',
1870 help='(git only) Cache all git repos into this dir and do ' 1872 help='(git only) Cache all git repos into this dir and do '
1871 'shared clones from the cache, instead of cloning ' 1873 'shared clones from the cache, instead of cloning '
1872 'directly from the remote. (experimental)') 1874 'directly from the remote. (experimental)')
1873 parser.set_defaults(config_filename=None) 1875 parser.set_defaults(config_filename=None)
1874 (options, args) = parser.parse_args(args) 1876 (options, args) = parser.parse_args(args)
1875 if options.output_config_file: 1877 if options.output_config_file:
1876 setattr(options, 'config_filename', getattr(options, 'output_config_file')) 1878 setattr(options, 'config_filename', getattr(options, 'output_config_file'))
1877 if ((options.spec and args) or len(args) > 2 or 1879 if ((options.spec and args) or len(args) > 2 or
1878 (not options.spec and not args)): 1880 (not options.spec and not args)):
(...skipping 12 matching lines...) Expand all
1891 # specify an alternate relpath for the given URL. 1893 # specify an alternate relpath for the given URL.
1892 name = options.name 1894 name = options.name
1893 if not os.path.abspath(os.path.join(os.getcwd(), name)).startswith( 1895 if not os.path.abspath(os.path.join(os.getcwd(), name)).startswith(
1894 os.getcwd()): 1896 os.getcwd()):
1895 parser.error('Do not pass a relative path for --name.') 1897 parser.error('Do not pass a relative path for --name.')
1896 if any(x in ('..', '.', '/', '\\') for x in name.split(os.sep)): 1898 if any(x in ('..', '.', '/', '\\') for x in name.split(os.sep)):
1897 parser.error('Do not include relative path components in --name.') 1899 parser.error('Do not include relative path components in --name.')
1898 1900
1899 deps_file = options.deps_file 1901 deps_file = options.deps_file
1900 client.SetDefaultConfig(name, deps_file, base_url, 1902 client.SetDefaultConfig(name, deps_file, base_url,
1901 managed=not options.unmanaged, 1903 managed=options.managed,
1902 cache_dir=options.cache_dir) 1904 cache_dir=options.cache_dir)
1903 client.SaveConfig() 1905 client.SaveConfig()
1904 return 0 1906 return 0
1905 1907
1906 1908
1907 @subcommand.epilog("""Example: 1909 @subcommand.epilog("""Example:
1908 gclient pack > patch.txt 1910 gclient pack > patch.txt
1909 generate simple patch for configured client and dependences 1911 generate simple patch for configured client and dependences
1910 """) 1912 """)
1911 def CMDpack(parser, args): 1913 def CMDpack(parser, args):
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 2317
2316 2318
2317 if '__main__' == __name__: 2319 if '__main__' == __name__:
2318 try: 2320 try:
2319 sys.exit(main(sys.argv[1:])) 2321 sys.exit(main(sys.argv[1:]))
2320 except KeyboardInterrupt: 2322 except KeyboardInterrupt:
2321 sys.stderr.write('interrupted\n') 2323 sys.stderr.write('interrupted\n')
2322 sys.exit(1) 2324 sys.exit(1)
2323 2325
2324 # vim: ts=2:sw=2:tw=80:et: 2326 # vim: ts=2:sw=2:tw=80:et:
OLDNEW
« no previous file with comments | « no previous file | tests/gclient_smoketest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698