| 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 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1371 return client | 1371 return client |
| 1372 | 1372 |
| 1373 @staticmethod | 1373 @staticmethod |
| 1374 def LoadCurrentConfig(options): | 1374 def LoadCurrentConfig(options): |
| 1375 """Searches for and loads a .gclient file relative to the current working | 1375 """Searches for and loads a .gclient file relative to the current working |
| 1376 dir. Returns a GClient object.""" | 1376 dir. Returns a GClient object.""" |
| 1377 if options.spec: | 1377 if options.spec: |
| 1378 client = GClient('.', options) | 1378 client = GClient('.', options) |
| 1379 client.SetConfig(options.spec) | 1379 client.SetConfig(options.spec) |
| 1380 else: | 1380 else: |
| 1381 if options.verbose: |
| 1382 print('Looking for %s starting from %s\n' % ( |
| 1383 options.config_filename, os.getcwd())) |
| 1381 path = gclient_utils.FindGclientRoot(os.getcwd(), options.config_filename) | 1384 path = gclient_utils.FindGclientRoot(os.getcwd(), options.config_filename) |
| 1382 if not path: | 1385 if not path: |
| 1383 return None | 1386 return None |
| 1384 client = GClient(path, options) | 1387 client = GClient(path, options) |
| 1385 client.SetConfig(gclient_utils.FileRead( | 1388 client.SetConfig(gclient_utils.FileRead( |
| 1386 os.path.join(path, options.config_filename))) | 1389 os.path.join(path, options.config_filename))) |
| 1387 client = client.MigrateConfigToGit(path, options) | 1390 client = client.MigrateConfigToGit(path, options) |
| 1388 | 1391 |
| 1389 if (options.revisions and | 1392 if (options.revisions and |
| 1390 len(client.dependencies) > 1 and | 1393 len(client.dependencies) > 1 and |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1689 entries[d.name] = d.parsed_url | 1692 entries[d.name] = d.parsed_url |
| 1690 keys = sorted(entries.keys()) | 1693 keys = sorted(entries.keys()) |
| 1691 for x in keys: | 1694 for x in keys: |
| 1692 print('%s: %s' % (x, entries[x])) | 1695 print('%s: %s' % (x, entries[x])) |
| 1693 logging.info(str(self)) | 1696 logging.info(str(self)) |
| 1694 | 1697 |
| 1695 def ParseDepsFile(self): | 1698 def ParseDepsFile(self): |
| 1696 """No DEPS to parse for a .gclient file.""" | 1699 """No DEPS to parse for a .gclient file.""" |
| 1697 raise gclient_utils.Error('Internal error') | 1700 raise gclient_utils.Error('Internal error') |
| 1698 | 1701 |
| 1702 def PrintLocationAndContents(self): |
| 1703 # Print out the .gclient file. This is longer than if we just printed the |
| 1704 # client dict, but more legible, and it might contain helpful comments. |
| 1705 print('Loaded .gclient config in %s:\n%s' % ( |
| 1706 self.root_dir, self.config_content)) |
| 1707 |
| 1699 @property | 1708 @property |
| 1700 def root_dir(self): | 1709 def root_dir(self): |
| 1701 """Root directory of gclient checkout.""" | 1710 """Root directory of gclient checkout.""" |
| 1702 return self._root_dir | 1711 return self._root_dir |
| 1703 | 1712 |
| 1704 @property | 1713 @property |
| 1705 def enforced_os(self): | 1714 def enforced_os(self): |
| 1706 """What deps_os entries that are to be parsed.""" | 1715 """What deps_os entries that are to be parsed.""" |
| 1707 return self._enforced_os | 1716 return self._enforced_os |
| 1708 | 1717 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1731 """ | 1740 """ |
| 1732 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', | 1741 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', |
| 1733 help='override deps for the specified (comma-separated) ' | 1742 help='override deps for the specified (comma-separated) ' |
| 1734 'platform(s); \'all\' will process all deps_os ' | 1743 'platform(s); \'all\' will process all deps_os ' |
| 1735 'references') | 1744 'references') |
| 1736 (options, args) = parser.parse_args(args) | 1745 (options, args) = parser.parse_args(args) |
| 1737 client = GClient.LoadCurrentConfig(options) | 1746 client = GClient.LoadCurrentConfig(options) |
| 1738 if not client: | 1747 if not client: |
| 1739 raise gclient_utils.Error('client not configured; see \'gclient config\'') | 1748 raise gclient_utils.Error('client not configured; see \'gclient config\'') |
| 1740 if options.verbose: | 1749 if options.verbose: |
| 1741 # Print out the .gclient file. This is longer than if we just printed the | 1750 client.PrintLocationAndContents() |
| 1742 # client dict, but more legible, and it might contain helpful comments. | |
| 1743 print(client.config_content) | |
| 1744 return client.RunOnDeps('cleanup', args) | 1751 return client.RunOnDeps('cleanup', args) |
| 1745 | 1752 |
| 1746 | 1753 |
| 1747 @subcommand.usage('[command] [args ...]') | 1754 @subcommand.usage('[command] [args ...]') |
| 1748 def CMDrecurse(parser, args): | 1755 def CMDrecurse(parser, args): |
| 1749 """Operates [command args ...] on all the dependencies. | 1756 """Operates [command args ...] on all the dependencies. |
| 1750 | 1757 |
| 1751 Runs a shell command on all entries. | 1758 Runs a shell command on all entries. |
| 1752 Sets GCLIENT_DEP_PATH enviroment variable as the dep's relative location to | 1759 Sets GCLIENT_DEP_PATH enviroment variable as the dep's relative location to |
| 1753 root directory of the checkout. | 1760 root directory of the checkout. |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1922 'platform(s); \'all\' will process all deps_os ' | 1929 'platform(s); \'all\' will process all deps_os ' |
| 1923 'references') | 1930 'references') |
| 1924 parser.remove_option('--jobs') | 1931 parser.remove_option('--jobs') |
| 1925 (options, args) = parser.parse_args(args) | 1932 (options, args) = parser.parse_args(args) |
| 1926 # Force jobs to 1 so the stdout is not annotated with the thread ids | 1933 # Force jobs to 1 so the stdout is not annotated with the thread ids |
| 1927 options.jobs = 1 | 1934 options.jobs = 1 |
| 1928 client = GClient.LoadCurrentConfig(options) | 1935 client = GClient.LoadCurrentConfig(options) |
| 1929 if not client: | 1936 if not client: |
| 1930 raise gclient_utils.Error('client not configured; see \'gclient config\'') | 1937 raise gclient_utils.Error('client not configured; see \'gclient config\'') |
| 1931 if options.verbose: | 1938 if options.verbose: |
| 1932 # Print out the .gclient file. This is longer than if we just printed the | 1939 client.PrintLocationAndContents() |
| 1933 # client dict, but more legible, and it might contain helpful comments. | |
| 1934 print(client.config_content) | |
| 1935 return client.RunOnDeps('pack', args) | 1940 return client.RunOnDeps('pack', args) |
| 1936 | 1941 |
| 1937 | 1942 |
| 1938 def CMDstatus(parser, args): | 1943 def CMDstatus(parser, args): |
| 1939 """Shows modification status for every dependencies.""" | 1944 """Shows modification status for every dependencies.""" |
| 1940 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', | 1945 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', |
| 1941 help='override deps for the specified (comma-separated) ' | 1946 help='override deps for the specified (comma-separated) ' |
| 1942 'platform(s); \'all\' will process all deps_os ' | 1947 'platform(s); \'all\' will process all deps_os ' |
| 1943 'references') | 1948 'references') |
| 1944 (options, args) = parser.parse_args(args) | 1949 (options, args) = parser.parse_args(args) |
| 1945 client = GClient.LoadCurrentConfig(options) | 1950 client = GClient.LoadCurrentConfig(options) |
| 1946 if not client: | 1951 if not client: |
| 1947 raise gclient_utils.Error('client not configured; see \'gclient config\'') | 1952 raise gclient_utils.Error('client not configured; see \'gclient config\'') |
| 1948 if options.verbose: | 1953 if options.verbose: |
| 1949 # Print out the .gclient file. This is longer than if we just printed the | 1954 client.PrintLocationAndContents() |
| 1950 # client dict, but more legible, and it might contain helpful comments. | |
| 1951 print(client.config_content) | |
| 1952 return client.RunOnDeps('status', args) | 1955 return client.RunOnDeps('status', args) |
| 1953 | 1956 |
| 1954 | 1957 |
| 1955 @subcommand.epilog("""Examples: | 1958 @subcommand.epilog("""Examples: |
| 1956 gclient sync | 1959 gclient sync |
| 1957 update files from SCM according to current configuration, | 1960 update files from SCM according to current configuration, |
| 1958 *for modules which have changed since last update or sync* | 1961 *for modules which have changed since last update or sync* |
| 1959 gclient sync --force | 1962 gclient sync --force |
| 1960 update files from SCM according to current configuration, for | 1963 update files from SCM according to current configuration, for |
| 1961 all modules (useful for recovering files deleted from local copy) | 1964 all modules (useful for recovering files deleted from local copy) |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2054 client = GClient.LoadCurrentConfig(options) | 2057 client = GClient.LoadCurrentConfig(options) |
| 2055 | 2058 |
| 2056 if not client: | 2059 if not client: |
| 2057 raise gclient_utils.Error('client not configured; see \'gclient config\'') | 2060 raise gclient_utils.Error('client not configured; see \'gclient config\'') |
| 2058 | 2061 |
| 2059 if options.revisions and options.head: | 2062 if options.revisions and options.head: |
| 2060 # TODO(maruel): Make it a parser.error if it doesn't break any builder. | 2063 # TODO(maruel): Make it a parser.error if it doesn't break any builder. |
| 2061 print('Warning: you cannot use both --head and --revision') | 2064 print('Warning: you cannot use both --head and --revision') |
| 2062 | 2065 |
| 2063 if options.verbose: | 2066 if options.verbose: |
| 2064 # Print out the .gclient file. This is longer than if we just printed the | 2067 client.PrintLocationAndContents() |
| 2065 # client dict, but more legible, and it might contain helpful comments. | |
| 2066 print(client.config_content) | |
| 2067 ret = client.RunOnDeps('update', args) | 2068 ret = client.RunOnDeps('update', args) |
| 2068 if options.output_json: | 2069 if options.output_json: |
| 2069 slns = {} | 2070 slns = {} |
| 2070 for d in client.subtree(True): | 2071 for d in client.subtree(True): |
| 2071 normed = d.name.replace('\\', '/').rstrip('/') + '/' | 2072 normed = d.name.replace('\\', '/').rstrip('/') + '/' |
| 2072 slns[normed] = { | 2073 slns[normed] = { |
| 2073 'revision': d.got_revision, | 2074 'revision': d.got_revision, |
| 2074 'scm': d.used_scm.name if d.used_scm else None, | 2075 'scm': d.used_scm.name if d.used_scm else None, |
| 2075 'url': str(d.url) if d.url else None, | 2076 'url': str(d.url) if d.url else None, |
| 2076 } | 2077 } |
| 2077 with open(options.output_json, 'wb') as f: | 2078 with open(options.output_json, 'wb') as f: |
| 2078 json.dump({'solutions': slns}, f) | 2079 json.dump({'solutions': slns}, f) |
| 2079 return ret | 2080 return ret |
| 2080 | 2081 |
| 2081 | 2082 |
| 2082 CMDupdate = CMDsync | 2083 CMDupdate = CMDsync |
| 2083 | 2084 |
| 2084 | 2085 |
| 2085 def CMDdiff(parser, args): | 2086 def CMDdiff(parser, args): |
| 2086 """Displays local diff for every dependencies.""" | 2087 """Displays local diff for every dependencies.""" |
| 2087 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', | 2088 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', |
| 2088 help='override deps for the specified (comma-separated) ' | 2089 help='override deps for the specified (comma-separated) ' |
| 2089 'platform(s); \'all\' will process all deps_os ' | 2090 'platform(s); \'all\' will process all deps_os ' |
| 2090 'references') | 2091 'references') |
| 2091 (options, args) = parser.parse_args(args) | 2092 (options, args) = parser.parse_args(args) |
| 2092 client = GClient.LoadCurrentConfig(options) | 2093 client = GClient.LoadCurrentConfig(options) |
| 2093 if not client: | 2094 if not client: |
| 2094 raise gclient_utils.Error('client not configured; see \'gclient config\'') | 2095 raise gclient_utils.Error('client not configured; see \'gclient config\'') |
| 2095 if options.verbose: | 2096 if options.verbose: |
| 2096 # Print out the .gclient file. This is longer than if we just printed the | 2097 client.PrintLocationAndContents() |
| 2097 # client dict, but more legible, and it might contain helpful comments. | |
| 2098 print(client.config_content) | |
| 2099 return client.RunOnDeps('diff', args) | 2098 return client.RunOnDeps('diff', args) |
| 2100 | 2099 |
| 2101 | 2100 |
| 2102 def CMDrevert(parser, args): | 2101 def CMDrevert(parser, args): |
| 2103 """Reverts all modifications in every dependencies. | 2102 """Reverts all modifications in every dependencies. |
| 2104 | 2103 |
| 2105 That's the nuclear option to get back to a 'clean' state. It removes anything | 2104 That's the nuclear option to get back to a 'clean' state. It removes anything |
| 2106 that shows up in svn status.""" | 2105 that shows up in svn status.""" |
| 2107 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', | 2106 parser.add_option('--deps', dest='deps_os', metavar='OS_LIST', |
| 2108 help='override deps for the specified (comma-separated) ' | 2107 help='override deps for the specified (comma-separated) ' |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2131 help='override deps for the specified (comma-separated) ' | 2130 help='override deps for the specified (comma-separated) ' |
| 2132 'platform(s); \'all\' will process all deps_os ' | 2131 'platform(s); \'all\' will process all deps_os ' |
| 2133 'references') | 2132 'references') |
| 2134 parser.add_option('-f', '--force', action='store_true', default=True, | 2133 parser.add_option('-f', '--force', action='store_true', default=True, |
| 2135 help='Deprecated. No effect.') | 2134 help='Deprecated. No effect.') |
| 2136 (options, args) = parser.parse_args(args) | 2135 (options, args) = parser.parse_args(args) |
| 2137 client = GClient.LoadCurrentConfig(options) | 2136 client = GClient.LoadCurrentConfig(options) |
| 2138 if not client: | 2137 if not client: |
| 2139 raise gclient_utils.Error('client not configured; see \'gclient config\'') | 2138 raise gclient_utils.Error('client not configured; see \'gclient config\'') |
| 2140 if options.verbose: | 2139 if options.verbose: |
| 2141 # Print out the .gclient file. This is longer than if we just printed the | 2140 client.PrintLocationAndContents() |
| 2142 # client dict, but more legible, and it might contain helpful comments. | |
| 2143 print(client.config_content) | |
| 2144 options.force = True | 2141 options.force = True |
| 2145 options.nohooks = False | 2142 options.nohooks = False |
| 2146 return client.RunOnDeps('runhooks', args) | 2143 return client.RunOnDeps('runhooks', args) |
| 2147 | 2144 |
| 2148 | 2145 |
| 2149 def CMDrevinfo(parser, args): | 2146 def CMDrevinfo(parser, args): |
| 2150 """Outputs revision info mapping for the client and its dependencies. | 2147 """Outputs revision info mapping for the client and its dependencies. |
| 2151 | 2148 |
| 2152 This allows the capture of an overall 'revision' for the source tree that | 2149 This allows the capture of an overall 'revision' for the source tree that |
| 2153 can be used to reproduce the same tree in the future. It is only useful for | 2150 can be used to reproduce the same tree in the future. It is only useful for |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2322 | 2319 |
| 2323 | 2320 |
| 2324 if '__main__' == __name__: | 2321 if '__main__' == __name__: |
| 2325 try: | 2322 try: |
| 2326 sys.exit(main(sys.argv[1:])) | 2323 sys.exit(main(sys.argv[1:])) |
| 2327 except KeyboardInterrupt: | 2324 except KeyboardInterrupt: |
| 2328 sys.stderr.write('interrupted\n') | 2325 sys.stderr.write('interrupted\n') |
| 2329 sys.exit(1) | 2326 sys.exit(1) |
| 2330 | 2327 |
| 2331 # vim: ts=2:sw=2:tw=80:et: | 2328 # vim: ts=2:sw=2:tw=80:et: |
| OLD | NEW |