1
0
Fork 0
mirror of synced 2024-12-22 06:01:07 -05:00

Fix issue with duplicate execution of plugins

This commit is contained in:
Anish Athalye 2024-12-07 17:29:45 -05:00
parent 8c2dc8cbc6
commit cef40c902e
3 changed files with 37 additions and 0 deletions

View file

@ -131,6 +131,11 @@ def main():
for plugin_path in plugin_paths: for plugin_path in plugin_paths:
abspath = os.path.abspath(plugin_path) abspath = os.path.abspath(plugin_path)
plugins.extend(module.load(abspath)) plugins.extend(module.load(abspath))
# ensure plugins are unique to avoid duplicate execution, which
# can happen if, for example, a third-party plugin loads a
# built-in plugin, which will cause it to appear in the list
# returned by module.load above
plugins = set(plugins)
if not options.config_file: if not options.config_file:
log.error("No configuration file specified") log.error("No configuration file specified")
exit(1) exit(1)

View file

@ -0,0 +1,17 @@
import os
from dotbot.plugin import Plugin
from dotbot.plugins import Clean, Create, Link, Shell
# https://github.com/anishathalye/dotbot/issues/357
# if we import from dotbot.plugins, the built-in plugins get executed multiple times
class NoopPlugin(Plugin):
_directive = "noop"
def can_handle(self, directive):
return directive == self._directive
def handle(self, directive, data):
return True

View file

@ -159,6 +159,21 @@ def test_plugin_loading_directory(home, dotfiles, run_dotbot):
assert file.read() == "directory plugin loading works" assert file.read() == "directory plugin loading works"
def test_issue_357(capfd, home, dotfiles, run_dotbot):
"""Verify that built-in plugins are only executed once, when
using a plugin that imports from dotbot.plugins."""
plugin_file = os.path.join(
os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_issue_357.py"
)
dotfiles.write_config([{"shell": [{"command": "echo apple", "stdout": True}]}])
run_dotbot("--plugin", plugin_file)
assert (
len([line for line in capfd.readouterr().out.splitlines() if line.strip() == "apple"]) == 1
)
def test_disable_builtin_plugins(home, dotfiles, run_dotbot): def test_disable_builtin_plugins(home, dotfiles, run_dotbot):
"""Verify that builtin plugins can be disabled.""" """Verify that builtin plugins can be disabled."""