From 3582698c138a7a311d12a57d0b35359815e8dbc9 Mon Sep 17 00:00:00 2001 From: Jeroen Dekkers Date: Mon, 14 Jul 2014 21:09:33 +0200 Subject: [PATCH] Fixed #23071 -- Use last migration's name in dependency to other app Changed the autodetector to lookup the name of the other app's last migration in the graph and use that as dependency instead of using __latest__. --- django/db/migrations/autodetector.py | 10 +++++----- django/db/migrations/loader.py | 2 +- tests/migrations/test_autodetector.py | 5 +++-- tests/migrations/test_loader.py | 20 ------------------- .../test_migrations_latest/0001_initial.py | 13 ------------ .../test_migrations_latest/__init__.py | 0 .../0001_initial.py | 11 ---------- .../0002_second.py | 13 ------------ .../test_migrations_latest_basic/__init__.py | 0 9 files changed, 9 insertions(+), 65 deletions(-) delete mode 100644 tests/migrations/test_migrations_latest/0001_initial.py delete mode 100644 tests/migrations/test_migrations_latest/__init__.py delete mode 100644 tests/migrations/test_migrations_latest_basic/0001_initial.py delete mode 100644 tests/migrations/test_migrations_latest_basic/0002_second.py delete mode 100644 tests/migrations/test_migrations_latest_basic/__init__.py diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 37824e169c..382486ffbe 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -254,13 +254,13 @@ class MigrationAutodetector(object): # If we can't find the other app, we add a first/last dependency, # but only if we've already been through once and checked everything if chop_mode: - # If the app already exists, we add __latest__, as we don't know which - # migration contains the target field. + # If the app already exists, we add a dependency on the last migration, + # as we don't know which migration contains the target field. # If it's not yet migrated or has no migrations, we use __first__ - if graph and not graph.root_nodes(dep[0]): - operation_dependencies.add((dep[0], "__first__")) + if graph and graph.leaf_nodes(dep[0]): + operation_dependencies.add(graph.leaf_nodes(dep[0])[0]) else: - operation_dependencies.add((dep[0], "__latest__")) + operation_dependencies.add((dep[0], "__first__")) else: deps_satisfied = False if deps_satisfied: diff --git a/django/db/migrations/loader.py b/django/db/migrations/loader.py index 5465f0ad18..5c240ca739 100644 --- a/django/db/migrations/loader.py +++ b/django/db/migrations/loader.py @@ -136,7 +136,7 @@ class MigrationLoader(object): return self.disk_migrations[results[0]] def check_key(self, key, current_app): - if (key[1] != "__first__" and key[1] != "__latest__") or key in self.graph: + if key[1] != "__first__" or key in self.graph: return key # Special-case __first__, which means "the first migration" for # migrated apps, and is ignored for unmigrated apps. It allows diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index 2e097d9247..43ef225ae9 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -1059,7 +1059,8 @@ class AutodetectorTests(TestCase): @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) def test_last_dependency(self): """ - Tests that a dependency to an app with existing migrations uses __latest__. + Tests that a dependency to an app with existing migrations uses the + last migration of that app. """ # Load graph loader = MigrationLoader(connection) @@ -1074,4 +1075,4 @@ class AutodetectorTests(TestCase): self.assertOperationTypes(changes, 'otherapp', 0, ["CreateModel"]) self.assertOperationAttributes(changes, 'otherapp', 0, 0, name="Book") # Right dependencies? - self.assertEqual(changes['otherapp'][0].dependencies, [("migrations", "__latest__")]) + self.assertEqual(changes['otherapp'][0].dependencies, [("migrations", "0002_second")]) diff --git a/tests/migrations/test_loader.py b/tests/migrations/test_loader.py index c0f9f1a6dd..68d05d296f 100644 --- a/tests/migrations/test_loader.py +++ b/tests/migrations/test_loader.py @@ -122,26 +122,6 @@ class LoaderTests(TestCase): ], ) - @modify_settings(INSTALLED_APPS={'append': 'basic'}) - @override_settings(MIGRATION_MODULES={ - "migrations": "migrations.test_migrations_latest", - "basic": "migrations.test_migrations_latest_basic", - }) - def test_latest(self): - """ - Makes sure that __latest__ works correctly. - """ - # Load and test the plan - migration_loader = MigrationLoader(connection) - self.assertEqual( - migration_loader.graph.forwards_plan(("migrations", "0001_initial")), - [ - ("basic", "0001_initial"), - ("basic", "0002_second"), - ("migrations", "0001_initial"), - ], - ) - @override_settings(MIGRATION_MODULES={ "migrations": "migrations.test_migrations_first", "migrations2": "migrations2.test_migrations_2_first", diff --git a/tests/migrations/test_migrations_latest/0001_initial.py b/tests/migrations/test_migrations_latest/0001_initial.py deleted file mode 100644 index e16bb2152d..0000000000 --- a/tests/migrations/test_migrations_latest/0001_initial.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("basic", "__latest__"), - ] - - operations = [] diff --git a/tests/migrations/test_migrations_latest/__init__.py b/tests/migrations/test_migrations_latest/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/migrations/test_migrations_latest_basic/0001_initial.py b/tests/migrations/test_migrations_latest_basic/0001_initial.py deleted file mode 100644 index 4df0594154..0000000000 --- a/tests/migrations/test_migrations_latest_basic/0001_initial.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [] - - operations = [] diff --git a/tests/migrations/test_migrations_latest_basic/0002_second.py b/tests/migrations/test_migrations_latest_basic/0002_second.py deleted file mode 100644 index 49f5b1966c..0000000000 --- a/tests/migrations/test_migrations_latest_basic/0002_second.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("basic", "0001_initial"), - ] - - operations = [] diff --git a/tests/migrations/test_migrations_latest_basic/__init__.py b/tests/migrations/test_migrations_latest_basic/__init__.py deleted file mode 100644 index e69de29bb2..0000000000