From d18810131995dac63f9d89b0beaeadfc935130aa Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 16 Nov 2014 18:42:23 +0100 Subject: [PATCH] Fixed #23799 -- Made makemigrations respect --no-optimize. Thanks to yamila-moreno for the idea of a skip message. --- .../management/commands/squashmigrations.py | 33 +++++++++------- docs/releases/1.7.2.txt | 3 ++ tests/migrations/test_commands.py | 39 +++++++++++++++++++ 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/django/core/management/commands/squashmigrations.py b/django/core/management/commands/squashmigrations.py index 9cd9915574..6f598757b6 100644 --- a/django/core/management/commands/squashmigrations.py +++ b/django/core/management/commands/squashmigrations.py @@ -26,7 +26,9 @@ class Command(BaseCommand): self.verbosity = options.get('verbosity') self.interactive = options.get('interactive') - app_label, migration_name = options['app_label'], options['migration_name'] + app_label = options['app_label'] + migration_name = options['migration_name'] + no_optimize = options['no_optimize'] # Load the current graph state, check the app and migration they asked for exists executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) @@ -95,20 +97,25 @@ class Command(BaseCommand): elif dependency[0] != smigration.app_label: dependencies.add(dependency) - if self.verbosity > 0: - self.stdout.write(self.style.MIGRATE_HEADING("Optimizing...")) + if no_optimize: + if self.verbosity > 0: + self.stdout.write(self.style.MIGRATE_HEADING("(Skipping optimization.)")) + new_operations = operations + else: + if self.verbosity > 0: + self.stdout.write(self.style.MIGRATE_HEADING("Optimizing...")) - optimizer = MigrationOptimizer() - new_operations = optimizer.optimize(operations, migration.app_label) + optimizer = MigrationOptimizer() + new_operations = optimizer.optimize(operations, migration.app_label) - if self.verbosity > 0: - if len(new_operations) == len(operations): - self.stdout.write(" No optimizations possible.") - else: - self.stdout.write( - " Optimized from %s operations to %s operations." % - (len(operations), len(new_operations)) - ) + if self.verbosity > 0: + if len(new_operations) == len(operations): + self.stdout.write(" No optimizations possible.") + else: + self.stdout.write( + " Optimized from %s operations to %s operations." % + (len(operations), len(new_operations)) + ) # Work out the value of replaces (any squashed ones we're re-squashing) # need to feed their replaces into ours diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 8420b5b303..0fe97a3225 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -62,3 +62,6 @@ Bugfixes * Fixed a migration crash when a field is renamed that is part of an ``index_together`` (:ticket:`23859`). + +* Fixed :djadmin:`squashmigrations` to respect the ``--no-optimize`` parameter + (:ticket:`23799`). diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index f4e3878d17..83826e819d 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -543,3 +543,42 @@ class MakeMigrationsTests(MigrationTestBase): content = cmd("0002", migration_name_0002, "--empty") self.assertIn("dependencies=[\n('migrations','0001_%s'),\n]" % migration_name_0001, content) self.assertIn("operations=[\n]", content) + + +class SquashMigrationsTest(MigrationTestBase): + """ + Tests running the squashmigrations command. + """ + + path = "migrations/test_migrations/0001_squashed_0002_second.py" + + def tearDown(self): + if os.path.exists(self.path): + os.remove(self.path) + + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) + def test_squashmigrations_squashes(self): + """ + Tests that squashmigrations squashes migrations. + """ + call_command("squashmigrations", "migrations", "0002", interactive=False, verbosity=0) + self.assertTrue(os.path.exists(self.path)) + + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) + def test_squashmigrations_optimizes(self): + """ + Tests that squashmigrations optimizes operations. + """ + out = six.StringIO() + call_command("squashmigrations", "migrations", "0002", interactive=False, verbosity=1, stdout=out) + self.assertIn("Optimized from 7 operations to 5 operations.", out.getvalue()) + + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) + def test_ticket_23799_squashmigrations_no_optimize(self): + """ + Makes sure that squashmigrations --no-optimize really doesn't optimize operations. + """ + out = six.StringIO() + call_command("squashmigrations", "migrations", "0002", + interactive=False, verbosity=1, no_optimize=True, stdout=out) + self.assertIn("Skipping optimization", out.getvalue())