···11{ config, lib, pkgs, ... }:
22-33-with lib;
44-52let
63 cfg = config.hardware.sane.brscan4;
7488- netDeviceList = attrValues cfg.netDevices;
55+ netDeviceList = lib.attrValues cfg.netDevices;
96107 etcFiles = pkgs.callPackage ./brscan4_etc_files.nix { netDevices = netDeviceList; };
118···13101411 options = {
15121616- name = mkOption {
1717- type = types.str;
1313+ name = lib.mkOption {
1414+ type = lib.types.str;
1815 description = ''
1916 The friendly name you give to the network device. If undefined,
2017 the name of attribute will be used.
···2320 example = "office1";
2421 };
25222626- model = mkOption {
2727- type = types.str;
2323+ model = lib.mkOption {
2424+ type = lib.types.str;
2825 description = ''
2926 The model of the network device.
3027 '';
···3229 example = "MFC-7860DW";
3330 };
34313535- ip = mkOption {
3636- type = with types; nullOr str;
3232+ ip = lib.mkOption {
3333+ type = with lib.types; nullOr str;
3734 default = null;
3835 description = ''
3936 The ip address of the device. If undefined, you will have to
···4340 example = "192.168.1.2";
4441 };
45424646- nodename = mkOption {
4747- type = with types; nullOr str;
4343+ nodename = lib.mkOption {
4444+ type = with lib.types; nullOr str;
4845 default = null;
4946 description = ''
5047 The node name of the device. If undefined, you will have to
···585559566057 config =
6161- { name = mkDefault name;
5858+ { name = lib.mkDefault name;
6259 };
6360 };
6461···6865 options = {
69667067 hardware.sane.brscan4.enable =
7171- mkEnableOption "Brother's brscan4 scan backend" // {
6868+ lib.mkEnableOption "Brother's brscan4 scan backend" // {
7269 description = ''
7370 When enabled, will automatically register the "brscan4" sane
7471 backend and bring configuration files to their expected location.
7572 '';
7673 };
77747878- hardware.sane.brscan4.netDevices = mkOption {
7575+ hardware.sane.brscan4.netDevices = lib.mkOption {
7976 default = {};
8077 example =
8178 { office1 = { model = "MFC-7860DW"; ip = "192.168.1.2"; };
8279 office2 = { model = "MFC-7860DW"; nodename = "BRW0080927AFBCE"; };
8380 };
8484- type = with types; attrsOf (submodule netDeviceOpts);
8181+ type = with lib.types; attrsOf (submodule netDeviceOpts);
8582 description = ''
8683 The list of network devices that will be registered against the brscan4
8784 sane backend.
···8986 };
9087 };
91889292- config = mkIf (config.hardware.sane.enable && cfg.enable) {
8989+ config = lib.mkIf (config.hardware.sane.enable && cfg.enable) {
93909491 hardware.sane.extraBackends = [
9592 pkgs.brscan4
···9996 { source = "${etcFiles}/etc/opt/brother/scanner/brscan4"; };
1009710198 assertions = [
102102- { assertion = all (x: !(null != x.ip && null != x.nodename)) netDeviceList;
9999+ { assertion = lib.all (x: !(null != x.ip && null != x.nodename)) netDeviceList;
103100 message = ''
104101 When describing a network device as part of the attribute list
105102 `hardware.sane.brscan4.netDevices`, only one of its `ip` or `nodename`
···11{ config, lib, pkgs, ... }:
22-33-with lib;
44-52let
63 cfg = config.hardware.sane.brscan5;
7488- netDeviceList = attrValues cfg.netDevices;
55+ netDeviceList = lib.attrValues cfg.netDevices;
96107 etcFiles = pkgs.callPackage ./brscan5_etc_files.nix { netDevices = netDeviceList; };
118···13101411 options = {
15121616- name = mkOption {
1717- type = types.str;
1313+ name = lib.mkOption {
1414+ type = lib.types.str;
1815 description = ''
1916 The friendly name you give to the network device. If undefined,
2017 the name of attribute will be used.
···2320 example = "office1";
2421 };
25222626- model = mkOption {
2727- type = types.str;
2323+ model = lib.mkOption {
2424+ type = lib.types.str;
2825 description = ''
2926 The model of the network device.
3027 '';
···3229 example = "ADS-1200";
3330 };
34313535- ip = mkOption {
3636- type = with types; nullOr str;
3232+ ip = lib.mkOption {
3333+ type = with lib.types; nullOr str;
3734 default = null;
3835 description = ''
3936 The ip address of the device. If undefined, you will have to
···4340 example = "192.168.1.2";
4441 };
45424646- nodename = mkOption {
4747- type = with types; nullOr str;
4343+ nodename = lib.mkOption {
4444+ type = with lib.types; nullOr str;
4845 default = null;
4946 description = ''
5047 The node name of the device. If undefined, you will have to
···585559566057 config =
6161- { name = mkDefault name;
5858+ { name = lib.mkDefault name;
6259 };
6360 };
6461···6865 options = {
69667067 hardware.sane.brscan5.enable =
7171- mkEnableOption "the Brother brscan5 sane backend";
6868+ lib.mkEnableOption "the Brother brscan5 sane backend";
72697373- hardware.sane.brscan5.netDevices = mkOption {
7070+ hardware.sane.brscan5.netDevices = lib.mkOption {
7471 default = {};
7572 example =
7673 { office1 = { model = "MFC-7860DW"; ip = "192.168.1.2"; };
7774 office2 = { model = "MFC-7860DW"; nodename = "BRW0080927AFBCE"; };
7875 };
7979- type = with types; attrsOf (submodule netDeviceOpts);
7676+ type = with lib.types; attrsOf (submodule netDeviceOpts);
8077 description = ''
8178 The list of network devices that will be registered against the brscan5
8279 sane backend.
···8481 };
8582 };
86838787- config = mkIf (config.hardware.sane.enable && cfg.enable) {
8484+ config = lib.mkIf (config.hardware.sane.enable && cfg.enable) {
88858986 hardware.sane.extraBackends = [
9087 pkgs.brscan5
···9794 environment.etc."sane.d/dll.d/brother5.conf".source = "${pkgs.brscan5}/etc/sane.d/dll.d/brother5.conf";
98959996 assertions = [
100100- { assertion = all (x: !(null != x.ip && null != x.nodename)) netDeviceList;
9797+ { assertion = lib.all (x: !(null != x.ip && null != x.nodename)) netDeviceList;
10198 message = ''
10299 When describing a network device as part of the attribute list
103100 `hardware.sane.brscan5.netDevices`, only one of its `ip` or `nodename`
···321321 :::
322322 '';
323323 };
324324+325325+ environmentFile = mkOption {
326326+ type = with types; nullOr path;
327327+ default = null;
328328+ example = "/run/secrets/caddy.env";
329329+ description = ''
330330+ Environment file as defined in {manpage}`systemd.exec(5)`.
331331+332332+ You can use environment variables to pass secrets to the service without adding
333333+ them to the world-redable nix store.
334334+335335+ ```
336336+ # in configuration.nix
337337+ services.caddy.environmentFile = "/run/secrets/caddy.env";
338338+ services.caddy.globalConfig = '''
339339+ {
340340+ acme_ca https://acme.zerossl.com/v2/DV90
341341+ acme_eab {
342342+ key_id {$EAB_KEY_ID}
343343+ mac_key {$EAB_MAC_KEY}
344344+ }
345345+ }
346346+ ''';
347347+ ```
348348+349349+ ```
350350+ # in /run/secrets/caddy.env
351351+ EAB_KEY_ID=secret
352352+ EAB_MAC_KEY=secret
353353+ ```
354354+355355+ Find more examples
356356+ [here](https://caddyserver.com/docs/caddyfile/concepts#environment-variables)
357357+ '';
358358+ };
324359 };
325360326361 # implementation
···378413 Restart = "on-failure";
379414 RestartPreventExitStatus = 1;
380415 RestartSec = "5s";
416416+ EnvironmentFile = optional (cfg.environmentFile != null) cfg.environmentFile;
381417382418 # TODO: attempt to upstream these options
383419 NoNewPrivileges = true;
+1-1
nixos/modules/system/etc/etc-activation.nix
···3636 where = "/run/etc-metadata";
3737 what = "/etc-metadata-image";
3838 type = "erofs";
3939- options = "loop";
3939+ options = "loop,ro";
4040 unitConfig = {
4141 # Since this unit depends on the nix store being mounted, it cannot
4242 # be a dependency of local-fs.target, because if it did, we'd have
+1-1
nixos/modules/system/etc/etc.nix
···232232 echo "remounting /etc..."
233233234234 tmpMetadataMount=$(mktemp --directory -t nixos-etc-metadata.XXXXXXXXXX)
235235- mount --type erofs ${config.system.build.etcMetadataImage} $tmpMetadataMount
235235+ mount --type erofs -o ro ${config.system.build.etcMetadataImage} $tmpMetadataMount
236236237237 # Mount the new /etc overlay to a temporary private mount.
238238 # This needs the indirection via a private bind mount because you
···11-import ./make-test-python.nix ({ pkgs, lib, ... }:
11+{
22+ lib,
33+ ...
44+}:
2536let
47 configDir = "/var/lib/foobar";
···122125 # Cause a configuration change that requires a service restart as we added a new runtime dependency
123126 specialisation.newFeature = {
124127 inheritParentConfig = true;
125125- configuration.services.home-assistant.config.backup = {};
128128+ configuration.services.home-assistant.config.prometheus = {};
126129 };
127130128131 specialisation.removeCustomThings = {
···206209 with subtest("Check extra components are considered in systemd unit hardening"):
207210 hass.succeed("systemctl show -p DeviceAllow home-assistant.service | grep -q char-ttyUSB")
208211209209- with subtest("Check service reloads when configuration changes"):
212212+ with subtest("Check service restart from SIGHUP"):
210213 pid = hass.succeed("systemctl show --property=MainPID home-assistant.service")
211214 cursor = get_journal_cursor()
212215 hass.succeed("${system}/specialisation/differentName/bin/switch-to-configuration test")
216216+ wait_for_homeassistant(cursor)
213217 new_pid = hass.succeed("systemctl show --property=MainPID home-assistant.service")
214214- assert pid == new_pid, "The PID of the process should not change between process reloads"
215215- wait_for_homeassistant(cursor)
218218+ assert pid != new_pid, "The PID of the process must change after sending SIGHUP"
216219217220 with subtest("Check service restarts when dependencies change"):
218221 pid = new_pid
219222 cursor = get_journal_cursor()
220223 hass.succeed("${system}/specialisation/newFeature/bin/switch-to-configuration test")
221221- new_pid = hass.succeed("systemctl show --property=MainPID home-assistant.service")
222222- assert pid != new_pid, "The PID of the process should change when its PYTHONPATH changess"
223224 wait_for_homeassistant(cursor)
225225+ new_pid = hass.succeed("systemctl show --property=MainPID home-assistant.service")
226226+ assert pid != new_pid, "The PID of the process must change when its PYTHONPATH changess"
224227225228 with subtest("Check that new components get setup after restart"):
226229 journal = get_journal_since(cursor)
227227- for domain in ["backup"]:
230230+ for domain in ["prometheus"]:
228231 assert f"Setup of domain {domain} took" in journal, f"{domain} setup missing"
229232230233 with subtest("Check custom components and custom lovelace modules get removed"):
···242245 hass.log(hass.succeed("systemctl cat home-assistant.service"))
243246 hass.log(hass.succeed("systemd-analyze security home-assistant.service"))
244247 '';
245245-})
248248+}
···55}:
66let
77 pname = "ankama-launcher";
88- version = "3.12.26";
88+ version = "3.12.27";
991010 # The original URL for the launcher is:
1111 # https://launcher.cdn.ankama.com/installers/production/Ankama%20Launcher-Setup-x86_64.AppImage
1212 # As it does not encode the version, we use the wayback machine (web.archive.org) to get a fixed URL.
1313 # To update the client, head to web.archive.org and create a new snapshot of the download page.
1414 src = fetchurl {
1515- url = "https://web.archive.org/web/20241206172526/https://launcher.cdn.ankama.com/installers/production/Ankama%20Launcher-Setup-x86_64.AppImage";
1616- hash = "sha256-K/qe/qxMfcGWU5gyEfPdl0ptjTCWaqIXMCy4O8WEKCQ=";
1515+ url = "https://web.archive.org/web/20241209195235/https://launcher.cdn.ankama.com/installers/production/Ankama%20Launcher-Setup-x86_64.AppImage";
1616+ hash = "sha256-35seTJ8OVcMDvEkGtxRuZd7JSrqCfk2VSSDc6I8d7UI=";
1717 };
18181919 appimageContents = appimageTools.extract { inherit pname version src; };
···4848 description = "Ankama Launcher";
4949 longDescription = ''
5050 Ankama Launcher is a portal that allows you to access Ankama's video games, VOD animations, webtoons, and livestreams, as well as download updates, stay up to date with the latest news, and chat with your friends.
5151-5252- If you encounter a `wine` error while running *Dofus*, delete or rename the `cinematics/` directory:
5353- - Go to the directory where you installed the game and run: `mv content/gfx/cinematics content/gfx/cinematics_DISABLE`
5451 '';
5552 homepage = "https://www.ankama.com/en/launcher";
5653 license = lib.licenses.unfree;
···11-{ lib, stdenv, fetchurl, makeWrapper, php, nixosTests }:
11+{
22+ lib,
33+ stdenv,
44+ fetchurl,
55+ makeWrapper,
66+ php,
77+ nixosTests,
88+}:
29310let
411 versions = {
···714 hash = "sha256-cGnsxfpvt7FyhxFcA2/gWWe7CyanVGZVKtCDES3XLdI=";
815 };
916 matomo_5 = {
1010- version = "5.1.1";
1111- hash = "sha256-xi6R9O/pOxBgga6+wwqziwDKK7Q1Ispldvxg+0mpdeQ=";
1717+ version = "5.1.2";
1818+ hash = "sha256-6kR6OOyqwQfV+pRqHO+VMLM1eZQb0om65EilAnIlW9U=";
1219 };
1320 matomo-beta = {
1414- version = "5.0.0";
2121+ version = "5.2.0";
1522 # `beta` examples: "b1", "rc1", null
1623 # when updating: use null if stable version is >= latest beta or release candidate
1717- beta = "rc9";
1818- hash = "sha256-OXxJCEXcrl6UXYh+jbNqLQGYphrSjxaOAZg3AZVPAqs=";
2424+ beta = "rc1";
2525+ hash = "sha256-heAd01p8QHkrxQY2MEf//YXNplgL19Opw/WhA2cwZ+c=";
1926 };
2027 };
2121- common = pname: { version, hash, beta ? null }:
2222- let
2323- fullVersion = version + lib.optionalString (beta != null) "-${toString beta}";
2424- name = "${pname}-${fullVersion}";
2525- in
2828+ common =
2929+ pname:
3030+ {
3131+ version,
3232+ hash,
3333+ beta ? null,
3434+ }:
3535+ stdenv.mkDerivation (finalAttrs: {
3636+ name = "${pname}-${finalAttrs.version}";
3737+ version = version + lib.optionalString (beta != null) "-${toString beta}";
26382727- stdenv.mkDerivation rec {
2828- inherit name;
2929- version = fullVersion;
3939+ src = fetchurl {
4040+ url = "https://builds.matomo.org/matomo-${finalAttrs.version}.tar.gz";
4141+ inherit hash;
4242+ };
30433131- src = fetchurl {
3232- url = "https://builds.matomo.org/matomo-${version}.tar.gz";
3333- inherit hash;
3434- };
4444+ nativeBuildInputs = [ makeWrapper ];
35453636- nativeBuildInputs = [ makeWrapper ];
4646+ patches = [
4747+ # This changes the default value of the database server field
4848+ # from 127.0.0.1 to localhost.
4949+ # unix socket authentication only works with localhost,
5050+ # but password-based SQL authentication works with both.
5151+ # TODO: is upstream interested in this?
5252+ # -> discussion at https://github.com/matomo-org/matomo/issues/12646
5353+ ./make-localhost-default-database-host.patch
5454+ # This changes the default config for path.geoip2 so that it doesn't point
5555+ # to the nix store.
5656+ (
5757+ if lib.versionOlder finalAttrs.version "5.0" then
5858+ ./change-path-geoip2-4.x.patch
5959+ else
6060+ ./change-path-geoip2-5.x.patch
6161+ )
6262+ ];
37633838- patches = [
3939- # This changes the default value of the database server field
4040- # from 127.0.0.1 to localhost.
4141- # unix socket authentication only works with localhost,
4242- # but password-based SQL authentication works with both.
4343- # TODO: is upstream interested in this?
4444- # -> discussion at https://github.com/matomo-org/matomo/issues/12646
4545- ./make-localhost-default-database-host.patch
4646- # This changes the default config for path.geoip2 so that it doesn't point
4747- # to the nix store.
4848- (if lib.versionOlder version "5.0"
4949- then ./change-path-geoip2-4.x.patch
5050- else ./change-path-geoip2-5.x.patch)
5151- ];
6464+ # this bootstrap.php adds support for getting PIWIK_USER_PATH
6565+ # from an environment variable. Point it to a mutable location
6666+ # to be able to use matomo read-only from the nix store
6767+ postPatch = ''
6868+ cp ${./bootstrap.php} bootstrap.php
6969+ '';
52705353- # this bootstrap.php adds support for getting PIWIK_USER_PATH
5454- # from an environment variable. Point it to a mutable location
5555- # to be able to use matomo read-only from the nix store
5656- postPatch = ''
5757- cp ${./bootstrap.php} bootstrap.php
5858- '';
7171+ # TODO: future versions might rename the PIWIK_… variables to MATOMO_…
7272+ # TODO: Move more unnecessary files from share/, especially using PIWIK_INCLUDE_PATH.
7373+ # See https://forum.matomo.org/t/bootstrap-php/5926/10 and
7474+ # https://github.com/matomo-org/matomo/issues/11654#issuecomment-297730843
7575+ installPhase = ''
7676+ runHook preInstall
59776060- # TODO: future versions might rename the PIWIK_… variables to MATOMO_…
6161- # TODO: Move more unnecessary files from share/, especially using PIWIK_INCLUDE_PATH.
6262- # See https://forum.matomo.org/t/bootstrap-php/5926/10 and
6363- # https://github.com/matomo-org/matomo/issues/11654#issuecomment-297730843
6464- installPhase = ''
6565- runHook preInstall
7878+ # copy everything to share/, used as webroot folder, and then remove what's known to be not needed
7979+ mkdir -p $out/share
8080+ cp -ra * $out/share/
8181+ # tmp/ is created by matomo in PIWIK_USER_PATH
8282+ rmdir $out/share/tmp
8383+ # config/ needs to be accessed by PIWIK_USER_PATH anyway
8484+ ln -s $out/share/config $out/
66856767- # copy everything to share/, used as webroot folder, and then remove what's known to be not needed
6868- mkdir -p $out/share
6969- cp -ra * $out/share/
7070- # tmp/ is created by matomo in PIWIK_USER_PATH
7171- rmdir $out/share/tmp
7272- # config/ needs to be accessed by PIWIK_USER_PATH anyway
7373- ln -s $out/share/config $out/
8686+ makeWrapper ${php}/bin/php $out/bin/matomo-console \
8787+ --add-flags "$out/share/console"
74887575- makeWrapper ${php}/bin/php $out/bin/matomo-console \
7676- --add-flags "$out/share/console"
8989+ runHook postInstall
9090+ '';
77917878- runHook postInstall
7979- '';
9292+ filesToFix = [
9393+ "misc/composer/build-xhprof.sh"
9494+ "misc/composer/clean-xhprof.sh"
9595+ "misc/cron/archive.sh"
9696+ "plugins/GeoIp2/config/config.php"
9797+ "plugins/Installation/FormDatabaseSetup.php"
9898+ "vendor/pear/archive_tar/sync-php4"
9999+ "vendor/szymach/c-pchart/coverage.sh"
100100+ "vendor/matomo/matomo-php-tracker/run_tests.sh"
101101+ "vendor/twig/twig/drupal_test.sh"
102102+ ];
801038181- filesToFix = [
8282- "misc/composer/build-xhprof.sh"
8383- "misc/composer/clean-xhprof.sh"
8484- "misc/cron/archive.sh"
8585- "plugins/GeoIp2/config/config.php"
8686- "plugins/Installation/FormDatabaseSetup.php"
8787- "vendor/pear/archive_tar/sync-php4"
8888- "vendor/szymach/c-pchart/coverage.sh"
8989- "vendor/matomo/matomo-php-tracker/run_tests.sh"
9090- "vendor/twig/twig/drupal_test.sh"
9191- ];
104104+ # This fixes the consistency check in the admin interface
105105+ #
106106+ # The filesToFix list may contain files that are exclusive to only one of the versions we build
107107+ # make sure to test for existence to avoid erroring on an incompatible version and failing
108108+ postFixup = ''
109109+ pushd $out/share > /dev/null
110110+ for f in $filesToFix; do
111111+ if [ -f "$f" ]; then
112112+ length="$(wc -c "$f" | cut -d' ' -f1)"
113113+ hash="$(md5sum "$f" | cut -d' ' -f1)"
114114+ sed -i "s:\\(\"$f\"[^(]*(\\).*:\\1\"$length\", \"$hash\"),:g" config/manifest.inc.php
115115+ else
116116+ echo "INFO(files-to-fix): $f does not exist in this version"
117117+ fi
118118+ done
119119+ popd > /dev/null
120120+ '';
921219393- # This fixes the consistency check in the admin interface
9494- #
9595- # The filesToFix list may contain files that are exclusive to only one of the versions we build
9696- # make sure to test for existence to avoid erroring on an incompatible version and failing
9797- postFixup = ''
9898- pushd $out/share > /dev/null
9999- for f in $filesToFix; do
100100- if [ -f "$f" ]; then
101101- length="$(wc -c "$f" | cut -d' ' -f1)"
102102- hash="$(md5sum "$f" | cut -d' ' -f1)"
103103- sed -i "s:\\(\"$f\"[^(]*(\\).*:\\1\"$length\", \"$hash\"),:g" config/manifest.inc.php
104104- else
105105- echo "INFO(files-to-fix): $f does not exist in this version"
106106- fi
107107- done
108108- popd > /dev/null
109109- '';
110110-111111- passthru = {
112112- tests = nixosTests.matomo."${pname}";
113113- };
122122+ passthru = {
123123+ tests = nixosTests.matomo."${pname}";
124124+ };
114125115115- meta = with lib; {
116116- description = "Real-time web analytics application";
117117- mainProgram = "matomo-console";
118118- license = licenses.gpl3Plus;
119119- homepage = "https://matomo.org/";
120120- platforms = platforms.all;
121121- maintainers = with maintainers; [ florianjacob sebbel twey boozedog ] ++ teams.flyingcircus.members;
122122- };
126126+ meta = with lib; {
127127+ description = "Real-time web analytics application";
128128+ mainProgram = "matomo-console";
129129+ license = licenses.gpl3Plus;
130130+ homepage = "https://matomo.org/";
131131+ platforms = platforms.all;
132132+ maintainers =
133133+ with maintainers;
134134+ [
135135+ florianjacob
136136+ sebbel
137137+ twey
138138+ boozedog
139139+ ]
140140+ ++ teams.flyingcircus.members;
123141 };
142142+ });
124143in
125144lib.mapAttrs common versions
···11+Checks:
22+- bugprone-*
33+# don't find them too problematic
44+- -bugprone-easily-swappable-parameters
55+- performance-*
66+- modernize-*
77+# doesn't improve readability much in this project
88+- -modernize-use-trailing-return-type
99+- readability-*
1010+# don't find them too problematic
1111+- -readability-identifier-length
1212+- -readability-magic-numbers
1313+- portability-*
1414+- concurrency-*
1515+- google-*
1616+- -google-readability-todo
1717+- misc-*
1818+# we maybe want to address this?
1919+- -misc-no-recursion
2020+- cppcoreguidelines-*
2121+- -cppcoreguidelines-avoid-magic-numbers
2222+# We could use std::reference_wrapper, but it's not super important
2323+- -cppcoreguidelines-avoid-const-or-ref-data-members
2424+UseColor: true
2525+CheckOptions:
2626+ misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic: True
···11+with import ../../../.. { };
22+nixos-option.overrideAttrs (old: {
33+ nativeBuildInputs = old.nativeBuildInputs ++ [
44+ # hiprio so that it has a higher priority than the default unwrapped clang tools from clang if our stdenv is based on clang
55+ (lib.hiPrio pkgs.buildPackages.clang-tools)
66+ ];
77+})
···22// Since they are not, copy/paste them here.
33// TODO: Delete these and use the ones in the library as they become available.
4455+#include <string_view>
56#include "libnix-copy-paste.hh"
66-#include <nix/print.hh> // for Strings
77+#include <nix/print.hh>
7899+// NOLINTBEGIN
810// From nix/src/nix/repl.cc
99-bool isVarName(const std::string_view & s)
1111+bool isVarName(std::string_view s)
1012{
1113 if (s.size() == 0) return false;
1214 if (nix::isReservedKeyword(s)) return false;
···2022 return false;
2123 return true;
2224}
2525+// NOLINTEND
···3535 # so users choosing to allow don't have to rebuild them every time.
3636 permittedInsecurePackages = [
3737 "olm-3.2.16" # see PR #347899
3838+ "kanidm_1_3-1.3.3"
3839 ];
3940 }; }
4041