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__.
This commit is contained in:
Jeroen Dekkers 2014-07-14 21:09:33 +02:00
parent b4cf7e3d1d
commit 3582698c13
9 changed files with 9 additions and 65 deletions

View File

@ -254,13 +254,13 @@ class MigrationAutodetector(object):
# If we can't find the other app, we add a first/last dependency, # 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 # but only if we've already been through once and checked everything
if chop_mode: if chop_mode:
# If the app already exists, we add __latest__, as we don't know which # If the app already exists, we add a dependency on the last migration,
# migration contains the target field. # 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 it's not yet migrated or has no migrations, we use __first__
if graph and not graph.root_nodes(dep[0]): if graph and graph.leaf_nodes(dep[0]):
operation_dependencies.add((dep[0], "__first__")) operation_dependencies.add(graph.leaf_nodes(dep[0])[0])
else: else:
operation_dependencies.add((dep[0], "__latest__")) operation_dependencies.add((dep[0], "__first__"))
else: else:
deps_satisfied = False deps_satisfied = False
if deps_satisfied: if deps_satisfied:

View File

@ -136,7 +136,7 @@ class MigrationLoader(object):
return self.disk_migrations[results[0]] return self.disk_migrations[results[0]]
def check_key(self, key, current_app): 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 return key
# Special-case __first__, which means "the first migration" for # Special-case __first__, which means "the first migration" for
# migrated apps, and is ignored for unmigrated apps. It allows # migrated apps, and is ignored for unmigrated apps. It allows

View File

@ -1059,7 +1059,8 @@ class AutodetectorTests(TestCase):
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
def test_last_dependency(self): 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 # Load graph
loader = MigrationLoader(connection) loader = MigrationLoader(connection)
@ -1074,4 +1075,4 @@ class AutodetectorTests(TestCase):
self.assertOperationTypes(changes, 'otherapp', 0, ["CreateModel"]) self.assertOperationTypes(changes, 'otherapp', 0, ["CreateModel"])
self.assertOperationAttributes(changes, 'otherapp', 0, 0, name="Book") self.assertOperationAttributes(changes, 'otherapp', 0, 0, name="Book")
# Right dependencies? # Right dependencies?
self.assertEqual(changes['otherapp'][0].dependencies, [("migrations", "__latest__")]) self.assertEqual(changes['otherapp'][0].dependencies, [("migrations", "0002_second")])

View File

@ -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={ @override_settings(MIGRATION_MODULES={
"migrations": "migrations.test_migrations_first", "migrations": "migrations.test_migrations_first",
"migrations2": "migrations2.test_migrations_2_first", "migrations2": "migrations2.test_migrations_2_first",

View File

@ -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 = []

View File

@ -1,11 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = []
operations = []

View File

@ -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 = []