summaryrefslogtreecommitdiffstats
path: root/flake/packages.nix
blob: 15aa910bd722916e806ebad4c78669b3b25a8a10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
{
  inputs,
  lib,
  self,
  system,
  ...
}: let
  pkgs = inputs.nixpkgs.legacyPackages.${system};

  inherit (lib.customisation) makeScope;
  inherit (lib.attrsets) isDerivation isAttrs concatMapAttrs;
  inherit (lib.strings) concatStringsSep;
  inherit (lib.filesystem) packagesFromDirectoryRecursive;

  # Entrypoint for nvf documentation and relevant packages.
  docs = import ../docs {inherit pkgs inputs lib;};

  # Helper function for creating demo configurations for nvf
  # TODO: make this more generic.
  buildPkg = maximal:
    (lib.nvim.neovimConfiguration {
      inherit pkgs;
      modules = [(import ../configuration.nix maximal)];
    }).neovim;

  # This constructs a by-name overlay similar to the one found in Nixpkgs.
  # The goal is to automatically discover and packages found in pkgs/by-name
  # as long as they have a 'package.nix' in the package directory. We also
  # pass 'inputs' and 'pins' to all packages in the 'callPackage' scope, therefore
  # they are always available in the relevant 'package.nix' files.
  # ---
  # The logic is borrowed from drupol/pkgs-by-name-for-flake-parts, available
  # under the MIT license.
  flattenPkgs = separator: path: value:
    if isDerivation value
    then {
      ${concatStringsSep separator path} = value;
    }
    else if isAttrs value
    then concatMapAttrs (name: flattenPkgs separator (path ++ [name])) value
    else
      # Ignore the functions which makeScope returns
      {};

  inputsScope = makeScope pkgs.newScope (_: {
    inherit inputs;
    inherit (self) pins;
  });

  scopeFromDirectory = directory:
    packagesFromDirectoryRecursive {
      inherit directory;
      inherit (inputsScope) newScope callPackage;
    };

  legacyPackages = scopeFromDirectory ./pkgs/by-name;
in
  (flattenPkgs "/" [] legacyPackages)
  // {
    inherit (docs.manual) htmlOpenTool;

    # Documentation
    docs = docs.manual.html;
    docs-html = docs.manual.html;
    docs-manpages = docs.manPages;
    docs-json = docs.options.json;
    docs-linkcheck = let
      site = self.packages.${system}.docs;
    in
      pkgs.testers.lycheeLinkCheck {
        inherit site;

        remap = {
          "https://notashelf.github.io/nvf/" = "${site}/share/doc/";
          "https://nvf.notashelf.dev/" = "${site}/share/doc/";
        };

        extraConfig = {
          exclude = [
            # This is not an email, but just part of an SCM query inside a nix code block.
            # The leading escaped non breaking space is there on purpose.
            "%C2%A0@injection.content"
          ];
          include_mail = true;
          include_verbatim = true;
        };
      };

    # Helper utility for building the HTML manual and opening it in the
    # browser with $BROWSER or using xdg-open as a fallback tool.
    # Adapted from Home-Manager, available under the MIT license.
    docs-html-wrapped = let
      xdg-open = lib.getExe' pkgs.xdg-utils "xdg-open";
      docs-html = docs.manual.html + /share/doc/nvf;
    in
      pkgs.writeShellScriptBin "docs-html-wrapped" ''
        set -euo pipefail

        if [[ ! -v BROWSER || -z $BROWSER ]]; then
          for candidate in xdg-open open w3m; do
          BROWSER="$(type -P $candidate || true)"
            if [[ -x $BROWSER ]]; then
              break;
            fi
          done
        fi

        if [[ ! -v BROWSER || -z $BROWSER ]]; then
          echo "$0: unable to start a web browser; please set \$BROWSER"
          echo "$0: Trying xdg-open as a fallback"
          ${xdg-open} ${docs-html}/index.xhtml
        else
          echo "\$BROWSER is set. Attempting to open manual"
          exec "$BROWSER" "${docs-html}/index.xhtml"
        fi
      '';

    # Exposed neovim configurations
    nix = buildPkg false;
    maximal = buildPkg true;
    default = self.packages.${system}.nix;
  }