mirror of
https://github.com/nix-community/home-manager
synced 2024-12-27 12:19:48 +01:00
9f9e277b60
These (and the `*MD` functions apart from `literalMD`) are now no-ops in nixpkgs and serve no purpose other than to add additional noise and potentially mislead people into thinking unmarked DocBook documentation will still be accepted. Note that if backporting changes including documentation to 23.05, the `mdDoc` calls will need to be re-added. To reproduce this commit, run: $ NIX_PATH=nixpkgs=flake:nixpkgs/e7e69199f0372364a6106a1e735f68604f4c5a25 \ nix shell nixpkgs#coreutils \ -c find . -name '*.nix' \ -exec nix run -- github:emilazy/nix-doc-munge/98dadf1f77351c2ba5dcb709a2a171d655f15099 \ --strip {} + $ ./format
187 lines
5.3 KiB
Nix
187 lines
5.3 KiB
Nix
{ config, options, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
# TODO: Fix the formatting of the resulting config.
|
|
let
|
|
cfg = config.services.recoll;
|
|
|
|
# The key-value generator for Recoll config format. For future references,
|
|
# see the example configuration from the package (i.e.,
|
|
# `$out/share/recoll/examples/recoll.conf`).
|
|
mkRecollConfKeyValue = generators.mkKeyValueDefault {
|
|
mkValueString = let mkQuoted = v: ''"${escape [ ''"'' ] v}"'';
|
|
in v:
|
|
if v == true then
|
|
"1"
|
|
else if v == false then
|
|
"0"
|
|
else if isList v then
|
|
concatMapStringsSep " " mkQuoted v
|
|
else
|
|
generators.mkValueStringDefault { } v;
|
|
} " = ";
|
|
|
|
# A modified version of 'lib.generators.toINI' that also accepts top-level
|
|
# attributes as non-attrsets.
|
|
toRecollConf = { listsAsDuplicateKeys ? false }:
|
|
attr:
|
|
let
|
|
toKeyValue = generators.toKeyValue {
|
|
inherit listsAsDuplicateKeys;
|
|
mkKeyValue = mkRecollConfKeyValue;
|
|
};
|
|
mkSectionName = name: strings.escape [ "[" "]" ] name;
|
|
convert = k: v:
|
|
if isAttrs v then
|
|
''
|
|
[${mkSectionName k}]
|
|
'' + toKeyValue v
|
|
else
|
|
toKeyValue { "${k}" = v; };
|
|
|
|
# TODO: Improve this chunk of code, pls.
|
|
# There's a possibility of attributes with attrsets overriding other
|
|
# top-level attributes with non-attrsets so we're forcing the attrsets to
|
|
# come last.
|
|
_config = mapAttrsToList convert (filterAttrs (k: v: !isAttrs v) attr);
|
|
_config' = mapAttrsToList convert (filterAttrs (k: v: isAttrs v) attr);
|
|
config = _config ++ _config';
|
|
in concatStringsSep "\n" config;
|
|
|
|
# A specific type for Recoll config format. Taken from `pkgs.formats`
|
|
# implementation from nixpkgs. See the 'Nix-representable formats' from the
|
|
# NixOS manual for more information.
|
|
recollConfFormat = { }: {
|
|
type = with types;
|
|
let
|
|
valueType = nullOr (oneOf [
|
|
bool
|
|
float
|
|
int
|
|
path
|
|
str
|
|
(attrsOf valueType)
|
|
(listOf valueType)
|
|
]) // {
|
|
description = "Recoll config value";
|
|
};
|
|
in attrsOf valueType;
|
|
|
|
generate = name: value: pkgs.writeText name (toRecollConf { } value);
|
|
};
|
|
|
|
# The actual object we're going to use for this module. This is for the sake
|
|
# of consistency (and dogfooding the settings format implementation).
|
|
settingsFormat = recollConfFormat { };
|
|
in {
|
|
meta.maintainers = [ maintainers.foo-dogsquared ];
|
|
|
|
options.services.recoll = {
|
|
enable = mkEnableOption "Recoll file index service";
|
|
|
|
package = mkOption {
|
|
type = types.package;
|
|
default = pkgs.recoll;
|
|
defaultText = literalExpression "pkgs.recoll";
|
|
description = ''
|
|
Package providing the `recoll` binary.
|
|
'';
|
|
example = literalExpression "(pkgs.recoll.override { withGui = false; })";
|
|
};
|
|
|
|
startAt = mkOption {
|
|
type = types.str;
|
|
default = "hourly";
|
|
example = "00/2:00";
|
|
description = ''
|
|
When or how often the periodic update should run. Must be the format
|
|
described from
|
|
{manpage}`systemd.time(7)`.
|
|
'';
|
|
};
|
|
|
|
settings = mkOption {
|
|
type = settingsFormat.type;
|
|
default = { };
|
|
description = ''
|
|
The configuration to be written at
|
|
{file}`''${config.services.recoll.configDir}/recoll.conf`.
|
|
|
|
See
|
|
{manpage}`recoll(5)` for more details about the configuration.
|
|
'';
|
|
example = literalExpression ''
|
|
{
|
|
nocjk = true;
|
|
loglevel = 5;
|
|
topdirs = [ "~/Downloads" "~/Documents" "~/projects" ];
|
|
|
|
"~/Downloads" = {
|
|
"skippedNames+" = [ "*.iso" ];
|
|
};
|
|
|
|
"~/projects" = {
|
|
"skippedNames+" = [ "node_modules" "target" "result" ];
|
|
};
|
|
}
|
|
'';
|
|
};
|
|
|
|
configDir = mkOption {
|
|
type = types.str;
|
|
default = "${config.home.homeDirectory}/.recoll";
|
|
defaultText = literalExpression "\${config.home.homeDirectory}/.recoll";
|
|
example = literalExpression "\${config.xdg.configHome}/recoll";
|
|
description = ''
|
|
The directory to contain Recoll configuration files. This will be set
|
|
as `RECOLL_CONFDIR`.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
assertions = [
|
|
(lib.hm.assertions.assertPlatform "services.recoll" pkgs
|
|
lib.platforms.linux)
|
|
];
|
|
|
|
home.packages = [ cfg.package ];
|
|
|
|
home.sessionVariables = { RECOLL_CONFDIR = cfg.configDir; };
|
|
|
|
home.file."${cfg.configDir}/recoll.conf".source =
|
|
settingsFormat.generate "recoll-conf-${config.home.username}"
|
|
cfg.settings;
|
|
|
|
systemd.user.services.recollindex = {
|
|
Unit = {
|
|
Description = "Recoll index update";
|
|
Documentation = [
|
|
"man:recoll"
|
|
"man:recollindex"
|
|
"https://www.lesbonscomptes.com/recoll/usermanual/"
|
|
];
|
|
};
|
|
|
|
Service = {
|
|
ExecStart = "${cfg.package}/bin/recollindex";
|
|
Environment = [ "RECOLL_CONFDIR=${escapeShellArg cfg.configDir}" ];
|
|
};
|
|
};
|
|
|
|
systemd.user.timers.recollindex = {
|
|
Unit = {
|
|
Description = "Recoll index update";
|
|
PartOf = [ "default.target" ];
|
|
};
|
|
|
|
Timer = {
|
|
Persistent = true;
|
|
OnCalendar = cfg.startAt;
|
|
};
|
|
|
|
Install.WantedBy = [ "timers.target" ];
|
|
};
|
|
};
|
|
}
|