forked from lix-project/lix
doc: remove utils.nix
only generate-manpage.nix uses it any more, so we can inline it there
instead of keeping it around as a separate generated header. doing so
will also allow us to remove caching functions needed *only for this*
Change-Id: I97ee91f1dd7140ecb69dbafd8479b82fba7981b8
This commit is contained in:
parent
2297d3f895
commit
f815b966c4
4 changed files with 130 additions and 170 deletions
|
@ -1,26 +1,134 @@
|
||||||
|
with builtins;
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (builtins)
|
splitLines = s: filter (x: !isList x) (split "\n" s);
|
||||||
attrNames
|
|
||||||
attrValues
|
concatStrings = concatStringsSep "";
|
||||||
fromJSON
|
|
||||||
listToAttrs
|
replaceStringsRec =
|
||||||
mapAttrs
|
from: to: string:
|
||||||
concatStringsSep
|
# recursively replace occurrences of `from` with `to` within `string`
|
||||||
concatMap
|
# example:
|
||||||
length
|
# replaceStringRec "--" "-" "hello-----world"
|
||||||
lessThan
|
# => "hello-world"
|
||||||
replaceStrings
|
let
|
||||||
sort
|
replaced = replaceStrings [ from ] [ to ] string;
|
||||||
;
|
in
|
||||||
inherit (import ./utils.nix)
|
if replaced == string then string else replaceStringsRec from to replaced;
|
||||||
concatStrings
|
|
||||||
optionalString
|
squash = replaceStringsRec "\n\n\n" "\n\n";
|
||||||
filterAttrs
|
|
||||||
trim
|
trim =
|
||||||
squash
|
string:
|
||||||
unique
|
# trim trailing spaces and squash non-leading spaces
|
||||||
showSettings
|
let
|
||||||
;
|
trimLine =
|
||||||
|
line:
|
||||||
|
let
|
||||||
|
# separate leading spaces from the rest
|
||||||
|
parts = split "(^ *)" line;
|
||||||
|
spaces = head (elemAt parts 1);
|
||||||
|
rest = elemAt parts 2;
|
||||||
|
# drop trailing spaces
|
||||||
|
body = head (split " *$" rest);
|
||||||
|
in
|
||||||
|
spaces + replaceStringsRec " " " " body;
|
||||||
|
in
|
||||||
|
concatStringsSep "\n" (map trimLine (splitLines string));
|
||||||
|
|
||||||
|
# FIXME: O(n^2)
|
||||||
|
unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [ ];
|
||||||
|
|
||||||
|
nameValuePair = name: value: { inherit name value; };
|
||||||
|
|
||||||
|
filterAttrs =
|
||||||
|
pred: set:
|
||||||
|
listToAttrs (
|
||||||
|
concatMap (
|
||||||
|
name:
|
||||||
|
let
|
||||||
|
v = set.${name};
|
||||||
|
in
|
||||||
|
if pred name v then [ (nameValuePair name v) ] else [ ]
|
||||||
|
) (attrNames set)
|
||||||
|
);
|
||||||
|
|
||||||
|
optionalString = cond: string: if cond then string else "";
|
||||||
|
|
||||||
|
showSetting =
|
||||||
|
{ inlineHTML }:
|
||||||
|
name:
|
||||||
|
{
|
||||||
|
description,
|
||||||
|
documentDefault,
|
||||||
|
defaultValue,
|
||||||
|
aliases,
|
||||||
|
value,
|
||||||
|
experimentalFeature,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
result = squash ''
|
||||||
|
- ${
|
||||||
|
if inlineHTML then ''<span id="conf-${name}">[`${name}`](#conf-${name})</span>'' else ''`${name}`''
|
||||||
|
}
|
||||||
|
|
||||||
|
${indent " " body}
|
||||||
|
'';
|
||||||
|
|
||||||
|
experimentalFeatureNote = optionalString (experimentalFeature != null) ''
|
||||||
|
> **Warning**
|
||||||
|
> This setting is part of an
|
||||||
|
> [experimental feature](@docroot@/contributing/experimental-features.md).
|
||||||
|
|
||||||
|
To change this setting, you need to make sure the corresponding experimental feature,
|
||||||
|
[`${experimentalFeature}`](@docroot@/contributing/experimental-features.md#xp-feature-${experimentalFeature}),
|
||||||
|
is enabled.
|
||||||
|
For example, include the following in [`nix.conf`](#):
|
||||||
|
|
||||||
|
```
|
||||||
|
extra-experimental-features = ${experimentalFeature}
|
||||||
|
${name} = ...
|
||||||
|
```
|
||||||
|
'';
|
||||||
|
|
||||||
|
# separate body to cleanly handle indentation
|
||||||
|
body = ''
|
||||||
|
${description}
|
||||||
|
|
||||||
|
${experimentalFeatureNote}
|
||||||
|
|
||||||
|
**Default:** ${showDefault documentDefault defaultValue}
|
||||||
|
|
||||||
|
${showAliases aliases}
|
||||||
|
'';
|
||||||
|
|
||||||
|
showDefault =
|
||||||
|
documentDefault: defaultValue:
|
||||||
|
if documentDefault then
|
||||||
|
# a StringMap value type is specified as a string, but
|
||||||
|
# this shows the value type. The empty stringmap is `null` in
|
||||||
|
# JSON, but that converts to `{ }` here.
|
||||||
|
if defaultValue == "" || defaultValue == [ ] || isAttrs defaultValue then
|
||||||
|
"*empty*"
|
||||||
|
else if isBool defaultValue then
|
||||||
|
if defaultValue then "`true`" else "`false`"
|
||||||
|
else
|
||||||
|
"`${toString defaultValue}`"
|
||||||
|
else
|
||||||
|
"*machine-specific*";
|
||||||
|
|
||||||
|
showAliases =
|
||||||
|
aliases:
|
||||||
|
optionalString (aliases != [ ])
|
||||||
|
"**Deprecated alias:** ${(concatStringsSep ", " (map (s: "`${s}`") aliases))}";
|
||||||
|
in
|
||||||
|
result;
|
||||||
|
|
||||||
|
indent =
|
||||||
|
prefix: s: concatStringsSep "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s));
|
||||||
|
|
||||||
|
showSettings =
|
||||||
|
args: settingsInfo: concatStrings (attrValues (mapAttrs (showSetting args) settingsInfo));
|
||||||
in
|
in
|
||||||
|
|
||||||
inlineHTML: commandDump:
|
inlineHTML: commandDump:
|
||||||
|
|
|
@ -1,139 +0,0 @@
|
||||||
with builtins;
|
|
||||||
|
|
||||||
rec {
|
|
||||||
splitLines = s: filter (x: !isList x) (split "\n" s);
|
|
||||||
|
|
||||||
concatStrings = concatStringsSep "";
|
|
||||||
|
|
||||||
attrsToList =
|
|
||||||
a:
|
|
||||||
map (name: {
|
|
||||||
inherit name;
|
|
||||||
value = a.${name};
|
|
||||||
}) (builtins.attrNames a);
|
|
||||||
|
|
||||||
replaceStringsRec =
|
|
||||||
from: to: string:
|
|
||||||
# recursively replace occurrences of `from` with `to` within `string`
|
|
||||||
# example:
|
|
||||||
# replaceStringRec "--" "-" "hello-----world"
|
|
||||||
# => "hello-world"
|
|
||||||
let
|
|
||||||
replaced = replaceStrings [ from ] [ to ] string;
|
|
||||||
in
|
|
||||||
if replaced == string then string else replaceStringsRec from to replaced;
|
|
||||||
|
|
||||||
squash = replaceStringsRec "\n\n\n" "\n\n";
|
|
||||||
|
|
||||||
trim =
|
|
||||||
string:
|
|
||||||
# trim trailing spaces and squash non-leading spaces
|
|
||||||
let
|
|
||||||
trimLine =
|
|
||||||
line:
|
|
||||||
let
|
|
||||||
# separate leading spaces from the rest
|
|
||||||
parts = split "(^ *)" line;
|
|
||||||
spaces = head (elemAt parts 1);
|
|
||||||
rest = elemAt parts 2;
|
|
||||||
# drop trailing spaces
|
|
||||||
body = head (split " *$" rest);
|
|
||||||
in
|
|
||||||
spaces + replaceStringsRec " " " " body;
|
|
||||||
in
|
|
||||||
concatStringsSep "\n" (map trimLine (splitLines string));
|
|
||||||
|
|
||||||
# FIXME: O(n^2)
|
|
||||||
unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [ ];
|
|
||||||
|
|
||||||
nameValuePair = name: value: { inherit name value; };
|
|
||||||
|
|
||||||
filterAttrs =
|
|
||||||
pred: set:
|
|
||||||
listToAttrs (
|
|
||||||
concatMap (
|
|
||||||
name:
|
|
||||||
let
|
|
||||||
v = set.${name};
|
|
||||||
in
|
|
||||||
if pred name v then [ (nameValuePair name v) ] else [ ]
|
|
||||||
) (attrNames set)
|
|
||||||
);
|
|
||||||
|
|
||||||
optionalString = cond: string: if cond then string else "";
|
|
||||||
|
|
||||||
showSetting =
|
|
||||||
{ inlineHTML }:
|
|
||||||
name:
|
|
||||||
{
|
|
||||||
description,
|
|
||||||
documentDefault,
|
|
||||||
defaultValue,
|
|
||||||
aliases,
|
|
||||||
value,
|
|
||||||
experimentalFeature,
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
result = squash ''
|
|
||||||
- ${
|
|
||||||
if inlineHTML then ''<span id="conf-${name}">[`${name}`](#conf-${name})</span>'' else ''`${name}`''
|
|
||||||
}
|
|
||||||
|
|
||||||
${indent " " body}
|
|
||||||
'';
|
|
||||||
|
|
||||||
experimentalFeatureNote = optionalString (experimentalFeature != null) ''
|
|
||||||
> **Warning**
|
|
||||||
> This setting is part of an
|
|
||||||
> [experimental feature](@docroot@/contributing/experimental-features.md).
|
|
||||||
|
|
||||||
To change this setting, you need to make sure the corresponding experimental feature,
|
|
||||||
[`${experimentalFeature}`](@docroot@/contributing/experimental-features.md#xp-feature-${experimentalFeature}),
|
|
||||||
is enabled.
|
|
||||||
For example, include the following in [`nix.conf`](#):
|
|
||||||
|
|
||||||
```
|
|
||||||
extra-experimental-features = ${experimentalFeature}
|
|
||||||
${name} = ...
|
|
||||||
```
|
|
||||||
'';
|
|
||||||
|
|
||||||
# separate body to cleanly handle indentation
|
|
||||||
body = ''
|
|
||||||
${description}
|
|
||||||
|
|
||||||
${experimentalFeatureNote}
|
|
||||||
|
|
||||||
**Default:** ${showDefault documentDefault defaultValue}
|
|
||||||
|
|
||||||
${showAliases aliases}
|
|
||||||
'';
|
|
||||||
|
|
||||||
showDefault =
|
|
||||||
documentDefault: defaultValue:
|
|
||||||
if documentDefault then
|
|
||||||
# a StringMap value type is specified as a string, but
|
|
||||||
# this shows the value type. The empty stringmap is `null` in
|
|
||||||
# JSON, but that converts to `{ }` here.
|
|
||||||
if defaultValue == "" || defaultValue == [ ] || isAttrs defaultValue then
|
|
||||||
"*empty*"
|
|
||||||
else if isBool defaultValue then
|
|
||||||
if defaultValue then "`true`" else "`false`"
|
|
||||||
else
|
|
||||||
"`${toString defaultValue}`"
|
|
||||||
else
|
|
||||||
"*machine-specific*";
|
|
||||||
|
|
||||||
showAliases =
|
|
||||||
aliases:
|
|
||||||
optionalString (aliases != [ ])
|
|
||||||
"**Deprecated alias:** ${(concatStringsSep ", " (map (s: "`${s}`") aliases))}";
|
|
||||||
in
|
|
||||||
result;
|
|
||||||
|
|
||||||
indent =
|
|
||||||
prefix: s: concatStringsSep "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s));
|
|
||||||
|
|
||||||
showSettings =
|
|
||||||
args: settingsInfo: concatStrings (attrValues (mapAttrs (showSetting args) settingsInfo));
|
|
||||||
}
|
|
|
@ -261,14 +261,6 @@ static void showHelp(std::vector<std::string> subcommand, NixArgs & toplevel)
|
||||||
#include "generate-manpage.nix.gen.hh"
|
#include "generate-manpage.nix.gen.hh"
|
||||||
, CanonPath::root), *vGenerateManpage);
|
, CanonPath::root), *vGenerateManpage);
|
||||||
|
|
||||||
auto vUtils = state.mem.allocValue();
|
|
||||||
state.cacheFile(
|
|
||||||
CanonPath("/utils.nix"), CanonPath("/utils.nix"),
|
|
||||||
&state.parseExprFromString(
|
|
||||||
#include "utils.nix.gen.hh"
|
|
||||||
, CanonPath::root),
|
|
||||||
*vUtils);
|
|
||||||
|
|
||||||
auto vDump = state.mem.allocValue();
|
auto vDump = state.mem.allocValue();
|
||||||
vDump->mkString(toplevel.dumpCli());
|
vDump->mkString(toplevel.dumpCli());
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
nix_generated_headers = [
|
nix_generated_headers = [
|
||||||
gen_header.process(meson.project_source_root() / 'doc/manual/generate-manpage.nix'),
|
gen_header.process(meson.project_source_root() / 'doc/manual/generate-manpage.nix'),
|
||||||
gen_header.process(meson.project_source_root() / 'doc/manual/utils.nix'),
|
|
||||||
gen_header.process('get-env.sh'),
|
gen_header.process('get-env.sh'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue