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 default_trunk_instance=patched_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 |