Edgewall Software

Ticket #2382: 2382.1.patch

File 2382.1.patch, 6.1 KB (added by Carsten Klein <carsten.klein@…>, 2 years ago)

Also includes the changes to trac.versioncontrol.cache

  • versioncontrol/admin.py

     
    1313 
    1414import sys 
    1515 
     16from StringIO import StringIO 
     17 
    1618from trac.admin import IAdminCommandProvider, IAdminPanelProvider 
    1719from trac.config import _TRUE_VALUES 
    1820from trac.core import * 
    1921from trac.perm import IPermissionRequestor 
    2022from trac.util.text import breakable_path, normalize_whitespace, print_table, \ 
    21                            printout 
     23                           console_print, printout 
    2224from trac.util.translation import _, ngettext 
    2325from trac.versioncontrol import DbRepositoryProvider, RepositoryManager, \ 
    2426                                is_default 
     
    107109                           alias, info.get('dir', ''))) 
    108110        print_table(values, [_('Name'), _('Type'), _('Alias'), _('Directory')]) 
    109111     
    110     def _sync(self, reponame, rev, clean): 
     112    def _sync(self, reponame, rev, clean, out=sys.stdout): 
    111113        rm = RepositoryManager(self.env) 
    112114        if reponame == '*': 
    113115            if rev is not None: 
     
    123125                                  reponame=reponame or _('(default)'))) 
    124126            if rev is not None: 
    125127                repos.sync_changeset(rev) 
    126                 printout(_('%(rev)s resynced on %(reponame)s.', rev=rev, 
    127                            reponame=repos.reponame or _('(default)'))) 
     128                console_print(out, _('%(rev)s resynced on %(reponame)s.',  
     129                           rev=rev, reponame=repos.reponame or _('(default)'))) 
    128130                return 
    129131            repositories = [repos] 
    130132         
    131133        db = self.env.get_db_cnx() 
    132134        cursor = db.cursor() 
    133135        for repos in sorted(repositories, key=lambda r: r.reponame): 
    134             printout(_('Resyncing repository history for %(reponame)s... ', 
     136          
     137            console_print(out, _('Resyncing repository history for %(reponame)s... ', 
    135138                       reponame=repos.reponame or _('(default)'))) 
    136             repos.sync(self._sync_feedback, clean=clean) 
     139            repos.sync(self._sync_feedback, out=out, clean=clean) 
    137140            cursor.execute("SELECT count(rev) FROM revision WHERE repos=%s", 
    138141                           (repos.id,)) 
    139142            for cnt, in cursor: 
    140                 printout(ngettext('%(num)s revision cached.', 
     143                console_print(out, ngettext('%(num)s revision cached.', 
    141144                                  '%(num)s revisions cached.', num=cnt)) 
    142         printout(_('Done.')) 
     145        console_print(out, _('Done.')) 
    143146 
    144     def _sync_feedback(self, rev): 
    145         sys.stdout.write(' [%s]\r' % rev) 
    146         sys.stdout.flush() 
     147    def _sync_feedback(self, rev, out=sys.stdout): 
     148        out.write(' [%s]\r' % rev) 
     149        out.flush() 
    147150 
    148151    def _do_resync(self, reponame, rev=None): 
    149152        self._sync(reponame, rev, clean=True) 
     
    258261                # Refresh the list of repositories 
    259262                elif req.args.get('refresh'): 
    260263                    req.redirect(req.href.admin(category, page)) 
    261                  
     264 
     265                # Resync the selected repositories or all if none selected 
     266                elif req.args.get('resync'): 
     267                    out = StringIO() 
     268                    sel = req.args.getlist('sel') 
     269                    if len(sel) == 0: 
     270                        add_warning(req, _('Please select a repository or alias for resynchronization.')) 
     271                    else: 
     272                        rm = RepositoryManager(self.env) 
     273                        reponames = set() 
     274                        for name in sel: 
     275                            reponames.add(rm.get_repository(name).reponame) 
     276                        for name in reponames: 
     277                            self._sync(name, None, True, out=out) 
     278                        for line in out.getvalue().split('\n'): 
     279                            if len(line) > 0: 
     280                                add_notice(req, line) 
     281 
    262282                # Remove repositories 
    263283                elif db_provider and req.args.get('remove'): 
    264284                    sel = req.args.getlist('sel') 
  • versioncontrol/api.py

     
    720720        """ 
    721721        pass 
    722722 
    723     def sync(self, rev_callback=None, clean=False): 
     723    def sync(self, rev_callback=None, clean=False, out=None): 
    724724        """Perform a sync of the repository cache, if relevant. 
    725725         
    726726        If given, `rev_callback` must be a callable taking a `rev` parameter. 
  • versioncontrol/cache.py

     
    1515# Author: Christopher Lenz <cmlenz@gmx.de> 
    1616 
    1717import os 
     18import sys 
    1819 
    1920from trac.cache import CacheProxy 
    2021from trac.core import TracError 
     
    112113                       (self.id,) + CACHE_METADATA_KEYS) 
    113114        return dict(cursor) 
    114115 
    115     def sync(self, feedback=None, clean=False): 
     116    def sync(self, feedback=None, clean=False, out=sys.out): 
    116117        db = self.env.get_db_cnx() 
    117118        cursor = db.cursor() 
    118119        if clean: 
     
    277278 
    278279                # 1.5. provide some feedback 
    279280                if feedback: 
    280                     feedback(youngest) 
     281                    feedback(youngest, out=out) 
    281282 
    282283    def get_node(self, path, rev=None): 
    283284        return self.repos.get_node(path, self.normalize_rev(rev)) 
  • versioncontrol/templates/admin_repositories.html

     
    141141          </table> 
    142142          <div class="buttons"> 
    143143            <input type="submit" name="refresh" value="${_('Refresh')}"/> 
     144            <input type="submit" name="resync" value="${_('Resync')}"/> 
    144145            <input type="submit" name="remove" value="${_('Remove selected items')}"/> 
    145146          </div> 
    146147        </form>