···209209210210- `pnpm` was updated to version 10. If your project is incompatible, you can install the previous version from the package attribute `pnpm_9`.
211211212212+- `dwarf-fortress-packages` now only contains one minor version for each major version since version 0.44. Saves should still be compatible, but you may have to change which minor version you were using if it was one other than the newest.
213213+212214- `zig_0_9` and `zig_0_10` have been removed, you should upgrade to `zig_0_13` (also available as just `zig`), `zig_0_12` or `zig_0_11` instead.
213215214216- `webpack-cli` was updated to major version 6, which has breaking changes from the previous version 5.1.4. See the [upstream release notes](https://github.com/webpack/webpack-cli/releases/tag/webpack-cli%406.0.0) for details on these changes.
···348350 - All versions specified in composeAndroidPackages now track the latest. Android packages are automatically updated on unstable, and run the androidenv test suite on every update.
349351 - Many androidenv packages are now searchable on [search.nixos.org](https://search.nixos.org).
350352 - We now use the latest Google repositories, which should improve aarch64-darwin compatibility. The SDK now additionally evaluates on aarch64-linux, though not all packages are functional.
353353+354354+- `dwarf-fortress` audio now works again. Additionally, the `dfhack` and `dwarf-fortress-full` packages are now exposed at toplevel, making it easier to install and play Dwarf Fortress. Note that `dwarf-fortress-full` is the Nixpkgs equivalent of the Dwarf Fortress Lazy Pack.
351355352356- `gerbera` now has wavpack support.
353357
···3030 inherit (lib.attrsets)
3131 attrByPath
3232 optionalAttrs
3333+ showAttrPath
3334 ;
3435 inherit (lib.strings)
3536 concatMapStrings
···4041 ;
4142 inherit (lib.lists)
4243 last
4444+ toList
4345 ;
4446 prioritySuggestion = ''
4547 Use `lib.mkForce value` or `lib.mkDefault value` to change the priority on any of these definitions.
···310312 }:
311313 let
312314 name' = if isList name then last name else name;
313313- default' = if isList default then default else [ default ];
314314- defaultText = concatStringsSep "." default';
315315+ default' = toList default;
316316+ defaultText = showAttrPath default';
315317 defaultValue = attrByPath default' (throw "${defaultText} cannot be found in ${pkgsText}") pkgs;
316318 defaults =
317319 if default != null then
318320 {
319321 default = defaultValue;
320320- defaultText = literalExpression ("${pkgsText}." + defaultText);
322322+ defaultText = literalExpression "${pkgsText}.${defaultText}";
321323 }
322324 else
323325 optionalAttrs nullable {
···333335 }
334336 // optionalAttrs (example != null) {
335337 example = literalExpression (
336336- if isList example then "${pkgsText}." + concatStringsSep "." example else example
338338+ if isList example then "${pkgsText}.${showAttrPath example}" else example
337339 );
338340 }
339341 );
+1-1
lib/path/default.nix
···165165 # This is a workaround for https://github.com/NixOS/nix/issues/12361 which
166166 # was needed during the experimental phase of ca-derivations and should be
167167 # removed once the issue has been resolved.
168168- || match "[0-9a-z]{52}" (head components) != null;
168168+ || components != [ ] && match "[0-9a-z]{52}" (head components) != null;
169169170170in
171171# No rec! Add dependencies on this file at the top.
···678678 check =
679679 x:
680680 let
681681- isInStore = builtins.match "${builtins.storeDir}/[^.].*" (toString x) != null;
681681+ isInStore = lib.path.hasStorePathPrefix (
682682+ if builtins.isPath x then
683683+ x
684684+ # Discarding string context is necessary to convert the value to
685685+ # a path and safe as the result is never used in any derivation.
686686+ else
687687+ /. + builtins.unsafeDiscardStringContext x
688688+ );
682689 isAbsolute = builtins.substring 0 1 (toString x) == "/";
683690 isExpectedType = (
684691 if inStore == null || inStore then isStringLike x else isString x # Do not allow a true path, which could be copied to the store later on.
···139139140140- [Netbird](https://netbird.io), an open-source VPN management platform, now has a self-hosted management server. Available as [services.netbird.server](#opt-services.netbird.server.enable).
141141142142-- [nh](https://github.com/viperML/nh), yet another Nix CLI helper. Available as [programs.nh](#opt-programs.nh.enable).
142142+- [nh](https://github.com/nix-community/nh), yet another Nix CLI helper. Available as [programs.nh](#opt-programs.nh.enable).
143143144144- [oink](https://github.com/rlado/oink), a dynamic DNS client for Porkbun. Available as [services.oink](#opt-services.oink.enable).
145145
+3
nixos/doc/manual/release-notes/rl-2505.section.md
···224224225225- [GoDNS](https://github.com/TimothyYe/godns), a dynamic DNS client written in Go, which supports multiple DNS providers. Available as [services.godns](option.html#opt-services.godns.enable).
226226227227+- [CookCLI](https://cooklang.org/cli/) Server, a web UI for cooklang recipes.
228228+227229<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
228230229231## Backward Incompatibilities {#sec-release-25.05-incompatibilities}
···425427426428427429- `programs.clash-verge.tunMode` was deprecated and removed because now service mode is necessary to start program. Without `programs.clash-verge.enable`, clash-verge-rev will refuse to start.
430430+- `services.discourse` now requires PostgreSQL 15 per default. Please update before upgrading.
428431429432- `services.homepage-dashboard` now requires the `allowedHosts` option to be set in accordance with the [documentation](https://gethomepage.dev/installation/#homepage_allowed_hosts).
430433
···11+{
22+ lib,
33+ stdenv,
44+ fetchFromGitHub,
55+ nix-update-script,
66+}:
77+88+stdenv.mkDerivation (finalAttrs: {
99+ pname = "eliza";
1010+ version = "0-unstable-2025-02-21";
1111+ src = fetchFromGitHub {
1212+ owner = "anthay";
1313+ repo = "ELIZA";
1414+ rev = "27bcf6e5fb1d32812cc0aab8133fa5e395d41773";
1515+ hash = "sha256-/i8mckRQWTK1yI/MNaieSuE+dx94DMdrABkqf/bXQbM=";
1616+ };
1717+1818+ doCheck = true;
1919+2020+ # Unit tests are executed automatically on execution
2121+ checkPhase = ''
2222+ runHook preCheck
2323+ echo Corki is mana | ./eliza
2424+ runHook postCheck
2525+ '';
2626+2727+ buildPhase = ''
2828+ runHook preBuild
2929+ $CXX -std=c++20 -pedantic -o eliza ./src/eliza.cpp
3030+ runHook postBuild
3131+ '';
3232+3333+ installPhase = ''
3434+ runHook preInstall
3535+ install -Dm544 ./eliza $out/bin/eliza
3636+ runHook postInstall
3737+ '';
3838+3939+ passthru.updateScript = nix-update-script {
4040+ extraArgs = [
4141+ "--version=branch=master"
4242+ ];
4343+ };
4444+4545+ meta = {
4646+ description = "C++ simulation of Joseph Weizenbaum’s 1966 ELIZA";
4747+ longDescription = ''
4848+ This is an implementation in C++ of ELIZA that attempts to be as close
4949+ to the original as possible.
5050+ It was made to closely follow Joseph Weizenbaum’s description of his program
5151+ given in his January 1966 Communications of the ACM paper, and later changed
5252+ to follow the ELIZA source code found on 2021 and the SLIP programming
5353+ function HASH(D,N) found on 2022.
5454+ It is controlled by a script identical to the one given in the appendix of
5555+ the 1966 paper.
5656+ '';
5757+ license = lib.licenses.cc0;
5858+ mainProgram = "eliza";
5959+ homepage = "https://github.com/anthay/ELIZA";
6060+ maintainers = with lib.maintainers; [ EmanuelM153 ];
6161+ platforms = lib.platforms.all;
6262+ };
6363+})
···11-From 1d78c8bd4295262a3118f478e6b3a7c7536fa282 Mon Sep 17 00:00:00 2001
22-From: Johannes Altmanninger <aclopte@gmail.com>
33-Date: Wed, 19 Mar 2025 09:39:04 +0100
44-Subject: [PATCH] Fix concurrent setlocale() in string escape tests
55-66-In our C++ implementation, these tests were run serially. As pointed out in
77-https://github.com/fish-shell/fish-shell/issues/11254#issuecomment-2735623229
88-we run them in parallel now, which means that one test could be changing
99-the global locale used by another.
1010-1111-In theory this could be fine because all tests are setting setting the
1212-global locale to the same thing but the existence of a lock suggests that
1313-setlocale() is not guaranteed to be atomic, so it's possible that another
1414-thread uses a temporarily-invalid locale.
1515-1616-Fixes #11254
1717----
1818- src/tests/string_escape.rs | 14 ++++++++------
1919- 1 file changed, 8 insertions(+), 6 deletions(-)
2020-2121-diff --git a/src/tests/string_escape.rs b/src/tests/string_escape.rs
2222-index ba8ee7534ebf..4428d679cd35 100644
2323---- a/src/tests/string_escape.rs
2424-+++ b/src/tests/string_escape.rs
2525-@@ -1,3 +1,5 @@
2626-+use std::sync::MutexGuard;
2727-+
2828- use crate::common::{
2929- escape_string, str2wcstring, unescape_string, wcs2string, EscapeFlags, EscapeStringStyle,
3030- UnescapeStringStyle, ENCODE_DIRECT_BASE, ENCODE_DIRECT_END,
3131-@@ -10,21 +12,21 @@ use rand::{Rng, RngCore};
3232-3333- /// wcs2string is locale-dependent, so ensure we have a multibyte locale
3434- /// before using it in a test.
3535--fn setlocale() {
3636-- let _guard = LOCALE_LOCK.lock().unwrap();
3737-+fn setlocale() -> MutexGuard<'static, ()> {
3838-+ let guard = LOCALE_LOCK.lock().unwrap();
3939-4040- #[rustfmt::skip]
4141- const UTF8_LOCALES: &[&str] = &[
4242- "C.UTF-8", "en_US.UTF-8", "en_GB.UTF-8", "de_DE.UTF-8", "C.utf8", "UTF-8",
4343- ];
4444- if crate::libc::MB_CUR_MAX() > 1 {
4545-- return;
4646-+ return guard;
4747- }
4848- for locale in UTF8_LOCALES {
4949- let locale = std::ffi::CString::new(locale.to_owned()).unwrap();
5050- unsafe { libc::setlocale(libc::LC_CTYPE, locale.as_ptr()) };
5151- if crate::libc::MB_CUR_MAX() > 1 {
5252-- return;
5353-+ return guard;
5454- }
5555- }
5656- panic!("No UTF-8 locale found");
5757-@@ -100,7 +102,7 @@ fn test_escape_var() {
5858- }
5959-6060- fn escape_test(escape_style: EscapeStringStyle, unescape_style: UnescapeStringStyle) {
6161-- setlocale();
6262-+ let _locale_guard = setlocale();
6363- let seed: u128 = 92348567983274852905629743984572;
6464- let mut rng = get_seeded_rng(seed);
6565-6666-@@ -174,7 +176,7 @@ fn str2hex(input: &[u8]) -> String {
6767- /// string comes back through double conversion.
6868- #[test]
6969- fn test_convert() {
7070-- setlocale();
7171-+ let _locale_guard = setlocale();
7272- let seed = get_rng_seed();
7373- let mut rng = get_seeded_rng(seed);
7474- let mut origin = Vec::new();
···155155 pythonRelaxDeps = [
156156 "celery"
157157 "rapidfuzz"
158158+ "weblate-schemas"
158159 ];
159160160161 # We don't just use wrapGAppsNoGuiHook because we need to expose GI_TYPELIB_PATH
···11+# dwarf-fortress
22+33+Maintainers, please read me!
44+55+The policy for updates is currently keeping one major version of DF around since 0.44.
66+See [Save Compatibility](https://dwarffortresswiki.org/index.php/Save_compatibility)
77+on the DF wiki. Note that saves are backwards compatible, but not forwards-compatible.
88+99+This policy has been in effect since Nixpkgs 25.05.
+44-31
pkgs/games/dwarf-fortress/default.nix
···77 libsForQt5,
88 newScope,
99 perlPackages,
1010- jdk8,
1111- jre8,
1210}:
13111412# To whomever it may concern:
···6159 # out, ensure that (unfuck|dfhack|twbt) are all up to date before changing
6260 # this. Note that unfuck and twbt are not required for 50.
6361 latestVersion =
6464- if stdenv.hostPlatform.isLinux then
6565- "50.13"
6666- else if stdenv.hostPlatform.isDarwin then
6767- "0.47.05"
6868- else
6969- throw "Unsupported system";
6262+ self.dfVersions.game.latest.${
6363+ if stdenv.hostPlatform.isLinux then
6464+ "linux"
6565+ else if stdenv.hostPlatform.isDarwin then
6666+ "darwin"
6767+ else
6868+ throw "Unsupported system"
6969+ };
70707171 # Converts a version to a package name.
7272 versionToName = version: "dwarf-fortress_${replaceStrings [ "." ] [ "_" ] version}";
···9696 stdenv = gccStdenv;
9797 };
98989999- dwarf-therapist = libsForQt5.callPackage ./dwarf-therapist/wrapper.nix {
100100- inherit dwarf-fortress;
101101- dwarf-therapist = (libsForQt5.callPackage ./dwarf-therapist { }).override (
102102- optionalAttrs (!isAtLeast50) {
103103- # 41.2.5 is the last version to support Dwarf Fortress 0.47.
104104- version = "41.2.5";
105105- hash = "sha256-xfYBtnO1n6OcliVt07GsQ9alDJIfWdVhtuyWwuvXSZs=";
9999+ mkDfWrapper =
100100+ {
101101+ dwarf-fortress,
102102+ dfhack,
103103+ dwarf-therapist ? null,
104104+ ...
105105+ }@args:
106106+ callPackage ./wrapper (
107107+ {
108108+ inherit (self) themes;
109109+ inherit
110110+ dwarf-fortress
111111+ twbt
112112+ dfhack
113113+ dwarf-therapist
114114+ ;
106115 }
116116+ // args
107117 );
118118+119119+ dwarf-therapist = libsForQt5.callPackage ./dwarf-therapist/wrapper.nix {
120120+ inherit dwarf-fortress dfhack mkDfWrapper;
121121+ dwarf-therapist =
122122+ (libsForQt5.callPackage ./dwarf-therapist {
123123+ inherit (self) dfVersions;
124124+ }).override
125125+ (
126126+ optionalAttrs (!isAtLeast50) {
127127+ # 41.2.5 is the last version to support Dwarf Fortress 0.47.
128128+ version = "41.2.5";
129129+ maxDfVersion = "0.47.05";
130130+ hash = "sha256-xfYBtnO1n6OcliVt07GsQ9alDJIfWdVhtuyWwuvXSZs=";
131131+ }
132132+ );
108133 };
109134 in
110110- callPackage ./wrapper {
111111- inherit (self) themes;
112112- inherit
113113- dwarf-fortress
114114- twbt
115115- dfhack
116116- dwarf-therapist
117117- ;
118118-119119- jdk = jdk8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
120120- };
121121- }) (attrNames self.df-hashes)
135135+ mkDfWrapper { inherit dwarf-fortress dfhack dwarf-therapist; };
136136+ }) (attrNames self.dfVersions.game.versions)
122137 );
123138124139 self = rec {
125125- df-hashes = importJSON ./game.json;
140140+ dfVersions = importJSON ./df.lock.json;
126141127142 # Aliases for the latest Dwarf Fortress and the selected Therapist install
128143 dwarf-fortress = getAttr (versionToName latestVersion) df-games;
···135150136151 soundSense = callPackage ./soundsense.nix { };
137152138138- legends-browser = callPackage ./legends-browser {
139139- jre = jre8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
140140- };
153153+ legends-browser = callPackage ./legends-browser { };
141154142155 themes = recurseIntoAttrs (
143156 callPackage ./themes {
···112112 cd "$NIXPKGS_DF_HOME"
113113 debug "Executing: $NIXPKGS_DF_HOME/$NIXPKGS_DF_EXE"
114114115115+ # Only mess with the library paths if we're starting Dwarf Fortress (not Soundsense).
116116+ if [ "$NIXPKGS_DF_GAME" -eq 1 ]; then
117117+ # Handle library paths on Darwin.
118118+ if [ "$NIXPKGS_DF_PLATFORM" == df_osx ]; then
119119+ if [ "${NIXPKGS_DF_PLATFORM_REV%%.*}" -ge 11 ]; then
120120+ export DYLD_LIBRARY_PATH="$NIXPKGS_DF_ENV/libs"
121121+ export DYLD_FRAMEWORK_PATH="$NIXPKGS_DF_ENV/libs"
122122+ else
123123+ export DYLD_FALLBACK_LIBRARY_PATH="$NIXPKGS_DF_ENV/libs"
124124+ export DYLD_FALLBACK_FRAMEWORK_PATH="$NIXPKGS_DF_ENV/libs"
125125+ fi
126126+ fi
127127+128128+ if [ "$NIXPKGS_DF_PLATFORM" == df_linux ]; then
129129+ # We have to preload the audio plugin for audio to work. See Nix Pill #12 for this pattern:
130130+ # https://nixos.org/guides/nix-pills/12-inputs-design-pattern.html
131131+ if [ "${_NIXPKGS_DF_OPTS[fmod]}" -eq 0 ] && [ -f "$NIXPKGS_DF_HOME/libfmod.so.13" ]; then
132132+ export LD_PRELOAD="$NIXPKGS_DF_HOME/libfmod.so.13${LD_PRELOAD:+:}${LD_PRELOAD:-}"
133133+ else
134134+ export LD_PRELOAD="@SDL2_mixer@${LD_PRELOAD:+:}${LD_PRELOAD:-}"
135135+ fi
136136+ fi
137137+ fi
138138+115139 # If we make it past here, we want to log.
116140 # shellcheck disable=SC2093
117117- exec -a "$NIXPKGS_DF_EXE" "$NIXPKGS_DF_HOME/$NIXPKGS_DF_EXE"
141141+ exec -a "$NIXPKGS_DF_EXE" "$NIXPKGS_DF_HOME/$NIXPKGS_DF_EXE" "$@"
118142 log "Execution of $NIXPKGS_DF_HOME/$NIXPKGS_DF_EXE failed!"
119143 exit 1
120144}
121145146146+# Figure out the Dwarf Fortress directory (df_linux or df_osx).
122147os_name="$(@uname@)"
123123-os_rev="$(@uname@ -r)"
124124-125148if [ "$os_name" == Linux ]; then
126126- df_dir="df_linux"
149149+ export NIXPKGS_DF_PLATFORM="df_linux"
127150elif [ "$os_name" == Darwin ]; then
128128- df_dir="df_osx"
151151+ export NIXPKGS_DF_PLATFORM="df_osx"
129152else
130153 log "Unknown platform: $os_name"
131154 exit 1
132155fi
156156+export NIXPKGS_DF_PLATFORM_REV="$(@uname@ -r)"
133157134158if [[ -v DF_DIR ]] && [ -n "$DF_DIR" ] && { [[ ! -v NIXPKGS_DF_HOME ]] || [ -z "$NIXPKGS_DF_HOME" ]; }; then
135159 # Compatibility for users that were using DF_DIR, since the dfhack script clobbers this variable.
···137161fi
138162139163if [[ ! -v NIXPKGS_DF_HOME ]] || [ -z "$NIXPKGS_DF_HOME" ]; then
140140- export NIXPKGS_DF_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/$df_dir"
164164+ export NIXPKGS_DF_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/$NIXPKGS_DF_PLATFORM"
141165fi
142166143167# Compatibility.
···166190EOF
167191168192cd "$NIXPKGS_DF_ENV"
169169-170170-# All potential important files in DF 50 and below.
171171-for path in dwarfort dwarfort.exe df *.so libs raw data/init/* data/!(init|index|announcement); do
172172- force_delete=0
173173- if [[ "$path" == libfmod*.so* ]] && [ "${_NIXPKGS_DF_OPTS[fmod]}" -eq 0 ]; then
174174- force_delete=1
175175- fi
176176-177177- if [ -e "$path" ] && [ "$force_delete" -eq 0 ]; then
178178- update_path "$path"
179179- else
180180- cleanup_path "$path"
181181- fi
182182-done
183183-184184-# These need to be copied due to read only flags on older versions of DF.
185185-for path in index announcement help dipscript; do
186186- forcecopy_path "data/$path"
187187-done
188188-189189-# Handle library paths on Darwin.
190190-if [ "$os_name" == Darwin ]; then
191191- if [ "${os_rev%%.*}" -ge 11 ]; then
192192- export DYLD_LIBRARY_PATH="$NIXPKGS_DF_ENV/libs"
193193- export DYLD_FRAMEWORK_PATH="$NIXPKGS_DF_ENV/libs"
194194- else
195195- export DYLD_FALLBACK_LIBRARY_PATH="$NIXPKGS_DF_ENV/libs"
196196- export DYLD_FALLBACK_FRAMEWORK_PATH="$NIXPKGS_DF_ENV/libs"
197197- fi
198198-fi
···11#!@stdenv_shell@ -e
2233export NIXPKGS_DF_EXE="@dfExe@"
44+export NIXPKGS_DF_GAME=1
45source @dfInit@
66+77+# All potential important files in DF 50 and below.
88+for path in dwarfort dwarfort.exe df *.so* libs raw data/init/* data/!(init|index|announcement); do
99+ force_delete=0
1010+ if [[ "$path" == *fmod*.so* ]] && [ "${_NIXPKGS_DF_OPTS[fmod]}" -eq 0 ]; then
1111+ # Delete fmod plugins if we're using SDL_mixer.
1212+ force_delete=1
1313+ elif [[ "$path" == *mixer*.so* ]] && [ "${_NIXPKGS_DF_OPTS[fmod]}" -ne 0 ]; then
1414+ # Delete SDL_mixer plugins if we're using fmod.
1515+ force_delete=1
1616+ fi
1717+1818+ if [ -e "$path" ] && [ "$force_delete" -eq 0 ]; then
1919+ update_path "$path"
2020+ else
2121+ cleanup_path "$path"
2222+ fi
2323+done
2424+2525+# These need to be copied due to read only flags on older versions of DF.
2626+for path in index announcement help dipscript; do
2727+ forcecopy_path "data/$path"
2828+done
529630# If we're switching back from dfhack to vanilla, cleanup all dfhack
731# links so Dwarf Fortress doesn't autoload its leftover libdfhooks.so.
···3256 done
3357fi
34583535-go
5959+go "$@"
+2-1
pkgs/games/dwarf-fortress/wrapper/soundSense.in
···11#!@stdenv_shell@ -e
2233export NIXPKGS_DF_EXE="soundsense/soundSense.sh"
44+export NIXPKGS_DF_GAME=0
45source @dfInit@
5667for path in soundsense/*; do
78 update_path "$path"
89done
9101010-PATH="@jre@/bin:$PATH" go
1111+JDK_JAVA_OPTIONS='--add-opens=java.xml/com.sun.org.apache.xerces.internal.parsers=ALL-UNNAMED' PATH="@jre@/bin:$PATH" go "$@"
···14781478 prometheus-openldap-exporter = throw "'prometheus-openldap-exporter' has been removed from nixpkgs, as it was unmaintained"; # Added 2024-09-01
14791479 prometheus-minio-exporter = throw "'prometheus-minio-exporter' has been removed from nixpkgs, use Minio's built-in Prometheus integration instead"; # Added 2024-06-10
14801480 prometheus-tor-exporter = throw "'prometheus-tor-exporter' has been removed from nixpkgs, as it was broken and unmaintained"; # Added 2024-10-30
14811481+ protobuf_23 = throw "'protobuf_23' has been removed from nixpkgs. Consider using a more recent version of the protobuf library"; # Added 2025-04-20
14811482 protobuf3_24 = protobuf_24;
14821483 protobuf3_23 = protobuf_23;
14831484 protobuf3_21 = protobuf_21;
···15771578 SDL_classic = SDL1; # Added 2024-09-03
15781579 SDL1 = throw "'SDL1' has been removed as development ended long ago with SDL 2.0 replacing it, use SDL_compat instead"; # Added 2025-03-27
15791580 SDL_gpu = throw "'SDL_gpu' has been removed due to lack of upstream maintenance and known users"; # Added 2025-03-15
15811581+ SDL_image_2_0 = throw "'SDL_image_2_0' has been removed in favor of the latest version"; # Added 2025-04-20
15801582 s2n = throw "'s2n' has been renamed to/replaced by 's2n-tls'"; # Converted to throw 2024-10-17
15811583 sandboxfs = throw "'sandboxfs' has been removed due to being unmaintained, consider using linux namespaces for sandboxing instead"; # Added 2024-06-06
15821584 sane-backends-git = throw "'sane-backends-git' has been renamed to/replaced by 'sane-backends'"; # Converted to throw 2024-10-17