Merge master into staging-next

This commit is contained in:
nixpkgs-ci[bot]
2026-08-26 06:10:31 +00:00
committed by GitHub
34 changed files with 939 additions and 808 deletions

View File

@@ -199,7 +199,7 @@ nixos/modules/installer/tools/nix-fallback-paths.nix @Artturin @Ericson2314 @lo
/doc/languages-frameworks/haskell.section.md @sternenseemann @maralorn @wolfgangwalther
/maintainers/scripts/haskell @sternenseemann @maralorn @wolfgangwalther
/pkgs/development/compilers/ghc @sternenseemann @maralorn @wolfgangwalther
/pkgs/development/compilers/ghc/9.6.6-debian-binary.nix @sternenseemann @maralorn @wolfgangwalther @OPNA2608
/pkgs/development/compilers/ghc/9.6.6-debian-binary.nix @sternenseemann @maralorn @wolfgangwalther @OPNA2608 @liberodark
/pkgs/development/haskell-modules @sternenseemann @maralorn @wolfgangwalther
/pkgs/test/haskell @sternenseemann @maralorn @wolfgangwalther
/pkgs/top-level/release-haskell.nix @sternenseemann @maralorn @wolfgangwalther

View File

@@ -36,7 +36,7 @@ let
};
tun = {
disabled = netCfg.tun.disable;
dev = if (netCfg.tun.device != null) then netCfg.tun.device else "nebula.${netName}";
dev = netCfg.tun.device;
};
firewall = {
inbound = netCfg.firewall.inbound;
@@ -75,187 +75,213 @@ in
description = "Nebula network definitions.";
default = { };
type = lib.types.attrsOf (
lib.types.submodule {
options = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable or disable this network.";
};
lib.types.submodule (
{ name, ... }: {
options = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable or disable this network.";
};
package = lib.mkPackageOption pkgs "nebula" { };
package = lib.mkPackageOption pkgs "nebula" { };
ca = lib.mkOption {
type = lib.types.path;
description = "Path to the certificate authority certificate.";
example = "/etc/nebula/ca.crt";
};
ca = lib.mkOption {
type = lib.types.path;
description = "Path to the certificate authority certificate.";
example = "/etc/nebula/ca.crt";
};
cert = lib.mkOption {
type = lib.types.path;
description = "Path to the host certificate.";
example = "/etc/nebula/host.crt";
};
cert = lib.mkOption {
type = lib.types.path;
description = "Path to the host certificate.";
example = "/etc/nebula/host.crt";
};
key = lib.mkOption {
type = lib.types.oneOf [
lib.types.nonEmptyStr
lib.types.path
];
description = "Path or reference to the host key.";
example = "/etc/nebula/host.key";
};
key = lib.mkOption {
type = lib.types.oneOf [
lib.types.nonEmptyStr
lib.types.path
];
description = "Path or reference to the host key.";
example = "/etc/nebula/host.key";
};
enableReload = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Enable automatic config reload on config change.
This setting is not enabled by default as nix cannot determine if the config change is reloadable.
Please refer to the [config reference](https://nebula.defined.net/docs/config/) for documentation on reloadable changes.
'';
};
enableReload = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Enable automatic config reload on config change.
This setting is not enabled by default as nix cannot determine if the config change is reloadable.
Please refer to the [config reference](https://nebula.defined.net/docs/config/) for documentation on reloadable changes.
'';
};
staticHostMap = lib.mkOption {
type = lib.types.attrsOf (lib.types.listOf (lib.types.str));
default = { };
description = ''
The static host map defines a set of hosts with fixed IP addresses on the internet (or any network).
A host can have multiple fixed IP addresses defined here, and nebula will try each when establishing a tunnel.
'';
example = {
"192.168.100.1" = [ "100.64.22.11:4242" ];
staticHostMap = lib.mkOption {
type = lib.types.attrsOf (lib.types.listOf (lib.types.str));
default = { };
description = ''
The static host map defines a set of hosts with fixed IP addresses on the internet (or any network).
A host can have multiple fixed IP addresses defined here, and nebula will try each when establishing a tunnel.
'';
example = {
"192.168.100.1" = [ "100.64.22.11:4242" ];
};
};
isLighthouse = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether this node is a lighthouse.";
};
isRelay = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether this node is a relay.";
};
lighthouse.dns.enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether this lighthouse node should serve DNS.";
};
lighthouse.dns.host = lib.mkOption {
type = lib.types.str;
default = "localhost";
description = ''
IP address on which nebula lighthouse should serve DNS.
'localhost' is a good default to ensure the service does not listen on public interfaces;
use a Nebula address like 10.0.0.5 to make DNS resolution available to nebula hosts only.
'';
};
lighthouse.dns.port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = 5353;
description = "UDP port number for lighthouse DNS server.";
};
lighthouses = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
List of IPs of lighthouse hosts this node should report to and query from. This should be empty on lighthouse
nodes. The IPs should be the lighthouse's Nebula IPs, not their external IPs.
'';
example = [ "192.168.100.1" ];
};
relays = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
List of IPs of relays that this node should allow traffic from.
'';
example = [ "192.168.100.1" ];
};
listen.host = lib.mkOption {
type = lib.types.str;
default = "0.0.0.0";
description = "IP address to listen on.";
};
listen.port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
defaultText = lib.literalExpression ''
if (config.services.nebula.networks.''${name}.isLighthouse ||
config.services.nebula.networks.''${name}.isRelay) then
4242
else
0;
'';
description = "Port number to listen on.";
};
tun.disable = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
When tun is disabled, a lighthouse can be started without a local tun interface (and therefore without root).
'';
};
tun.device = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = "nebula.${name}";
description = "Name of the tun device. Defaults to nebula.\${networkName}.";
};
firewall.outbound = lib.mkOption {
type = lib.types.listOf lib.types.attrs;
default = [ ];
description = "Firewall rules for outbound traffic.";
example = [
{
port = "any";
proto = "any";
host = "any";
}
];
};
firewall.inbound = lib.mkOption {
type = lib.types.listOf lib.types.attrs;
default = [ ];
description = "Firewall rules for inbound traffic.";
example = [
{
port = "any";
proto = "any";
host = "any";
}
];
};
settings = lib.mkOption {
type = format.type;
default = { };
description = ''
Nebula configuration. Refer to
<https://github.com/slackhq/nebula/blob/master/examples/config.yml>
for details on supported values.
'';
example = lib.literalExpression ''
{
lighthouse.interval = 15;
}
'';
};
user = lib.mkOption {
type = lib.types.str;
default = nameToId name;
description = ''
User under which the nebula daemon is run for this network.
::: {.note}
A user will be created if this config is left to the default value.
:::
'';
};
group = lib.mkOption {
type = lib.types.str;
default = nameToId name;
description = ''
Group under which the nebula daemon is run for this network.
::: {.note}
The group will be created if this config is left to the default value.
:::
'';
};
};
isLighthouse = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether this node is a lighthouse.";
};
isRelay = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether this node is a relay.";
};
lighthouse.dns.enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether this lighthouse node should serve DNS.";
};
lighthouse.dns.host = lib.mkOption {
type = lib.types.str;
default = "localhost";
description = ''
IP address on which nebula lighthouse should serve DNS.
'localhost' is a good default to ensure the service does not listen on public interfaces;
use a Nebula address like 10.0.0.5 to make DNS resolution available to nebula hosts only.
'';
};
lighthouse.dns.port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = 5353;
description = "UDP port number for lighthouse DNS server.";
};
lighthouses = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
List of IPs of lighthouse hosts this node should report to and query from. This should be empty on lighthouse
nodes. The IPs should be the lighthouse's Nebula IPs, not their external IPs.
'';
example = [ "192.168.100.1" ];
};
relays = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
List of IPs of relays that this node should allow traffic from.
'';
example = [ "192.168.100.1" ];
};
listen.host = lib.mkOption {
type = lib.types.str;
default = "0.0.0.0";
description = "IP address to listen on.";
};
listen.port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
defaultText = lib.literalExpression ''
if (config.services.nebula.networks.''${name}.isLighthouse ||
config.services.nebula.networks.''${name}.isRelay) then
4242
else
0;
'';
description = "Port number to listen on.";
};
tun.disable = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
When tun is disabled, a lighthouse can be started without a local tun interface (and therefore without root).
'';
};
tun.device = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Name of the tun device. Defaults to nebula.\${networkName}.";
};
firewall.outbound = lib.mkOption {
type = lib.types.listOf lib.types.attrs;
default = [ ];
description = "Firewall rules for outbound traffic.";
example = [
{
port = "any";
proto = "any";
host = "any";
}
];
};
firewall.inbound = lib.mkOption {
type = lib.types.listOf lib.types.attrs;
default = [ ];
description = "Firewall rules for inbound traffic.";
example = [
{
port = "any";
proto = "any";
host = "any";
}
];
};
settings = lib.mkOption {
type = format.type;
default = { };
description = ''
Nebula configuration. Refer to
<https://github.com/slackhq/nebula/blob/master/examples/config.yml>
for details on supported values.
'';
example = lib.literalExpression ''
{
lighthouse.interval = 15;
}
'';
};
};
}
}
)
);
};
};
@@ -263,11 +289,21 @@ in
# Implementation
config = lib.mkIf (enabledNetworks != { }) {
assertions = lib.mapAttrsToList (netName: netCfg: {
# IFNAMSIZ caps network device names to 16 chars (including NULL terminator).
# Without this check, users might end up with a truncated interface name.
assertion = !netCfg.tun.disable && builtins.stringLength netCfg.tun.device <= 15;
message = ''
Network device names can't be longer than 15 chars.
`config.services.nebula.networks.${netName}.tun.device` is set to "${netCfg.tun.device}" which is above the limit.
Please assign `tun.device` to something shorter.
'';
}) enabledNetworks;
systemd.services = lib.mkMerge (
lib.mapAttrsToList (
netName: netCfg:
let
networkId = nameToId netName;
settings = genSettings netName netCfg;
generatedConfigFile = genConfigFile netName settings;
configFile =
@@ -328,8 +364,8 @@ in
ProtectSystem = true;
RestrictNamespaces = true;
RestrictSUIDSGID = true;
User = networkId;
Group = networkId;
User = netCfg.user;
Group = netCfg.group;
};
unitConfig.StartLimitIntervalSec = 0; # ensure Restart=always is always honoured (networks can go down for arbitrarily long)
};
@@ -343,7 +379,7 @@ in
"nebula/${netName}.yml" = {
source = genConfigFile netName (genSettings netName netCfg);
mode = "0440";
user = nameToId netName;
user = netCfg.user;
};
})
(
@@ -362,19 +398,25 @@ in
# Create the service users and groups.
users.users = lib.mkMerge (
lib.mapAttrsToList (netName: netCfg: {
${nameToId netName} = {
group = nameToId netName;
description = "Nebula service user for network ${netName}";
isSystemUser = true;
};
}) enabledNetworks
lib.mapAttrsToList (
netName: netCfg:
lib.optionalAttrs (netCfg.user == nameToId netName) {
${nameToId netName} = {
group = netCfg.group;
description = "Nebula service user for network ${netName}";
isSystemUser = true;
};
}
) enabledNetworks
);
users.groups = lib.mkMerge (
lib.mapAttrsToList (netName: netCfg: {
${nameToId netName} = { };
}) enabledNetworks
lib.mapAttrsToList (
netName: netCfg:
lib.optionalAttrs (netCfg.group == nameToId netName) {
${nameToId netName} = { };
}
) enabledNetworks
);
};

