""" Script to migrate repository from sqlalchemy <= 0.4.4 to the new repository schema. This shouldn't use any other migrate modules, so that it can work in any version."""importosimportsysimportlogginglog=logging.getLogger(__name__)defusage():"""Gives usage information."""print"""Usage: %(prog)s repository-to-migrate Upgrade your repository to the new flat format. NOTE: You should probably make a backup before running this. """%{'prog':sys.argv[0]}sys.exit(1)defdelete_file(filepath):"""Deletes a file and prints a message."""log.info('Deleting file: %s'%filepath)os.remove(filepath)defmove_file(src,tgt):"""Moves a file and prints a message."""log.info('Moving file %s to %s'%(src,tgt))ifos.path.exists(tgt):raiseException('Cannot move file %s because target %s already exists'% \
(src,tgt))os.rename(src,tgt)defdelete_directory(dirpath):"""Delete a directory and print a message."""log.info('Deleting directory: %s'%dirpath)os.rmdir(dirpath)defmigrate_repository(repos):"""Does the actual migration to the new repository format."""log.info('Migrating repository at: %s to new format'%repos)versions='%s/versions'%reposdirs=os.listdir(versions)# Only use int's in list.numdirs=[int(dirname)fordirnameindirsifdirname.isdigit()]numdirs.sort()# Sort list.fordirnameinnumdirs:origdir='%s/%s'%(versions,dirname)log.info('Working on directory: %s'%origdir)files=os.listdir(origdir)files.sort()forfilenameinfiles:# Delete compiled Python files.iffilename.endswith('.pyc')orfilename.endswith('.pyo'):delete_file('%s/%s'%(origdir,filename))# Delete empty __init__.py files.origfile='%s/__init__.py'%origdirifos.path.exists(origfile)andlen(open(origfile).read())==0:delete_file(origfile)# Move sql upgrade scripts.iffilename.endswith('.sql'):version,dbms,operation=filename.split('.',3)[0:3]origfile='%s/%s'%(origdir,filename)# For instance: 2.postgres.upgrade.sql -># 002_postgres_upgrade.sqltgtfile='%s/%03d_%s_%s.sql'%(versions,int(version),dbms,operation)move_file(origfile,tgtfile)# Move Python upgrade script.pyfile='%s.py'%dirnamepyfilepath='%s/%s'%(origdir,pyfile)ifos.path.exists(pyfilepath):tgtfile='%s/%03d.py'%(versions,int(dirname))move_file(pyfilepath,tgtfile)# Try to remove directory. Will fail if it's not empty.delete_directory(origdir)defmain():"""Main function to be called when using this script."""iflen(sys.argv)!=2:usage()migrate_repository(sys.argv[1])if__name__=='__main__':main()