comparison rhodecode/lib/dbmigrate/migrate/versioning/migrate_repository.py @ 833:9753e0907827 beta

added dbmigrate package, added model changes moved out upgrade db command to that package
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 11 Dec 2010 01:54:12 +0100
parents
children
comparison
equal deleted inserted replaced
832:634596f81cfd 833:9753e0907827
1 """
2 Script to migrate repository from sqlalchemy <= 0.4.4 to the new
3 repository schema. This shouldn't use any other migrate modules, so
4 that it can work in any version.
5 """
6
7 import os
8 import sys
9 import logging
10
11 log = logging.getLogger(__name__)
12
13
14 def usage():
15 """Gives usage information."""
16 print """Usage: %(prog)s repository-to-migrate
17
18 Upgrade your repository to the new flat format.
19
20 NOTE: You should probably make a backup before running this.
21 """ % {'prog': sys.argv[0]}
22
23 sys.exit(1)
24
25
26 def delete_file(filepath):
27 """Deletes a file and prints a message."""
28 log.info('Deleting file: %s' % filepath)
29 os.remove(filepath)
30
31
32 def move_file(src, tgt):
33 """Moves a file and prints a message."""
34 log.info('Moving file %s to %s' % (src, tgt))
35 if os.path.exists(tgt):
36 raise Exception(
37 'Cannot move file %s because target %s already exists' % \
38 (src, tgt))
39 os.rename(src, tgt)
40
41
42 def delete_directory(dirpath):
43 """Delete a directory and print a message."""
44 log.info('Deleting directory: %s' % dirpath)
45 os.rmdir(dirpath)
46
47
48 def migrate_repository(repos):
49 """Does the actual migration to the new repository format."""
50 log.info('Migrating repository at: %s to new format' % repos)
51 versions = '%s/versions' % repos
52 dirs = os.listdir(versions)
53 # Only use int's in list.
54 numdirs = [int(dirname) for dirname in dirs if dirname.isdigit()]
55 numdirs.sort() # Sort list.
56 for dirname in numdirs:
57 origdir = '%s/%s' % (versions, dirname)
58 log.info('Working on directory: %s' % origdir)
59 files = os.listdir(origdir)
60 files.sort()
61 for filename in files:
62 # Delete compiled Python files.
63 if filename.endswith('.pyc') or filename.endswith('.pyo'):
64 delete_file('%s/%s' % (origdir, filename))
65
66 # Delete empty __init__.py files.
67 origfile = '%s/__init__.py' % origdir
68 if os.path.exists(origfile) and len(open(origfile).read()) == 0:
69 delete_file(origfile)
70
71 # Move sql upgrade scripts.
72 if filename.endswith('.sql'):
73 version, dbms, operation = filename.split('.', 3)[0:3]
74 origfile = '%s/%s' % (origdir, filename)
75 # For instance: 2.postgres.upgrade.sql ->
76 # 002_postgres_upgrade.sql
77 tgtfile = '%s/%03d_%s_%s.sql' % (
78 versions, int(version), dbms, operation)
79 move_file(origfile, tgtfile)
80
81 # Move Python upgrade script.
82 pyfile = '%s.py' % dirname
83 pyfilepath = '%s/%s' % (origdir, pyfile)
84 if os.path.exists(pyfilepath):
85 tgtfile = '%s/%03d.py' % (versions, int(dirname))
86 move_file(pyfilepath, tgtfile)
87
88 # Try to remove directory. Will fail if it's not empty.
89 delete_directory(origdir)
90
91
92 def main():
93 """Main function to be called when using this script."""
94 if len(sys.argv) != 2:
95 usage()
96 migrate_repository(sys.argv[1])
97
98
99 if __name__ == '__main__':
100 main()