···254254 inherit
255255 lib
256256 options
257257- config
258257 specialArgs
259258 ;
260259 _class = class;
261260 _prefix = prefix;
261261+ config = addErrorContext "if you get an infinite recursion here, you probably reference `config` in `imports`. If you are trying to achieve a conditional import behavior dependent on `config`, consider importing unconditionally, and using `mkEnableOption` and `mkIf` to control its effect." config;
262262 }
263263 // specialArgs
264264 );
···651651 # evaluation of the option.
652652 context = name: ''while evaluating the module argument `${name}' in "${key}":'';
653653 extraArgs = mapAttrs (
654654- name: _: addErrorContext (context name) (args.${name} or config._module.args.${name})
654654+ name: _:
655655+ addErrorContext (context name) (
656656+ args.${name} or (addErrorContext
657657+ "noting that argument `${name}` is not externally provided, so querying `_module.args` instead, requiring `config`"
658658+ config._module.args.${name}
659659+ )
660660+ )
655661 ) (functionArgs f);
656662657663 # Note: we append in the opposite order such that we can add an error
+35-3
lib/tests/modules.sh
···8282 fi
8383}
84848585+invertIfUnset() {
8686+ gate="$1"
8787+ shift
8888+ if [[ -n "${!gate:-}" ]]; then
8989+ "$@"
9090+ else
9191+ ! "$@"
9292+ fi
9393+}
9494+9595+globalErrorLogCheck() {
9696+ invertIfUnset "REQUIRE_INFINITE_RECURSION_HINT" \
9797+ grep -i 'if you get an infinite recursion here' \
9898+ <<<"$err" >/dev/null \
9999+ || {
100100+ if [[ -n "${REQUIRE_INFINITE_RECURSION_HINT:-}" ]]; then
101101+ echo "Unexpected infinite recursion hint"
102102+ else
103103+ echo "Expected infinite recursion hint, but none found"
104104+ fi
105105+ return 1
106106+ }
107107+}
108108+85109checkConfigError() {
86110 local errorContains=$1
87111 local err=""
···94118 logFailure
95119 logEndFailure
96120 else
121121+ if ! globalErrorLogCheck "$err"; then
122122+ logStartFailure
123123+ echo "LOG:"
124124+ reportFailure "$@"
125125+ echo "GLOBAL ERROR LOG CHECK FAILED"
126126+ logFailure
127127+ logEndFailure
128128+ fi
97129 if echo "$err" | grep -zP --silent "$errorContains" ; then
98130 ((++pass))
99131 else
···283315# Check that using _module.args on imports cause infinite recursions, with
284316# the proper error context.
285317set -- "$@" ./define-_module-args-custom.nix ./import-custom-arg.nix
286286-checkConfigError 'while evaluating the module argument .*custom.* in .*import-custom-arg.nix.*:' "$@"
287287-checkConfigError 'infinite recursion encountered' "$@"
318318+REQUIRE_INFINITE_RECURSION_HINT=1 checkConfigError 'while evaluating the module argument .*custom.* in .*import-custom-arg.nix.*:' "$@"
319319+REQUIRE_INFINITE_RECURSION_HINT=1 checkConfigError 'infinite recursion encountered' "$@"
288320289321# Check _module.check.
290322set -- config.enable ./declare-enable.nix ./define-enable.nix ./define-attrsOfSub-foo.nix
···488520checkConfigOutput '^null$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix
489521checkConfigOutput '^"24"$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix ./define-value-string.nix
490522# Check whether an freeform-typed value can depend on a declared option, this can only work with lazyAttrsOf
491491-checkConfigError 'infinite recursion encountered' config.foo ./freeform-attrsOf.nix ./freeform-unstr-dep-str.nix
523523+REQUIRE_INFINITE_RECURSION_HINT=1 checkConfigError 'infinite recursion encountered' config.foo ./freeform-attrsOf.nix ./freeform-unstr-dep-str.nix
492524checkConfigError 'The option .* was accessed but has no value defined. Try setting the option.' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix
493525checkConfigOutput '^"24"$' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix ./define-value-string.nix
494526# submodules in freeformTypes should have their locations annotated
+2
nixos/doc/manual/release-notes/rl-2511.section.md
···133133134134- [`services.victorialogs.package`](#opt-services.victorialogs.package) now defaults to `victorialogs`, as `victoriametrics` no longer contains the VictoriaLogs binaries.
135135136136+- The `services.traccar.settings` attribute has been reworked. Instead of the previous flat attribute set the new implementation uses nested attribute sets. You need to update you configuration manually. For instance, `services.traccar.settings.loggerConsole` becomes `services.traccar.settings.logger.console`.
137137+136138- The `wstunnel` module was converted to RFC42-style settings, you will need to update your NixOS config if you make use of this module.
137139138140- [private-gpt](https://github.com/zylon-ai/private-gpt) service has been removed by lack of maintenance upstream.
+1-2
nixos/modules/profiles/installation-device.nix
···102102 boot.kernel.sysctl."vm.overcommit_memory" = "1";
103103104104 # To speed up installation a little bit, include the complete
105105- # stdenv in the Nix store on the CD.
105105+ # stdenvNoCC in the Nix store on the CD.
106106 system.extraDependencies =
107107 with pkgs;
108108 [
109109- stdenv
110109 stdenvNoCC # for runCommand
111110 busybox
112111 # For boot.initrd.systemd
+246-2
nixos/modules/security/auditd.nix
···44 pkgs,
55 ...
66}:
77+let
88+ cfg = config.security.auditd;
791010+ settingsType =
1111+ with lib.types;
1212+ nullOr (oneOf [
1313+ bool
1414+ nonEmptyStr
1515+ path
1616+ int
1717+ ]);
1818+1919+ pluginOptions = lib.types.submodule {
2020+ options = {
2121+ active = lib.mkEnableOption "Whether to enable this plugin";
2222+ direction = lib.mkOption {
2323+ type = lib.types.enum [
2424+ "in"
2525+ "out"
2626+ ];
2727+ default = "out";
2828+ description = ''
2929+ The option is dictated by the plugin. In or out are the only choices.
3030+ You cannot make a plugin operate in a way it wasn't designed just by
3131+ changing this option. This option is to give a clue to the event dispatcher
3232+ about which direction events flow.
3333+3434+ ::: {.note}
3535+ Inbound events are not supported yet.
3636+ :::
3737+ '';
3838+ };
3939+ path = lib.mkOption {
4040+ type = lib.types.path;
4141+ description = "This is the absolute path to the plugin executable.";
4242+ };
4343+ type = lib.mkOption {
4444+ type = lib.types.enum [ "always" ];
4545+ readOnly = true;
4646+ default = "always";
4747+ description = ''
4848+ This tells the dispatcher how the plugin wants to be run. There is only
4949+ one valid option, `always`, which means the plugin is external and should
5050+ always be run. The default is `always` since there are no more builtin plugins.
5151+ '';
5252+ };
5353+ args = lib.mkOption {
5454+ type = lib.types.nullOr (lib.types.listOf lib.types.nonEmptyStr);
5555+ default = null;
5656+ description = ''
5757+ This allows you to pass arguments to the child program.
5858+ Generally plugins do not take arguments and have their own
5959+ config file that instructs them how they should be configured.
6060+ '';
6161+ };
6262+ format = lib.mkOption {
6363+ type = lib.types.enum [
6464+ "binary"
6565+ "string"
6666+ ];
6767+ default = "string";
6868+ description = ''
6969+ Binary passes the data exactly as the audit event dispatcher gets it from
7070+ the audit daemon. The string option tells the dispatcher to completely change
7171+ the event into a string suitable for parsing with the audit parsing library.
7272+ '';
7373+ };
7474+ settings = lib.mkOption {
7575+ type = lib.types.nullOr (
7676+ lib.types.submodule {
7777+ freeformType = lib.types.attrsOf settingsType;
7878+ }
7979+ );
8080+ default = null;
8181+ description = "Plugin-specific config file to link to /etc/audit/<plugin>.conf";
8282+ };
8383+ };
8484+ };
8585+8686+ prepareConfigValue =
8787+ v:
8888+ if lib.isBool v then
8989+ (if v then "yes" else "no")
9090+ else if lib.isList v then
9191+ lib.concatStringsSep " " (map prepareConfigValue v)
9292+ else
9393+ builtins.toString v;
9494+ prepareConfigText =
9595+ conf:
9696+ lib.concatLines (
9797+ lib.mapAttrsToList (k: v: if v == null then "#${k} =" else "${k} = ${prepareConfigValue v}") conf
9898+ );
9999+in
8100{
99- options.security.auditd.enable = lib.mkEnableOption "the Linux Audit daemon";
101101+ options.security.auditd = {
102102+ enable = lib.mkEnableOption "the Linux Audit daemon";
101031111- config = lib.mkIf config.security.auditd.enable {
104104+ settings = lib.mkOption {
105105+ type = lib.types.submodule {
106106+ freeformType = lib.types.attrsOf settingsType;
107107+ options = {
108108+ # space_left needs to be larger than admin_space_left, yet they default to be the same if left open.
109109+ space_left = lib.mkOption {
110110+ type = lib.types.either lib.types.int (lib.types.strMatching "[0-9]+%");
111111+ default = 75;
112112+ description = ''
113113+ If the free space in the filesystem containing log_file drops below this value, the audit daemon takes the action specified by
114114+ {option}`space_left_action`. If the value of {option}`space_left` is specified as a whole number, it is interpreted as an absolute size in mebibytes
115115+ (MiB). If the value is specified as a number between 1 and 99 followed by a percentage sign (e.g., 5%), the audit daemon calculates
116116+ the absolute size in megabytes based on the size of the filesystem containing {option}`log_file`. (E.g., if the filesystem containing
117117+ {option}`log_file` is 2 gibibytes in size, and {option}`space_left` is set to 25%, then the audit daemon sets {option}`space_left` to approximately 500 mebibytes.
118118+119119+ ::: {.note}
120120+ This calculation is performed when the audit daemon starts, so if you resize the filesystem containing {option}`log_file` while the
121121+ audit daemon is running, you should send the audit daemon SIGHUP to re-read the configuration file and recalculate the correct per‐
122122+ centage.
123123+ :::
124124+ '';
125125+ };
126126+ admin_space_left = lib.mkOption {
127127+ type = lib.types.either lib.types.int (lib.types.strMatching "[0-9]+%");
128128+ default = 50;
129129+ description = ''
130130+ This is a numeric value in mebibytes (MiB) that tells the audit daemon when to perform a configurable action because the system is running
131131+ low on disk space. This should be considered the last chance to do something before running out of disk space. The numeric value for
132132+ this parameter should be lower than the number for {option}`space_left`. You may also append a percent sign (e.g. 1%) to the number to have
133133+ the audit daemon calculate the number based on the disk partition size.
134134+ '';
135135+ };
136136+ };
137137+ };
138138+139139+ default = { };
140140+ description = "auditd configuration file contents. See {auditd.conf} for supported values.";
141141+ };
142142+143143+ plugins = lib.mkOption {
144144+ type = lib.types.attrsOf pluginOptions;
145145+ default = { };
146146+ defaultText = lib.literalExpression ''
147147+ {
148148+ af_unix = {
149149+ path = lib.getExe' pkgs.audit "audisp-af_unix";
150150+ args = [
151151+ "0640"
152152+ "/var/run/audispd_events"
153153+ "string"
154154+ ];
155155+ format = "binary";
156156+ };
157157+ remote = {
158158+ path = lib.getExe' pkgs.audit "audisp-remote";
159159+ settings = { };
160160+ };
161161+ filter = {
162162+ path = lib.getExe' pkgs.audit "audisp-filter";
163163+ args = [
164164+ "allowlist"
165165+ "/etc/audit/audisp-filter.conf"
166166+ (lib.getExe' pkgs.audit "audisp-syslog")
167167+ "LOG_USER"
168168+ "LOG_INFO"
169169+ "interpret"
170170+ ];
171171+ settings = { };
172172+ };
173173+ syslog = {
174174+ path = lib.getExe' pkgs.audit "audisp-syslog";
175175+ args = [ "LOG_INFO" ];
176176+ };
177177+ }
178178+ '';
179179+ description = "Plugin definitions to register with auditd";
180180+ };
181181+ };
182182+183183+ config = lib.mkIf cfg.enable {
184184+ assertions = [
185185+ {
186186+ assertion =
187187+ let
188188+ cfg' = cfg.settings;
189189+ in
190190+ (
191191+ (lib.isInt cfg'.space_left && lib.isInt cfg'.admin_space_left)
192192+ -> cfg'.space_left > cfg'.admin_space_left
193193+ )
194194+ && (
195195+ let
196196+ get_percent = s: lib.toInt (lib.strings.removeSuffix "%" s);
197197+ in
198198+ (lib.isString cfg'.space_left && lib.isString cfg'.admin_space_left)
199199+ -> (get_percent cfg'.space_left) > (get_percent cfg'.admin_space_left)
200200+ );
201201+ message = "`security.auditd.settings.space_left` must be larger than `security.auditd.settings.admin_space_left`";
202202+ }
203203+ ];
204204+12205 # Starting auditd should also enable loading the audit rules..
13206 security.audit.enable = lib.mkDefault true;
1420715208 environment.systemPackages = [ pkgs.audit ];
209209+210210+ # setting this to anything other than /etc/audit/plugins.d will break, so we pin it here
211211+ security.auditd.settings.plugin_dir = "/etc/audit/plugins.d";
212212+213213+ environment.etc = {
214214+ "audit/auditd.conf".text = prepareConfigText cfg.settings;
215215+ }
216216+ // (lib.mapAttrs' (
217217+ pluginName: pluginDefinitionConfigValue:
218218+ lib.nameValuePair "audit/plugins.d/${pluginName}.conf" {
219219+ text = prepareConfigText (lib.removeAttrs pluginDefinitionConfigValue [ "settings" ]);
220220+ }
221221+ ) cfg.plugins)
222222+ // (lib.mapAttrs' (
223223+ pluginName: pluginDefinitionConfigValue:
224224+ lib.nameValuePair "audit/audisp-${pluginName}.conf" {
225225+ text = prepareConfigText pluginDefinitionConfigValue.settings;
226226+ }
227227+ ) (lib.filterAttrs (_: v: v.settings != null) cfg.plugins));
228228+229229+ security.auditd.plugins = {
230230+ af_unix = {
231231+ path = lib.getExe' pkgs.audit "audisp-af_unix";
232232+ args = [
233233+ "0640"
234234+ "/var/run/audispd_events"
235235+ "string"
236236+ ];
237237+ format = "binary";
238238+ };
239239+ remote = {
240240+ path = lib.getExe' pkgs.audit "audisp-remote";
241241+ settings = { };
242242+ };
243243+ filter = {
244244+ path = lib.getExe' pkgs.audit "audisp-filter";
245245+ args = [
246246+ "allowlist"
247247+ "/etc/audit/audisp-filter.conf"
248248+ (lib.getExe' pkgs.audit "audisp-syslog")
249249+ "LOG_USER"
250250+ "LOG_INFO"
251251+ "interpret"
252252+ ];
253253+ settings = { };
254254+ };
255255+ syslog = {
256256+ path = lib.getExe' pkgs.audit "audisp-syslog";
257257+ args = [ "LOG_INFO" ];
258258+ };
259259+ };
1626017261 systemd.services.auditd = {
18262 description = "Security Audit Logging Service";
+37-19
nixos/modules/services/monitoring/traccar.nix
···88 cfg = config.services.traccar;
99 stateDirectory = "/var/lib/traccar";
1010 configFilePath = "${stateDirectory}/config.xml";
1111- expandCamelCase = lib.replaceStrings lib.upperChars (map (s: ".${s}") lib.lowerChars);
1212- mkConfigEntry = key: value: "<entry key='${expandCamelCase key}'>${value}</entry>";
1111+1212+ # Map leafs to XML <entry> elements as expected by traccar, using
1313+ # dot-separated keys for nested attribute paths.
1414+ mapLeafs = lib.mapAttrsRecursive (
1515+ path: value: "<entry key='${lib.concatStringsSep "." path}'>${value}</entry>"
1616+ );
1717+1818+ mkConfigEntry = config: lib.collect builtins.isString (mapLeafs config);
1919+1320 mkConfig =
1421 configurationOptions:
1522 pkgs.writeText "traccar.xml" ''
1623 <?xml version='1.0' encoding='UTF-8'?>
1724 <!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>
1825 <properties>
1919- ${builtins.concatStringsSep "\n" (lib.mapAttrsToList mkConfigEntry configurationOptions)}
2626+ ${builtins.concatStringsSep "\n" (mkConfigEntry configurationOptions)}
2027 </properties>
2128 '';
22292330 defaultConfig = {
2424- databaseDriver = "org.h2.Driver";
2525- databasePassword = "";
2626- databaseUrl = "jdbc:h2:${stateDirectory}/traccar";
2727- databaseUser = "sa";
2828- loggerConsole = "true";
2929- mediaPath = "${stateDirectory}/media";
3030- templatesRoot = "${stateDirectory}/templates";
3131+ database = {
3232+ driver = "org.h2.Driver";
3333+ password = "";
3434+ url = "jdbc:h2:${stateDirectory}/traccar";
3535+ user = "sa";
3636+ };
3737+ logger.console = "true";
3838+ media.path = "${stateDirectory}/media";
3939+ templates.root = "${stateDirectory}/templates";
3140 };
4141+3242in
3343{
3444 options.services.traccar = {
3545 enable = lib.mkEnableOption "Traccar, an open source GPS tracking system";
4646+ settingsFile = lib.mkOption {
4747+ type = with lib.types; nullOr path;
4848+ default = null;
4949+ description = ''
5050+ File used as configuration for traccar. When specified, {option}`settings` is ignored.
5151+ '';
5252+ };
3653 settings = lib.mkOption {
3754 apply = lib.recursiveUpdate defaultConfig;
3855 default = defaultConfig;
3956 description = ''
4057 {file}`config.xml` configuration as a Nix attribute set.
4141- Attribute names are translated from camelCase to dot-separated strings. For instance:
4242- {option}`mailSmtpPort = "25"`
4343- would result in the following configuration property:
5858+ This option is ignored if `settingsFile` is set.
5959+6060+ Nested attributes get translated to a properties entry in the traccar configuration.
6161+ For instance: `mail.smtp.port = "25"` results in the following entry:
4462 `<entry key='mail.smtp.port'>25</entry>`
4545- Configuration options should match those described in
4646- [Traccar - Configuration File](https://www.traccar.org/configuration-file/).
4747- Secret tokens should be specified using {option}`environmentFile`
6363+6464+ Secrets should be specified using {option}`environmentFile`
4865 instead of this world-readable attribute set.
6666+ [Traccar - Configuration File](https://www.traccar.org/configuration-file/).
4967 '';
5068 };
5169 environmentFile = lib.mkOption {
···56745775 Can be used for storing the secrets without making them available in the world-readable Nix store.
58765959- For example, you can set {option}`services.traccar.settings.databasePassword = "$TRACCAR_DB_PASSWORD"`
7777+ For example, you can set {option}`services.traccar.settings.database.password = "$TRACCAR_DB_PASSWORD"`
6078 and then specify `TRACCAR_DB_PASSWORD="<secret>"` in the environment file.
6179 This value will get substituted in the configuration file.
6280 '';
···65836684 config =
6785 let
6868- configuration = mkConfig cfg.settings;
8686+ configuration = if cfg.settingsFile != null then cfg.settingsFile else mkConfig cfg.settings;
6987 in
7088 lib.mkIf cfg.enable {
7189 systemd.services.traccar = {
···9211093111 serviceConfig = {
94112 DynamicUser = true;
9595- EnvironmentFile = cfg.environmentFile;
113113+ EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
96114 ExecStart = "${lib.getExe pkgs.traccar} ${configFilePath}";
97115 LockPersonality = true;
98116 NoNewPrivileges = true;
···709709 system.extraDependencies =
710710 with pkgs;
711711 [
712712+ # TODO: Remove this when we can install systems
713713+ # without `stdenv`.
714714+ stdenv
715715+712716 bintools
713717 brotli
714718 brotli.dev
···1212 src = fetchFromGitHub {
1313 owner = "kubernetes-sigs";
1414 repo = "bom";
1515- rev = "v${version}";
1515+ tag = "v${version}";
1616 hash = "sha256-nYzBaFtOJhqO0O6MJsxTw/mxsIOa+cnU27nOFRe2/uI=";
1717 # populate values that require us to use git. By doing this in postFetch we
1818 # can delete .git afterwards and maintain better reproducibility of the src.
···1212 src = fetchFromGitHub {
1313 owner = "codecrafters-io";
1414 repo = "cli";
1515- rev = "v${version}";
1515+ tag = "v${version}";
1616 hash = "sha256-YgQPDc5BUIoEd44NLpRluxCKooW99qvcSTrFPm6qJKM=";
1717 # A shortened git commit hash is part of the version output, and is
1818 # needed at build time. Use the `.git` directory to retrieve the
+1-1
pkgs/by-name/co/colima/package.nix
···1919 src = fetchFromGitHub {
2020 owner = "abiosoft";
2121 repo = "colima";
2222- rev = "v${version}";
2222+ tag = "v${version}";
2323 hash = "sha256-RQnHqEabxyoAKr8BfmVhk8z+l5oy8pa5JPTWk/0FV5g=";
2424 # We need the git revision
2525 leaveDotGit = true;
···2020 src = fetchFromGitHub {
2121 owner = "sigstore";
2222 repo = "fulcio";
2323- rev = "v${version}";
2323+ tag = "v${version}";
2424 hash = "sha256-UVUVT4RvNHvzIwV6azu2h1O9lnNu0PQnnkj4wbrY8BA=";
2525 # populate values that require us to use git. By doing this in postFetch we
2626 # can delete .git afterwards and maintain better reproducibility of the src.
···1414 src = fetchFromGitHub {
1515 owner = "grdl";
1616 repo = "git-get";
1717- rev = "v${version}";
1717+ tag = "v${version}";
1818 hash = "sha256-v98Ff7io7j1LLzciHNWJBU3LcdSr+lhwYrvON7QjyCI=";
1919 # populate values that require us to use git. By doing this in postFetch we
2020 # can delete .git afterwards and maintain better reproducibility of the src.
···1313 src = fetchFromGitHub {
1414 owner = "quarkslab";
1515 repo = "kdigger";
1616- rev = "v${version}";
1616+ tag = "v${version}";
1717 hash = "sha256-hpLhtTENtOBQjm+CZRAcx1BG9831JUFIsLL57wZIrso=";
1818 # populate values that require us to use git. By doing this in postFetch we
1919 # can delete .git afterwards and maintain better reproducibility of the src.
···1515 src = fetchFromGitHub {
1616 owner = "Nitrokey";
1717 repo = "libnitrokey";
1818- rev = "v${finalAttrs.version}";
1818+ tag = "v${finalAttrs.version}";
1919 hash = "sha256-4PEZ31QyVOmdhpKqTN8fwcHoLuu+w+OJ3fZeqwlE+io=";
2020 # On OSX, libnitrokey depends on a custom version of hidapi in a submodule.
2121 # Monitor https://github.com/Nitrokey/libnitrokey/issues/140 to see if we
···4545 src = fetchFromGitHub {
4646 owner = "mltframework";
4747 repo = "mlt";
4848- rev = "v${version}";
4848+ tag = "v${version}";
4949 hash = "sha256-z1bW+hcVeMeibC1PUS5XNpbkNB+75YLoOWZC2zuDol4=";
5050 # The submodule contains glaxnimate code, since MLT uses internally some functions defined in glaxnimate.
5151 # Since glaxnimate is not available as a library upstream, we cannot remove for now this dependency on
···1313 src = fetchFromGitHub {
1414 owner = "pdfcpu";
1515 repo = "pdfcpu";
1616- rev = "v${version}";
1616+ tag = "v${version}";
1717 hash = "sha256-HTqaFl/ug/4sdchZBD4VQiXbD1L0/DVf2efZ3BV/vx4=";
1818 # Apparently upstream requires that the compiled executable will know the
1919 # commit hash and the date of the commit. This information is also presented
···1616 src = fetchFromGitHub {
1717 owner = "F1bonacc1";
1818 repo = "process-compose";
1919- rev = "v${version}";
1919+ tag = "v${version}";
2020 hash = "sha256-qv/fVfuQD7Nan5Nn1RkwXoGZuPYSRWQaojEn6MCF9BQ=";
2121 # populate values that require us to use git. By doing this in postFetch we
2222 # can delete .git afterwards and maintain better reproducibility of the src.
···1313 src = fetchFromGitHub {
1414 owner = "mgechev";
1515 repo = "revive";
1616- rev = "v${version}";
1616+ tag = "v${version}";
1717 hash = "sha256-89BlSc2tgxAJUGZM951fF+0H+SOsl0+xz/G18neRZxI=";
1818 # populate values that require us to use git. By doing this in postFetch we
1919 # can delete .git afterwards and maintain better reproducibility of the src.
···40404141 # if a release is tagged (which sometimes does not happen), it will
4242 # be in the format below.
4343- rev = "Release-${lib.replaceStrings [ "." ] [ "-" ] version}";
4343+ tag = "Release-${lib.replaceStrings [ "." ] [ "-" ] version}";
4444 hash = "sha256-vrRIirWQLbbe1l07AqqHK/StWo0egKuivdKT5R8Rx58=";
45454646 # the repository's .gitattributes file contains the lines "/Tst/
···1616 src = fetchFromGitHub {
1717 owner = "aquasecurity";
1818 repo = "starboard";
1919- rev = "v${finalAttrs.version}";
1919+ tag = "v${finalAttrs.version}";
2020 hash = "sha256-yQ4ABzN8EvD5qs0yjTaihM145K79LglprC2nlqAw0XU=";
2121 # populate values that require us to use git. By doing this in postFetch we
2222 # can delete .git afterwards and maintain better reproducibility of the src.
···5858 # Non-NixOS package managers are not present in the build environment.
5959 "test_parse_upgradable_list_apt"
6060 "test_parse_upgradable_list_dnf"
6161+ # Fails due to GPG clearsign output lacking trailing newline in some setups.
6262+ "test_clearsign_verification"
6163 ];
62646365 disabledTestPaths = [ "blocksatgui/tests/" ];