{
  lib,
  helpers,
  config,
  pkgs,
  ...
}:
with lib;
  helpers.neovim-plugin.mkNeovimPlugin config {
    name = "neogit";
    defaultPackage = pkgs.vimPlugins.neogit;
    extraPackages = [pkgs.git];

    maintainers = [maintainers.GaetanLepage];

    # TODO introduced 2024-02-29: remove 2024-04-29
    deprecateExtraOptions = true;
    imports =
      map (
        optionPath:
          mkRemovedOptionModule
          (["plugins" "neogit"] ++ optionPath)
          "This option has been removed upstream. Please refer to the plugin documentation to update your configuration."
      )
      [
        ["disableCommitConfirmation"]
        ["disableBuiltinNotifications"]
        ["useMagitKeybindings "]
        ["commitPopup"]
        ["sections" "unmerged"]
        ["sections" "unpulled"]
      ];
    optionsRenamedToSettings = [
      "disableSigns"
      "disableHint"
      "disableContextHighlighting"
      "autoRefresh"
      "graphStyle"
      "kind"
      "signs"
      "integrations"
      ["sections" "untracked"]
      ["sections" "unstaged"]
      ["sections" "staged"]
      ["sections" "stashes"]
      ["sections" "recent"]
      "mappings"
    ];

    settingsOptions = import ./options.nix {inherit lib helpers;};

    settingsExample = {
      kind = "floating";
      commit_popup.kind = "floating";
      preview_buffer.kind = "floating";
      popup.kind = "floating";
      integrations.diffview = false;
      disable_commit_confirmation = true;
      disable_builtin_notifications = true;
      sections = {
        untracked.folded = false;
        unstaged.folded = false;
        staged.folded = false;
        stashes.folded = false;
        unpulled.folded = false;
        unmerged.folded = true;
        recent.folded = true;
      };
      mappings = {
        status = {
          l = "Toggle";
          a = "Stage";
        };
      };
    };

    extraConfig = cfg: {
      assertions =
        map
        (
          name: {
            assertion = let
              enabled = cfg.settings.integrations.${name};
              isEnabled = (isBool enabled) && enabled;
            in
              isEnabled
              -> config.plugins.${name}.enable;
            message = ''
              Nixvim (plugins.neogit): You have enabled the `${name}` integration, but `plugins.${name}.enable` is `false`.
            '';
          }
        )
        [
          "telescope"
          "diffview"
          "fzf-lua"
        ];

      extraPackages =
        optional
        (hasInfix "which" (cfg.settings.commit_view.verify_commit.__raw or ""))
        pkgs.which;
    };
  }