Commit ebb13bbd authored by Andrew Godwin's avatar Andrew Godwin
Browse files

Fixed #22983: Alert when squashing RunPython operations with referred functions.

parent 4e4c10bc
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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.")
+13 −1
Original line number Diff line number Diff line
@@ -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: