Edgewall Software

Ticket #4132: sync_only_once_0.10-stable-r4280.diff

File sync_only_once_0.10-stable-r4280.diff, 4.2 KB (added by cboos, 2 years ago)

Only sync the repository once per request and clear the cached values at the instance level. Patch on 0.10-stable.

  • trac/versioncontrol/api.py

     
    2424from trac.config import Option 
    2525from trac.core import * 
    2626from trac.perm import PermissionError 
     27from trac.web.api import IRequestFilter 
    2728 
    2829 
    2930class IRepositoryConnector(Interface): 
     
    5051    It provides easy access to the configured implementation. 
    5152    """ 
    5253 
     54    implements(IRequestFilter) 
     55 
    5356    connectors = ExtensionPoint(IRepositoryConnector) 
    5457 
    5558    repository_type = Option('trac', 'repository_type', 'svn', 
     
    6265        self._lock = threading.Lock() 
    6366        self._connector = None 
    6467 
     68    # IRequestFilter methods 
     69 
     70    def pre_process_request(self, req, handler): 
     71        from trac.web.chrome import Chrome         
     72        if handler is not Chrome(self.env): 
     73            repos = self.get_repository(req.authname) 
     74            if hasattr(repos, 'sync'): 
     75                repos.sync() 
     76        return handler 
     77 
     78    def post_process_request(self, req, template, content_type): 
     79        return (template, content_type) 
     80 
     81 
    6582    # Public API methods 
    6683 
    6784    def get_repository(self, authname): 
     
    120137        """Close the connection to the repository.""" 
    121138        raise NotImplementedError 
    122139 
     140    def clear(self): 
     141        """Clear any data that may have been cached in instance properties.""" 
     142        pass 
     143 
    123144    def get_changeset(self, rev): 
    124145        """Retrieve a Changeset corresponding to the  given revision `rev`.""" 
    125146        raise NotImplementedError 
  • trac/versioncontrol/svn_fs.py

     
    307307         
    308308        self.log.debug("Opening subversion file-system at %s with scope %s" \ 
    309309                       % (self.path, self.scope)) 
     310        self.clear() 
     311 
     312    def clear(self): 
    310313        self.youngest = None 
    311314        self.oldest = None 
    312315 
  • trac/versioncontrol/cache.py

     
    3131        Repository.__init__(self, repos.name, authz, log) 
    3232        self.db = db 
    3333        self.repos = repos 
    34         self.synced = 0 
     34        self.sync() 
    3535 
    3636    def close(self): 
    3737        self.repos.close() 
    3838 
    3939    def get_changeset(self, rev): 
    40         if not self.synced: 
    41             self.sync() 
    42             self.synced = 1 
    4340        return CachedChangeset(self.repos.normalize_rev(rev), self.db, 
    4441                               self.authz) 
    4542 
    4643    def get_changesets(self, start, stop): 
    47         if not self.synced: 
    48             self.sync() 
    49             self.synced = 1 
    5044        cursor = self.db.cursor() 
    5145        cursor.execute("SELECT rev FROM revision " 
    5246                       "WHERE time >= %s AND time < %s " 
     
    7165            raise TracError, ("The 'repository_dir' has changed, " 
    7266                              "a 'trac-admin resync' operation is needed.") 
    7367 
     68        self.repos.clear() 
    7469        youngest_stored = self.repos.get_youngest_rev_in_cache(self.db) 
    7570 
    7671        if youngest_stored != str(self.repos.youngest_rev): 
     
    107102                                   (str(current_rev), path, kind, action, 
    108103                                   base_path, base_rev)) 
    109104                current_rev = self.repos.next_rev(current_rev) 
    110             try: 
    111                 self.db.commit() 
    112             except: 
    113                 # See <http://trac.edgewall.org/ticket/4120>: this breaks badly 
    114                 # while rendering the timeline, because the commit happens 
    115                 # while iterating over a recordset 
    116                 pass 
     105            self.db.commit() 
    117106            self.repos.authz = authz # restore permission checking 
    118107 
    119108    def get_node(self, path, rev=None): 
     
    126115        return self.repos.oldest_rev 
    127116 
    128117    def get_youngest_rev(self): 
    129         return self.repos.youngest_rev 
     118        return self.repos.get_youngest_rev_in_cache(self.db) 
    130119 
    131120    def previous_rev(self, rev): 
    132121        return self.repos.previous_rev(rev)