Mercurial > kallithea
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() |