githoot

Integrations

Portals are where pull requests come from. Integrations are where they can go: what GitHoot may do with the pull requests it finds, beyond showing them. Today there is one, the Herdr dispatcher. The seam is there so the next one is one new directory, not edits across the app.

Installed means switched on

Every integration ships inside GitHoot. Integrations in the settings pages lists them, each with an Install button, or Uninstall once it is installed, and each has a page with:

No restart anywhere: the runner reads config.txt on every pass.

Where a build cannot run an integration, it is still listed, as Not available here, with the reason and no Install button. The list of what exists is the same on every platform.

Why not plugins

An integration is code inside the binary, not a program GitHoot starts. That is deliberate. The dispatcher was an external script until 2.4.0, and being external was the problem: Task Scheduler gave it a console window on Windows, the ways around that are what antivirus flags, and bash and PowerShell versions of the same rules drifted. Plugins would bring all of that back for every integration, plus a protocol to keep compatible forever and GitHoot starting programs it did not ship.

Scripts of your own already have a door: the local API serves the same judged lists as JSON.

The shape

Everything about one integration lives under src/integration/<id>/. The core (config, page, serve, main) knows the list in integration::all() and the Integration trait, and nothing about any one of them.

What an integration is given

When it runs

One thread runs every installed integration, off the poll thread, so a slow git fetch never holds up the icon. It wakes right after each poll publishes, and at least every thirty seconds, which is also how soon an Install takes effect.

What a pass did is logged at info level; what went wrong with a pull request at error level, every time; what is wrong with the setup, such as a missing tool or a folder that is not there, at error level once until it changes.