#!/usr/bin/python # # # Convert moin moin to trac wiki wiki # Copyright 2006 by John (JT) Perry jt@perrypack.com # Any reproduction should include this copyright notice. # This work is covered by the Creative Commons Attribution-ShareAlike 2.5 license # For license terms and descriptions, http://creativecommons.org/licenses/by-sa/2.5/ import os import sys import getopt import re import shutil import time import sqlite def usage(): print """ -t --trac = install environment path for tracadmin -d --directory = source directory -o --output = output directory -p --prefix = prefix to any wikiname if desired Example: moinmoin.py -d=~/moin/data/pages -o ~/CommWorking """ def main(argv): #some defaults if you don't want to type away on the command line directory = "" output = "" trac = "" global prefix prefix = "" try: opts, args = getopt.getopt(argv, "ht:d:o:p:", ["help", "trac=", "directory=", "output=","prefix="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-t", "--trac"): trac = arg elif opt in ("-d", "--directory"): directory = arg elif opt in ("-o", "--output"): output = arg elif opt in ("-p", "--prefix"): prefix = arg Go(directory, output, trac) def Go(directory,output,trac): for f in os.listdir(directory) : if os.path.isdir(os.path.join(directory, f)): dir = os.path.join(directory, f) ProcessDir(dir, f, output, trac) print "Completed conversion beginning import" #print "COMMENTED OUT IMPORT" ImportIntoTrac(output,trac) def ImportIntoTrac(directoryToProcess, trac): #python c:\Python23\Scripts\trac-admin wiki import [file] for f in os.listdir(directoryToProcess): wikiname = f.replace("(2f)", "/") filename = os.path.join(directoryToProcess,f) if prefix != "": wikiname = prefix + "/" + wikiname ImportCommand = "python c:\\Python23\\Scripts\\trac-admin %s wiki import %s %s" % (trac, wikiname, filename) os.system(ImportCommand) print "Imported page %s from file %s" % (wikiname, filename) def GetRevision(directory): filename = os.path.join(directory, "current") revision = "" try: fsock = open(filename, "r", 0) try: revision = fsock.read() finally: fsock.close() except IOError: print "Unable to get revision for directory %s" % directory return revision def CleanUp(WikiText, WikiName): #this will go through and clean up some wiki stuff # put all new regex's replaces, etc.. in this routine p = re.compile('#.*\n') #strips out comments WikiText = p.sub("", WikiText) p = re.compile('\[\[FullSearch\(.*\)\]\]') m = p.search(WikiText) if m and m.group() == "[[FullSearch()]]": #replace the full search macro WikiText = p.sub("[search:?q=!%s&wiki=on See pages with the category %s.]" % (WikiName, WikiName), WikiText) elif m: #special query convert to Trac temp = m.group() temp = temp.replace("[[FullSearch(", "") temp = temp.replace(")]]","") #now all we should have left is the query # store off the query for the link linkText = temp temp = temp.replace(" ","+") link = "[search:?q=!%s&wiki=on %s]" % (temp,linkText) WikiText = p.sub(link,WikiText) WikiText = WikiText.replace("[[", "--") #convert any other macros to nothing for now WikiText = WikiText.replace("]]", "--") #trac doesn't do a. b. c. lists convert to bullets WikiText = WikiText.replace(" a. ", " * ") #try and fix level issue # !!! This is dangerous and was specific to our using tab instead of space in some cases. May need to be removed !!! p = re.compile("^[ ]{2,2}1\.", re.M) WikiText = p.sub(" 1.", WikiText) p = re.compile("^[ ]{2,4}\*", re.M) WikiText = p.sub(" *", WikiText) p = re.compile("^[ ]{6,6}\*", re.M) WikiText = p.sub(" *", WikiText) p = re.compile("!\S*\\\S*") # strip out ! for not wiki words because they have slash m = p.search(WikiText) if m: current = m.group() new = m.group() new = new.replace("!","") WikiText = WikiText.replace(current,new) #tables p = re.compile("^[ ]{1,4}[\|]{2,}", re.M) WikiText = p.sub("||", WikiText) #tables must be outdented p = re.compile("<[trs].*\">") WikiText = p.sub("", WikiText) #strip out table tags return WikiText def CreateTracWiki(directory,wikiname,revision,baseName): filename = os.path.join(directory, "revisions", revision) filename = filename.replace("\n","") WikiText = "" try: fsock = open(filename, "r", 0) try: WikiText = fsock.read() finally: fsock.close() except IOError: print "Unable to get read revision %s for directory %s filename %s" % (revision,directory,filename) #clean er up WikiText = CleanUp(WikiText, baseName) if WikiText != "": try: wsock = open(wikiname, "w") try: wsock.write(WikiText) finally: wsock.close() except IOError: print "Unable to write the wikitext to %s" % wikiname def ProcessDir(directory, wikiname, output, trac): baseName = wikiname #do this later #wikiname = wikiname.replace("(2f)", "/") wikiname = os.path.join(output, wikiname) rev = GetRevision(directory) if rev != "": CreateTracWiki(directory,wikiname,rev,baseName) ProcessAttachments(directory, trac, baseName) def ProcessAttachments(directory, trac, baseName): # look for attachments attachSourceDir = os.path.join(directory, "attachments") attachTargetDir = os.path.join(trac, r"attachments\wiki\%s" % baseName.replace("(2f)", "/")) if os.path.exists(attachSourceDir): for dafile in os.listdir(attachSourceDir): if not os.path.exists(attachTargetDir): os.makedirs(attachTargetDir) shutil.copy(os.path.join(attachSourceDir,dafile), attachTargetDir) #print os.path.join(trac, r"db\trac.db") con = sqlite.connect(os.path.join(trac, "db\\trac.db")) cur = con.cursor() print dafile cur.execute("insert into attachment (type,id,filename,size,author) values ('%s', '%s', '%s', %s, '%s')" % (r"wiki",baseName, dafile, os.path.getsize(os.path.join(attachSourceDir,dafile)), r"conversion")) print "copy %s to %s" % (os.path.join(attachSourceDir,dafile), attachTargetDir) con.commit() if __name__ == "__main__": main(sys.argv[1:])