Edgewall Software

Ticket #7715: 7715-mergeinfo-display-r8263.patch

File 7715-mergeinfo-display-r8263.patch, 2.8 KB (added by rblank, 3 years ago)

Updated patch with permission checks and error handling

  • trac/htdocs/css/browser.css

    diff --git a/trac/htdocs/css/browser.css b/trac/htdocs/css/browser.css
    a b  
    174174 margin: 0 0 .4em 1.6em; 
    175175 padding: 0; 
    176176} 
    177 #info .props li { padding: 0; overflow: auto; } 
     177#info .props > li { padding: 2px 0; overflow: auto; } 
    178178 
    179179/* Styles for the HTML preview */ 
    180180#preview { background: #fff; clear: both; margin: 0 } 
  • trac/versioncontrol/svn_fs.py

    diff --git a/trac/versioncontrol/svn_fs.py b/trac/versioncontrol/svn_fs.py
    a b  
    323323        if name == 'svn:externals': 
    324324            return self._render_externals(props[name]) 
    325325        elif name == 'svn:mergeinfo' or name.startswith('svnmerge-'): 
    326             return self._render_mergeinfo(props[name]) 
     326            return self._render_mergeinfo(name, mode, context, props) 
    327327        elif name == 'svn:needs-lock': 
    328328            return self._render_needslock(context) 
    329329 
     
    389389        return tag.ul([tag.li(tag.a(label, href=href, title=title)) 
    390390                       for label, href, title in externals_data]) 
    391391 
    392     def _render_mergeinfo(self, prop): 
    393         prop = prop.rsplit(':', 1) 
    394         if len(prop) == 2: 
    395             prop[1] = prop[1].replace(',', u',\u200b') 
    396         return ':'.join(prop) 
    397  
     392    def _render_mergeinfo(self, name, mode, context, props): 
     393        """Parse svn:mergeinfo and svnmerge-* properties converting branch 
     394        names and revisions to links.""" 
     395        ul = [] 
     396        for line in props[name].splitlines(): 
     397            try: 
     398                path, revs = line.split(':', 1) 
     399                if 'LOG_VIEW' in context.perm('source', path): 
     400                    li = [tag.a(path, href=context.href.browser(path)), ':'] 
     401                    for rev in revs.split(','): 
     402                        if len(li) > 2: 
     403                            li.append(u',\u200b') 
     404                        range = rev.split('-', 1) 
     405                        if len(range) > 1: 
     406                            href=context.href.log(path, rev=range[1],  
     407                                                  stop_rev=range[0]) 
     408                        else: 
     409                            href=context.href.changeset(rev, path) 
     410                        li.append(tag.a(rev, href=href)) 
     411                    ul.append(tag.li(li)) 
     412                else: 
     413                    revs = revs.replace(',', u',\u200b') 
     414                    ul.append(tag.li(':'.join([path, revs]))) 
     415            except Exception, e: 
     416                self.log.warning('Rendering of property %s failed: %s', name, 
     417                                 exception_to_unicode(e)) 
     418                ul.append(tag.li(line)) 
     419        return tag.ul(ul)       
     420      
    398421    def _render_needslock(self, context): 
    399422        return tag.img(src=context.href.chrome('common/lock-locked.png'), 
    400423                       alt="needs lock", title="needs lock")