Edgewall Software

Ticket #7687: svn-external-7687-3.patch

File svn-external-7687-3.patch, 6.5 KB (added by eblot, 3 years ago)

Replace hard-to-read external list with a cleaner table

  • Users/eblot/Sources/Svn/edgewall.org/trac/trunk/trac/versioncontrol/svn_fs.py

    (this hunk was shorter than expected) 
    321322     
    322323    def render_property(self, name, mode, context, props): 
    323324        if name == 'svn:externals': 
    324             return self._render_externals(props[name]) 
     325            return self._render_externals(props[name], context) 
    325326        elif name == 'svn:mergeinfo' or name.startswith('svnmerge-'): 
    326327            return self._render_mergeinfo(props[name]) 
    327328 
    328     def _render_externals(self, prop): 
     329    def _render_externals(self, prop, context): 
    329330        if not self._externals_map: 
    330331            for dummykey, value in self.config.options('svn:externals'): 
    331332                value = value.split() 
     
    340341                self._externals_map[key] = value.replace('%', '%%') \ 
    341342                                           .replace('$path', '%(path)s') \ 
    342343                                           .replace('$rev', '%(rev)s') 
    343         externals = [] 
     344        externals_data = [] 
     345        def add_externals_url(localpath, url, rev, href):  
     346            externals_data.append(((localpath, url or '', rev or ''), href)) 
    344347        for external in prop.splitlines(): 
    345348            elements = external.split() 
    346349            if not elements: 
    347350                continue 
    348             localpath, rev, url = elements[0], '', elements[-1] 
    349             if localpath.startswith('#'): 
    350                 externals.append((external, None, None, None, None)) 
    351                 continue 
    352             if len(elements) == 3: 
    353                 rev = elements[1] 
    354                 rev = rev.replace('-r', '') 
     351            if elements[-1].find(u'://') != -1: 
     352                # old-style externals syntax 
     353                localpath, rev, url = elements[0], '', elements[-1] 
     354                if localpath.startswith('#'): 
     355                    externals_data.append((external, None, None)) 
     356                    continue 
     357                if len(elements) > 2: 
     358                    rev = elements[len(elements)==4 and 3 or 2] 
     359                    rev = rev.replace('-r', '') 
     360            elif len(elements) > 1: 
     361                # new-style externals syntax 
     362                resource = context.resource 
     363                localpath = resource.id 
     364                url, localpath = elements[-2], elements[-1] 
     365                if len(elements) > 2: 
     366                    rev = elements[len(elements)==4 and 1 or 0] 
     367                    rev = rev.replace('-r', '') 
     368                else: 
     369                    rev = '' 
     370                    if '@' in url: 
     371                        (url, rev) = url.split('@')  
     372                if url.startswith(u'^/'): 
     373                    # relative to repository root 
     374                    href = context.req.href.browser(url[1:], rev=rev) 
     375                    add_externals_url(localpath, url[1:], rev, href) 
     376                    continue 
     377                elif url.startswith(u'../'): 
     378                    # relative to the directory 
     379                    remotepath = localpath 
     380                    while url.startswith(u'../'): 
     381                        url = url[3:] 
     382                        (remotepath, child) = posixpath.split(remotepath) 
     383                    remotepath = posixpath.join('/'+remotepath, url) 
     384                    href = context.req.href.browser(url, rev=rev) 
     385                    add_externals_url(localpath, remotepath, rev, href) 
     386                    continue 
     387                elif url.startswith(u'/'): 
     388                    # relative to server root or to scheme 
     389                    while url.startswith(u'//'): 
     390                        # relative to scheme, handle as server root 
     391                        url = url[1:]  
     392                    # relative to server root 
    355393            # retrieve a matching entry in the externals map 
    356394            prefix = [] 
    357395            base_url = url 
    358396            while base_url: 
    359397                if base_url in self._externals_map or base_url==u'/': 
    360398                    break 
     399                if base_url.endswith(':'): 
     400                    prefix.append(base_url+'//') 
     401                    base_url = '' 
     402                    break 
    361403                base_url, pref = posixpath.split(base_url) 
    362404                prefix.append(pref) 
    363405            href = self._externals_map.get(base_url) 
    364             revstr = rev and ' at revision '+rev or '' 
    365406            if not href and (url.startswith('http://') or  
    366407                             url.startswith('https://')): 
    367408                href = url.replace('%', '%%') 
     
    369410                remotepath = '' 
    370411                if prefix: 
    371412                    remotepath = posixpath.join(*reversed(prefix)) 
    372                 externals.append((localpath, revstr, base_url, remotepath, 
    373                                   href % {'path': remotepath, 'rev': rev})) 
     413                add_externals_url(localpath, url, rev, 
     414                                  href % {'path': remotepath, 'rev': rev}) 
    374415            else: 
    375                 externals.append((localpath, revstr, url, None, None)) 
    376         externals_data = [] 
    377         for localpath, rev, url, remotepath, href in externals: 
    378             label = localpath 
    379             if url is None: 
    380                 title = '' 
    381             elif href: 
    382                 if url: 
    383                     url = ' in ' + url 
    384                 label += rev + url 
    385                 title = ''.join((remotepath, rev, url)) 
     416                add_externals_url(localpath, url, rev, None) 
     417        trs = [] 
     418        for label, href in externals_data: 
     419            if not href: 
     420                tr = tag.tr(tag.td(label[0]), 
     421                            tag.td(tag.a(label[1], title=\ 
     422                                _('No svn:externals configured in trac.ini')), 
     423                            tag.td(label[2]))) 
    386424            else: 
    387                 title = _('No svn:externals configured in trac.ini') 
    388             externals_data.append((label, href, title)) 
    389         return tag.ul([tag.li(tag.a(label, href=href, title=title)) 
    390                        for label, href, title in externals_data]) 
     425                tr = tag.tr(tag.td(label[0]), 
     426                            tag.td(tag.a(label[1], href=href), title=\ 
     427                                _('Jump to external')), 
     428                            tag.td(tag.a(label[2], href=href))) 
     429            trs.append(tr) 
     430        return tag.table(tag.tbody(trs))