@@ -104,7 +104,6 @@ def __init__(self, root_path):
104104 super(PureRootPathDB, self).__init__(root_path)
105105
106106
107-
108107 #{ Interface
109108 def root_path(self):
110109 return self._root_path
@@ -132,44 +131,33 @@ class PureCompoundDB(CompoundDB, PureObjectDBR, LazyMixin, CachingDB):
132131 def _set_cache_(self, attr):
133132 if attr == '_dbs':
134133 self._dbs = list()
135- elif attr == '_obj_cache':
136- self._obj_cache = dict()
137134 else:
138135 super(PureCompoundDB, self)._set_cache_(attr)
139136
140- def _db_query(self, sha):
141- """:return: database containing the given 20 byte sha
142- :raise BadObject:"""
143- # most databases use binary representations, prevent converting
144- # it everytime a database is being queried
145- try:
146- return self._obj_cache[sha]
147- except KeyError:
148- pass
149- # END first level cache
150-
151- for db in self._dbs:
152- if db.has_object(sha):
153- self._obj_cache[sha] = db
154- return db
155- # END for each database
156- raise BadObject(sha)
157-
158137 #{ PureObjectDBR interface
159138
160139 def has_object(self, sha):
161- try:
162- self._db_query(sha)
163- return True
164- except BadObject:
165- return False
166- # END handle exceptions
140+ for db in self._dbs:
141+ if db.has_object(sha):
142+ return True
143+ #END for each db
144+ return False
167145
168146 def info(self, sha):
169- return self._db_query(sha).info(sha)
147+ for db in self._dbs:
148+ try:
149+ return db.info(sha)
150+ except BadObject:
151+ pass
152+ #END for each db
170153
171154 def stream(self, sha):
172- return self._db_query(sha).stream(sha)
155+ for db in self._dbs:
156+ try:
157+ return db.stream(sha)
158+ except BadObject:
159+ pass
160+ #END for each db
173161
174162 def size(self):
175163 return reduce(lambda x,y: x+y, (db.size() for db in self._dbs), 0)
@@ -186,7 +174,6 @@ def databases(self):
186174
187175 def update_cache(self, force=False):
188176 # something might have changed, clear everything
189- self._obj_cache.clear()
190177 stat = False
191178 for db in self._dbs:
192179 if isinstance(db, CachingDB):
@@ -233,7 +220,7 @@ def partial_to_complete_sha(self, partial_binsha, hex_len):
233220
234221class PureRepositoryPathsMixin(RepositoryPathsMixin):
235222 # slots has no effect here, its just to keep track of used attrs
236- __slots__ = ("_git_path", '_bare')
223+ __slots__ = ("_git_path", '_bare', '_working_tree_dir' )
237224
238225 #{ Configuration
239226 repo_dir = '.git'
@@ -272,14 +259,16 @@ def _initialize(self, path):
272259 raise InvalidGitRepositoryError(epath)
273260 # END path not found
274261
275- self._bare = self._git_path.endswith(self.repo_dir)
262+ self._bare = self._working_tree_dir is None
276263 if hasattr(self, 'config_reader'):
277264 try:
278265 self._bare = self.config_reader("repository").getboolean('core','bare')
279266 except Exception:
280267 # lets not assume the option exists, although it should
281268 pass
269+ #END handle exception
282270 #END check bare flag
271+ self._working_tree_dir = self._bare and None or self._working_tree_dir
283272
284273 #} end subclass interface
285274
@@ -313,7 +302,7 @@ def git_dir(self):
313302
314303 @property
315304 def working_tree_dir(self):
316- if self.is_bare :
305+ if self._working_tree_dir is None :
317306 raise AssertionError("Repository at %s is bare and does not have a working tree directory" % self.git_dir)
318307 #END assertion
319308 return dirname(self.git_dir)
@@ -354,6 +343,10 @@ class PureConfigurationMixin(ConfigurationMixin):
354343 repo_config_file_name = "config"
355344 #} END
356345
346+ def __new__(cls, *args, **kwargs):
347+ """This is just a stupid workaround for the evil py2.6 change which makes mixins quite impossible"""
348+ return super(PureConfigurationMixin, cls).__new__(cls, *args, **kwargs)
349+
357350 def __init__(self, *args, **kwargs):
358351 """Verify prereqs"""
359352 try:
@@ -421,7 +414,11 @@ class PureAlternatesFileMixin(object):
421414 #} END configuration
422415
423416 def __init__(self, *args, **kwargs):
424- super(PureAlternatesFileMixin, self).__init__(*args, **kwargs)
417+ try:
418+ super(PureAlternatesFileMixin, self).__init__(*args, **kwargs)
419+ except TypeError:
420+ pass
421+ #END handle py2.6 code breaking changes
425422 self._alternates_path() # throws on incompatible type
426423
427424 #{ Interface
0 commit comments