summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/south/migration/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/south/migration/__init__.py')
-rw-r--r--lib/python2.7/site-packages/south/migration/__init__.py235
1 files changed, 0 insertions, 235 deletions
diff --git a/lib/python2.7/site-packages/south/migration/__init__.py b/lib/python2.7/site-packages/south/migration/__init__.py
deleted file mode 100644
index 1d91ddf..0000000
--- a/lib/python2.7/site-packages/south/migration/__init__.py
+++ /dev/null
@@ -1,235 +0,0 @@
-"""
-Main migration logic.
-"""
-
-from __future__ import print_function
-
-import sys
-
-from django.core.exceptions import ImproperlyConfigured
-
-import south.db
-from south import exceptions
-from south.models import MigrationHistory
-from south.db import db, DEFAULT_DB_ALIAS
-from south.migration.migrators import (Backwards, Forwards,
- DryRunMigrator, FakeMigrator,
- LoadInitialDataMigrator)
-from south.migration.base import Migration, Migrations
-from south.migration.utils import SortedSet
-from south.migration.base import all_migrations
-from south.signals import pre_migrate, post_migrate
-
-
-def to_apply(forwards, done):
- return [m for m in forwards if m not in done]
-
-def to_unapply(backwards, done):
- return [m for m in backwards if m in done]
-
-def problems(pending, done):
- last = None
- if not pending:
- raise StopIteration()
- for migration in pending:
- if migration in done:
- last = migration
- continue
- if last and migration not in done:
- yield last, migration
-
-def forwards_problems(pending, done, verbosity):
- """
- Takes the list of linearised pending migrations, and the set of done ones,
- and returns the list of problems, if any.
- """
- return inner_problem_check(problems(reversed(pending), done), done, verbosity)
-
-def backwards_problems(pending, done, verbosity):
- return inner_problem_check(problems(pending, done), done, verbosity)
-
-def inner_problem_check(problems, done, verbosity):
- "Takes a set of possible problems and gets the actual issues out of it."
- result = []
- for last, migration in problems:
- checked = set([])
- # 'Last' is the last applied migration. Step back from it until we
- # either find nothing wrong, or we find something.
- to_check = list(last.dependencies)
- while to_check:
- checking = to_check.pop()
- if checking in checked:
- continue
- checked.add(checking)
-
- if checking not in done:
- # That's bad. Error.
- if verbosity:
- print((" ! Migration %s should not have been applied "
- "before %s but was." % (last, checking)))
- result.append((last, checking))
- else:
- to_check.extend(checking.dependencies)
- return result
-
-def check_migration_histories(histories, delete_ghosts=False, ignore_ghosts=False):
- "Checks that there's no 'ghost' migrations in the database."
- exists = SortedSet()
- ghosts = []
- for h in histories:
- try:
- m = h.get_migration()
- m.migration()
- except exceptions.UnknownMigration:
- ghosts.append(h)
- except ImproperlyConfigured:
- pass # Ignore missing applications
- else:
- exists.add(m)
- if ghosts:
- # They may want us to delete ghosts.
- if delete_ghosts:
- for h in ghosts:
- h.delete()
- elif not ignore_ghosts:
- raise exceptions.GhostMigrations(ghosts)
- return exists
-
-def get_dependencies(target, migrations):
- forwards = list
- backwards = list
- if target is None:
- backwards = migrations[0].backwards_plan
- else:
- forwards = target.forwards_plan
- # When migrating backwards we want to remove up to and
- # including the next migration up in this app (not the next
- # one, that includes other apps)
- migration_before_here = target.next()
- if migration_before_here:
- backwards = migration_before_here.backwards_plan
- return forwards, backwards
-
-def get_direction(target, applied, migrations, verbosity, interactive):
- # Get the forwards and reverse dependencies for this target
- forwards, backwards = get_dependencies(target, migrations)
- # Is the whole forward branch applied?
- problems = None
- forwards = forwards()
- workplan = to_apply(forwards, applied)
- if not workplan:
- # If they're all applied, we only know it's not backwards
- direction = None
- else:
- # If the remaining migrations are strictly a right segment of
- # the forwards trace, we just need to go forwards to our
- # target (and check for badness)
- problems = forwards_problems(forwards, applied, verbosity)
- direction = Forwards(verbosity=verbosity, interactive=interactive)
- if not problems:
- # What about the whole backward trace then?
- backwards = backwards()
- missing_backwards = to_apply(backwards, applied)
- if missing_backwards != backwards:
- # If what's missing is a strict left segment of backwards (i.e.
- # all the higher migrations) then we need to go backwards
- workplan = to_unapply(backwards, applied)
- problems = backwards_problems(backwards, applied, verbosity)
- direction = Backwards(verbosity=verbosity, interactive=interactive)
- return direction, problems, workplan
-
-def get_migrator(direction, db_dry_run, fake, load_initial_data):
- if not direction:
- return direction
- if db_dry_run:
- direction = DryRunMigrator(migrator=direction, ignore_fail=False)
- elif fake:
- direction = FakeMigrator(migrator=direction)
- elif load_initial_data:
- direction = LoadInitialDataMigrator(migrator=direction)
- return direction
-
-def get_unapplied_migrations(migrations, applied_migrations):
- applied_migration_names = ['%s.%s' % (mi.app_name,mi.migration) for mi in applied_migrations]
-
- for migration in migrations:
- is_applied = '%s.%s' % (migration.app_label(), migration.name()) in applied_migration_names
- if not is_applied:
- yield migration
-
-def migrate_app(migrations, target_name=None, merge=False, fake=False, db_dry_run=False, yes=False, verbosity=0, load_initial_data=False, skip=False, database=DEFAULT_DB_ALIAS, delete_ghosts=False, ignore_ghosts=False, interactive=False):
- app_label = migrations.app_label()
-
- verbosity = int(verbosity)
- # Fire off the pre-migrate signal
- pre_migrate.send(None, app=app_label, verbosity=verbosity, interactive=verbosity, db=database)
-
- # If there aren't any, quit quizically
- if not migrations:
- print("? You have no migrations for the '%s' app. You might want some." % app_label)
- return
-
- # Load the entire dependency graph
- Migrations.calculate_dependencies()
-
- # Check there's no strange ones in the database
- applied_all = MigrationHistory.objects.filter(applied__isnull=False).order_by('applied').using(database)
- applied = applied_all.filter(app_name=app_label).using(database)
- south.db.db = south.db.dbs[database]
- Migrations.invalidate_all_modules()
-
- south.db.db.debug = (verbosity > 1)
-
- if target_name == 'current-1':
- if applied.count() > 1:
- previous_migration = applied[applied.count() - 2]
- if verbosity:
- print('previous_migration: %s (applied: %s)' % (previous_migration.migration, previous_migration.applied))
- target_name = previous_migration.migration
- else:
- if verbosity:
- print('previous_migration: zero')
- target_name = 'zero'
- elif target_name == 'current+1':
- try:
- first_unapplied_migration = get_unapplied_migrations(migrations, applied).next()
- target_name = first_unapplied_migration.name()
- except StopIteration:
- target_name = None
-
- applied_all = check_migration_histories(applied_all, delete_ghosts, ignore_ghosts)
-
- # Guess the target_name
- target = migrations.guess_migration(target_name)
- if verbosity:
- if target_name not in ('zero', None) and target.name() != target_name:
- print(" - Soft matched migration %s to %s." % (target_name,
- target.name()))
- print("Running migrations for %s:" % app_label)
-
- # Get the forwards and reverse dependencies for this target
- direction, problems, workplan = get_direction(target, applied_all, migrations,
- verbosity, interactive)
- if problems and not (merge or skip):
- raise exceptions.InconsistentMigrationHistory(problems)
-
- # Perform the migration
- migrator = get_migrator(direction, db_dry_run, fake, load_initial_data)
- if migrator:
- migrator.print_title(target)
- success = migrator.migrate_many(target, workplan, database)
- # Finally, fire off the post-migrate signal
- if success:
- post_migrate.send(None, app=app_label, verbosity=verbosity, interactive=verbosity, db=database)
- else:
- if verbosity:
- # Say there's nothing.
- print('- Nothing to migrate.')
- # If we have initial data enabled, and we're at the most recent
- # migration, do initial data.
- # Note: We use a fake Forwards() migrator here. It's never used really.
- if load_initial_data:
- migrator = LoadInitialDataMigrator(migrator=Forwards(verbosity=verbosity))
- migrator.load_initial_data(target, db=database)
- # Send signal.
- post_migrate.send(None, app=app_label, verbosity=verbosity, interactive=verbosity, db=database)