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

Side by Side Diff: gclient.py

Issue 18328003: Add a git cache for gclient sync operations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Make cache_dir .gclient only, and move it to GitWrapper Created 7 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 | 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 7
8 Files 8 Files
9 .gclient : Current client configuration, written by 'config' command. 9 .gclient : Current client configuration, written by 'config' command.
10 Format is a Python script defining 'solutions', a list whose 10 Format is a Python script defining 'solutions', a list whose
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 solutions = [ 891 solutions = [
892 { "name" : "%(solution_name)s", 892 { "name" : "%(solution_name)s",
893 "url" : "%(solution_url)s", 893 "url" : "%(solution_url)s",
894 "deps_file" : "%(deps_file)s", 894 "deps_file" : "%(deps_file)s",
895 "managed" : %(managed)s, 895 "managed" : %(managed)s,
896 "custom_deps" : { 896 "custom_deps" : {
897 }, 897 },
898 "safesync_url": "%(safesync_url)s", 898 "safesync_url": "%(safesync_url)s",
899 }, 899 },
900 ] 900 ]
901 cache_dir = %(cache_dir)r
901 """) 902 """)
902 903
903 DEFAULT_SNAPSHOT_SOLUTION_TEXT = ("""\ 904 DEFAULT_SNAPSHOT_SOLUTION_TEXT = ("""\
904 { "name" : "%(solution_name)s", 905 { "name" : "%(solution_name)s",
905 "url" : "%(solution_url)s", 906 "url" : "%(solution_url)s",
906 "deps_file" : "%(deps_file)s", 907 "deps_file" : "%(deps_file)s",
907 "managed" : %(managed)s, 908 "managed" : %(managed)s,
908 "custom_deps" : { 909 "custom_deps" : {
909 %(solution_deps)s }, 910 %(solution_deps)s },
910 "safesync_url": "%(safesync_url)s", 911 "safesync_url": "%(safesync_url)s",
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 except SyntaxError, e: 944 except SyntaxError, e:
944 gclient_utils.SyntaxErrorToError('.gclient', e) 945 gclient_utils.SyntaxErrorToError('.gclient', e)
945 946
946 # Append any target OS that is not already being enforced to the tuple. 947 # Append any target OS that is not already being enforced to the tuple.
947 target_os = config_dict.get('target_os', []) 948 target_os = config_dict.get('target_os', [])
948 if config_dict.get('target_os_only', False): 949 if config_dict.get('target_os_only', False):
949 self._enforced_os = tuple(set(target_os)) 950 self._enforced_os = tuple(set(target_os))
950 else: 951 else:
951 self._enforced_os = tuple(set(self._enforced_os).union(target_os)) 952 self._enforced_os = tuple(set(self._enforced_os).union(target_os))
952 953
954 gclient_scm.GitWrapper.cache_dir = config_dict.get('cache_dir')
955
953 if not target_os and config_dict.get('target_os_only', False): 956 if not target_os and config_dict.get('target_os_only', False):
954 raise gclient_utils.Error('Can\'t use target_os_only if target_os is ' 957 raise gclient_utils.Error('Can\'t use target_os_only if target_os is '
955 'not specified') 958 'not specified')
956 959
957 deps_to_add = [] 960 deps_to_add = []
958 for s in config_dict.get('solutions', []): 961 for s in config_dict.get('solutions', []):
959 try: 962 try:
960 deps_to_add.append(Dependency( 963 deps_to_add.append(Dependency(
961 self, s['name'], s['url'], 964 self, s['name'], s['url'],
962 s.get('safesync_url', None), 965 s.get('safesync_url', None),
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 print >> sys.stderr, ( 1000 print >> sys.stderr, (
998 'You must specify the full solution name like --revision %s@%s\n' 1001 'You must specify the full solution name like --revision %s@%s\n'
999 'when you have multiple solutions setup in your .gclient file.\n' 1002 'when you have multiple solutions setup in your .gclient file.\n'
1000 'Other solutions present are: %s.') % ( 1003 'Other solutions present are: %s.') % (
1001 client.dependencies[0].name, 1004 client.dependencies[0].name,
1002 options.revisions[0], 1005 options.revisions[0],
1003 ', '.join(s.name for s in client.dependencies[1:])) 1006 ', '.join(s.name for s in client.dependencies[1:]))
1004 return client 1007 return client
1005 1008
1006 def SetDefaultConfig(self, solution_name, deps_file, solution_url, 1009 def SetDefaultConfig(self, solution_name, deps_file, solution_url,
1007 safesync_url, managed=True): 1010 safesync_url, managed=True, cache_dir=None):
1008 self.SetConfig(self.DEFAULT_CLIENT_FILE_TEXT % { 1011 self.SetConfig(self.DEFAULT_CLIENT_FILE_TEXT % {
1009 'solution_name': solution_name, 1012 'solution_name': solution_name,
1010 'solution_url': solution_url, 1013 'solution_url': solution_url,
1011 'deps_file': deps_file, 1014 'deps_file': deps_file,
1012 'safesync_url' : safesync_url, 1015 'safesync_url' : safesync_url,
1013 'managed': managed, 1016 'managed': managed,
1017 'cache_dir': cache_dir,
1014 }) 1018 })
1015 1019
1016 def _SaveEntries(self): 1020 def _SaveEntries(self):
1017 """Creates a .gclient_entries file to record the list of unique checkouts. 1021 """Creates a .gclient_entries file to record the list of unique checkouts.
1018 1022
1019 The .gclient_entries file lives in the same directory as .gclient. 1023 The .gclient_entries file lives in the same directory as .gclient.
1020 """ 1024 """
1021 # Sometimes pprint.pformat will use {', sometimes it'll use { ' ... It 1025 # Sometimes pprint.pformat will use {', sometimes it'll use { ' ... It
1022 # makes testing a bit too fun. 1026 # makes testing a bit too fun.
1023 result = 'entries = {\n' 1027 result = 'entries = {\n'
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 parser.add_option('--deps-file', default='DEPS', 1402 parser.add_option('--deps-file', default='DEPS',
1399 help='overrides the default name for the DEPS file for the' 1403 help='overrides the default name for the DEPS file for the'
1400 'main solutions and all sub-dependencies') 1404 'main solutions and all sub-dependencies')
1401 parser.add_option('--unmanaged', action='store_true', default=False, 1405 parser.add_option('--unmanaged', action='store_true', default=False,
1402 help='overrides the default behavior to make it possible ' 1406 help='overrides the default behavior to make it possible '
1403 'to have the main solution untouched by gclient ' 1407 'to have the main solution untouched by gclient '
1404 '(gclient will check out unmanaged dependencies but ' 1408 '(gclient will check out unmanaged dependencies but '
1405 'will never sync them)') 1409 'will never sync them)')
1406 parser.add_option('--git-deps', action='store_true', 1410 parser.add_option('--git-deps', action='store_true',
1407 help='sets the deps file to ".DEPS.git" instead of "DEPS"') 1411 help='sets the deps file to ".DEPS.git" instead of "DEPS"')
1412 parser.add_option('--cache-dir',
1413 help='(git only) Cache all git repos into this dir and do '
1414 'shared clones from the cache, instead of cloning '
1415 'directly from the remote. (experimental)')
1408 parser.set_defaults(config_filename=None) 1416 parser.set_defaults(config_filename=None)
1409 (options, args) = parser.parse_args(args) 1417 (options, args) = parser.parse_args(args)
1410 if options.output_config_file: 1418 if options.output_config_file:
1411 setattr(options, 'config_filename', getattr(options, 'output_config_file')) 1419 setattr(options, 'config_filename', getattr(options, 'output_config_file'))
1412 if ((options.spec and args) or len(args) > 2 or 1420 if ((options.spec and args) or len(args) > 2 or
1413 (not options.spec and not args)): 1421 (not options.spec and not args)):
1414 parser.error('Inconsistent arguments. Use either --spec or one or 2 args') 1422 parser.error('Inconsistent arguments. Use either --spec or one or 2 args')
1415 1423
1416 client = GClient('.', options) 1424 client = GClient('.', options)
1417 if options.spec: 1425 if options.spec:
1418 client.SetConfig(options.spec) 1426 client.SetConfig(options.spec)
1419 else: 1427 else:
1420 base_url = args[0].rstrip('/') 1428 base_url = args[0].rstrip('/')
1421 if not options.name: 1429 if not options.name:
1422 name = base_url.split('/')[-1] 1430 name = base_url.split('/')[-1]
1423 if name.endswith('.git'): 1431 if name.endswith('.git'):
1424 name = name[:-4] 1432 name = name[:-4]
1425 else: 1433 else:
1426 # specify an alternate relpath for the given URL. 1434 # specify an alternate relpath for the given URL.
1427 name = options.name 1435 name = options.name
1428 deps_file = options.deps_file 1436 deps_file = options.deps_file
1429 if options.git_deps: 1437 if options.git_deps:
1430 deps_file = '.DEPS.git' 1438 deps_file = '.DEPS.git'
1431 safesync_url = '' 1439 safesync_url = ''
1432 if len(args) > 1: 1440 if len(args) > 1:
1433 safesync_url = args[1] 1441 safesync_url = args[1]
1434 client.SetDefaultConfig(name, deps_file, base_url, safesync_url, 1442 client.SetDefaultConfig(name, deps_file, base_url, safesync_url,
1435 managed=not options.unmanaged) 1443 managed=not options.unmanaged,
1444 cache_dir=options.cache_dir)
1436 client.SaveConfig() 1445 client.SaveConfig()
1437 return 0 1446 return 0
1438 1447
1439 1448
1440 @attr('epilog', """Example: 1449 @attr('epilog', """Example:
1441 gclient pack > patch.txt 1450 gclient pack > patch.txt
1442 generate simple patch for configured client and dependences 1451 generate simple patch for configured client and dependences
1443 """) 1452 """)
1444 def CMDpack(parser, args): 1453 def CMDpack(parser, args):
1445 """Generate a patch which can be applied at the root of the tree. 1454 """Generate a patch which can be applied at the root of the tree.
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 parser.add_option('--gclientfile', dest='config_filename', 1722 parser.add_option('--gclientfile', dest='config_filename',
1714 default=None, 1723 default=None,
1715 help='Specify an alternate %s file' % gclientfile_default) 1724 help='Specify an alternate %s file' % gclientfile_default)
1716 parser.add_option('--spec', 1725 parser.add_option('--spec',
1717 default=None, 1726 default=None,
1718 help='create a gclient file containing the provided ' 1727 help='create a gclient file containing the provided '
1719 'string. Due to Cygwin/Python brokenness, it ' 1728 'string. Due to Cygwin/Python brokenness, it '
1720 'probably can\'t contain any newlines.') 1729 'probably can\'t contain any newlines.')
1721 parser.add_option('--no-nag-max', default=False, action='store_true', 1730 parser.add_option('--no-nag-max', default=False, action='store_true',
1722 help='If a subprocess runs for too long without generating' 1731 help='If a subprocess runs for too long without generating'
1723 ' terminal output, generate warnings, but do not kill' 1732 ' terminal output, generate warnings, but do not kill'
1724 ' the process.') 1733 ' the process.')
1725 # Integrate standard options processing. 1734 # Integrate standard options processing.
1726 old_parser = parser.parse_args 1735 old_parser = parser.parse_args
1727 def Parse(args): 1736 def Parse(args):
1728 (options, args) = old_parser(args) 1737 (options, args) = old_parser(args)
1729 level = [logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG][ 1738 level = [logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG][
1730 min(options.verbose, 3)] 1739 min(options.verbose, 3)]
1731 logging.basicConfig(level=level, 1740 logging.basicConfig(level=level,
1732 format='%(module)s(%(lineno)d) %(funcName)s:%(message)s') 1741 format='%(module)s(%(lineno)d) %(funcName)s:%(message)s')
1733 if options.config_filename and options.spec: 1742 if options.config_filename and options.spec:
1734 parser.error('Cannot specifiy both --gclientfile and --spec') 1743 parser.error('Cannot specifiy both --gclientfile and --spec')
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1807 except (gclient_utils.Error, subprocess2.CalledProcessError), e: 1816 except (gclient_utils.Error, subprocess2.CalledProcessError), e:
1808 print >> sys.stderr, 'Error: %s' % str(e) 1817 print >> sys.stderr, 'Error: %s' % str(e)
1809 return 1 1818 return 1
1810 1819
1811 1820
1812 if '__main__' == __name__: 1821 if '__main__' == __name__:
1813 fix_encoding.fix_encoding() 1822 fix_encoding.fix_encoding()
1814 sys.exit(Main(sys.argv[1:])) 1823 sys.exit(Main(sys.argv[1:]))
1815 1824
1816 # vim: ts=2:sw=2:tw=80:et: 1825 # 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