Edgewall Software

Ticket #295: svn_cp_mv_support.diff

File svn_cp_mv_support.diff, 6.1 KB (added by cboos@…, 4 years ago)

Fix for #295, as a diff against [1090]

  • htdocs/css/diff.css

     
    2121#overview .mod, .diff #legend .mod { background: #fd8 } 
    2222#overview .rem, .diff #legend .rem { background: #f88 } 
    2323#overview .add, .diff #legend .add { background: #dfd } 
     24#overview .cp, .diff #legend .cp { background: #88f } 
     25#overview .mv, .diff #legend .mv { background: #ddd } 
    2426 
    2527/* Legend for diff colors */ 
    2628.diff #legend { 
  • trac/sync.py

     
    5959    core.svn_pool_destroy(subpool) 
    6060    db.commit() 
    6161 
    62 def insert_change (pool, fs_ptr, rev, cursor): 
    63      
     62def insert_change(pool, fs_ptr, rev, cursor): 
     63 
    6464    class ChangeEditor(delta.Editor): 
    65         def __init__(self, rev, old_root, new_root, cursor): 
     65        def __init__(self, rev, new_root, cursor): 
    6666            self.rev = rev 
    6767            self.cursor = cursor 
    68             self.old_root = old_root 
    6968            self.new_root = new_root 
     69            self.deletions = {}  
    7070         
    7171        def delete_entry(self, path, revision, parent_baton, pool): 
    72             self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    73                                 'VALUES (%s, %s, \'D\')', self.rev, path) 
     72            if path[0] != '/': 
     73                path = '/'+path 
     74            self.deletions[path] = 1 
    7475         
    75         def add_directory(self, path, parent_baton, 
    76                           copyfrom_path, copyfrom_revision, dir_pool): 
     76        def add_file(self, path, parent_baton, copyfrom_path, copyfrom_revision, dir_pool): 
     77            self._add_entry( core.svn_node_file, path, parent_baton, copyfrom_path, copyfrom_revision ) 
     78        def add_directory(self, path, parent_baton, copyfrom_path, copyfrom_revision, dir_pool): 
     79            self._add_entry( core.svn_node_dir, path, parent_baton, copyfrom_path, copyfrom_revision ) 
     80             
     81        def _add_entry(self, node, path, parent_baton, copyfrom_path, copyfrom_revision): 
     82            if path[0] != '/': 
     83                path = '/'+path 
     84            if copyfrom_path and copyfrom_revision: 
     85                if self.deletions.has_key(copyfrom_path): 
     86                    self.deletions.pop(copyfrom_path) 
     87                    action = 'R' 
     88                else: 
     89                    action = 'C' 
     90                # encoding rev, copyfrom and path in a readable _and_ parseable string                     
     91                name = "%d %d:%s %s" % (  
     92                    copyfrom_revision, len(copyfrom_path), copyfrom_path, path ) 
     93            else: 
     94                action = 'A' 
     95                name = path 
    7796            self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    78                                 'VALUES (%s, %s, \'A\')', self.rev, path) 
    79  
    80         def add_file(self, path, parent_baton, 
    81                      copyfrom_path, copyfrom_revision, file_pool): 
    82             self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    83                                 'VALUES (%s, %s, \'A\')',self.rev, path) 
     97                                'VALUES (%s, %s, %s)', self.rev, name, action) 
    8498             
    8599        def open_file(self, path, parent_baton, base_revision, file_pool): 
     100            if path[0] != '/': 
     101                path = '/'+path 
    86102            self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
    87103                                'VALUES (%s, %s, \'M\')',self.rev, path) 
    88104 
     105        def finalize(self): 
     106            for path in self.deletions.iterkeys(): 
     107                self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 
     108                                    'VALUES (%s, %s, \'D\')', self.rev, path) 
    89109 
    90     old_root = fs.revision_root(fs_ptr, rev - 1, pool) 
     110 
    91111    new_root = fs.revision_root(fs_ptr, rev, pool) 
    92112     
    93     editor = ChangeEditor(rev, old_root, new_root, cursor) 
     113    editor = ChangeEditor(rev, new_root, cursor) 
    94114    e_ptr, e_baton = delta.make_editor(editor, pool) 
    95115 
    96     def authz_cb(root, path, pool): return 1 
    97     repos.svn_repos_dir_delta(old_root, '', '', 
    98                               new_root, '', e_ptr, e_baton, authz_cb, 
    99                               0, 1, 0, 1, pool) 
     116    repos.svn_repos_replay(new_root, e_ptr, e_baton, pool) 
     117    editor.finalize() 
     118         
    100119     
  • templates/changeset.cs

     
    11<?cs set:html.stylesheet = 'css/changeset.css' ?> 
    22<?cs include "header.cs"?> 
    33<?cs include "macros.cs"?> 
     4<?cs include "diff_macros.cs"?> 
    45 
    56<div id="ctxtnav" class="nav"> 
    67 <h2>Changeset Navigation</h2> 
     
    7879     <div class="add"></div> 
    7980     <a href="<?cs var:item.browser_href ?>" title="Show file in browser"><?cs 
    8081       var:item.name ?></a> <span class="comment">(added)</span> 
     82    <?cs elif:item.change == "R" ?> 
     83     <div class="mv"></div> 
     84     <a href="<?cs var:item.browser_href ?>" title="Show file in browser"><?cs 
     85       var:item.name ?></a> <span class="comment">(renamed)</span> 
     86       (from <a href="<?cs var:item.browser_copyfrom_href ?>" title="Show original in browser"> 
     87        <?cs var:item.copyfrom_path ?></a>) 
     88    <?cs elif:item.change == "C" ?> 
     89     <div class="cp"></div> 
     90     <a href="<?cs var:item.browser_href ?>" title="Show file in browser"><?cs 
     91       var:item.name ?></a> <span class="comment">(copied)</span> 
     92       (from <a href="<?cs var:item.browser_copyfrom_href ?>" title="Show original in browser"> 
     93        <?cs var:item.copyfrom_path ?></a>) 
    8194    <?cs elif:item.change == "M" ?> 
    8295     <div class="mod"></div> 
    8396     <a href="<?cs var:item.browser_href ?>" title="Show file in browser"><?cs 
     
    100113  <dl> 
    101114   <dt class="unmod"></dt><dd>Unmodified</dd> 
    102115   <dt class="add"></dt><dd>Added</dd> 
     116   <dt class="cp"></dt><dd>Copied</dd> 
     117   <dt class="mv"></dt><dd>Renamed</dd> 
    103118   <dt class="rem"></dt><dd>Removed</dd> 
    104119   <dt class="mod"></dt><dd>Modified</dd> 
    105120  </dl>