""" 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. """ import os import sys import logging log = logging.getLogger(__name__) def usage(): """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) def delete_file(filepath): """Deletes a file and prints a message.""" log.info('Deleting file: %s' % filepath) os.remove(filepath) def move_file(src, tgt): """Moves a file and prints a message.""" log.info('Moving file %s to %s' % (src, tgt)) if os.path.exists(tgt): raise Exception( 'Cannot move file %s because target %s already exists' % \ (src, tgt)) os.rename(src, tgt) def delete_directory(dirpath): """Delete a directory and print a message.""" log.info('Deleting directory: %s' % dirpath) os.rmdir(dirpath) def migrate_repository(repos): """Does the actual migration to the new repository format.""" log.info('Migrating repository at: %s to new format' % repos) versions = '%s/versions' % repos dirs = os.listdir(versions) # Only use int's in list. numdirs = [int(dirname) for dirname in dirs if dirname.isdigit()] numdirs.sort() # Sort list. for dirname in numdirs: origdir = '%s/%s' % (versions, dirname) log.info('Working on directory: %s' % origdir) files = os.listdir(origdir) files.sort() for filename in files: # Delete compiled Python files. if filename.endswith('.pyc') or filename.endswith('.pyo'): delete_file('%s/%s' % (origdir, filename)) # Delete empty __init__.py files. origfile = '%s/__init__.py' % origdir if os.path.exists(origfile) and len(open(origfile).read()) == 0: delete_file(origfile) # Move sql upgrade scripts. if filename.endswith('.sql'): version, dbms, operation = filename.split('.', 3)[0:3] origfile = '%s/%s' % (origdir, filename) # For instance: 2.postgres.upgrade.sql -> # 002_postgres_upgrade.sql tgtfile = '%s/%03d_%s_%s.sql' % ( versions, int(version), dbms, operation) move_file(origfile, tgtfile) # Move Python upgrade script. pyfile = '%s.py' % dirname pyfilepath = '%s/%s' % (origdir, pyfile) if os.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) def main(): """Main function to be called when using this script.""" if len(sys.argv) != 2: usage() migrate_repository(sys.argv[1]) if __name__ == '__main__': main()