View File

@@ -288,7 +288,7 @@ in
wants = [ "network-online.target" ];
path = with pkgs; [
ffmpeg_4-full
ffmpeg-full
];
script = ''

View File

@@ -88,15 +88,15 @@ let
};
};
betaVersion = {
version = "2026.1.3.6"; # "Android Studio Quail 3 | 2026.1.3 RC 2"
version = "2026.1.4.5"; # "Android Studio Quail 4 | 2026.1.4 RC 1"
sources = {
x86_64-linux = {
sha256Hash = "sha256-Mgwy+Cbx5yBCHWUEcvMfAsC1zMk3j7A5fWtMrVJgmAk=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.3.6/android-studio-quail3-rc2-linux.tar.gz";
sha256Hash = "sha256-of6o6bn3hpc5OyHJbm005GFeW2K1q3STQU4vzPRhB0w=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.4.5/android-studio-quail4-rc1-linux.tar.gz";
};
aarch64-darwin = {
sha256Hash = "sha256-5SJmTQRweFeAJsZWv0vHgK+ZtSHu0gp+al8iDGEAg+E=";
url = "https://edgedl.me.gvt1.com/android/studio/install/2026.1.3.6/android-studio-quail3-rc2-mac_arm.dmg";
sha256Hash = "sha256-FvtsU6FHFz/khKSWzBudNzgt4qVkdlS2kXIqGCcAncg=";
url = "https://edgedl.me.gvt1.com/android/studio/install/2026.1.4.5/android-studio-quail4-rc1-mac_arm.dmg";
};
};
};

