Skip to content

Commit

Permalink
Fix issue with duplicate execution of plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
anishathalye committed Dec 7, 2024
1 parent 8c2dc8c commit a63e9ef
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
5 changes: 5 additions & 0 deletions dotbot/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ def main():
for plugin_path in plugin_paths:
abspath = os.path.abspath(plugin_path)
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:
log.error("No configuration file specified")
exit(1)
Expand Down
15 changes: 15 additions & 0 deletions tests/dotbot_plugin_issue_357.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
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
13 changes: 13 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,19 @@ def test_plugin_loading_directory(home, dotfiles, run_dotbot):
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):
"""Verify that builtin plugins can be disabled."""

Expand Down

0 comments on commit a63e9ef

Please sign in to comment.