diff --git a/platformio/managers/lib.py b/platformio/managers/lib.py index ea5b343f..68bc1ce7 100644 --- a/platformio/managers/lib.py +++ b/platformio/managers/lib.py @@ -237,6 +237,7 @@ class LibraryManager(BasePkgManager): silent=False, trigger_event=True, interactive=False): + pkg_dir = None try: _name, _requirements, _url = self.parse_pkg_input(name, requirements) @@ -254,6 +255,9 @@ class LibraryManager(BasePkgManager): click.secho(str(e), fg="yellow") return + if not pkg_dir: + return + manifest = self.load_manifest(pkg_dir) if "dependencies" not in manifest: return pkg_dir diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 1f9bffd6..69fd0d83 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -470,6 +470,9 @@ class PkgInstallerMixin(object): class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): + # Handle circle dependencies + INSTALL_HISTORY = None + def __init__(self, package_dir, repositories=None): self.repositories = repositories self.package_dir = package_dir @@ -592,6 +595,15 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): requirements=None, silent=False, trigger_event=True): + + # avoid circle dependencies + if not BasePkgManager.INSTALL_HISTORY: + BasePkgManager.INSTALL_HISTORY = [] + history_key = "%s-%s" % (name, requirements) if requirements else name + if history_key in BasePkgManager.INSTALL_HISTORY: + return + BasePkgManager.INSTALL_HISTORY.append(history_key) + name, requirements, url = self.parse_pkg_input(name, requirements) package_dir = self.get_package_dir(name, requirements, url)