@@ -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