##// END OF EJS Templates
vcs: added headers into stream call too
vcs: added headers into stream call too

File last commit:

r3061:a44afbe5 default
r4888:279ce63e default
Show More
migrate_repository.py
100 lines | 3.0 KiB | text/x-python | PythonLexer
project: added all source files and assets
r1 """
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."""
core: use py3 compatible prints
r3057 print("""Usage: %(prog)s repository-to-migrate
project: added all source files and assets
r1
Upgrade your repository to the new flat format.
NOTE: You should probably make a backup before running this.
core: use py3 compatible prints
r3057 """ % {'prog': sys.argv[0]})
project: added all source files and assets
r1
sys.exit(1)
def delete_file(filepath):
"""Deletes a file and prints a message."""
logging: use lazy parameter evaluation in log calls.
r3061 log.info('Deleting file: %s', filepath)
project: added all source files and assets
r1 os.remove(filepath)
def move_file(src, tgt):
"""Moves a file and prints a message."""
logging: use lazy parameter evaluation in log calls.
r3061 log.info('Moving file %s to %s', src, tgt)
project: added all source files and assets
r1 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."""
logging: use lazy parameter evaluation in log calls.
r3061 log.info('Deleting directory: %s', dirpath)
project: added all source files and assets
r1 os.rmdir(dirpath)
def migrate_repository(repos):
"""Does the actual migration to the new repository format."""
logging: use lazy parameter evaluation in log calls.
r3061 log.info('Migrating repository at: %s to new format', repos)
project: added all source files and assets
r1 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)
logging: use lazy parameter evaluation in log calls.
r3061 log.info('Working on directory: %s', origdir)
project: added all source files and assets
r1 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()