Index: trac/versioncontrol/api.py
===================================================================
--- trac/versioncontrol/api.py	(revision 4289)
+++ trac/versioncontrol/api.py	(working copy)
@@ -24,6 +24,7 @@
 from trac.config import Option
 from trac.core import *
 from trac.perm import PermissionError
+from trac.web.api import IRequestFilter
 
 
 class IRepositoryConnector(Interface):
@@ -50,6 +51,8 @@
     It provides easy access to the configured implementation.
     """
 
+    implements(IRequestFilter)
+
     connectors = ExtensionPoint(IRepositoryConnector)
 
     repository_type = Option('trac', 'repository_type', 'svn',
@@ -62,6 +65,20 @@
         self._lock = threading.Lock()
         self._connector = None
 
+    # IRequestFilter methods
+
+    def pre_process_request(self, req, handler):
+        from trac.web.chrome import Chrome        
+        if handler is not Chrome(self.env):
+            repos = self.get_repository(req.authname)
+            if hasattr(repos, 'sync'):
+                repos.sync()
+        return handler
+
+    def post_process_request(self, req, template, content_type):
+        return (template, content_type)
+
+
     # Public API methods
 
     def get_repository(self, authname):
Index: trac/versioncontrol/cache.py
===================================================================
--- trac/versioncontrol/cache.py	(revision 4289)
+++ trac/versioncontrol/cache.py	(working copy)
@@ -34,22 +34,15 @@
         Repository.__init__(self, repos.name, authz, log)
         self.db = db
         self.repos = repos
-        self.synced = 0
 
     def close(self):
         self.repos.close()
 
     def get_changeset(self, rev):
-        if not self.synced:
-            self.sync()
-            self.synced = 1
         return CachedChangeset(self.repos, self.repos.normalize_rev(rev),
                                self.db, self.authz)
 
     def get_changesets(self, start, stop):
-        if not self.synced:
-            self.sync()
-            self.synced = 1
         cursor = self.db.cursor()
         cursor.execute("SELECT rev FROM revision "
                        "WHERE time >= %s AND time < %s "
@@ -123,7 +116,7 @@
         return self.repos.oldest_rev
 
     def get_youngest_rev(self):
-        return self.repos.youngest_rev
+        return self.repos.get_youngest_rev_in_cache(self.db)
 
     def previous_rev(self, rev):
         return self.repos.previous_rev(rev)

