Changeset 3178

Show
Ignore:
Timestamp:
02/05/08 08:23:41 (10 months ago)
Author:
hvr
Message:

GitPlugin: adapted plugin to 0.11 API changes

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gitplugin/0.11/gitplugin/git_fs.py

    r3175 r3178  
    1515from trac.core import * 
    1616from trac.util import TracError, shorten_line, escape 
    17 from trac.versioncontrol import Changeset, Node, Repository, \ 
    18                                 IRepositoryConnector, NoSuchChangeset, NoSuchNode 
     17from trac.util.datefmt import utc 
     18from trac.versioncontrol.api import \ 
     19    Changeset, Node, Repository, IRepositoryConnector, NoSuchChangeset, NoSuchNode 
    1920from trac.wiki import IWikiSyntaxProvider 
    20 from trac.util.html import escape, html 
     21from trac.versioncontrol.web_ui import IPropertyRenderer 
     22 
     23from genshi.builder import tag 
     24 
     25from datetime import datetime 
     26import time 
     27 
     28import pkg_resources 
     29pkg_resources.require('Trac>=0.11dev') 
     30 
     31from genshi.builder import tag 
    2132 
    2233import PyGIT 
    2334 
    2435class GitConnector(Component): 
    25         implements(IRepositoryConnector, IWikiSyntaxProvider) 
    26  
    27         ####################### 
    28         # IWikiSyntaxProvider 
    29  
    30         def get_wiki_syntax(self): 
    31                 yield (r'\b[0-9a-fA-F]{40,40}\b',  
    32                        lambda fmt, sha, match: 
    33                                self._format_sha_link(fmt, 'changeset', sha, sha)) 
    34  
    35         def get_link_resolvers(self): 
    36                 yield ('sha', self._format_sha_link) 
     36        implements(IRepositoryConnector, IWikiSyntaxProvider, IPropertyRenderer) 
    3737 
    3838        def _format_sha_link(self, formatter, ns, sha, label, fullmatch=None): 
    3939                try: 
    4040                        changeset = self.env.get_repository().get_changeset(sha) 
    41                         return html.a(label, class_="changeset", 
    42                                       title=shorten_line(changeset.message), 
    43                                       href=formatter.href.changeset(sha)) 
     41                        return tag.a(label, class_="changeset", 
     42                                     title=shorten_line(changeset.message), 
     43                                     href=formatter.href.changeset(sha)) 
    4444                except TracError, e: 
    45                         return html.a(label, class_="missing changeset", 
    46                                       href=formatter.href.changeset(sha), 
    47                                       title=unicode(e), rel="nofollow") 
    48  
     45                        return tag.a(label, class_="missing changeset", 
     46                                     href=formatter.href.changeset(sha), 
     47                                     title=unicode(e), rel="nofollow") 
     48 
     49        ####################### 
     50        # IPropertyRenderer 
     51 
     52        # relied upon by GitChangeset 
     53 
     54        def match_property(self, name, mode): 
     55                if (name == 'Parents' and mode == 'revprop'): 
     56                        return 8 # default renderer has priority 1 
     57                return 0 
     58 
     59        def render_property(self, name, mode, context, props): 
     60                assert name == 'Parents' 
     61 
     62                revs = props[name] 
     63 
     64                def sha_link(sha): 
     65                        return self._format_sha_link(context, 'sha', sha, sha) 
     66 
     67                return tag([tag(sha_link(rev), ', ') for rev in revs[:-1]], 
     68                           sha_link(revs[-1])) 
     69 
     70 
     71        ####################### 
     72        # IWikiSyntaxProvider 
     73 
     74        def get_wiki_syntax(self): 
     75                yield (r'\b[0-9a-fA-F]{40,40}\b', 
     76                       lambda fmt, sha, match: 
     77                               self._format_sha_link(fmt, 'changeset', sha, sha)) 
     78 
     79        def get_link_resolvers(self): 
     80                yield ('sha', self._format_sha_link) 
    4981 
    5082        ####################### 
     
    6395                self.git = PyGIT.Storage(path) 
    6496                Repository.__init__(self, "git:"+path, None, log) 
     97 
     98        def close(self): 
     99                self.git = None 
    65100 
    66101        def get_youngest_rev(self): 
     
    90125        def get_changesets(self, start, stop): 
    91126                #print "get_changesets", start, stop 
    92                 for rev in self.git.history_all(start, stop): 
     127                def to_unix(dt): 
     128                        return time.mktime(dt.timetuple()) + dt.microsecond/1e6 
     129 
     130                for rev in self.git.history_all(to_unix(start), to_unix(stop)): 
    93131                        yield self.get_changeset(rev) 
    94132 
    95133        def get_changeset(self, rev): 
     134                """GitChangeset factory method""" 
    96135                #print "get_changeset", rev 
    97136                return GitChangeset(self.git, rev) 
     
    234273                self.git = git 
    235274                try: 
    236                         (msg,props) = git.read_commit(sha) 
     275                        (msg, props) = git.read_commit(sha) 
    237276                except PyGIT.GitErrorSha: 
    238277                        raise NoSuchChangeset(sha) 
     
    242281                (user,time,tz) = committer.rsplit(None, 2) 
    243282 
    244                 Changeset.__init__(self, sha, msg, user, float(time)) 
     283                time = datetime.fromtimestamp(float(time), utc) 
     284                Changeset.__init__(self, sha, msg, user, time) 
    245285 
    246286        def get_properties(self): 
    247                 for k in self.props: 
    248                         v = self.props[k] 
    249                         if k in ['committer', 'author']: 
    250                                 yield("git-"+k, ", ".join(v), False, 'author') 
    251                         if k in ['parent']: 
    252                                 yield("git-"+k, ", ".join(("[%s]" % c) for c in v), True, 'changeset') 
     287                properties = {} 
     288                if 'parent' in self.props: 
     289                        properties['Parents'] = self.props['parent'] 
     290                if 'committer' in self.props: 
     291                        properties['git-committer'] = "\n".join(self.props['committer']) 
     292                if 'author' in self.props: 
     293                        git_author = "\n".join(self.props['author']) 
     294                        if not (properties.has_key('git-committer') and 
     295                                properties['git-committer'] == git_author): 
     296                                properties['git-author'] = git_author 
     297 
     298                return properties 
    253299 
    254300        def get_changes(self):