Index: versioncontrol/admin.py
===================================================================
--- versioncontrol/admin.py	(Revision 48)
+++ versioncontrol/admin.py	(Arbeitskopie)
@@ -13,12 +13,14 @@
 
 import sys
 
+from StringIO import StringIO
+
 from trac.admin import IAdminCommandProvider, IAdminPanelProvider
 from trac.config import _TRUE_VALUES
 from trac.core import *
 from trac.perm import IPermissionRequestor
 from trac.util.text import breakable_path, normalize_whitespace, print_table, \
-                           printout
+                           console_print, printout
 from trac.util.translation import _, ngettext
 from trac.versioncontrol import DbRepositoryProvider, RepositoryManager, \
                                 is_default
@@ -107,7 +109,7 @@
                            alias, info.get('dir', '')))
         print_table(values, [_('Name'), _('Type'), _('Alias'), _('Directory')])
     
-    def _sync(self, reponame, rev, clean):
+    def _sync(self, reponame, rev, clean, out=sys.stdout):
         rm = RepositoryManager(self.env)
         if reponame == '*':
             if rev is not None:
@@ -123,27 +125,28 @@
                                   reponame=reponame or _('(default)')))
             if rev is not None:
                 repos.sync_changeset(rev)
-                printout(_('%(rev)s resynced on %(reponame)s.', rev=rev,
-                           reponame=repos.reponame or _('(default)')))
+                console_print(out, _('%(rev)s resynced on %(reponame)s.', 
+                           rev=rev, reponame=repos.reponame or _('(default)')))
                 return
             repositories = [repos]
         
         db = self.env.get_db_cnx()
         cursor = db.cursor()
         for repos in sorted(repositories, key=lambda r: r.reponame):
-            printout(_('Resyncing repository history for %(reponame)s... ',
+         
+            console_print(out, _('Resyncing repository history for %(reponame)s... ',
                        reponame=repos.reponame or _('(default)')))
-            repos.sync(self._sync_feedback, clean=clean)
+            repos.sync(self._sync_feedback, out=out, clean=clean)
             cursor.execute("SELECT count(rev) FROM revision WHERE repos=%s",
                            (repos.id,))
             for cnt, in cursor:
-                printout(ngettext('%(num)s revision cached.',
+                console_print(out, ngettext('%(num)s revision cached.',
                                   '%(num)s revisions cached.', num=cnt))
-        printout(_('Done.'))
+        console_print(out, _('Done.'))
 
-    def _sync_feedback(self, rev):
-        sys.stdout.write(' [%s]\r' % rev)
-        sys.stdout.flush()
+    def _sync_feedback(self, rev, out=sys.stdout):
+        out.write(' [%s]\r' % rev)
+        out.flush()
 
     def _do_resync(self, reponame, rev=None):
         self._sync(reponame, rev, clean=True)
@@ -258,7 +261,24 @@
                 # Refresh the list of repositories
                 elif req.args.get('refresh'):
                     req.redirect(req.href.admin(category, page))
-                
+
+                # Resync the selected repositories or all if none selected
+                elif req.args.get('resync'):
+                    out = StringIO()
+                    sel = req.args.getlist('sel')
+                    if len(sel) == 0:
+                        add_warning(req, _('Please select a repository or alias for resynchronization.'))
+                    else:
+                        rm = RepositoryManager(self.env)
+                        reponames = set()
+                        for name in sel:
+                            reponames.add(rm.get_repository(name).reponame)
+                        for name in reponames:
+                            self._sync(name, None, True, out=out)
+                        for line in out.getvalue().split('\n'):
+                            if len(line) > 0:
+                                add_notice(req, line)
+
                 # Remove repositories
                 elif db_provider and req.args.get('remove'):
                     sel = req.args.getlist('sel')
Index: versioncontrol/api.py
===================================================================
--- versioncontrol/api.py	(Revision 48)
+++ versioncontrol/api.py	(Arbeitskopie)
@@ -720,7 +720,7 @@
         """
         pass
 
-    def sync(self, rev_callback=None, clean=False):
+    def sync(self, rev_callback=None, clean=False, out=None):
         """Perform a sync of the repository cache, if relevant.
         
         If given, `rev_callback` must be a callable taking a `rev` parameter.
Index: versioncontrol/templates/admin_repositories.html
===================================================================
--- versioncontrol/templates/admin_repositories.html	(Revision 48)
+++ versioncontrol/templates/admin_repositories.html	(Arbeitskopie)
@@ -141,6 +141,7 @@
           </table>
           <div class="buttons">
             <input type="submit" name="refresh" value="${_('Refresh')}"/>
+            <input type="submit" name="resync" value="${_('Resync')}"/>
             <input type="submit" name="remove" value="${_('Remove selected items')}"/>
           </div>
         </form>

