| 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 from fnmatch import fnmatch | 5 from fnmatch import fnmatch |
| 6 import logging | 6 import logging |
| 7 from urlparse import urlparse | 7 from urlparse import urlparse |
| 8 | 8 |
| 9 from appengine_url_fetcher import AppEngineUrlFetcher | 9 from appengine_url_fetcher import AppEngineUrlFetcher |
| 10 from appengine_wrappers import IsDevServer | 10 from appengine_wrappers import IsDevServer |
| 11 from caching_file_system import CachingFileSystem | 11 from caching_file_system import CachingFileSystem |
| 12 from caching_rietveld_patcher import CachingRietveldPatcher | 12 from caching_rietveld_patcher import CachingRietveldPatcher |
| 13 from chained_compiled_file_system import ChainedCompiledFileSystem | 13 from chained_compiled_file_system import ChainedCompiledFileSystem |
| 14 from compiled_file_system import CompiledFileSystem | 14 from compiled_file_system import CompiledFileSystem |
| 15 from host_file_system_creator import HostFileSystemCreator | 15 from host_file_system_provider import HostFileSystemProvider |
| 16 from instance_servlet import InstanceServlet | 16 from instance_servlet import InstanceServlet |
| 17 from render_servlet import RenderServlet | 17 from render_servlet import RenderServlet |
| 18 from rietveld_patcher import RietveldPatcher, RietveldPatcherError | 18 from rietveld_patcher import RietveldPatcher, RietveldPatcherError |
| 19 from object_store_creator import ObjectStoreCreator | 19 from object_store_creator import ObjectStoreCreator |
| 20 from patched_file_system import PatchedFileSystem | 20 from patched_file_system import PatchedFileSystem |
| 21 from server_instance import ServerInstance | 21 from server_instance import ServerInstance |
| 22 from servlet import Request, Response, Servlet | 22 from servlet import Request, Response, Servlet |
| 23 import svn_constants | 23 import svn_constants |
| 24 import url_constants | 24 import url_constants |
| 25 | 25 |
| 26 class _PatchServletDelegate(RenderServlet.Delegate): | 26 class _PatchServletDelegate(RenderServlet.Delegate): |
| 27 def __init__(self, issue, delegate): | 27 def __init__(self, issue, delegate): |
| 28 self._issue = issue | 28 self._issue = issue |
| 29 self._delegate = delegate | 29 self._delegate = delegate |
| 30 | 30 |
| 31 def CreateServerInstance(self): | 31 def CreateServerInstance(self): |
| 32 # start_empty=False because a patch can rely on files that are already in |
| 33 # SVN repository but not yet pulled into data store by cron jobs (a typical |
| 34 # example is to add documentation for an existing API). |
| 32 object_store_creator = ObjectStoreCreator(start_empty=False) | 35 object_store_creator = ObjectStoreCreator(start_empty=False) |
| 33 branch_utility = self._delegate.CreateBranchUtility(object_store_creator) | 36 |
| 34 host_file_system_creator = self._delegate.CreateHostFileSystemCreator( | 37 unpatched_host_file_system_provider = ( |
| 38 self._delegate.CreateHostFileSystemProvider(object_store_creator)) |
| 39 unpatched_trunk_host_file_system = ( |
| 40 unpatched_host_file_system_provider.GetTrunk()) |
| 41 unpatched_compiled_fs_factory = CompiledFileSystem.Factory( |
| 42 unpatched_trunk_host_file_system, |
| 35 object_store_creator) | 43 object_store_creator) |
| 36 # offline=False because a patch can rely on files that are already in SVN | |
| 37 # repository but not yet pulled into data store by cron jobs (a typical | |
| 38 # example is to add documentation for an existing API). | |
| 39 base_file_system = CachingFileSystem( | |
| 40 host_file_system_creator.Create(offline=False), | |
| 41 object_store_creator) | |
| 42 base_compiled_fs_factory = CompiledFileSystem.Factory(base_file_system, | |
| 43 object_store_creator) | |
| 44 | 44 |
| 45 rietveld_patcher = CachingRietveldPatcher( | 45 rietveld_patcher = CachingRietveldPatcher( |
| 46 RietveldPatcher(svn_constants.EXTENSIONS_PATH, | 46 RietveldPatcher(svn_constants.EXTENSIONS_PATH, |
| 47 self._issue, | 47 self._issue, |
| 48 AppEngineUrlFetcher(url_constants.CODEREVIEW_SERVER)), | 48 AppEngineUrlFetcher(url_constants.CODEREVIEW_SERVER)), |
| 49 object_store_creator) | 49 object_store_creator) |
| 50 patched_file_system = PatchedFileSystem(base_file_system, | 50 |
| 51 patched_file_system = PatchedFileSystem(unpatched_trunk_host_file_system, |
| 51 rietveld_patcher) | 52 rietveld_patcher) |
| 53 patched_host_file_system_provider = ( |
| 54 self._delegate.CreateHostFileSystemProvider( |
| 55 object_store_creator, |
| 56 # The patched file system needs to be online otherwise it'd be |
| 57 # impossible to add files in the patches. |
| 58 offline=False, |
| 59 # The trunk file system for this creator should be the patched one. |
| 60 trunk=unpatched_trunk_host_file_system)) |
| 52 patched_compiled_fs_factory = CompiledFileSystem.Factory( | 61 patched_compiled_fs_factory = CompiledFileSystem.Factory( |
| 53 patched_file_system, object_store_creator) | 62 patched_file_system, |
| 63 object_store_creator) |
| 54 | 64 |
| 55 compiled_fs_factory = ChainedCompiledFileSystem.Factory( | 65 combined_compiled_fs_factory = ChainedCompiledFileSystem.Factory( |
| 56 [(patched_compiled_fs_factory, patched_file_system), | 66 [(patched_compiled_fs_factory, patched_file_system), |
| 57 (base_compiled_fs_factory, base_file_system)]) | 67 (unpatched_compiled_fs_factory, unpatched_trunk_host_file_system)]) |
| 68 |
| 69 branch_utility = self._delegate.CreateBranchUtility(object_store_creator) |
| 58 | 70 |
| 59 return ServerInstance(object_store_creator, | 71 return ServerInstance(object_store_creator, |
| 60 patched_file_system, | |
| 61 self._delegate.CreateAppSamplesFileSystem( | 72 self._delegate.CreateAppSamplesFileSystem( |
| 62 object_store_creator), | 73 object_store_creator), |
| 63 compiled_fs_factory, | 74 combined_compiled_fs_factory, |
| 64 branch_utility, | 75 branch_utility, |
| 65 host_file_system_creator, | 76 patched_host_file_system_provider, |
| 66 base_path='/_patch/%s/' % self._issue) | 77 base_path='/_patch/%s/' % self._issue) |
| 67 | 78 |
| 68 class PatchServlet(Servlet): | 79 class PatchServlet(Servlet): |
| 69 '''Servlet which renders patched docs. | 80 '''Servlet which renders patched docs. |
| 70 ''' | 81 ''' |
| 71 def __init__(self, request, delegate=None): | 82 def __init__(self, request, delegate=None): |
| 72 self._request = request | 83 self._request = request |
| 73 self._delegate = delegate or InstanceServlet.Delegate() | 84 self._delegate = delegate or InstanceServlet.Delegate() |
| 74 | 85 |
| 75 def Get(self): | 86 def Get(self): |
| (...skipping 23 matching lines...) Expand all Loading... |
| 99 # Disable cache for patched content. | 110 # Disable cache for patched content. |
| 100 response.headers.pop('cache-control', None) | 111 response.headers.pop('cache-control', None) |
| 101 except RietveldPatcherError as e: | 112 except RietveldPatcherError as e: |
| 102 response = Response.NotFound(e.message, {'Content-Type': 'text/plain'}) | 113 response = Response.NotFound(e.message, {'Content-Type': 'text/plain'}) |
| 103 | 114 |
| 104 redirect_url, permanent = response.GetRedirect() | 115 redirect_url, permanent = response.GetRedirect() |
| 105 if redirect_url is not None: | 116 if redirect_url is not None: |
| 106 response = Response.Redirect('/_patch/%s%s' % (issue, redirect_url), | 117 response = Response.Redirect('/_patch/%s%s' % (issue, redirect_url), |
| 107 permanent) | 118 permanent) |
| 108 return response | 119 return response |
| OLD | NEW |