From d6861ceff031a372e4ec9f2d096ca3061d6b6295 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 18 Oct 2023 03:52:37 -0400 Subject: [PATCH] Safer fold markers (old version was getting maximum recursion depth exceeded). --- pipenv/utils/resolver.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pipenv/utils/resolver.py b/pipenv/utils/resolver.py index 06c8c8cb..f4b1af82 100644 --- a/pipenv/utils/resolver.py +++ b/pipenv/utils/resolver.py @@ -463,15 +463,26 @@ class Resolver: return " and ".join(combined_markers).strip() - def _fold_markers(self, dependency_tree, install_req): + def _fold_markers(self, dependency_tree, install_req, checked_dependencies=None): + if checked_dependencies is None: + checked_dependencies = set() + comes_from = dependency_tree[install_req.name] + # Check for recursion loop + if comes_from.name in checked_dependencies: + return None # Or raise an error or handle cyclic dependencies differently + + checked_dependencies.add(install_req.name) + if comes_from == "Pipfile": pipfile_entry = self.pipfile_entries.get(install_req.name) if pipfile_entry and isinstance(pipfile_entry, dict): return self._get_pipfile_markers(pipfile_entry) else: - markers = self._fold_markers(dependency_tree, comes_from) + markers = self._fold_markers( + dependency_tree, comes_from, checked_dependencies + ) if markers: self.markers_lookup[install_req.name] = markers return markers