Index: 0.11/wikirename/util.py =================================================================== --- 0.11/wikirename/util.py (revision 2666) +++ 0.11/wikirename/util.py (working copy) @@ -3,7 +3,7 @@ from trac.env import * import sys -import sre +import re import os import time import optparse Index: 0.10/wikirename/web_ui.py =================================================================== --- 0.10/wikirename/web_ui.py (revision 2666) +++ 0.10/wikirename/web_ui.py (working copy) @@ -4,7 +4,7 @@ from trac.web.chrome import ITemplateProvider from webadmin.web_ui import IAdminPageProvider -from wikirename.util import rename_page +from wikirename.util import rename_page, copy_page import urllib @@ -42,6 +42,7 @@ def process_admin_request(self, req, cat, page, path_info): src = req.args.get('src_page','') dest = req.args.get('dest_page','') + action = req.args.get('action','') redir = req.args.get('redirect','') == '1' # Handle escaped chars (#TH672) @@ -51,7 +52,10 @@ if 'submit' in req.args.keys(): if not src or not dest: raise TracError, "Please provide both the old and new names" - rename_page(self.env, src, dest, req.authname, req.remote_addr, debug=self.log.debug) + if action == 'copy': + copy_page(self.env, src, dest, req.authname, req.remote_addr, debug=self.log.debug) + else: + rename_page(self.env, src, dest, req.authname, req.remote_addr, debug=self.log.debug) if redir: req.redirect(req.href.wiki(dest)) # Reset for the next display @@ -60,6 +64,7 @@ req.hdf['wikirename.src'] = src req.hdf['wikirename.dest'] = dest + req.hdf['wikirename.action'] = action req.hdf['wikirename.redir'] = redir return 'wikirename_admin.cs', None Index: 0.10/wikirename/util.py =================================================================== --- 0.10/wikirename/util.py (revision 2666) +++ 0.10/wikirename/util.py (working copy) @@ -3,8 +3,9 @@ from trac.env import * import sys -import sre +import re import os +import shutil import time import optparse import urllib @@ -88,4 +89,62 @@ if handle_commit: db.commit() +def copy_page(env, oldname, newname, user, ip, debug=False, db=None): + """Copy a wiki page from oldname to newname, using env as the environment.""" + handle_commit = False + if not db: + db = env.get_db_cnx() + handle_commit = True + cursor = db.cursor() + + if debug is False: + debug = pass_ + elif debug is True: + debug = print_ + else: + debug = log_intercept(debug) + sqlbase = ' FROM wiki w1, ' + \ + '(SELECT name, MAX(version) AS max_version FROM wiki GROUP BY name) w2 ' + \ + 'WHERE w1.version = w2.max_version AND w1.name = w2.name ' + + sql = 'SELECT w1.version,w1.text' + sqlbase + 'AND w1.name = \'%s\'' % oldname + debug('Running query %r', sql) + cursor.execute(sql) + + row = cursor.fetchone() + + if not row: + raise TracError, 'Page not found' + + new_wiki_page = (newname,row[0]+1,int(time.time()),user,ip,row[1],'Page copied from %s to %s'%(oldname,newname),0) + + # Create a new page with the needed comment + debug('Inserting new page %r', new_wiki_page) + cursor.execute('INSERT INTO wiki (name,version,time,author,ipnr,text,comment,readonly) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)', new_wiki_page) + + + # Copy all the old versions of the page + debug("Copy all old versions of page") + cursor.execute('INSERT INTO wiki (name, version, time, author, ipnr, text, comment, readonly) \ + SELECT \'%s\', version, time, author, ipnr, text, comment, readonly FROM wiki where name = \'%s\'' % (newname, oldname)) + + + # Move any attachments that are on the page + debug("Copying all attachments in database") + cursor.execute('INSERT INTO attachment SELECT type, \'%s\', filename, size, time, description, author, ipnr\ + FROM attachment WHERE type=\'%s\' AND id=\'%s\'' % (newname,'wiki',oldname)) + + debug("Found %s attachments on that page", cursor.rowcount) + if cursor.rowcount > 0: + # Change the directory where the attachments are stored, if there were any + debug('Moving all attachments on file system') + from_path = os.path.join(env.path, 'attachments', 'wiki', urllib.quote(oldname)) + to_path = os.path.join(env.path, 'attachments', 'wiki', urllib.quote(newname)) + debug('Copying from %r to %r', from_path, to_path) + shutil.copytree(from_path, to_path, symlinks=True) + + if handle_commit: + db.commit() + + Index: 0.10/wikirename/script.py =================================================================== --- 0.10/wikirename/script.py (revision 2666) +++ 0.10/wikirename/script.py (working copy) @@ -13,7 +13,7 @@ def main(*argv): - parser = optparse.OptionParser(usage='Usage: %prog old-name new-name trac-env', version='RenamePage 2.0') + parser = optparse.OptionParser(usage='Usage: %prog old-name new-name action trac-env', version='RenamePage 2.0') parser.add_option('-d','--debug',help='Activate debugging', action='store_true', default=False) (options, args) = parser.parse_args(list(argv[1:])) if len(args) < 3: @@ -21,9 +21,13 @@ oldname = args[0] newname = args[1] - envpath = args[2] + action = args[2] + envpath = args[3] env = Environment(envpath) - rename_page(env, oldname, newname, username(), '127.0.0.1', debug=options.debug) + if action == 'copy': + copy_page(env, oldname, newname, username(), '127.0.0.1', debug=options.debug) + else: + rename_page(env, oldname, newname, username(), '127.0.0.1', debug=options.debug) def run(): main(*sys.argv) Index: 0.10/wikirename/templates/wikirename.cs =================================================================== --- 0.10/wikirename/templates/wikirename.cs (revision 2666) +++ 0.10/wikirename/templates/wikirename.cs (working copy) @@ -15,6 +15,11 @@ +