Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import base64 | 5 import base64 |
| 6 import json | 6 import json |
| 7 import os | 7 import os |
| 8 import time | 8 import time |
| 9 import urllib2 | 9 import urllib2 |
| 10 | 10 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 name = path.split('/')[0].lower() | 59 name = path.split('/')[0].lower() |
| 60 if name in components_renamed: | 60 if name in components_renamed: |
| 61 return components_renamed[name].lower() | 61 return components_renamed[name].lower() |
| 62 else: | 62 else: |
| 63 return name.lower() | 63 return name.lower() |
| 64 | 64 |
| 65 # Unknown path, return the whole path as component name. | 65 # Unknown path, return the whole path as component name. |
| 66 return '_'.join(path.split('/')) | 66 return '_'.join(path.split('/')) |
| 67 | 67 |
| 68 | 68 |
| 69 def _GetContentOfDEPS(url, retries=5, sleep_time=0.1): | 69 def _GetContentOfDEPS(revision, retries=5, sleep_time=0.1): |
| 70 chromium_git_file_url_template = CONFIG['chromium_git_file_url'] | |
| 71 deps_file_name = '.DEPS.git' | |
| 72 url = chromium_git_file_url_template % (revision, deps_file_name) | |
| 70 count = 0 | 73 count = 0 |
| 71 while True: | 74 while True: |
| 72 count += 1 | 75 count += 1 |
| 73 try: | 76 try: |
| 74 _, content = utils.GetHttpClient().Get(url, timeout=60) | 77 http_status_code, content = utils.GetHttpClient().Get(url, timeout=60) |
|
aarya
2014/08/26 02:13:53
404 might cause an exception which will cause deps
stgao
2014/08/26 18:35:24
Good catch. Fix both here and the http_client.
Th
| |
| 75 return content | |
| 76 | 78 |
| 77 # TODO(jeun): Handle HTTP Errors, such as 404. | 79 if http_status_code == 404 and deps_file_name != 'DEPS': |
| 80 deps_file_name = 'DEPS' | |
| 81 count = 0 | |
| 82 continue | |
| 83 elif http_status_code == 200: | |
| 84 # Googlesource git returns text file encoded in base64, so decode it. | |
| 85 return base64.b64decode(content) | |
| 86 | |
| 78 except urllib2.HTTPError: | 87 except urllib2.HTTPError: |
| 79 if count < retries: | 88 if count < retries: |
| 80 time.sleep(sleep_time) | 89 time.sleep(sleep_time) |
| 81 else: | 90 else: |
| 82 break | 91 break |
| 83 | 92 |
| 84 return '' | 93 return '' |
| 85 | 94 |
| 86 | 95 |
| 87 def GetChromiumComponents(chromium_revision, | 96 def GetChromiumComponents(chromium_revision, |
| 88 os_platform='unix', | 97 os_platform='unix', |
| 89 deps_file_downloader=_GetContentOfDEPS): | 98 deps_file_downloader=_GetContentOfDEPS): |
| 90 """Return a list of components used by Chrome of the given revision. | 99 """Return a list of components used by Chrome of the given revision. |
| 91 | 100 |
| 92 Args: | 101 Args: |
| 93 chromium_revision: The revision of the Chrome build. | 102 chromium_revision: Revision of the Chrome build: svn revision, or git hash. |
| 94 os_platform: The target platform of the Chrome build, eg. win, mac, etc. | 103 os_platform: The target platform of the Chrome build, eg. win, mac, etc. |
| 95 deps_file_downloader: A function that takes the chromium_revision as input, | 104 deps_file_downloader: A function that takes the chromium_revision as input, |
| 96 and returns the content of the DEPS file. The returned | 105 and returns the content of the DEPS file. The returned |
| 97 content is assumed to be trusted input and will be | 106 content is assumed to be trusted input and will be |
| 98 evaluated as python code. | 107 evaluated as python code. |
| 99 | 108 |
| 100 Returns: | 109 Returns: |
| 101 A map from component path to parsed component name, repository URL, | 110 A map from component path to parsed component name, repository URL, |
| 102 repository type and revision. | 111 repository type and revision. |
| 103 """ | 112 """ |
| 104 if os_platform.lower() == 'linux': | 113 if os_platform.lower() == 'linux': |
| 105 os_platform = 'unix' | 114 os_platform = 'unix' |
| 106 | 115 |
| 107 git_base_url = CONFIG['git_base_url'] | 116 chromium_git_base_url = CONFIG['chromium_git_base_url'] |
| 108 git_deps_path = CONFIG['git_deps_path'] | 117 |
| 109 svn_base_url = CONFIG['svn_base_url'] | 118 if not utils.IsGitHash(chromium_revision): |
| 110 svn_deps_path = CONFIG['svn_deps_path'] | 119 # Convert svn revision or commit position to Git hash. |
| 111 svn_src_chromium_url = CONFIG['svn_src_chromium_url'] | 120 cr_rev_url_template = CONFIG['cr_rev_url'] |
| 112 is_git_hash = utils.IsGitHash(chromium_revision) | 121 url = cr_rev_url_template % chromium_revision |
| 113 if is_git_hash: | 122 _, content = utils.GetHttpClient().Get(url, timeout=60) |
| 114 url = git_base_url + (git_deps_path % chromium_revision) | 123 cr_rev_data = json.loads(content) |
| 115 else: | 124 if 'git_sha' not in cr_rev_data: |
| 116 url = svn_base_url + (svn_deps_path % chromium_revision) | 125 raise Exception('Failed to convert svn revision to git hash') |
| 126 chromium_revision = cr_rev_data['git_sha'] | |
| 117 | 127 |
| 118 # Download the content of DEPS file in chromium. | 128 # Download the content of DEPS file in chromium. |
| 119 deps_content = deps_file_downloader(url) | 129 deps_content = deps_file_downloader(chromium_revision) |
| 120 | |
| 121 # Googlesource git returns text file encoded in base64, so decode it. | |
| 122 if is_git_hash: | |
| 123 deps_content = base64.b64decode(deps_content) | |
| 124 | 130 |
| 125 all_deps = {} | 131 all_deps = {} |
| 126 | 132 |
| 127 # Parse the content of DEPS file. | 133 # Parse the content of DEPS file. |
| 128 deps, deps_os = _ParseDEPS(deps_content) | 134 deps, deps_os = _ParseDEPS(deps_content) |
| 129 all_deps.update(deps) | 135 all_deps.update(deps) |
| 130 if os_platform is not None: | 136 if os_platform is not None: |
| 131 all_deps.update(deps_os.get(os_platform, {})) | 137 all_deps.update(deps_os.get(os_platform, {})) |
| 132 | 138 |
| 133 # Figure out components based on the dependencies. | 139 # Figure out components based on the dependencies. |
| 134 components = {} | 140 components = {} |
| 135 host_dirs = CONFIG['host_directories'] | 141 host_dirs = CONFIG['host_directories'] |
| 136 for component_path in all_deps: | 142 for component_path, component_repo_url in all_deps.iteritems(): |
| 143 if component_repo_url is None: | |
| 144 # For some platform like iso, some component is ignored. | |
| 145 continue | |
| 146 | |
| 137 name = _GetComponentName(component_path, host_dirs) | 147 name = _GetComponentName(component_path, host_dirs) |
| 138 repository, revision = all_deps[component_path].split('@') | 148 repository, revision = component_repo_url.split('@') |
| 139 is_git_hash = utils.IsGitHash(revision) | 149 is_git_hash = utils.IsGitHash(revision) |
| 140 if repository.startswith('/'): | |
| 141 # In DEPS file, if a path starts with /, it is a relative path to the | |
| 142 # https://src.chromium.org/chrome. Strip /trunk at the end of the base | |
| 143 # url and add it to the base url. | |
| 144 # TODO(stgao): Use git repo after chromium moves to git. | |
| 145 repository = svn_src_chromium_url + repository | |
| 146 if is_git_hash: | 150 if is_git_hash: |
| 147 repository_type = 'git' | 151 repository_type = 'git' |
| 148 else: | 152 else: |
| 149 repository_type = 'svn' | 153 repository_type = 'svn' |
| 150 if not component_path.endswith('/'): | 154 if not component_path.endswith('/'): |
| 151 component_path += '/' | 155 component_path += '/' |
| 152 components[component_path] = { | 156 components[component_path] = { |
| 153 'path': component_path, | 157 'path': component_path, |
| 154 'name': name, | 158 'name': name, |
| 155 'repository': repository, | 159 'repository': repository, |
| 156 'repository_type': repository_type, | 160 'repository_type': repository_type, |
| 157 'revision': revision | 161 'revision': revision |
| 158 } | 162 } |
| 159 | 163 |
| 160 # Add chromium as a component, depending on the repository type. | 164 # Add chromium as a component. |
| 161 if is_git_hash: | |
| 162 repository = git_base_url | |
| 163 repository_type = 'git' | |
| 164 else: | |
| 165 repository = svn_base_url | |
| 166 repository_type = 'svn' | |
| 167 | |
| 168 components['src/'] = { | 165 components['src/'] = { |
| 169 'path': 'src/', | 166 'path': 'src/', |
| 170 'name': 'chromium', | 167 'name': 'chromium', |
| 171 'repository': repository, | 168 'repository': chromium_git_base_url, |
| 172 'repository_type': repository_type, | 169 'repository_type': 'git', |
| 173 'revision': chromium_revision | 170 'revision': chromium_revision |
| 174 } | 171 } |
| 175 | 172 |
| 176 return components | 173 return components |
| 177 | 174 |
| 178 | 175 |
| 179 def GetChromiumComponentRange(old_revision, | 176 def GetChromiumComponentRange(old_revision, |
| 180 new_revision, | 177 new_revision, |
| 181 os_platform='unix', | 178 os_platform='unix', |
| 182 deps_file_downloader=_GetContentOfDEPS): | 179 deps_file_downloader=_GetContentOfDEPS): |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 213 'path': path, | 210 'path': path, |
| 214 'rolled': new_component['revision'] != old_revision, | 211 'rolled': new_component['revision'] != old_revision, |
| 215 'name': new_component['name'], | 212 'name': new_component['name'], |
| 216 'old_revision': old_revision, | 213 'old_revision': old_revision, |
| 217 'new_revision': new_component['revision'], | 214 'new_revision': new_component['revision'], |
| 218 'repository': new_component['repository'], | 215 'repository': new_component['repository'], |
| 219 'repository_type': new_component['repository_type'] | 216 'repository_type': new_component['repository_type'] |
| 220 } | 217 } |
| 221 | 218 |
| 222 return components | 219 return components |
| OLD | NEW |