From ebb13bbd884d8c3053d1d342ef0423240feb05e6 Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Fri, 11 Jul 2014 18:59:21 -0700 Subject: [PATCH] Fixed #22983: Alert when squashing RunPython operations with referred functions. --- .../core/management/commands/squashmigrations.py | 6 ++++++ django/db/migrations/writer.py | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/django/core/management/commands/squashmigrations.py b/django/core/management/commands/squashmigrations.py index 7e559f1a76..0bb50bea6c 100644 --- a/django/core/management/commands/squashmigrations.py +++ b/django/core/management/commands/squashmigrations.py @@ -107,3 +107,9 @@ class Command(BaseCommand): self.stdout.write(" the new migration will be used for new installs. Once you are sure") self.stdout.write(" all instances of the codebase have applied the migrations you squashed,") self.stdout.write(" you can delete them.") + if writer.needs_manual_porting: + self.stdout.write(self.style.MIGRATE_HEADING("Manual porting required")) + self.stdout.write(" Your migrations contained functions that must be manually copied over,") + self.stdout.write(" as we could not safely copy their implementation.") + self.stdout.write(" See the comment at the top of the squashed migration for details.") + diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py index dbeaae184c..593bff902d 100644 --- a/django/db/migrations/writer.py +++ b/django/db/migrations/writer.py @@ -111,6 +111,7 @@ class MigrationWriter(object): def __init__(self, migration): self.migration = migration + self.needs_manual_porting = False def as_string(self): """ @@ -142,9 +143,20 @@ class MigrationWriter(object): dependencies.append(" %s," % self.serialize(dependency)[0]) items["dependencies"] = "\n".join(dependencies) + "\n" if dependencies else "" - # Format imports nicely + # Format imports nicely, swapping imports of functions from migration files + # for comments + migration_imports = set() + for line in list(imports): + if re.match("^import (.*)\.\d+[^\s]*$", line): + migration_imports.add(line.split("import")[1].strip()) + imports.remove(line) + self.needs_manual_porting = True imports.discard("from django.db import models") items["imports"] = "\n".join(imports) + "\n" if imports else "" + if migration_imports: + items["imports"] += "\n\n# Functions from the following migrations need manual copying.\n# Move them and any dependencies into this file, then update the\n# RunPython operations to refer to the local versions:\n# %s" % ( + "\n# ".join(migration_imports) + ) # If there's a replaces, make a string for it if self.migration.replaces: