[1.7.x] 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:
parent
d8961a5ad0
commit
6e7e5bacd5
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1057,7 +1057,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)
|
||||||
|
@ -1072,4 +1073,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")])
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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 = []
|
|
|
@ -1,11 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = []
|
|
||||||
|
|
||||||
operations = []
|
|
|
@ -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 = []
|
|
Loading…
Reference in New Issue