View File

@@ -35,25 +35,25 @@ let
in
rustPlatform.buildRustPackage (finalAttrs: {
pname = "dorion";
version = "6.12.2";
version = "6.13.0";
src = fetchFromGitHub {
owner = "SpikeHD";
repo = "Dorion";
tag = "v${finalAttrs.version}";
hash = "sha256-aPYQOec4D0I4N/6nmSwodXsh3pvcHnlD37fUIw5kMjo=";
hash = "sha256-3AQX1q3qpu/QKqigmCvLKQJzQpsTnYgwT+1VWA+gIz0=";
};
cargoRoot = "src-tauri";
buildAndTestSubdir = finalAttrs.cargoRoot;
cargoHash = "sha256-3FS8w9K3Wx7KbT7iy+0pAMdmreZnL+ZFMSAnwesnS7Y=";
cargoHash = "sha256-p/mj3BL61HlLpN3nqNkVExu0mWaMawg9I2+dKeFUOJ8=";
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pnpm_10;
fetcherVersion = 3;
hash = "sha256-WzJD2Brg7+cx7TXRpEg2c1QSY0uo0Ppulj3ytdl0A4I=";
hash = "sha256-i20NSlWot8DmjSpdIGd2ne/82HyPB1cdxkBSxbOLA/8=";
};
# CMake (webkit extension, Linux only)

View File

@@ -8,16 +8,16 @@
buildGoModule (finalAttrs: {
pname = "fq";
version = "0.17.0";
version = "0.18.0";
src = fetchFromGitHub {
owner = "wader";
repo = "fq";
rev = "v${finalAttrs.version}";
hash = "sha256-rGuUvuq9hZrqt3Uy1s1he8O+c+iF83RU6PsUlatrPcQ=";
hash = "sha256-Prd0GkLQOdVtpjeu6Ga6dq3imOm7m4m1/kLp9g/1O0I=";
};
vendorHash = "sha256-Iga9g9VMTxtdselFn+8udjtInXWW9sNUfSzIc7OgvbY=";
vendorHash = "sha256-oqS6j8YTllObGKR8rFvlcFaUGnT3uouOP7pfzuTcgGk=";
ldflags = [
"-s"

View File

@@ -8,13 +8,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "fut";
version = "3.3.6";
version = "3.3.7";
src = fetchFromGitHub {
owner = "fusionlanguage";
repo = "fut";
tag = "fut-${finalAttrs.version}";
hash = "sha256-DWx97eYGR/jrLiN8RkHdjsU+hjSNKRD8q1BSEkNtcDU=";
hash = "sha256-SeCp6DhkYv31yrJHm2PbujKpbGRiRP0E9jweCk3GHoE=";
};
buildPhase = ''

View File

@@ -32,13 +32,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "goverlay";
version = "1.8.11";
version = "1.9.0";
src = fetchFromGitHub {
owner = "benjamimgois";
repo = "goverlay";
tag = finalAttrs.version;
hash = "sha256-N/lLvRU6uvYTLRlSrDkMund7U3q5qDxYxTj9T0C9he0=";
hash = "sha256-Il2EtcTLswmhQhIZ8lcOWqryoqvSNXZ3b1FiJPv85M8=";
};
outputs = [

File diff suppressed because it is too large Load Diff

View File

@@ -6,13 +6,13 @@
}:
buildNpmPackage rec {
pname = "i18next-cli";
version = "1.69.2";
version = "1.71.3";
src = fetchFromGitHub {
owner = "i18next";
repo = "i18next-cli";
tag = "v${version}";
hash = "sha256-6POO9yZFdc8BBNfm2emwKviUS7gmIwhtnKQt4dVlQ4U=";
hash = "sha256-jVfHtvlRwYncPdnNcD+DfHex6UaZQGatjKUqiV6/H9c=";
};
# NOTE: Generating lock-file
@@ -21,7 +21,7 @@ buildNpmPackage rec {
cp ${./package-lock.json} package-lock.json
'';
npmDepsHash = "sha256-yvI4UnMlczxXWh4CjJi8eUQ/n4Tn9VqC4GofYc2rxQE=";
npmDepsHash = "sha256-7JQbydV3UaTdw/hJ8LFqGd37tHAQtyFS7RP5u2By+oU=";
passthru.updateScript = nix-update-script {
extraArgs = [ "--generate-lockfile" ];

View File

@@ -11,13 +11,13 @@ let
jdk = jdk17;
in
stdenv.mkDerivation (finalAttrs: {
version = "5.6.1";
version = "5.7.0";
pname = "keystore-explorer";
src = fetchzip {
url = "https://github.com/kaikramer/keystore-explorer/releases/download/v${finalAttrs.version}/kse-${
lib.replaceStrings [ "." ] [ "" ] finalAttrs.version
}.zip";
sha256 = "sha256-yhYQpeBoicILYEXpW+oqDdF+KieDbNmTFpxL+aA8vTw=";
sha256 = "sha256-yYekrnutgy2KFmQDRAU2BUrj6XqmsE9i9AhnAB/U2ko=";
};
# glib is necessary so file dialogs don't hang.

View File

@@ -92,7 +92,12 @@ stdenv.mkDerivation (finalAttrs: {
"PYTHON=${python3.pythonOnBuildForHost.interpreter}"
"PYTHONLIBDIR=$(py)/${python3.sitePackages}"
"PYTHON_SETUP_ARGS=--no-build-isolation"
];
]
++
lib.optionals (stdenv.buildPlatform.parsed.kernel.name != stdenv.hostPlatform.parsed.kernel.name)
[
"OS=${if stdenv.hostPlatform.isDarwin then "Darwin" else "Linux"}"
];
preInstall = lib.optionalString enablePython ''
mkdir -p $py/${python3.sitePackages}/selinux

View File

@@ -35,7 +35,12 @@ stdenv.mkDerivation (finalAttrs: {
]
++ lib.optionals stdenv.hostPlatform.isStatic [
"DISABLE_SHARED=y"
];
]
++
lib.optionals (stdenv.buildPlatform.parsed.kernel.name != stdenv.hostPlatform.parsed.kernel.name)
[
"OS=${if stdenv.hostPlatform.isDarwin then "Darwin" else "Linux"}"
];
env.NIX_CFLAGS_COMPILE = "-Wno-error";

View File

@@ -5,24 +5,27 @@
fetchFromGitHub,
iana-etc,
libredirect,
versionCheckHook,
writableTmpDirAsHomeHook,
}:
buildGoModule (finalAttrs: {
pname = "mark";
version = "16.12.0";
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "kovetskiy";
repo = "mark";
rev = "v${finalAttrs.version}";
sha256 = "sha256-KSxMcHizvTQh3AuJ0NV7GQhBgpBIZwrbeI945PFzQJE=";
tag = "v${finalAttrs.version}";
hash = "sha256-KSxMcHizvTQh3AuJ0NV7GQhBgpBIZwrbeI945PFzQJE=";
};
vendorHash = "sha256-EELqh6C8SZdyCJfHDqOEY5bhP5G6jlOUhpDaK93fmTA=";
ldflags = [
"-s"
"-w"
"-X main.version=${finalAttrs.version}"
];
@@ -55,6 +58,13 @@ buildGoModule (finalAttrs: {
# binds a localhost listener.
__darwinAllowLocalNetworking = true;
nativeInstallCheckInputs = [
versionCheckHook
writableTmpDirAsHomeHook
];
versionCheckKeepEnvironment = [ "HOME" ];
doInstallCheck = true;
meta = {
description = "Tool for syncing your markdown documentation with Atlassian Confluence pages";
mainProgram = "mark";

View File

@@ -6,13 +6,13 @@
buildGoModule (finalAttrs: {
pname = "pb";
version = "1.0.0";
version = "1.0.1";
src = fetchFromGitHub {
owner = "parseablehq";
repo = "pb";
tag = "v${finalAttrs.version}";
hash = "sha256-GpG++ZoIKZTozS6QdxKIMfNgmTp3U/bChdbVPzPM468=";
hash = "sha256-JFoMArwAjOr2zyshrC/BDGe3Uit4TBNgA5vHm9CsdEU=";
};
vendorHash = "sha256-hEVoz8EgC2hAkiC0LNZ+h/Hy7toVxWvv2gchymfpMK8=";

View File

@@ -0,0 +1,47 @@
{
lib,
buildGoModule,
fetchFromGitHub,
installShellFiles,
nix-update-script,
}:
buildGoModule (finalAttrs: {
pname = "pokego";
version = "0.5.2";
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "rubiin";
repo = "pokego";
tag = "v${finalAttrs.version}";
hash = "sha256-GBKQ9YV98znhTP9QsvAAyva8dNohFS8dbQ4FAG5IDig=";
};
vendorHash = "sha256-a/YYEMVCqyg76P2Pyfpej46vYQhnnJjicpxNMAZGOVg=";
ldflags = [
"-s"
"-w"
];
nativeBuildInputs = [ installShellFiles ];
postInstall = ''
installShellCompletion completions/pokego.bash
installShellCompletion completions/pokego.fish
installShellCompletion completions/pokego.zsh
'';
passthru.updateScript = nix-update-script { };
meta = {
description = "Display Pokémon sprites in color directly in your terminal";
homepage = "https://github.com/rubiin/pokego";
license = lib.licenses.gpl3Only;
mainProgram = "pokego";
platforms = lib.platforms.linux;
maintainers = with lib.maintainers; [ yvnth ];
};
})

View File

@@ -7,14 +7,14 @@
python3.pkgs.buildPythonApplication {
pname = "renode-dts2repl";
version = "0-unstable-2026-08-13";
version = "0-unstable-2026-08-24";
pyproject = true;
src = fetchFromGitHub {
owner = "antmicro";
repo = "dts2repl";
rev = "93231a98a38187b7d16a528143077eb73764007f";
hash = "sha256-CSnf1op/X25MmaUFywn9kydl+A4Gj3R04mRMMJVpw5M=";
rev = "cf9df05f6f0435e4ee94bd898de1e6797bf57328";
hash = "sha256-slLNTLy++B7ChKUBAl3AUyQ+ZrTi4QcdBI2DEPqNJC4=";
};
nativeBuildInputs = [

View File

@@ -60,6 +60,11 @@ stdenv.mkDerivation (finalAttrs: {
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
maintainers = [ lib.maintainers.adamcstephens ];
mainProgram = "tailwindcss";
platforms = lib.platforms.darwin ++ lib.platforms.linux;
platforms = [
"aarch64-darwin"
"aarch64-linux"
"armv7l-linux"
"x86_64-linux"
];
};
})

View File

@@ -72,6 +72,10 @@ stdenv.mkDerivation {
adamcstephens
];
mainProgram = "tailwindcss";
platforms = lib.platforms.darwin ++ lib.platforms.linux;
platforms = [
"aarch64-darwin"
"aarch64-linux"
"x86_64-linux"
];
};
}

View File

@@ -6,11 +6,11 @@
appimageTools.wrapType2 rec {
pname = "xlights";
version = "2026.12";
version = "2026.15";
src = fetchurl {
url = "https://github.com/smeighan/xLights/releases/download/${version}/xLights-${version}-x86_64.AppImage";
hash = "sha256-aMOnG80gEZcCo1vIYcyRCTRhJIbcNPEEsmacfRLIoxY=";
hash = "sha256-CbX6/6gIPGCHUVcJjtTXZkOd4seFxlHRMJ+g+9l2zUA=";
};
appimageContents = appimageTools.extract { inherit pname version src; };

View File

@@ -12,6 +12,8 @@
libffi,
coreutils,
targetPackages,
llvmPackages,
replaceVarsWith,
}:
# Prebuilt only does native
@@ -20,10 +22,13 @@ assert stdenv.targetPlatform == stdenv.hostPlatform;
let
version = "9.6.6";
useLLVM = !(import ./common-have-ncg.nix { inherit lib stdenv version; });
# GHC upstream doesn't release bindist tarballs for some platforms.
# We're using Debian's binary package, and patching it into a usable-in-Nixpkgs state.
ghcDebs = {
powerpc64-linux = {
toolPrefix = "powerpc64-linux-gnu-";
src = {
urls = [
"http://ftp.ports.debian.org/debian-ports/pool-ppc64/main/g/ghc/ghc_9.6.6-4_ppc64.deb"
@@ -51,6 +56,35 @@ let
}
];
};
riscv64-linux = {
toolPrefix = "riscv64-linux-gnu-";
src = {
urls = [
"https://deb.debian.org/debian/pool/main/g/ghc/ghc_9.6.6-4_riscv64.deb"
"https://snapshot.debian.org/archive/debian/20250218T211057Z/pool/main/g/ghc/ghc_9.6.6-4_riscv64.deb"
];
sha256 = "01ff1fdec9e7581b05998b216399b316c41bdbbc813e3379c7f7a38223550ad0";
};
exePathForLibraryCheck = "ghc-debian-binary-9.6.6/usr/lib/ghc/bin/ghc-9.6.6";
archSpecificLibraries = [
{
nixPackage = gmp;
fileToCheckFor = null;
}
{
nixPackage = ncurses6;
fileToCheckFor = "libtinfo.so.6";
}
{
nixPackage = numactl;
fileToCheckFor = null;
}
{
nixPackage = libffi;
fileToCheckFor = null;
}
];
};
};
debUsed =
@@ -66,6 +100,23 @@ let
targetPackages.stdenv.cc
targetPackages.stdenv.cc.bintools
coreutils # for cat
]
# GHC 9.6 has no NCG for riscv64, it uses LLVM.
++ lib.optionals useLLVM [
(replaceVarsWith {
name = "subopt";
src = ./subopt.bash;
dir = "bin";
isExecutable = true;
preBuild = ''
name=opt
'';
replacements = {
inherit (stdenv) shell;
opt = lib.getExe' llvmPackages.llvm "opt";
};
})
(lib.getBin llvmPackages.llvm)
];
extraLibraryMapping = {
@@ -191,11 +242,11 @@ stdenv.mkDerivation (finalAttrs: {
# Patch ghc settings
+ ''
substituteInPlace $out/lib/ghc/lib/settings \
--replace-fail powerpc64-linux-gnu-gcc gcc \
--replace-fail powerpc64-linux-gnu-g++ g++ \
--replace-fail powerpc64-linux-gnu-ld ld \
--replace-fail powerpc64-linux-gnu-ar ar \
--replace-fail powerpc64-linux-gnu-ranlib ranlib \
--replace-fail ${debUsed.toolPrefix}gcc gcc \
--replace-fail ${debUsed.toolPrefix}g++ g++ \
--replace-fail ${debUsed.toolPrefix}ld ld \
--replace-fail ${debUsed.toolPrefix}ar ar \
--replace-fail ${debUsed.toolPrefix}ranlib ranlib \
--replace-fail llc-18 llc \
--replace-fail opt-18 opt
'';
@@ -247,7 +298,7 @@ stdenv.mkDerivation (finalAttrs: {
targetPrefix = "";
enableShared = true;
llvmPackages = null;
inherit llvmPackages;
# Our Cabal compiler name
haskellCompilerName = "ghc-${version}";
@@ -263,7 +314,12 @@ stdenv.mkDerivation (finalAttrs: {
description = "Glasgow Haskell Compiler";
license = lib.licenses.bsd3;
platforms = builtins.attrNames ghcDebs;
maintainers = [ lib.maintainers.OPNA2608 ];
maintainers = [
# powerpc64-linux
lib.maintainers.OPNA2608
# riscv64-linux
lib.maintainers.liberodark
];
teams = [ lib.teams.haskell ];
};
})

View File

@@ -254,6 +254,21 @@
"sha256-vtjT+TL/7sYPu4rcVV3xCqJQ+uqkyBbf9l0KIi97j/0=";
})
]
++
lib.optionals
(
stdenv.hostPlatform.isRiscV64
&& lib.versionAtLeast version "9.10"
&& lib.versionOlder version "9.12"
)
[
# Fix LLVM backend split sections causing bin/out reference cycles: https://gitlab.haskell.org/ghc/ghc/-/issues/26770
(fetchpatch {
name = "ghc-llvm-fix-split-sections.patch";
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/b18b2c42c32488ad6d3480a56a1fcd753cad2023.patch";
hash = "sha256-kEgZARwcdnWcvjuTfyqnn8V1zAUczZN0qiy/1WbCy1s=";
})
]
++ lib.optionals (lib.versionOlder version "9.12") [
(fetchpatch {
name = "ghc-rts-Fix-compile-on-powerpc64-elf-v1.patch";
@@ -927,6 +942,7 @@ stdenv.mkDerivation (
inherit llvmPackages;
inherit enableShared;
inherit enableProfiledLibs;
inherit hasHaddock;
# Expose hadrian used for bootstrapping, for debugging purposes

View File

@@ -123,7 +123,8 @@ in
doInstallIntermediates ? false,
editedCabalFile ? null,
# Cabal does not build the profiled dynamic objects required by wasm TH.
enableLibraryProfiling ? !stdenv.hostPlatform.isGhcjs && !stdenv.hostPlatform.isWasm,
enableLibraryProfiling ?
!stdenv.hostPlatform.isGhcjs && !stdenv.hostPlatform.isWasm && (ghc.enableProfiledLibs or true),
enableExecutableProfiling ? false,
profilingDetail ? "exported-functions",
# TODO enable shared libs for cross-compiling

View File

@@ -2632,17 +2632,17 @@ final: prev: {
}:
buildLuarocksPackage {
pname = "lua-resty-session";
version = "4.1.5-1";
version = "4.2.0-1";
knownRockspec =
(fetchurl {
url = "mirror://luarocks/lua-resty-session-4.1.5-1.rockspec";
sha256 = "1mapndwa260pk18v4nwnmz4bncqizfn1zc8k8aj1557pc1fj5ii6";
url = "mirror://luarocks/lua-resty-session-4.2.0-1.rockspec";
sha256 = "1xps6j9ddz4xqminhl56s3gvx2nbbnc9k3bzhjpkz4x6f39ciabf";
}).outPath;
src = fetchFromGitHub {
owner = "bungle";
repo = "lua-resty-session";
tag = "v4.1.5";
hash = "sha256-qwXNEWU0i3PUJK5cUChkcH43HnBCz4EEVPDQQ10Je+Q=";
tag = "v4.2.0";
hash = "sha256-wRAd6AGcSkhZcA4Cm9cGetEUt1TfABtYpU2avrK1Hdw=";
};
disabled = luaOlder "5.1";

View File

@@ -3,19 +3,22 @@
buildPythonPackage,
fetchPypi,
requests,
setuptools,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "casttube";
version = "0.2.1";
format = "setuptools";
pyproject = true;
src = fetchPypi {
inherit pname version;
inherit (finalAttrs) pname version;
sha256 = "10pw2sjy648pvp42lbbdmkkx79bqlkq1xcbzp1frraj9g66azljl";
};
propagatedBuildInputs = [ requests ];
build-system = [ setuptools ];
dependencies = [ requests ];
# no tests
doCheck = false;
@@ -26,4 +29,4 @@ buildPythonPackage rec {
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fpletz ];
};
}
})

View File

@@ -6,22 +6,25 @@
pytest-cov-stub,
pytestCheckHook,
pyyaml,
setuptools,
six,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "cfn-flip";
version = "1.3.0";
format = "setuptools";
pyproject = true;
src = fetchFromGitHub {
owner = "awslabs";
repo = "aws-cfn-template-flip";
rev = version;
tag = finalAttrs.version;
hash = "sha256-lfhTR3+D1FvblhQGF83AB8+I8WDPBTmo+q22ksgDgt4=";
};
propagatedBuildInputs = [
build-system = [ setuptools ];
dependencies = [
click
pyyaml
six
@@ -50,4 +53,4 @@ buildPythonPackage rec {
psyanticy
];
};
}
})

View File

@@ -2,18 +2,21 @@
lib,
buildPythonPackage,
fetchPypi,
setuptools,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "chacha20poly1305";
version = "0.0.3";
format = "setuptools";
pyproject = true;
src = fetchPypi {
inherit pname version;
inherit (finalAttrs) pname version;
hash = "sha256-8vAFx89GOP+k/wbALHh0gGi2QpFnlcbRbHzF41XnDt8=";
};
build-system = [ setuptools ];
# Module has no tests
doCheck = false;
@@ -22,7 +25,7 @@ buildPythonPackage rec {
meta = {
description = "Module that implements ChaCha20Poly1305";
homepage = "https://github.com/ph4r05/py-chacha20poly1305";
license = lib.licenses.mit;
license = lib.licenses.lgpl21;
maintainers = [ ];
};
}
})

View File

@@ -12,7 +12,7 @@
buildPythonPackage (finalAttrs: {
pname = "denon-rs232";
version = "4.2.1";
version = "4.2.2";
pyproject = true;
disabled = pythonOlder "3.12";
@@ -21,7 +21,7 @@ buildPythonPackage (finalAttrs: {
owner = "home-assistant-libs";
repo = "denon-rs232";
tag = finalAttrs.version;
hash = "sha256-3EFV/lDUWylQBpiOf5gHX+8J9qW8mMTvr1xET27salo=";
hash = "sha256-DqlJWgREneOFS4OFEgeJTyF4osgPYw1GO6I6sZVA6J4=";
};
build-system = [ uv-build ];

View File

@@ -13,14 +13,14 @@
buildPythonPackage (finalAttrs: {
pname = "pycaption";
version = "2.3.7";
version = "2.3.9";
pyproject = true;
src = fetchFromGitHub {
owner = "pbs";
repo = "pycaption";
tag = finalAttrs.version;
hash = "sha256-yokCL6CTUlsANJp7H31ilaT1GN2jp5JfLTNWJ4FMW1s=";
hash = "sha256-qqWL9l4UITw6uPXuo9fhr0GdTVv2AIMr+Lxfm8OctNc=";
};
build-system = [ setuptools ];

View File

@@ -1,28 +1,28 @@
{
"game": {
"latest": {
"linux": "53.15",
"linux": "53.16",
"darwin": "0.47.05"
},
"versions": {
"53.15": {
"53.16": {
"df": {
"version": "53.15",
"version": "53.16",
"urls": {
"linux": {
"url": "https://www.bay12games.com/dwarves/df_53_15_linux.tar.bz2",
"outputHash": "sha256-LreGXGk8Pgmr8Mk37VT3U0tCFOhRKZFdEsXBzmJtN4o="
"url": "https://www.bay12games.com/dwarves/df_53_16_linux.tar.bz2",
"outputHash": "sha256-L5wBNLJGXMy3BbjT4yLN/wffc3T/v6//6PmC8u9+fn0="
}
}
},
"hack": {
"version": "53.15-r1",
"version": "53.16-r1.1",
"git": {
"url": "https://github.com/DFHack/dfhack.git",
"revision": "53.15-r1",
"outputHash": "sha256-7vNk/JmNu0tQEevZ7XeGX/435EydR15dJJIHEyS1a7c="
"revision": "53.16-r1.1",
"outputHash": "sha256-ex6//9ylounbyHVpgyDWLLCCibvu59NOXmpComn4cGg="
},
"xmlRev": "80a6267faddb7aa99759c9df94186de3f873dd97"
"xmlRev": "1dd01aad64219afa0578f1328cf15bd0c6006d5a"
}
},
"52.05": {

View File

@@ -1,66 +0,0 @@
commit f89ce378d3b405d69635da28dfd57adced23aa17
Author: kuflierl <41301536+kuflierl@users.noreply.github.com>
Date: Mon Sep 15 20:14:08 2025 +0200
server: replace pillow-avif-plugin, pyheif, heif-image-plugin with pillow-heif
diff --git a/requirements.txt b/requirements.txt
index ffe18f0c..16a72750 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,12 +1,10 @@
alembic>=0.8.5
certifi>=2017.11.5
coloredlogs==5.0
-heif-image-plugin==0.3.2
numpy>=1.8.2
-pillow-avif-plugin~=1.1.0
-pillow>=4.3.0
+pillow>=11.2.1
+pillow-heif>=1.0.0
psycopg2-binary>=2.6.1
-pyheif==0.6.1
pynacl>=1.2.1
pyRFC3339>=1.0
pytz>=2018.3
diff --git a/szurubooru/func/image_hash.py b/szurubooru/func/image_hash.py
index 76d5a846..b89541eb 100644
--- a/szurubooru/func/image_hash.py
+++ b/szurubooru/func/image_hash.py
@@ -4,13 +4,13 @@ from datetime import datetime
from io import BytesIO
from typing import Any, Callable, List, Optional, Set, Tuple
-import HeifImagePlugin
+from pillow_heif import register_heif_opener
import numpy as np
-import pillow_avif
from PIL import Image
from szurubooru import config, errors
+register_heif_opener()
logger = logging.getLogger(__name__)
# Math based on paper from H. Chi Wong, Marshall Bern and David Goldberg
diff --git a/szurubooru/func/images.py b/szurubooru/func/images.py
index e135d182..f4b5aa5b 100644
--- a/szurubooru/func/images.py
+++ b/szurubooru/func/images.py
@@ -7,14 +7,14 @@ import subprocess
from io import BytesIO
from typing import List
-import HeifImagePlugin
-import pillow_avif
+from pillow_heif import register_heif_opener
from PIL import Image as PILImage
from szurubooru import errors
from szurubooru.func import mime, util
logger = logging.getLogger(__name__)
+register_heif_opener()
def convert_heif_to_png(content: bytes) -> bytes:

View File

@@ -5,12 +5,12 @@
}:
let
version = "2.5-unstable-2025-07-19";
version = "2.5-unstable-2026-07-25";
src = fetchFromGitHub {
owner = "rr-";
repo = "szurubooru";
rev = "5a0f8867f3af1556d82c1ad7e29977903300c2dd";
hash = "sha256-ihocmBS4h23bb4ZRhHEXvnHiNfRMPdUe94B5K9bi2E4=";
rev = "10ac8509ff73d539360215f65b95ad704e6a2740";
hash = "sha256-7uvhB1kaRUpPr2qWcoVNXtOzK218w8SY3AsCPF0HeF4=";
};
in

View File

@@ -3,48 +3,20 @@
version,
lib,
nixosTests,
fetchPypi,
python3,
ffmpeg_4-full,
ffmpeg-full,
szurubooru,
}:
let
overrides = [
(self: super: {
alembic = super.alembic.overridePythonAttrs (oldAttrs: rec {
version = "1.14.1";
src = fetchPypi {
pname = "alembic";
inherit version;
sha256 = "sha256-SW6IgkWlOt8UmPyrMXE6Rpxlg2+N524BOZqhw+kN0hM=";
};
doCheck = false;
});
sqlalchemy = self.sqlalchemy_1_4;
})
];
python = python3.override {
self = python;
packageOverrides = lib.composeManyExtensions overrides;
};
in
python.pkgs.buildPythonApplication {
python3.pkgs.buildPythonApplication {
pname = "szurubooru-server";
inherit version;
pyproject = true;
src = "${src}/server";
patches = [
./001-server-pillow-heif.patch
];
nativeBuildInputs = with python.pkgs; [ setuptools ];
propagatedBuildInputs = with python.pkgs; [
nativeBuildInputs = with python3.pkgs; [ setuptools ];
propagatedBuildInputs = with python3.pkgs; [
certifi
coloredlogs
legacy-cgi
@@ -61,7 +33,7 @@ python.pkgs.buildPythonApplication {
];
makeWrapperArgs = [
"--prefix PATH : ${lib.makeBinPath [ ffmpeg_4-full ]}"
"--prefix PATH : ${lib.makeBinPath [ ffmpeg-full ]}"
];
postInstall = ''
@@ -73,13 +45,13 @@ python.pkgs.buildPythonApplication {
# Database migration. Needs the szurubooru server in its environment for the
# migration to complete successfully.
passthru.alembic = python.pkgs.alembic.overrideAttrs (old: {
passthru.alembic = python3.pkgs.alembic.overrideAttrs (old: {
propagatedBuildInputs = old.propagatedBuildInputs ++ [
szurubooru.server
];
});
# Waitress is used to run the serer.
passthru.waitress = python.pkgs.waitress.overrideAttrs (old: {
passthru.waitress = python3.pkgs.waitress.overrideAttrs (old: {
propagatedBuildInputs = old.propagatedBuildInputs ++ [
szurubooru.server
];

View File

@@ -121,6 +121,8 @@ in
then
# No bindist, "borrowing" the GHC from Debian
bb.packages.ghc966DebianBinary
else if stdenv.buildPlatform.isRiscV64 then
bb.packages.ghc966DebianBinary
else
bb.packages.ghc948;
inherit (buildPackages.python3Packages) sphinx;
@@ -136,6 +138,8 @@ in
then
# No bindist, "borrowing" the GHC from Debian
bb.packages.ghc966DebianBinary
else if stdenv.buildPlatform.isRiscV64 then
bb.packages.ghc966DebianBinary
else if stdenv.buildPlatform.isi686 then
bb.packages.ghc948
else
@@ -153,6 +157,8 @@ in
then
# No bindist, "borrowing" the GHC from Debian
bb.packages.ghc966DebianBinary
else if stdenv.buildPlatform.isRiscV64 then
bb.packages.ghc966DebianBinary
else if stdenv.buildPlatform.isi686 then
bb.packages.ghc967
else