Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 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 logging | 5 import logging |
| 6 import os | 6 import os |
| 7 import traceback | 7 import traceback |
| 8 | 8 |
| 9 from chroot_file_system import ChrootFileSystem | 9 from chroot_file_system import ChrootFileSystem |
| 10 from content_provider import ContentProvider | 10 from content_provider import ContentProvider |
| 11 import environment | 11 import environment |
| 12 from extensions_paths import CONTENT_PROVIDERS, LOCAL_DEBUG_DIR | 12 from extensions_paths import CONTENT_PROVIDERS, LOCAL_DEBUG_DIR |
| 13 from future import Future | 13 from future import All, Future |
| 14 from gitiles_file_system import GitilesFileSystem | |
|
Ken Rockot(use gerrit already)
2015/05/26 00:26:23
\o/
| |
| 15 from local_file_system import LocalFileSystem | 14 from local_file_system import LocalFileSystem |
| 16 from third_party.json_schema_compiler.memoize import memoize | 15 from third_party.json_schema_compiler.memoize import memoize |
| 17 | 16 |
| 18 | 17 |
| 19 _IGNORE_MISSING_CONTENT_PROVIDERS = [False] | 18 _IGNORE_MISSING_CONTENT_PROVIDERS = [False] |
| 20 | 19 |
| 21 | 20 |
| 22 def IgnoreMissingContentProviders(fn): | 21 def IgnoreMissingContentProviders(fn): |
| 23 '''Decorates |fn| to ignore missing content providers during its run. | 22 '''Decorates |fn| to ignore missing content providers during its run. |
| 24 ''' | 23 ''' |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 37 chrome/common/extensions/docs/templates/json/content_providers.json for its | 36 chrome/common/extensions/docs/templates/json/content_providers.json for its |
| 38 current state and a description of the format. | 37 current state and a description of the format. |
| 39 | 38 |
| 40 Returns ContentProvider instances based on how they're configured there. | 39 Returns ContentProvider instances based on how they're configured there. |
| 41 ''' | 40 ''' |
| 42 | 41 |
| 43 def __init__(self, | 42 def __init__(self, |
| 44 object_store_creator, | 43 object_store_creator, |
| 45 compiled_fs_factory, | 44 compiled_fs_factory, |
| 46 host_file_system, | 45 host_file_system, |
| 47 github_file_system_provider, | |
|
Ken Rockot(use gerrit already)
2015/05/26 00:26:23
I removed all the github FS plumbing for two reaso
| |
| 48 gcs_file_system_provider): | 46 gcs_file_system_provider): |
| 49 self._object_store_creator = object_store_creator | 47 self._object_store_creator = object_store_creator |
| 50 self._compiled_fs_factory = compiled_fs_factory | 48 self._compiled_fs_factory = compiled_fs_factory |
| 51 self._host_file_system = host_file_system | 49 self._host_file_system = host_file_system |
| 52 self._github_file_system_provider = github_file_system_provider | |
| 53 self._gcs_file_system_provider = gcs_file_system_provider | 50 self._gcs_file_system_provider = gcs_file_system_provider |
| 54 self._cache = None | 51 self._cache = None |
| 55 | 52 |
| 56 # If running the devserver and there is a LOCAL_DEBUG_DIR, we | 53 # If running the devserver and there is a LOCAL_DEBUG_DIR, we |
| 57 # will read the content_provider configuration from there instead | 54 # will read the content_provider configuration from there instead |
| 58 # of fetching it from Gitiles or patch. | 55 # of fetching it from Gitiles or patch. |
| 59 if environment.IsDevServer() and os.path.exists(LOCAL_DEBUG_DIR): | 56 if environment.IsDevServer() and os.path.exists(LOCAL_DEBUG_DIR): |
| 60 local_fs = LocalFileSystem(LOCAL_DEBUG_DIR) | 57 local_fs = LocalFileSystem(LOCAL_DEBUG_DIR) |
| 61 conf_stat = None | 58 conf_stat = None |
| 62 try: | 59 try: |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 return None | 138 return None |
| 142 bucket = gcs_config['bucket'] | 139 bucket = gcs_config['bucket'] |
| 143 if not bucket.startswith('gs://'): | 140 if not bucket.startswith('gs://'): |
| 144 logging.error('%s: bucket %s should start with gs://' % (name, bucket)) | 141 logging.error('%s: bucket %s should start with gs://' % (name, bucket)) |
| 145 return None | 142 return None |
| 146 bucket = bucket[len('gs://'):] | 143 bucket = bucket[len('gs://'):] |
| 147 file_system = self._gcs_file_system_provider.Create(bucket) | 144 file_system = self._gcs_file_system_provider.Create(bucket) |
| 148 if 'dir' in gcs_config: | 145 if 'dir' in gcs_config: |
| 149 file_system = ChrootFileSystem(file_system, gcs_config['dir']) | 146 file_system = ChrootFileSystem(file_system, gcs_config['dir']) |
| 150 | 147 |
| 151 elif 'github' in config: | |
| 152 github_config = config['github'] | |
| 153 if 'owner' not in github_config or 'repo' not in github_config: | |
| 154 logging.error('%s: "github" must provide an "owner" and "repo"' % name) | |
| 155 return None | |
| 156 file_system = self._github_file_system_provider.Create( | |
| 157 github_config['owner'], github_config['repo']) | |
| 158 if 'dir' in github_config: | |
| 159 file_system = ChrootFileSystem(file_system, github_config['dir']) | |
| 160 | |
| 161 else: | 148 else: |
| 162 logging.error('%s: content provider type not supported' % name) | 149 logging.error('%s: content provider type not supported' % name) |
| 163 return None | 150 return None |
| 164 | 151 |
| 165 return ContentProvider(name, | 152 return ContentProvider(name, |
| 166 self._compiled_fs_factory, | 153 self._compiled_fs_factory, |
| 167 file_system, | 154 file_system, |
| 168 self._object_store_creator, | 155 self._object_store_creator, |
| 169 default_extensions=default_extensions, | 156 default_extensions=default_extensions, |
| 170 supports_templates=supports_templates, | 157 supports_templates=supports_templates, |
| 171 supports_zip=supports_zip) | 158 supports_zip=supports_zip) |
| 172 | 159 |
| 173 def GetRefreshPaths(self): | 160 def Refresh(self): |
| 174 return self._GetConfig().keys() | |
| 175 | |
| 176 def Refresh(self, path): | |
| 177 def safe(name, action, callback): | 161 def safe(name, action, callback): |
| 178 '''Safely runs |callback| for a ContentProvider called |name| by | 162 '''Safely runs |callback| for a ContentProvider called |name| by |
| 179 swallowing exceptions and turning them into a None return value. It's | 163 swallowing exceptions and turning them into a None return value. It's |
| 180 important to run all ContentProvider Refreshes even if some of them fail. | 164 important to run all ContentProvider Refreshes even if some of them fail. |
| 181 ''' | 165 ''' |
| 182 try: | 166 try: |
| 183 return callback() | 167 return callback() |
| 184 except: | 168 except: |
| 185 if not _IGNORE_MISSING_CONTENT_PROVIDERS[0]: | 169 if not _IGNORE_MISSING_CONTENT_PROVIDERS[0]: |
| 186 logging.error('Error %s Refresh for ContentProvider "%s":\n%s' % | 170 logging.error('Error %s Refresh for ContentProvider "%s":\n%s' % |
| 187 (action, name, traceback.format_exc())) | 171 (action, name, traceback.format_exc())) |
| 188 return None | 172 return None |
| 189 | 173 |
| 190 config = self._GetConfig()[path] | 174 def refresh_provider(path, config): |
|
Ken Rockot(use gerrit already)
2015/05/26 00:26:23
No net logic changes, just killing refresh paths
| |
| 191 provider = self._CreateContentProvider(path, config) | 175 provider = self._CreateContentProvider(path, config) |
| 192 future = safe(path, | 176 future = safe(path, |
| 193 'initializing', | 177 'initializing', |
| 194 self._CreateContentProvider(path, config).Refresh) | 178 self._CreateContentProvider(path, config).Refresh) |
| 195 if future is None: | 179 if future is None: |
| 196 return Future(callback=lambda: True) | 180 return Future(callback=lambda: True) |
| 197 return Future(callback=lambda: safe(path, 'resolving', future.Get)) | 181 return Future(callback=lambda: safe(path, 'resolving', future.Get)) |
| 182 | |
| 183 return All(refresh_provider(path, config) | |
| 184 for path, config in self._GetConfig().iteritems()) | |
| OLD | NEW |