Changeset 120 in tracdarcs


Ignore:
Timestamp:
06/17/08 18:59:59 (4 years ago)
Author:
lele@…
Hash name:
20080617165959-97f81-01b798f29e7c925e146c0876e73dc6879e4d9156
Message:

Added the IWikiSyntaxProvider to the DarcsConnector
This allows the use of the native darcs hashname in place of the
artificial incremental number to reference any particular
changeset, either using the usual wiki syntax (that is,
[20080617091638-97f81-63d.....420.gz]) or as an argument to the
/changeset/ URL.

Location:
tracdarcs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tracdarcs/components.py

    r111 r120  
    1414# Author: Lele Gaifax <lele@metapensiero.it> 
    1515 
     16from genshi.builder import tag 
     17 
    1618from trac.config import BoolOption, Option 
    1719from trac.core import Component, implements 
    1820from trac.db import Column, DatabaseManager, Index, Table 
    1921from trac.env import IEnvironmentSetupParticipant 
    20 from trac.versioncontrol import IRepositoryConnector 
     22from trac.util.text import shorten_line 
     23from trac.versioncontrol import IRepositoryConnector, NoSuchChangeset 
     24from trac.wiki import IWikiSyntaxProvider 
    2125 
    2226from tracdarcs.repository import DarcsRepository 
     
    2428class DarcsConnector(Component): 
    2529 
    26     implements(IRepositoryConnector) 
     30    implements(IRepositoryConnector, IWikiSyntaxProvider) 
    2731 
    2832    dont_escape_8bit = BoolOption('darcs', 'dont_escape_8bit', 'false', 
     
    4549            darcs = "DARCS_DONT_ESCAPE_8BIT=1 " + darcs 
    4650        return DarcsRepository(db, dir, self.env.log, darcs) 
     51 
     52    # IWikiSyntaxProvider methods 
     53 
     54    def get_wiki_syntax(self): 
     55        yield (r'[0-9]{14}-[0-9a-f]{5}-[0-9a-f]{40}.gz', 
     56               lambda formatter, label, match: self._format_link(formatter, 'cset', label, label)) 
     57 
     58    def get_link_resolvers(self): 
     59        yield ('cset', self._format_link) 
     60 
     61    def _format_link(self, formatter, ns, rev, label): 
     62 
     63        repos = self.env.get_repository() 
     64        try: 
     65            chgset = repos.get_changeset(rev) 
     66            return tag.a(chgset.rev, class_="changeset", 
     67                         title=shorten_line(chgset.message), 
     68                         href=formatter.href.changeset(chgset.rev)) 
     69        except NoSuchChangeset, e: 
     70            return tag.a(label, class_="missing changeset", 
     71                         title="No changeset for %s" % rev, rel="nofollow") 
    4772 
    4873class DarcsSetup(Component): 
  • tracdarcs/repository.py

    r118 r120  
    151151 
    152152    def normalize_rev(self, rev): 
    153         youngest = self.get_youngest_rev() 
    154         if rev is None or rev == "": 
    155             return youngest 
    156         try: 
    157             rev = int(rev) 
    158         except ValueError, le: 
    159             raise TracError('Ill-formed revision: %s, error: %s' % (rev, le)) 
    160         if rev > youngest: 
    161             rev = youngest 
     153        if isinstance(rev, basestring) and rev.endswith('.gz'): 
     154            c = self.db.cursor() 
     155            c.execute('SELECT rev FROM darcs_changesets ' 
     156                      'WHERE hash = %s', (rev,)) 
     157            row = c.fetchone() 
     158            if row is None: 
     159                raise NoSuchChangeset(rev) 
     160            rev = row[0] 
     161        else: 
     162            youngest = self.get_youngest_rev() 
     163            if rev is None or rev == "": 
     164                return youngest 
     165            try: 
     166                rev = int(rev) 
     167            except ValueError, le: 
     168                raise TracError('Ill-formed revision: %s, error: %s' % (rev, le)) 
     169            if rev > youngest: 
     170                rev = youngest 
    162171        return rev 
    163172 
Note: See TracChangeset for help on using the changeset viewer.