Fixed #26647 -- Included the state of all applied migrations when migrating forward.
Thanks Jasper Maes for the detailed report.
This commit is contained in:
parent
30d110ef43
commit
36d36818a3
|
@ -116,8 +116,8 @@ class MigrationExecutor(object):
|
||||||
if key in self.loader.graph.nodes
|
if key in self.loader.graph.nodes
|
||||||
}
|
}
|
||||||
for migration, _ in full_plan:
|
for migration, _ in full_plan:
|
||||||
if not migrations_to_run:
|
if not migrations_to_run and not applied_migrations:
|
||||||
# We remove every migration that we applied from this set so
|
# We remove every migration that we applied from these sets so
|
||||||
# that we can bail out once the last migration has been applied
|
# that we can bail out once the last migration has been applied
|
||||||
# and don't always run until the very end of the migration
|
# and don't always run until the very end of the migration
|
||||||
# process.
|
# process.
|
||||||
|
@ -136,6 +136,7 @@ class MigrationExecutor(object):
|
||||||
# to make sure the resulting state doesn't include changes
|
# to make sure the resulting state doesn't include changes
|
||||||
# from unrelated migrations.
|
# from unrelated migrations.
|
||||||
migration.mutate_state(state, preserve=False)
|
migration.mutate_state(state, preserve=False)
|
||||||
|
applied_migrations.remove(migration)
|
||||||
|
|
||||||
return state
|
return state
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mutate_state_b', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.SeparateDatabaseAndState([], [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='A',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(serialize=False, verbose_name='ID', auto_created=True, primary_key=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
])
|
||||||
|
]
|
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.SeparateDatabaseAndState([], [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='B',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(serialize=False, verbose_name='ID', auto_created=True, primary_key=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
])
|
||||||
|
]
|
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mutate_state_b', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.SeparateDatabaseAndState([], [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='B',
|
||||||
|
name='added',
|
||||||
|
field=models.TextField(),
|
||||||
|
),
|
||||||
|
])
|
||||||
|
]
|
|
@ -477,6 +477,34 @@ class ExecutorTests(MigrationTestBase):
|
||||||
self.assertTableNotExists("lookuperror_b_b1")
|
self.assertTableNotExists("lookuperror_b_b1")
|
||||||
self.assertTableNotExists("lookuperror_c_c1")
|
self.assertTableNotExists("lookuperror_c_c1")
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
INSTALLED_APPS=[
|
||||||
|
'migrations.migrations_test_apps.mutate_state_a',
|
||||||
|
'migrations.migrations_test_apps.mutate_state_b',
|
||||||
|
]
|
||||||
|
)
|
||||||
|
def test_unrelated_applied_migrations_mutate_state(self):
|
||||||
|
"""
|
||||||
|
#26647 - Unrelated applied migrations should be part of the final
|
||||||
|
state in both directions.
|
||||||
|
"""
|
||||||
|
executor = MigrationExecutor(connection)
|
||||||
|
executor.migrate([
|
||||||
|
('mutate_state_b', '0002_add_field'),
|
||||||
|
])
|
||||||
|
# Migrate forward.
|
||||||
|
executor.loader.build_graph()
|
||||||
|
state = executor.migrate([
|
||||||
|
('mutate_state_a', '0001_initial'),
|
||||||
|
])
|
||||||
|
self.assertIn('added', dict(state.models['mutate_state_b', 'b'].fields))
|
||||||
|
executor.loader.build_graph()
|
||||||
|
# Migrate backward.
|
||||||
|
state = executor.migrate([
|
||||||
|
('mutate_state_a', None),
|
||||||
|
])
|
||||||
|
self.assertIn('added', dict(state.models['mutate_state_b', 'b'].fields))
|
||||||
|
|
||||||
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
|
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
|
||||||
def test_process_callback(self):
|
def test_process_callback(self):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue