Edgewall Software

Ticket #7706: 7706-repo-resource-r8633.patch

File 7706-repo-resource-r8633.patch, 11.2 KB (added by rblank, 2 years ago)

Make source and changeset resources child resources of a repository resource.

  • trac/versioncontrol/api.py

    diff --git a/trac/versioncontrol/api.py b/trac/versioncontrol/api.py
    a b  
    2727from trac.config import ListOption, Option 
    2828from trac.core import * 
    2929from trac.perm import PermissionError 
    30 from trac.resource import IResourceManager, ResourceSystem, ResourceNotFound 
     30from trac.resource import IResourceManager, Resource, ResourceSystem, \ 
     31                          ResourceNotFound 
    3132from trac.util.text import printout, to_unicode 
    3233from trac.util.translation import _ 
    3334from trac.web.api import IRequestFilter 
    3435 
    3536 
     37def make_repo_resource(reponame): 
     38    """Create a repository resource for the given reponame, or return None 
     39    for the default repository. 
     40    """ 
     41    if reponame: 
     42        return Resource('repository', reponame) 
     43 
     44 
     45def split_vc_resource(resource): 
     46    """Split a versioncontrol resource into reponame and path.""" 
     47    if resource.parent and resource.parent.realm == 'repository': 
     48        return (resource.parent.id, resource.id) 
     49    return ('', resource.id) 
     50 
     51 
    3652class IRepositoryConnector(Interface): 
    3753    """Provide support for a specific version control system.""" 
    3854 
     
    343359 
    344360    # IResourceManager methods 
    345361 
    346     # Note: with multiple repository support, the repository name becomes 
    347     #       part of the 'id', which becomes a `(reponame, rev or path)` pair. 
    348  
    349362    def get_resource_realms(self): 
    350363        yield 'changeset' 
    351364        yield 'source' 
     365        yield 'repository' 
    352366 
    353367    def get_resource_description(self, resource, format=None, **kwargs): 
    354         reponame, id = resource.id 
    355368        if resource.realm == 'changeset': 
     369            (reponame, id) = split_vc_resource(resource) 
    356370            if reponame: 
    357371                return _("Changeset %(rev)s in %(repo)s", rev=id, repo=reponame) 
    358372            else: 
    359373                return _("Changeset %(rev)s", rev=id) 
    360374        elif resource.realm == 'source': 
     375            (reponame, id) = split_vc_resource(resource) 
    361376            version = in_repo = '' 
    362377            if format == 'summary': 
    363378                repos = resource.env.get_repository(reponame) 
     
    375390            if reponame: 
    376391                in_repo = _(" in %(repo)s", repo=reponame) 
    377392            return ''.join([kind, ' ', id, version, in_repo]) 
     393        elif resource.realm == 'repository': 
     394            return _("Repository %(repo)s", repo=resource.id) 
    378395 
    379396    def get_resource_url(self, resource, href, **kwargs): 
    380         if resource and resource.realm in ('source', 'changeset'): 
    381             repos, id = resource.id 
    382             if resource.realm == 'source': 
    383                 return href.source(repos, id) 
    384             else: 
    385                 return href.changeset(id, repos) 
     397        if resource.realm == 'changeset': 
     398            (reponame, id) = split_vc_resource(resource) 
     399            return href.changeset(id, reponame) 
     400        elif resource.realm == 'source': 
     401            (reponame, id) = split_vc_resource(resource) 
     402            return href.source(reponame, id) 
     403        elif resource.realm == 'repository': 
     404            return href.source(resource.id) 
    386405 
    387406    # IRepositoryProvider methods 
    388407 
     
    524543        """ 
    525544        while context: 
    526545            if context.resource.realm in ('source', 'changeset'): 
    527                 return context.resource.id[0] 
     546                return split_vc_resource(context.resource)[0] 
    528547            context = context.parent 
    529548 
    530549    def get_all_repositories(self): 
  • trac/versioncontrol/svn_prop.py

    diff --git a/trac/versioncontrol/svn_prop.py b/trac/versioncontrol/svn_prop.py
    a b  
    2121from genshi.builder import tag 
    2222 
    2323from trac.core import * 
    24 from trac.versioncontrol import NoSuchNode 
     24from trac.versioncontrol import NoSuchNode, split_vc_resource 
    2525from trac.versioncontrol.svn_fs import _path_within_scope 
    2626from trac.versioncontrol.web_ui.browser import IPropertyRenderer 
    2727from trac.versioncontrol.web_ui.changeset import IPropertyDiffRenderer 
     
    147147        has_eligible = name in ('svnmerge-integrated', 'svn:mergeinfo') 
    148148        revs_label = (_('merged'), _('blocked'))[name.endswith('blocked')] 
    149149        revs_cols = has_eligible and 2 or None 
    150         (reponame, target_path) = context.resource.id 
     150        (reponame, target_path) = split_vc_resource(context.resource) 
    151151        repos = self.env.get_repository(reponame) 
    152152        target_rev = context.resource.version 
    153153        if has_eligible: 
     
    228228 
    229229def _get_source_link(spath, context): 
    230230    """Return a link to a merge source.""" 
    231     reponame = context.resource.id[0] 
     231    reponame = split_vc_resource(context.resource)[0] 
    232232    return tag.a('/' + spath, title=_('View merge source'), 
    233233                 href=context.href.browser(reponame, spath, 
    234234                                           rev=context.resource.version)) 
     
    238238    given, to the revision itself for a single revision, or a `<span>` 
    239239    with "no revision" for none. 
    240240    """ 
    241     reponame = context.resource.id[0] 
     241    reponame = split_vc_resource(context.resource)[0] 
    242242    if not revs: 
    243243        return tag.span(label, title=_('No revisions')) 
    244244    elif ',' in revs or '-' in revs: 
     
    262262        # Build 3 columns table showing modifications on merge sources 
    263263        # || source || added revs || removed revs || 
    264264        # || source || removed                    || 
    265         repos = self.env.get_repository(old_context.resource.id[0]) 
     265        reponame = split_vc_resource(old_context.resource)[0] 
     266        repos = self.env.get_repository(reponame) 
    266267        def parse_sources(props): 
    267268            sources = {} 
    268269            for line in props[name].splitlines(): 
  • trac/versioncontrol/web_ui/browser.py

    diff --git a/trac/versioncontrol/web_ui/browser.py b/trac/versioncontrol/web_ui/browser.py
    a b  
    2828from trac.mimeview.api import Mimeview, is_binary, get_mimetype, \ 
    2929                              IHTMLPreviewAnnotator, Context 
    3030from trac.perm import IPermissionRequestor 
    31 from trac.resource import ResourceNotFound, Resource 
     31from trac.resource import Resource, ResourceNotFound 
    3232from trac.util import embedded_numbers 
    3333from trac.util.compat import all 
    3434from trac.util.datefmt import http_date, utc 
     
    4141from trac.wiki.api import IWikiSyntaxProvider, IWikiMacroProvider, parse_args 
    4242from trac.wiki.formatter import format_to_html, format_to_oneliner 
    4343from trac.versioncontrol.api import RepositoryManager, NoSuchChangeset, \ 
    44                                     NoSuchNode 
     44                                    NoSuchNode, make_repo_resource, \ 
     45                                    split_vc_resource 
    4546from trac.versioncontrol.web_ui.util import * 
    4647 
    4748 
     
    363364            except NoSuchChangeset, e: 
    364365                raise ResourceNotFound(e.message, _('Invalid Changeset Number')) 
    365366 
    366             context = context('source', (reponame, path), node.created_rev) 
     367            context = context(Resource('source', path, 
     368                                       version=node.created_rev, 
     369                                       parent=make_repo_resource(reponame))) 
    367370 
    368371        # Prepare template data 
    369372        path_links = get_path_links(req.href, reponame, path, rev, order, desc) 
     
    789792    def __init__(self, env, context): 
    790793        self.env = env 
    791794        self.context = context 
    792         # `context`'s resource is ('source', (reponame, path), version=rev) 
    793         r = context.resource 
    794         self.reponame, self.path = r.id 
     795        (self.reponame, self.path) = split_vc_resource(context.resource) 
    795796        self.repos = env.get_repository(self.reponame) 
    796         self.rev = r.version 
     797        self.rev = context.resource.version 
    797798        # maintain state 
    798799        self.prev_chgset = None 
    799800        self.chgset_data = {} 
  • trac/versioncontrol/web_ui/changeset.py

    diff --git a/trac/versioncontrol/web_ui/changeset.py b/trac/versioncontrol/web_ui/changeset.py
    a b  
    4242                           unicode_urlencode, shorten_line, CRLF 
    4343from trac.util.translation import _, ngettext 
    4444from trac.versioncontrol.api import RepositoryManager, Changeset, Node, \ 
    45                                     NoSuchChangeset 
     45                                    NoSuchChangeset, make_repo_resource, \ 
     46                                    split_vc_resource 
    4647from trac.versioncontrol.diff import get_diff_options, diff_blocks, \ 
    4748                                     unified_diff 
    4849from trac.versioncontrol.web_ui.browser import BrowserModule 
     
    485486        #           with _that_ node specific history... 
    486487 
    487488        options = data['diff']['options'] 
     489        repo_resource = make_repo_resource(reponame) 
    488490 
    489491        def _prop_changes(old_node, new_node): 
    490             old_source = Resource('source', (reponame, old_node.created_path), 
    491                                   version=old_node.created_rev) 
    492             new_source = Resource('source', (reponame, new_node.created_path), 
    493                                   version=new_node.created_rev) 
     492            old_source = Resource('source', old_node.created_path, 
     493                                  version=old_node.created_rev, 
     494                                  parent=repo_resource) 
     495            new_source = Resource('source', new_node.created_path, 
     496                                  version=new_node.created_rev, 
     497                                  parent=repo_resource) 
    494498            old_props = new_props = [] 
    495499            if 'FILE_VIEW' in req.perm(old_source): 
    496500                old_props = old_node.get_properties() 
     
    854858                 
    855859            uids_seen = {} 
    856860            def generate_changesets(reponame, repos): 
     861                repo_resource = make_repo_resource(reponame) 
    857862                for _, changesets in groupby(repos.get_changesets(start, stop), 
    858863                                             key=collapse_changesets): 
    859864                    viewable_changesets = [] 
    860865                    for cset in changesets: 
    861                         cset_resource = Resource('changeset',  
    862                                                  (reponame, cset.rev)) 
     866                        cset_resource = Resource('changeset', cset.rev, 
     867                                                 parent=repo_resource) 
    863868                        if 'CHANGESET_VIEW' in req.perm(cset_resource): 
    864869                            repos_for_uid = [reponame] 
    865870                            uid = repos.get_changeset_uid(cset.rev) 
     
    885890        changesets, show_location, show_files = event[3] 
    886891        cset, cset_resource, repos_for_uid = changesets[0] 
    887892        message = cset.message or '' 
    888         reponame = cset_resource.id[0] # first repo 
     893        reponame = split_vc_resource(cset_resource)[0] 
    889894        rev_b, rev_a = cset.rev, cset.rev 
    890895 
    891896        if field == 'url': 
     
    10691074            #cset = Resource('repository', reponame).child('changeset' , rev) 
    10701075            #cset = repos.resource.child('changeset' , rev) 
    10711076            #cset = repos.changeset_resource(rev) 
    1072             cset = Resource('changeset', (reponame, rev)) 
     1077            cset = Resource('changeset', rev, 
     1078                            parent=make_repo_resource(reponame)) 
    10731079            if 'CHANGESET_VIEW' in req.perm(cset): 
    10741080                yield (req.href.changeset(rev, reponame), 
    10751081                       '[%s]: %s' % (rev, shorten_line(log)),