Edgewall Software

Ticket #586: repo-paths.6.diff

File repo-paths.6.diff, 10.2 KB (added by quannon.au@…, 8 years ago)

Fix for previous patches breaking log revision file viewing.

  • Browser.py

    diff -u trac/Browser.py trac2/Browser.py
    old new  
    4040        except core.SubversionException: 
    4141            raise TracError('Invalid revision number: %d' % revision) 
    4242 
     43        # If not the current revision, do not append the repos_path 
     44        if not rev_specified == 1: 
     45            path = svn_path_join( self.repos_path, path) 
     46 
    4347        node_type = fs.check_path(root, path, self.pool) 
     48       
    4449        if not node_type in [core.svn_node_dir, core.svn_node_file]: 
    4550            raise TracError('"%s": no such file or directory in revision %d' \ 
    4651                            % (path, revision), 'Not such file or directory') 
     
    7883            else: 
    7984                date_seconds = 0 
    8085                date = '' 
     86        
     87            if self.repos_path: 
     88                url_path = fullpath[len(self.repos_path):] 
     89            else: 
     90                url_path = fullpath 
    8191 
    8292            item = { 
    8393                'name'       : name, 
    8494                'fullpath'   : fullpath, 
     95                'urlpath'    : url_path, 
    8596                'created_rev': created_rev, 
    8697                'date'       : date, 
    8798                'date_seconds' : date_seconds, 
     
    90101                'size'       : pretty_size(size), 
    91102                'size_bytes' : size } 
    92103            if rev_specified: 
    93                 item['log_href'] = self.env.href.log(fullpath, revision) 
     104                item['log_href'] = self.env.href.log(url_path, revision) 
    94105                if is_dir: 
    95                     item['browser_href'] = self.env.href.browser(fullpath, 
     106                    item['browser_href'] = self.env.href.browser(url_path, 
    96107                                                                 revision) 
    97108                else: 
    98                     item['browser_href'] = self.env.href.file(fullpath, revision) 
     109                    item['browser_href'] = self.env.href.file(url_path, revision) 
    99110            else: 
    100                 item['log_href'] = self.env.href.log(fullpath) 
     111                item['log_href'] = self.env.href.log(url_path) 
    101112                if is_dir: 
    102                     item['browser_href'] = self.env.href.browser(fullpath) 
     113                    item['browser_href'] = self.env.href.browser(url_path) 
    103114                else: 
    104                     item['browser_href'] = self.env.href.file(fullpath) 
     115                    item['browser_href'] = self.env.href.file(url_path) 
    105116 
    106117            info.append(item) 
    107118        return info 
  • File.py

    diff -u trac/File.py trac2/File.py
    old new  
    191191    def generate_path_links(self, rev, rev_specified): 
    192192        # FIXME: Browser, Log and File should share implementation of this 
    193193        # function. 
    194         list = self.path.split('/') 
     194        list = self.path[len(self.repos_path):].split('/') 
    195195        self.filename = list[-1] 
    196196        path = '/' 
    197197        self.req.hdf.setValue('file.filename', list[-1]) 
     
    223223         
    224224        rev = self.args.get('rev', None) 
    225225        self.path = self.args.get('path', '/') 
     226        if not self.path.startswith(self.repos_path): 
     227            self.path = util.svn_path_join(self.repos_path, self.path) 
     228         
    226229        if not rev: 
    227230            rev_specified = 0 
    228231            rev = svn.fs.youngest_rev(self.fs_ptr, self.pool) 
  • Log.py

    diff -u trac/Log.py trac2/Log.py
    old new  
    7575        return self.log_info 
    7676 
    7777    def generate_path_links(self, rev, rev_specified): 
    78         list = self.path.split('/') 
     78        list = self.path[len(self.repos_path):].split('/') 
    7979        path = '/' 
    8080        self.req.hdf.setValue('log.filename', list[-1]) 
    8181        self.req.hdf.setValue('log.href' , self.env.href.log(self.path)) 
  • core.py

    diff -u trac/core.py trac2/core.py
    old new  
    151151    if need_svn: 
    152152        import sync 
    153153        repos_dir = env.get_config('trac', 'repository_dir') 
     154        repos_path = env.get_config('trac', 'repository_path') 
    154155        pool, rep, fs_ptr = open_svn_repos(repos_dir) 
    155156        module.repos = rep 
     157        module.repos_path = repos_path         
    156158        module.fs_ptr = fs_ptr 
    157         sync.sync(module.db, rep, fs_ptr, pool) 
     159        sync.sync(module.db, rep, repos_path, fs_ptr, pool) 
    158160        module.pool = pool 
    159161    return module 
    160162 
  • sync.py

    Common subdirectories: trac/mimeviewers and trac2/mimeviewers
    diff -u trac/sync.py trac2/sync.py
    old new  
    2020# Author: Jonas Borgström <jonas@edgewall.com> 
    2121 
    2222from util import * 
    23 from svn import fs, util, delta, repos, core 
     23from svn import fs, util, delta, core, repos 
    2424 
    25 def sync(db, repos, fs_ptr, pool): 
     25def sync(db, repo, repos_path, fs_ptr, pool): 
    2626    """ 
    2727    updates the revision and node_change tables to be in sync with 
    2828    the repository. 
     
    3636    cursor = db.cursor() 
    3737    cursor.execute('SELECT ifnull(max(rev), 0) FROM revision') 
    3838    youngest_stored =  int(cursor.fetchone()[0]) 
     39     
    3940    max_rev = fs.youngest_rev(fs_ptr, pool) 
    40     num = max_rev - youngest_stored 
     41#    num = max_rev - youngest_stored 
    4142    offset = youngest_stored + 1 
     43    revision_set = [] 
    4244     
     45    if repos_path: 
     46        revision_set = get_revision_set( 
     47            db, 
     48            repo, 
     49            repos_path, 
     50            fs_ptr, 
     51            pool, 
     52            youngest_stored, 
     53            max_rev 
     54            ) 
     55        
     56    if not revision_set and not repos_path: 
     57        revision_set = range(youngest_stored+1, max_rev) 
     58 
    4359    subpool = core.svn_pool_create(pool) 
    44     for rev in range(num): 
     60    for rev in revision_set: 
    4561        message = fs.revision_prop(fs_ptr, rev + offset, 
    4662                                   util.SVN_PROP_REVISION_LOG, subpool) 
    4763        author = fs.revision_prop(fs_ptr, rev + offset, 
     
    5470        cursor.execute ('INSERT INTO revision (rev, time, author, message) ' 
    5571                        'VALUES (%s, %s, %s, %s)', rev + offset, date, 
    5672                        author, message) 
    57         insert_change (subpool, fs_ptr, rev + offset, cursor) 
     73        insert_change (subpool, repos_path, fs_ptr, rev, cursor) 
    5874        core.svn_pool_clear(subpool) 
    5975 
    6076    core.svn_pool_destroy(subpool) 
    6177    db.commit() 
    6278 
    63 def insert_change (pool, fs_ptr, rev, cursor): 
     79def insert_change (pool, repos_path, fs_ptr, rev, cursor): 
    6480     
    6581    class ChangeEditor(delta.Editor): 
    66         def __init__(self, rev, old_root, new_root, cursor): 
     82        def __init__(self, rev, old_root, new_root, repos_path, cursor): 
    6783            self.rev = rev 
    6884            self.cursor = cursor 
    6985            self.old_root = old_root 
    7086            self.new_root = new_root 
     87            self.repos_path = repos_path 
    7188         
    7289        def delete_entry(self, path, revision, parent_baton, pool): 
     90            if not path.startswith( self.repos_path): 
     91                return 
    7392            self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    7493                                'VALUES (%s, %s, \'D\')', self.rev, path) 
    7594         
    7695        def add_directory(self, path, parent_baton, 
    7796                          copyfrom_path, copyfrom_revision, dir_pool): 
     97            if not path.startswith( self.repos_path): 
     98                return 
    7899            self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    79100                                'VALUES (%s, %s, \'A\')', self.rev, path) 
    80101 
    81102        def add_file(self, path, parent_baton, 
    82103                     copyfrom_path, copyfrom_revision, file_pool): 
     104            if not path.startswith( self.repos_path): 
     105                return 
    83106            self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    84107                                'VALUES (%s, %s, \'A\')',self.rev, path) 
    85108             
    86109        def open_file(self, path, parent_baton, base_revision, file_pool): 
     110            if not path.startswith( self.repos_path): 
     111                return             
    87112            self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    88113                                'VALUES (%s, %s, \'M\')',self.rev, path) 
    89114 
     
    91116    old_root = fs.revision_root(fs_ptr, rev - 1, pool) 
    92117    new_root = fs.revision_root(fs_ptr, rev, pool) 
    93118     
    94     editor = ChangeEditor(rev, old_root, new_root, cursor) 
     119    editor = ChangeEditor(rev, old_root, new_root, repos_path, cursor) 
    95120    e_ptr, e_baton = delta.make_editor(editor, pool) 
    96121 
    97122    if util.SVN_VER_MAJOR == 0 and util.SVN_VER_MINOR == 37: 
     
    104129                                  new_root, '', e_ptr, e_baton, authz_cb, 
    105130                                  0, 1, 0, 1, pool) 
    106131 
     132def get_revision_set( db, repo, repos_path, fs_ptr, pool, youngest_stored, max_rev): 
     133    revision_set = [] 
     134    root = fs.revision_root(fs_ptr, max_rev, pool) 
     135    node_type = fs.check_path(root, repos_path, pool) 
     136 
     137    if not node_type in (core.svn_node_dir, core.svn_node_file): 
     138        raise ValueError("Svn Repository Path Invalid %r"%repos_path) 
     139     
     140    revs = [] 
     141     
     142    def addLog( paths, revision, author, date, message, pool): 
     143        revs.append(revision) 
     144 
     145    repos.svn_repos_get_logs( 
     146            repo, 
     147            [repos_path], 
     148            max_rev, # start rev 
     149            0, # end rev 
     150            0, # changed paths 
     151            0, # strict history 
     152            addLog, 
     153            pool 
     154            ) 
     155 
     156    revs.sort() 
     157    for rev in revs: 
     158        if rev > youngest_stored: 
     159            revision_set.append( rev ) 
     160 
     161    return revision_set 
  • util.py

    Common subdirectories: trac/tests and trac2/tests
    Common subdirectories: trac/upgrades and trac2/upgrades
    diff -u trac/util.py trac2/util.py
    old new  
    2929TRUE =  ['yes', '1', 1, 'true',  'on',  'aye'] 
    3030FALSE = ['no',  '0', 0, 'false', 'off', 'nay'] 
    3131 
     32def svn_path_join(*args): 
     33    return "/%s"%'/'.join(filter(None, '/'.join(args).split('/'))) 
     34 
    3235def svn_date_to_string(date, pool): 
    3336    from svn import util 
    3437    date_seconds = util.svn_time_from_cstring(date,