Ticket #295: svn_cp_mv_support.diff
| File svn_cp_mv_support.diff, 6.1 KB (added by cboos@…, 4 years ago) |
|---|
-
htdocs/css/diff.css
21 21 #overview .mod, .diff #legend .mod { background: #fd8 } 22 22 #overview .rem, .diff #legend .rem { background: #f88 } 23 23 #overview .add, .diff #legend .add { background: #dfd } 24 #overview .cp, .diff #legend .cp { background: #88f } 25 #overview .mv, .diff #legend .mv { background: #ddd } 24 26 25 27 /* Legend for diff colors */ 26 28 .diff #legend { -
trac/sync.py
59 59 core.svn_pool_destroy(subpool) 60 60 db.commit() 61 61 62 def insert_change (pool, fs_ptr, rev, cursor):63 62 def insert_change(pool, fs_ptr, rev, cursor): 63 64 64 class ChangeEditor(delta.Editor): 65 def __init__(self, rev, old_root,new_root, cursor):65 def __init__(self, rev, new_root, cursor): 66 66 self.rev = rev 67 67 self.cursor = cursor 68 self.old_root = old_root69 68 self.new_root = new_root 69 self.deletions = {} 70 70 71 71 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 74 75 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 77 96 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) 84 98 85 99 def open_file(self, path, parent_baton, base_revision, file_pool): 100 if path[0] != '/': 101 path = '/'+path 86 102 self.cursor.execute('INSERT INTO node_change (rev, name, change) ' 87 103 'VALUES (%s, %s, \'M\')',self.rev, path) 88 104 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) 89 109 90 old_root = fs.revision_root(fs_ptr, rev - 1, pool) 110 91 111 new_root = fs.revision_root(fs_ptr, rev, pool) 92 112 93 editor = ChangeEditor(rev, old_root,new_root, cursor)113 editor = ChangeEditor(rev, new_root, cursor) 94 114 e_ptr, e_baton = delta.make_editor(editor, pool) 95 115 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 100 119 -
templates/changeset.cs
1 1 <?cs set:html.stylesheet = 'css/changeset.css' ?> 2 2 <?cs include "header.cs"?> 3 3 <?cs include "macros.cs"?> 4 <?cs include "diff_macros.cs"?> 4 5 5 6 <div id="ctxtnav" class="nav"> 6 7 <h2>Changeset Navigation</h2> … … 78 79 <div class="add"></div> 79 80 <a href="<?cs var:item.browser_href ?>" title="Show file in browser"><?cs 80 81 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>) 81 94 <?cs elif:item.change == "M" ?> 82 95 <div class="mod"></div> 83 96 <a href="<?cs var:item.browser_href ?>" title="Show file in browser"><?cs … … 100 113 <dl> 101 114 <dt class="unmod"></dt><dd>Unmodified</dd> 102 115 <dt class="add"></dt><dd>Added</dd> 116 <dt class="cp"></dt><dd>Copied</dd> 117 <dt class="mv"></dt><dd>Renamed</dd> 103 118 <dt class="rem"></dt><dd>Removed</dd> 104 119 <dt class="mod"></dt><dd>Modified</dd> 105 120 </dl>
