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
3 # found in the LICENSE file.
5 from caching_file_system
import CachingFileSystem
6 from local_file_system
import LocalFileSystem
7 from offline_file_system
import OfflineFileSystem
8 from subversion_file_system
import SubversionFileSystem
9 from third_party
.json_schema_compiler
.memoize
import memoize
12 class HostFileSystemProvider(object):
13 '''Provides host file systems ("host" meaning the file system that hosts the
14 server's source code and templates) tracking trunk, or any branch.
16 File system instances are memoized to maintain the in-memory caches across
21 max_trunk_revision
=None,
22 default_trunk_instance
=None,
24 constructor_for_test
=None):
26 |object_store_creator|
27 Provides caches for file systems that need one.
29 If not None, the maximum revision that a 'trunk' file system will be
30 created at. If None, 'trunk' file systems will use HEAD.
31 |default_trunk_instance|
32 If not None, 'trunk' file systems provided by this class without a
33 specific revision will return |default_trunk_instance| instead.
35 If True all provided file systems will be wrapped in an OfflineFileSystem.
36 |constructor_for_test|
37 Provides a custom constructor rather than creating SubversionFileSystems.
39 self
._object
_store
_creator
= object_store_creator
40 self
._max
_trunk
_revision
= max_trunk_revision
41 self
._default
_trunk
_instance
= default_trunk_instance
42 self
._offline
= offline
43 self
._constructor
_for
_test
= constructor_for_test
46 def GetTrunk(self
, revision
=None):
47 '''Gets a file system tracking 'trunk'. Use this method rather than
48 GetBranch('trunk') because the behaviour is subtly different; 'trunk' can
49 be pinned to a max revision (|max_trunk_revision| in constructor) and can
50 have its default instance overridden (|default_trunk_instance| in
53 |revision| if non-None determines a specific revision to pin the host file
54 system at, though it will be ignored if it exceeds |max_trunk_revision|.
55 If None then |revision| will track |max_trunk_revision| if is has been
56 set, or just HEAD (which might change during server runtime!).
59 if self
._default
_trunk
_instance
is not None:
60 return self
._default
_trunk
_instance
61 return self
._Create
('trunk', revision
=self
._max
_trunk
_revision
)
62 if self
._max
_trunk
_revision
is not None:
63 revision
= min(revision
, self
._max
_trunk
_revision
)
64 return self
._Create
('trunk', revision
=revision
)
67 def GetBranch(self
, branch
):
68 '''Gets a file system tracking |branch|, for example '1150' - anything other
69 than 'trunk', which must be constructed via the GetTrunk() method.
71 Note: Unlike GetTrunk this function doesn't take a |revision| argument
72 since we assume that branches hardly ever change, while trunk frequently
75 assert isinstance(branch
, basestring
), 'Branch %s must be a string' % branch
76 assert branch
!= 'trunk', 'Cannot specify branch=\'trunk\', use GetTrunk()'
77 return self
._Create
(branch
)
79 def _Create(self
, branch
, revision
=None):
80 '''Creates SVN file systems (or if in a test, potentially whatever
81 |self._constructor_for_test specifies). Wraps the resulting file system in
82 an Offline file system if the offline flag is set, and finally wraps it in
83 a Caching file system.
85 if self
._constructor
_for
_test
is not None:
86 file_system
= self
._constructor
_for
_test
(branch
=branch
, revision
=revision
)
88 file_system
= SubversionFileSystem
.Create(branch
=branch
,
91 file_system
= OfflineFileSystem(file_system
)
92 return CachingFileSystem(file_system
, self
._object
_store
_creator
)
95 def ForLocal(object_store_creator
, **optargs
):
96 '''Used in creating a server instance on localhost.
98 return HostFileSystemProvider(
100 constructor_for_test
=lambda **_
: LocalFileSystem
.Create(),
104 def ForTest(file_system
, object_store_creator
, **optargs
):
105 '''Used in creating a test server instance. The HostFileSystemProvider
106 returned here will always return |file_system| when its Create() method is
109 return HostFileSystemProvider(
110 object_store_creator
,
111 constructor_for_test
=lambda **_
: file_system
,