summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorMatthias Kestenholz <mk@feinheit.ch>2019-02-24 13:08:59 +0100
committerTim Graham <timograham@gmail.com>2019-02-27 17:16:48 -0500
commit77e53da127cfb5d4f0c9a3540a02ff24f04fe9e2 (patch)
treec5232cbd37b89992db48755f30d2106e683d0ef8 /django/db
parentd29c8ea124d4c19e23f73b8a307dd177d8a1fe7b (diff)
[2.2.x] Refs #30179 -- Moved topological sort functions to django.utils.
Backport of e04209e181c99ac16ca769d115ac640015a83757 from master.
Diffstat (limited to 'django/db')
-rw-r--r--django/db/migrations/autodetector.py3
-rw-r--r--django/db/migrations/topological_sort.py32
2 files changed, 1 insertions, 34 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py
index 3d3eeb9230..0dc1c77c53 100644
--- a/django/db/migrations/autodetector.py
+++ b/django/db/migrations/autodetector.py
@@ -12,8 +12,7 @@ from django.db.migrations.questioner import MigrationQuestioner
from django.db.migrations.utils import (
COMPILED_REGEX_TYPE, RegexObject, get_migration_name_timestamp,
)
-
-from .topological_sort import stable_topological_sort
+from django.utils.topological_sort import stable_topological_sort
class MigrationAutodetector:
diff --git a/django/db/migrations/topological_sort.py b/django/db/migrations/topological_sort.py
deleted file mode 100644
index e0a22c9236..0000000000
--- a/django/db/migrations/topological_sort.py
+++ /dev/null
@@ -1,32 +0,0 @@
-def topological_sort_as_sets(dependency_graph):
- """
- Variation of Kahn's algorithm (1962) that returns sets.
-
- Take a dependency graph as a dictionary of node => dependencies.
-
- Yield sets of items in topological order, where the first set contains
- all nodes without dependencies, and each following set contains all
- nodes that may depend on the nodes only in the previously yielded sets.
- """
- todo = dependency_graph.copy()
- while todo:
- current = {node for node, deps in todo.items() if not deps}
-
- if not current:
- raise ValueError('Cyclic dependency in graph: {}'.format(
- ', '.join(repr(x) for x in todo.items())))
-
- yield current
-
- # remove current from todo's nodes & dependencies
- todo = {node: (dependencies - current) for node, dependencies in
- todo.items() if node not in current}
-
-
-def stable_topological_sort(l, dependency_graph):
- result = []
- for layer in topological_sort_as_sets(dependency_graph):
- for node in l:
- if node in layer:
- result.append(node)
- return result