summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Godwin <andrew@aeracode.org>2014-07-11 18:59:21 -0700
committerAndrew Godwin <andrew@aeracode.org>2014-07-11 19:00:39 -0700
commitebb13bbd884d8c3053d1d342ef0423240feb05e6 (patch)
tree2148f52e6d149724e2f446057bf8845f7057fafd
parent4e4c10bc6155d4a0eab117ad4c8afdf53853f5e0 (diff)
Fixed #22983: Alert when squashing RunPython operations with referred functions.
-rw-r--r--django/core/management/commands/squashmigrations.py6
-rw-r--r--django/db/migrations/writer.py14
2 files changed, 19 insertions, 1 deletions
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: