diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2015-08-22 11:39:33 +1000 |
|---|---|---|
| committer | Markus Holtermann <info@markusholtermann.eu> | 2015-08-27 09:52:53 +1000 |
| commit | 91f701f4fc324cd2feb7dbf151338a358ca0ea18 (patch) | |
| tree | d8373e20ec7ec1f9d281e03297dd06a45e301cb2 /django/db | |
| parent | 1175027641f512d33909cb766563328c6b171578 (diff) | |
Fixed #25280 -- Properly checked regex objects for equality to prevent infinite migrations
Thanks Sayid Munawar and Tim Graham for the report, investigation and
review.
Diffstat (limited to 'django/db')
| -rw-r--r-- | django/db/migrations/autodetector.py | 3 | ||||
| -rw-r--r-- | django/db/migrations/utils.py | 12 | ||||
| -rw-r--r-- | django/db/migrations/writer.py | 5 |
3 files changed, 17 insertions, 3 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 41830f06ba..b2181818ea 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -11,6 +11,7 @@ from django.db.migrations.migration import Migration from django.db.migrations.operations.models import AlterModelOptions from django.db.migrations.optimizer import MigrationOptimizer from django.db.migrations.questioner import MigrationQuestioner +from django.db.migrations.utils import COMPILED_REGEX_TYPE, RegexObject from django.utils import six from .topological_sort import stable_topological_sort @@ -62,6 +63,8 @@ class MigrationAutodetector(object): key: self.deep_deconstruct(value) for key, value in obj.items() } + elif isinstance(obj, COMPILED_REGEX_TYPE): + return RegexObject(obj) elif isinstance(obj, type): # If this is a type that implements 'deconstruct' as an instance method, # avoid treating this as being deconstructible itself - see #22951 diff --git a/django/db/migrations/utils.py b/django/db/migrations/utils.py new file mode 100644 index 0000000000..5bea82dc51 --- /dev/null +++ b/django/db/migrations/utils.py @@ -0,0 +1,12 @@ +import re + +COMPILED_REGEX_TYPE = type(re.compile('')) + + +class RegexObject(object): + def __init__(self, obj): + self.pattern = obj.pattern + self.flags = obj.flags + + def __eq__(self, other): + return self.pattern == other.pattern and self.flags == other.flags diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py index 44a4017f30..fb6a162b38 100644 --- a/django/db/migrations/writer.py +++ b/django/db/migrations/writer.py @@ -14,6 +14,7 @@ from django.apps import apps from django.db import migrations, models from django.db.migrations.loader import MigrationLoader from django.db.migrations.operations.base import Operation +from django.db.migrations.utils import COMPILED_REGEX_TYPE, RegexObject from django.utils import datetime_safe, six from django.utils._os import upath from django.utils.encoding import force_text @@ -23,8 +24,6 @@ from django.utils.module_loading import module_dir from django.utils.timezone import utc from django.utils.version import get_docs_version -COMPILED_REGEX_TYPE = type(re.compile('')) - class SettingsReference(str): """ @@ -506,7 +505,7 @@ class MigrationWriter(object): format = "(%s)" if len(strings) != 1 else "(%s,)" return format % (", ".join(strings)), imports # Compiled regex - elif isinstance(value, COMPILED_REGEX_TYPE): + elif isinstance(value, (COMPILED_REGEX_TYPE, RegexObject)): imports = {"import re"} regex_pattern, pattern_imports = cls.serialize(value.pattern) regex_flags, flag_imports = cls.serialize(value.flags) |
