0
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-07-14 14:10:33 +03:00

Merge staging-next into staging

This commit is contained in:
nixpkgs-ci[bot] 2025-03-16 00:17:17 +00:00 committed by GitHub
commit fe694bcc39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
151 changed files with 20644 additions and 2189 deletions

View file

@ -3201,6 +3201,12 @@
githubId = 77934086;
keys = [ { fingerprint = "4CA3 48F6 8FE1 1777 8EDA 3860 B9A2 C1B0 25EC 2C55"; } ];
};
blenderfreaky = {
name = "blenderfreaky";
email = "nix@blenderfreaky.de";
github = "blenderfreaky";
githubId = 14351657;
};
blinry = {
name = "blinry";
email = "mail@blinry.org";
@ -23962,6 +23968,12 @@
matrix = "@titaniumtown:envs.net";
keys = [ { fingerprint = "D15E 4754 FE1A EDA1 5A6D 4702 9AB2 8AC1 0ECE 533D"; } ];
};
tjkeller = {
email = "tjk@tjkeller.xyz";
github = "tjkeller-xyz";
githubId = 36288711;
name = "Tim Keller";
};
tjni = {
email = "43ngvg@masqt.com";
matrix = "@tni:matrix.org";

View file

@ -444,6 +444,7 @@ with lib.maintainers;
members = [
globin
krav
leona
talyz
yayayayaka
];

View file

@ -75,6 +75,7 @@ in
config = mkIf cfg.enable {
systemd.services.hddtemp = {
description = "HDD/SSD temperature";
documentation = [ "man:hddtemp(8)" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "forking";

View file

@ -15,6 +15,7 @@
systemd.services.auditd = {
description = "Linux Audit daemon";
documentation = [ "man:auditd(8)" ];
wantedBy = [ "sysinit.target" ];
after = [
"local-fs.target"

View file

@ -128,6 +128,7 @@ in
systemd.services.isolate = {
description = "Isolate control group hierarchy daemon";
wantedBy = [ "multi-user.target" ];
documentation = [ "man:isolate(1)" ];
serviceConfig = {
Type = "notify";
ExecStart = "${isolate}/bin/isolate-cg-keeper";

View file

@ -70,6 +70,7 @@ in
};
systemd.services.torque-server = {
documentation = [ "man:pbs_server(8)" ];
path = [ torque ];
wantedBy = [ "multi-user.target" ];
@ -93,6 +94,7 @@ in
};
systemd.services.torque-scheduler = {
documentation = [ "man:pbs_sched(8)" ];
path = [ torque ];
requires = [ "torque-server-init.service" ];

View file

@ -127,5 +127,7 @@
services.libeufin.nexus.settings.libeufin-nexusdb-postgres.CONFIG = lib.mkIf (
cfgMain.bank.enable && cfgMain.bank.createLocalDatabase
) "postgresql:///libeufin-bank";
systemd.services.libeufin-nexus.documentation = [ "man:libeufin-nexus(1)" ];
};
}

View file

@ -68,11 +68,19 @@ in
requires = [ "taler-${talerComponent}-dbinit.service" ];
after = [ "taler-${talerComponent}-dbinit.service" ];
wantedBy = [ "multi-user.target" ]; # TODO slice?
documentation = [
"man:taler-${talerComponent}-${name}(1)"
"info:taler-${talerComponent}"
];
}))
# Database Initialisation
{
"taler-${talerComponent}-dbinit" = {
path = [ config.services.postgresql.package ];
documentation = [
"man:taler-${talerComponent}-dbinit(1)"
"info:taler-${talerComponent}"
];
serviceConfig = {
Type = "oneshot";
DynamicUser = true;

View file

@ -148,7 +148,7 @@ in {
};
package = lib.mkPackageOption pkgs "minecraft-server" {
example = "minecraft-server_1_12_2";
example = "pkgs.minecraft-server_1_12_2";
};
jvmOpts = lib.mkOption {

View file

@ -49,6 +49,7 @@ in
systemd.services.thermald = {
description = "Thermal Daemon Service";
documentation = [ "man:thermald(8)" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
PrivateNetwork = true;

View file

@ -122,6 +122,7 @@ in
systemd.services.triggerhappy = {
wantedBy = [ "multi-user.target" ];
description = "Global hotkey daemon";
documentation = [ "man:thd(1)" ];
serviceConfig = {
ExecStart = "${pkgs.triggerhappy}/bin/thd ${
lib.optionalString (cfg.user != "root") "--user ${cfg.user}"

View file

@ -871,6 +871,7 @@ in
systemd.services.postfix = {
description = "Postfix mail server";
documentation = [ "man:postfix(1)" ];
wantedBy = [ "multi-user.target" ];
after = [
"network.target"

View file

@ -68,6 +68,7 @@ in
systemd.services."glances" = {
description = "Glances";
documentation = [ "man:glances(1)" ];
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];

View file

@ -218,6 +218,7 @@ in
in
lib.nameValuePair "tahoe.introducer-${node}" {
description = "Tahoe LAFS node ${node}";
documentation = [ "info:tahoe-lafs" ];
wantedBy = [ "multi-user.target" ];
path = [ settings.package ];
restartTriggers = [
@ -329,6 +330,7 @@ in
in
lib.nameValuePair "tahoe.${node}" {
description = "Tahoe LAFS node ${node}";
documentation = [ "info:tahoe-lafs" ];
wantedBy = [ "multi-user.target" ];
path = [ settings.package ];
restartTriggers = [

View file

@ -305,6 +305,12 @@ in
description = "Avahi mDNS/DNS-SD Stack";
wantedBy = [ "multi-user.target" ];
requires = [ "avahi-daemon.socket" ];
documentation = [
"man:avahi-daemon(8)"
"man:avahi-daemon.conf(5)"
"man:avahi.hosts(5)"
"man:avahi.service(5)"
];
# Make NSS modules visible so that `avahi_nss_support ()' can
# return a sensible value.

View file

@ -209,6 +209,8 @@ in
in
{ description = "DHCP Client";
documentation = [ "man:dhcpcd(8)" ];
wantedBy = [ "multi-user.target" ] ++ lib.optional (!hasDefaultGatewaySet) "network-online.target";
wants = [ "network.target" "resolvconf.service" ];
after = [ "resolvconf.service" ];

View file

@ -149,6 +149,7 @@ in
systemd.services.gnunet = {
description = "GNUnet";
documentation = [ "info:gnunet" ];
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
restartTriggers = [ config.environment.etc."gnunet.conf".source ];

View file

@ -114,6 +114,10 @@ in
config = mkIf cfg.enable {
systemd.services.gvpe = {
description = "GNU Virtual Private Ethernet node";
documentation = [
"info:gvpe"
"man:gvpe(8)"
];
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];

View file

@ -229,6 +229,7 @@ in
systemd.services.privoxy = {
description = "Filtering web proxy";
documentation = [ "man:privoxy(8)" ];
after = [
"network.target"
"nss-lookup.target"

View file

@ -142,6 +142,7 @@ in
wantedBy = [ "multi-user.target" ];
wants = [ "network-online.target" ];
after = [ "network-online.target" ];
documentation = [ "man:soju(1)" ];
serviceConfig = {
DynamicUser = true;
Restart = "always";

View file

@ -366,6 +366,10 @@ in
("tinc.${network}")
(let version = getVersion data.package; in {
description = "Tinc Daemon - ${network}";
documentation = [
"info:tinc"
"man:tincd(8)"
];
wantedBy = [ "multi-user.target" ];
path = [ data.package ];
reloadTriggers = mkIf (versionAtLeast version "1.1pre") [ (builtins.toJSON etcConfig) ];

View file

@ -82,6 +82,7 @@ in
systemd.services.atd = {
description = "Job Execution Daemon (atd)";
documentation = [ "man:atd(8)" ];
wantedBy = [ "multi-user.target" ];
path = [ at ];

View file

@ -169,6 +169,7 @@ in
systemd.services.clamav-daemon = lib.mkIf cfg.daemon.enable {
description = "ClamAV daemon (clamd)";
documentation = [ "man:clamd(8)" ];
after = lib.optionals cfg.updater.enable [ "clamav-freshclam.service" ];
wants = lib.optionals cfg.updater.enable [ "clamav-freshclam.service" ];
wantedBy = [ "multi-user.target" ];
@ -199,6 +200,7 @@ in
systemd.services.clamav-freshclam = lib.mkIf cfg.updater.enable {
description = "ClamAV virus database updater (freshclam)";
documentation = [ "man:freshclam(1)" ];
restartTriggers = [ freshclamConfigFile ];
requires = [ "network-online.target" ];
after = [ "network-online.target" ];
@ -276,6 +278,7 @@ in
systemd.services.clamdscan = lib.mkIf cfg.scanner.enable {
description = "ClamAV virus scanner";
documentation = [ "man:clamdscan(1)" ];
after = lib.optionals cfg.updater.enable [ "clamav-freshclam.service" ];
wants = lib.optionals cfg.updater.enable [ "clamav-freshclam.service" ];

View file

@ -48,6 +48,7 @@ in
config = lib.mkIf cfg.enable {
systemd.services.endlessh = {
description = "SSH tarpit";
documentation = [ "man:endlessh(1)" ];
requires = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig =

View file

@ -46,6 +46,10 @@ in
users.groups.munge = { };
systemd.services.munged = {
documentation = [
"man:munged(8)"
"man:mungekey(8)"
];
wantedBy = [ "multi-user.target" ];
wants = [
"network-online.target"

View file

@ -116,6 +116,7 @@ in
systemd.services.physlock = {
enable = true;
documentation = [ "man:physlock(1)" ];
description = "Physlock";
wantedBy =
lib.optional cfg.lockOn.suspend "suspend.target"

View file

@ -119,6 +119,7 @@ in
{
sks-db = {
description = "SKS database server";
documentation = [ "man:sks(8)" ];
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
preStart = ''

View file

@ -1324,6 +1324,7 @@ in
systemd.services.tor = {
description = "Tor Daemon";
documentation = [ "man:tor(8)" ];
path = [ pkgs.tor ];
wantedBy = [ "multi-user.target" ];

View file

@ -128,7 +128,11 @@ in
in
{
description = "hledger-web - web-app for the hledger accounting tool.";
documentation = [ "https://hledger.org/hledger-web.html" ];
documentation = [
"info:hledger-web"
"man:hledger-web(1)"
"https://hledger.org/hledger-web.html"
];
wantedBy = [ "multi-user.target" ];
after = [ "networking.target" ];
serviceConfig = mkMerge [

View file

@ -254,6 +254,7 @@ in {
after = [ "network.target" ];
wantedBy = [ "phpfpm.target" ];
partOf = [ "phpfpm.target" ];
documentation = [ "man:php-fpm(8)" ];
serviceConfig = let
cfgFile = fpmCfgFile pool poolOpts;
iniFile = phpIni poolOpts;

View file

@ -166,6 +166,7 @@ in
in
nameValuePair "btrfs-scrub-${fs'}" {
description = "btrfs scrub on ${fs}";
documentation = [ "man:btrfs-scrub(8)" ];
# scrub prevents suspend2ram or proper shutdown
conflicts = [
"shutdown.target"

View file

@ -51,6 +51,7 @@ in
config = mkIf (cfg.enable) {
systemd.services = {
powertop = {
documentation = [ "man:powertop(8)" ];
wantedBy = [ "multi-user.target" ];
after = [ "multi-user.target" ];
description = "Powertop tunings";

View file

@ -87,7 +87,7 @@ with lib;
# ec2-get-console-output.
echo "-----BEGIN SSH HOST KEY FINGERPRINTS-----" > /dev/console
for i in /etc/ssh/ssh_host_*_key.pub; do
${config.programs.ssh.package}/bin/ssh-keygen -l -f "$i" || true > /dev/console
${config.programs.ssh.package}/bin/ssh-keygen -l -f "$i" > /dev/console || true
done
echo "-----END SSH HOST KEY FINGERPRINTS-----" > /dev/console
'';

View file

@ -1300,26 +1300,26 @@ in {
wrappers = handleTest ./wrappers.nix {};
writefreely = handleTest ./web-apps/writefreely.nix {};
wstunnel = runTest ./wstunnel.nix;
xandikos = handleTest ./xandikos.nix {};
xautolock = handleTest ./xautolock.nix {};
xfce = handleTest ./xfce.nix {};
xfce-wayland = handleTest ./xfce-wayland.nix {};
xmonad = handleTest ./xmonad.nix {};
xmonad-xdg-autostart = handleTest ./xmonad-xdg-autostart.nix {};
xpadneo = handleTest ./xpadneo.nix {};
xrdp = handleTest ./xrdp.nix {};
xrdp-with-audio-pulseaudio = handleTest ./xrdp-with-audio-pulseaudio.nix {};
xandikos = runTest ./xandikos.nix;
xautolock = runTest ./xautolock.nix;
xfce = runTest ./xfce.nix;
xfce-wayland = runTest ./xfce-wayland.nix;
xmonad = runTest ./xmonad.nix;
xmonad-xdg-autostart = runTest ./xmonad-xdg-autostart.nix;
xpadneo = runTest ./xpadneo.nix;
xrdp = runTest ./xrdp.nix;
xrdp-with-audio-pulseaudio = runTest ./xrdp-with-audio-pulseaudio.nix;
xscreensaver = handleTest ./xscreensaver.nix {};
xss-lock = handleTest ./xss-lock.nix {};
xterm = handleTest ./xterm.nix {};
xxh = handleTest ./xxh.nix {};
yabar = handleTest ./yabar.nix {};
xss-lock = runTest ./xss-lock.nix;
xterm = runTest ./xterm.nix;
xxh = runTest ./xxh.nix;
yabar = runTest ./yabar.nix;
ydotool = handleTest ./ydotool.nix {};
yggdrasil = handleTest ./yggdrasil.nix {};
your_spotify = handleTest ./your_spotify.nix {};
zammad = handleTest ./zammad.nix {};
zenohd = handleTest ./zenohd.nix {};
zeronet-conservancy = handleTest ./zeronet-conservancy.nix {};
yggdrasil = runTest ./yggdrasil.nix;
your_spotify = runTest ./your_spotify.nix;
zammad = runTest ./zammad.nix;
zenohd = runTest ./zenohd.nix;
zeronet-conservancy = runTest ./zeronet-conservancy.nix;
zfs = handleTest ./zfs.nix {};
zigbee2mqtt_1 = runTest {
imports = [ ./zigbee2mqtt.nix ];
@ -1329,12 +1329,12 @@ in {
imports = [ ./zigbee2mqtt.nix ];
_module.args.package = pkgs.zigbee2mqtt_2;
};
zipline = handleTest ./zipline.nix {};
zoneminder = handleTest ./zoneminder.nix {};
zookeeper = handleTest ./zookeeper.nix {};
zram-generator = handleTest ./zram-generator.nix {};
zrepl = handleTest ./zrepl.nix {};
zsh-history = handleTest ./zsh-history.nix {};
zwave-js = handleTest ./zwave-js.nix {};
zwave-js-ui = handleTest ./zwave-js-ui.nix {};
zipline = runTest ./zipline.nix;
zoneminder = runTest ./zoneminder.nix;
zookeeper = runTest ./zookeeper.nix;
zram-generator = runTest ./zram-generator.nix;
zrepl = runTest ./zrepl.nix;
zsh-history = runTest ./zsh-history.nix;
zwave-js = runTest ./zwave-js.nix;
zwave-js-ui = runTest ./zwave-js-ui.nix;
}

View file

@ -1,73 +1,71 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{ lib, ... }:
{
name = "xandikos";
{
name = "xandikos";
meta.maintainers = with lib.maintainers; [ _0x4A6F ];
meta.maintainers = with lib.maintainers; [ _0x4A6F ];
nodes = {
xandikos_client = { };
xandikos_default = {
networking.firewall.allowedTCPPorts = [ 8080 ];
services.xandikos.enable = true;
};
xandikos_proxy = {
networking.firewall.allowedTCPPorts = [
80
8080
];
services.xandikos.enable = true;
services.xandikos.address = "localhost";
services.xandikos.port = 8080;
services.xandikos.routePrefix = "/xandikos-prefix/";
services.xandikos.extraOptions = [
"--defaults"
];
services.nginx = {
enable = true;
recommendedProxySettings = true;
virtualHosts."xandikos" = {
serverName = "xandikos.local";
basicAuth.xandikos = "snakeOilPassword";
locations."/xandikos/" = {
proxyPass = "http://localhost:8080/xandikos-prefix/";
};
nodes = {
xandikos_client = { };
xandikos_default = {
networking.firewall.allowedTCPPorts = [ 8080 ];
services.xandikos.enable = true;
};
xandikos_proxy = {
networking.firewall.allowedTCPPorts = [
80
8080
];
services.xandikos.enable = true;
services.xandikos.address = "localhost";
services.xandikos.port = 8080;
services.xandikos.routePrefix = "/xandikos-prefix/";
services.xandikos.extraOptions = [
"--defaults"
];
services.nginx = {
enable = true;
recommendedProxySettings = true;
virtualHosts."xandikos" = {
serverName = "xandikos.local";
basicAuth.xandikos = "snakeOilPassword";
locations."/xandikos/" = {
proxyPass = "http://localhost:8080/xandikos-prefix/";
};
};
};
};
};
testScript = ''
start_all()
testScript = ''
start_all()
with subtest("Xandikos default"):
xandikos_default.wait_for_unit("multi-user.target")
xandikos_default.wait_for_unit("xandikos.service")
xandikos_default.wait_for_open_port(8080)
xandikos_default.succeed("curl --fail http://localhost:8080/")
xandikos_default.succeed(
"curl -s --fail --location http://localhost:8080/ | grep -i Xandikos"
)
xandikos_client.wait_for_unit("network.target")
xandikos_client.fail("curl --fail http://xandikos_default:8080/")
with subtest("Xandikos default"):
xandikos_default.wait_for_unit("multi-user.target")
xandikos_default.wait_for_unit("xandikos.service")
xandikos_default.wait_for_open_port(8080)
xandikos_default.succeed("curl --fail http://localhost:8080/")
xandikos_default.succeed(
"curl -s --fail --location http://localhost:8080/ | grep -i Xandikos"
)
xandikos_client.wait_for_unit("network.target")
xandikos_client.fail("curl --fail http://xandikos_default:8080/")
with subtest("Xandikos proxy"):
xandikos_proxy.wait_for_unit("multi-user.target")
xandikos_proxy.wait_for_unit("xandikos.service")
xandikos_proxy.wait_for_open_port(8080)
xandikos_proxy.succeed("curl --fail http://localhost:8080/")
xandikos_proxy.succeed(
"curl -s --fail --location http://localhost:8080/ | grep -i Xandikos"
)
xandikos_client.wait_for_unit("network.target")
xandikos_client.fail("curl --fail http://xandikos_proxy:8080/")
xandikos_client.succeed(
"curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/ | grep -i Xandikos"
)
xandikos_client.succeed(
"curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/user/ | grep -i Xandikos"
)
'';
}
)
with subtest("Xandikos proxy"):
xandikos_proxy.wait_for_unit("multi-user.target")
xandikos_proxy.wait_for_unit("xandikos.service")
xandikos_proxy.wait_for_open_port(8080)
xandikos_proxy.succeed("curl --fail http://localhost:8080/")
xandikos_proxy.succeed(
"curl -s --fail --location http://localhost:8080/ | grep -i Xandikos"
)
xandikos_client.wait_for_unit("network.target")
xandikos_client.fail("curl --fail http://xandikos_proxy:8080/")
xandikos_client.succeed(
"curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/ | grep -i Xandikos"
)
xandikos_client.succeed(
"curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/user/ | grep -i Xandikos"
)
'';
}

View file

@ -1,27 +1,23 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{
name = "xautolock";
meta.maintainers = [ ];
{
name = "xautolock";
meta.maintainers = [ ];
nodes.machine = {
imports = [
./common/x11.nix
./common/user-account.nix
];
nodes.machine = {
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "bob";
services.xserver.xautolock.enable = true;
services.xserver.xautolock.time = 1;
};
test-support.displayManager.auto.user = "bob";
services.xserver.xautolock.enable = true;
services.xserver.xautolock.time = 1;
};
testScript = ''
machine.start()
machine.wait_for_x()
machine.fail("pgrep xlock")
machine.sleep(120)
machine.succeed("pgrep xlock")
'';
}
)
testScript = ''
machine.start()
machine.wait_for_x()
machine.fail("pgrep xlock")
machine.sleep(120)
machine.succeed("pgrep xlock")
'';
}

View file

@ -1,71 +1,68 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "xfce-wayland";
{
name = "xfce-wayland";
nodes.machine =
{ pkgs, ... }:
nodes.machine =
{ pkgs, ... }:
{
imports = [
./common/user-account.nix
];
{
imports = [
./common/user-account.nix
];
services.xserver.enable = true;
services.xserver.displayManager.lightdm.enable = true;
services.displayManager = {
defaultSession = "xfce-wayland";
autoLogin = {
enable = true;
user = "alice";
};
services.xserver.enable = true;
services.xserver.displayManager.lightdm.enable = true;
services.displayManager = {
defaultSession = "xfce-wayland";
autoLogin = {
enable = true;
user = "alice";
};
services.xserver.desktopManager.xfce.enable = true;
services.xserver.desktopManager.xfce.enableWaylandSession = true;
environment.systemPackages = [ pkgs.wlrctl ];
};
enableOCR = true;
services.xserver.desktopManager.xfce.enable = true;
services.xserver.desktopManager.xfce.enableWaylandSession = true;
environment.systemPackages = [ pkgs.wlrctl ];
};
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
rtdir = "XDG_RUNTIME_DIR=/run/user/${toString user.uid}";
in
''
machine.wait_for_unit("display-manager.service")
enableOCR = true;
with subtest("Wait for Wayland server"):
machine.wait_for_file("/run/user/${toString user.uid}/wayland-0")
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
rtdir = "XDG_RUNTIME_DIR=/run/user/${toString user.uid}";
in
''
machine.wait_for_unit("display-manager.service")
with subtest("Check that logging in has given the user ownership of devices"):
machine.succeed("getfacl -p /dev/snd/timer | grep -q ${user.name}")
with subtest("Wait for Wayland server"):
machine.wait_for_file("/run/user/${toString user.uid}/wayland-0")
with subtest("Check if Xfce components actually start"):
for p in ["labwc", "xfdesktop", "xfce4-notifyd", "xfconfd", "xfce4-panel"]:
machine.wait_until_succeeds(f"pgrep {p}")
with subtest("Check that logging in has given the user ownership of devices"):
machine.succeed("getfacl -p /dev/snd/timer | grep -q ${user.name}")
with subtest("Open Xfce terminal"):
machine.succeed("su - ${user.name} -c '${rtdir} xfce4-terminal >&2 &'")
machine.wait_until_succeeds("su - ${user.name} -c '${rtdir} wlrctl toplevel list | grep xfce4-terminal'")
with subtest("Check if Xfce components actually start"):
for p in ["labwc", "xfdesktop", "xfce4-notifyd", "xfconfd", "xfce4-panel"]:
machine.wait_until_succeeds(f"pgrep {p}")
with subtest("Open Thunar"):
machine.succeed("su - ${user.name} -c '${rtdir} thunar >&2 &'")
machine.wait_until_succeeds("su - ${user.name} -c '${rtdir} wlrctl toplevel list | grep Thunar'")
machine.wait_for_text('(Pictures|Public|Templates|Videos)')
with subtest("Open Xfce terminal"):
machine.succeed("su - ${user.name} -c '${rtdir} xfce4-terminal >&2 &'")
machine.wait_until_succeeds("su - ${user.name} -c '${rtdir} wlrctl toplevel list | grep xfce4-terminal'")
with subtest("Check if various environment variables are set"):
cmd = "xargs --null --max-args=1 echo < /proc/$(pgrep -xf xfce4-panel)/environ"
machine.succeed(f"{cmd} | grep 'XDG_SESSION_TYPE' | grep 'wayland'")
machine.succeed(f"{cmd} | grep 'XFCE4_SESSION_COMPOSITOR' | grep 'labwc'")
machine.succeed(f"{cmd} | grep 'XDG_CURRENT_DESKTOP' | grep 'XFCE'")
with subtest("Open Thunar"):
machine.succeed("su - ${user.name} -c '${rtdir} thunar >&2 &'")
machine.wait_until_succeeds("su - ${user.name} -c '${rtdir} wlrctl toplevel list | grep Thunar'")
machine.wait_for_text('(Pictures|Public|Templates|Videos)')
with subtest("Check if any coredumps are found"):
machine.succeed("(coredumpctl --json=short 2>&1 || true) | grep 'No coredumps found'")
machine.sleep(10)
machine.screenshot("screen")
'';
}
)
with subtest("Check if various environment variables are set"):
cmd = "xargs --null --max-args=1 echo < /proc/$(pgrep -xf xfce4-panel)/environ"
machine.succeed(f"{cmd} | grep 'XDG_SESSION_TYPE' | grep 'wayland'")
machine.succeed(f"{cmd} | grep 'XFCE4_SESSION_COMPOSITOR' | grep 'labwc'")
machine.succeed(f"{cmd} | grep 'XDG_CURRENT_DESKTOP' | grep 'XFCE'")
with subtest("Check if any coredumps are found"):
machine.succeed("(coredumpctl --json=short 2>&1 || true) | grep 'No coredumps found'")
machine.sleep(10)
machine.screenshot("screen")
'';
}

View file

@ -1,76 +1,73 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "xfce";
{
name = "xfce";
nodes.machine =
{ pkgs, ... }:
nodes.machine =
{ pkgs, ... }:
{
imports = [
./common/user-account.nix
];
{
imports = [
./common/user-account.nix
];
services.xserver.enable = true;
services.xserver.displayManager.lightdm.enable = true;
services.xserver.enable = true;
services.xserver.displayManager.lightdm.enable = true;
services.displayManager.autoLogin = {
enable = true;
user = "alice";
};
services.xserver.desktopManager.xfce.enable = true;
environment.systemPackages = [ pkgs.xfce.xfce4-whiskermenu-plugin ];
services.displayManager.autoLogin = {
enable = true;
user = "alice";
};
enableOCR = true;
services.xserver.desktopManager.xfce.enable = true;
environment.systemPackages = [ pkgs.xfce.xfce4-whiskermenu-plugin ];
};
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
bus = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${toString user.uid}/bus";
in
''
with subtest("Wait for login"):
machine.wait_for_x()
machine.wait_for_file("${user.home}/.Xauthority")
machine.succeed("xauth merge ${user.home}/.Xauthority")
enableOCR = true;
with subtest("Check that logging in has given the user ownership of devices"):
machine.succeed("getfacl -p /dev/snd/timer | grep -q ${user.name}")
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
bus = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${toString user.uid}/bus";
in
''
with subtest("Wait for login"):
machine.wait_for_x()
machine.wait_for_file("${user.home}/.Xauthority")
machine.succeed("xauth merge ${user.home}/.Xauthority")
with subtest("Check if Xfce components actually start"):
machine.wait_for_window("xfce4-panel")
machine.wait_for_window("Desktop")
for i in ["xfwm4", "xfsettingsd", "xfdesktop", "xfce4-screensaver", "xfce4-notifyd", "xfconfd"]:
machine.wait_until_succeeds(f"pgrep -f {i}")
with subtest("Check that logging in has given the user ownership of devices"):
machine.succeed("getfacl -p /dev/snd/timer | grep -q ${user.name}")
with subtest("Open whiskermenu"):
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfconf-query -c xfce4-panel -p /plugins/plugin-1 -t string -s whiskermenu -n >&2 &'")
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfconf-query -c xfce4-panel -p /plugins/plugin-1/stay-on-focus-out -t bool -s true -n >&2 &'")
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfce4-panel -r >&2 &'")
machine.wait_until_succeeds("journalctl -b --grep 'xfce4-panel: Restarting' -t xsession")
machine.sleep(5)
machine.wait_until_succeeds("pgrep -f libwhiskermenu")
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfce4-popup-whiskermenu >&2 &'")
machine.wait_for_text('Mail Reader')
# Close the menu.
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfce4-popup-whiskermenu >&2 &'")
with subtest("Check if Xfce components actually start"):
machine.wait_for_window("xfce4-panel")
machine.wait_for_window("Desktop")
for i in ["xfwm4", "xfsettingsd", "xfdesktop", "xfce4-screensaver", "xfce4-notifyd", "xfconfd"]:
machine.wait_until_succeeds(f"pgrep -f {i}")
with subtest("Open Xfce terminal"):
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 xfce4-terminal >&2 &'")
machine.wait_for_window("Terminal")
with subtest("Open whiskermenu"):
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfconf-query -c xfce4-panel -p /plugins/plugin-1 -t string -s whiskermenu -n >&2 &'")
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfconf-query -c xfce4-panel -p /plugins/plugin-1/stay-on-focus-out -t bool -s true -n >&2 &'")
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfce4-panel -r >&2 &'")
machine.wait_until_succeeds("journalctl -b --grep 'xfce4-panel: Restarting' -t xsession")
machine.sleep(5)
machine.wait_until_succeeds("pgrep -f libwhiskermenu")
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfce4-popup-whiskermenu >&2 &'")
machine.wait_for_text('Mail Reader')
# Close the menu.
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 ${bus} xfce4-popup-whiskermenu >&2 &'")
with subtest("Open Thunar"):
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 thunar >&2 &'")
machine.wait_for_window("Thunar")
machine.wait_for_text('(Pictures|Public|Templates|Videos)')
with subtest("Open Xfce terminal"):
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 xfce4-terminal >&2 &'")
machine.wait_for_window("Terminal")
with subtest("Check if any coredumps are found"):
machine.succeed("(coredumpctl --json=short 2>&1 || true) | grep 'No coredumps found'")
machine.sleep(10)
machine.screenshot("screen")
'';
}
)
with subtest("Open Thunar"):
machine.succeed("su - ${user.name} -c 'DISPLAY=:0 thunar >&2 &'")
machine.wait_for_window("Thunar")
machine.wait_for_text('(Pictures|Public|Templates|Videos)')
with subtest("Check if any coredumps are found"):
machine.succeed("(coredumpctl --json=short 2>&1 || true) | grep 'No coredumps found'")
machine.sleep(10)
machine.screenshot("screen")
'';
}

View file

@ -1,44 +1,42 @@
import ./make-test-python.nix (
{ lib, ... }:
{
name = "xmonad-xdg-autostart";
meta.maintainers = with lib.maintainers; [ oxalica ];
{ lib, ... }:
{
name = "xmonad-xdg-autostart";
meta.maintainers = with lib.maintainers; [ oxalica ];
nodes.machine =
{ pkgs, config, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
services.displayManager.defaultSession = "none+xmonad";
services.xserver.windowManager.xmonad.enable = true;
services.xserver.desktopManager.runXdgAutostartIfNone = true;
nodes.machine =
{ pkgs, config, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
services.displayManager.defaultSession = "none+xmonad";
services.xserver.windowManager.xmonad.enable = true;
services.xserver.desktopManager.runXdgAutostartIfNone = true;
environment.systemPackages = [
(pkgs.writeTextFile {
name = "test-xdg-autostart";
destination = "/etc/xdg/autostart/test-xdg-autostart.desktop";
text = ''
[Desktop Entry]
Name=test-xdg-autoatart
Type=Application
Terminal=false
Exec=${pkgs.coreutils}/bin/touch ${config.users.users.alice.home}/xdg-autostart-executed
'';
})
];
};
environment.systemPackages = [
(pkgs.writeTextFile {
name = "test-xdg-autostart";
destination = "/etc/xdg/autostart/test-xdg-autostart.desktop";
text = ''
[Desktop Entry]
Name=test-xdg-autoatart
Type=Application
Terminal=false
Exec=${pkgs.coreutils}/bin/touch ${config.users.users.alice.home}/xdg-autostart-executed
'';
})
];
};
testScript =
{ nodes, ... }:
let
user = nodes.machine.config.users.users.alice;
in
''
machine.wait_for_x()
machine.wait_for_file("${user.home}/xdg-autostart-executed")
'';
}
)
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
in
''
machine.wait_for_x()
machine.wait_for_file("${user.home}/xdg-autostart-executed")
'';
}

View file

@ -1,131 +1,129 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{ pkgs, ... }:
let
mkConfig = name: keys: ''
import XMonad
import XMonad.Operations (restart)
import XMonad.Util.EZConfig
import XMonad.Util.SessionStart
import Control.Monad (when)
import Text.Printf (printf)
import System.Posix.Process (executeFile)
import System.Info (arch,os)
import System.Environment (getArgs)
import System.FilePath ((</>))
let
mkConfig = name: keys: ''
import XMonad
import XMonad.Operations (restart)
import XMonad.Util.EZConfig
import XMonad.Util.SessionStart
import Control.Monad (when)
import Text.Printf (printf)
import System.Posix.Process (executeFile)
import System.Info (arch,os)
import System.Environment (getArgs)
import System.FilePath ((</>))
main = do
dirs <- getDirectories
launch (def { startupHook = startup } `additionalKeysP` myKeys) dirs
main = do
dirs <- getDirectories
launch (def { startupHook = startup } `additionalKeysP` myKeys) dirs
startup = isSessionStart >>= \sessInit ->
spawn "touch /tmp/${name}"
>> if sessInit then setSessionStarted else spawn "xterm"
startup = isSessionStart >>= \sessInit ->
spawn "touch /tmp/${name}"
>> if sessInit then setSessionStarted else spawn "xterm"
myKeys = [${builtins.concatStringsSep ", " keys}]
myKeys = [${builtins.concatStringsSep ", " keys}]
compiledConfig = printf "xmonad-%s-%s" arch os
compiledConfig = printf "xmonad-%s-%s" arch os
compileRestart resume = do
dirs <- asks directories
compileRestart resume = do
dirs <- asks directories
whenX (recompile dirs True) $
when resume writeStateToFile
*> catchIO
( do
args <- getArgs
executeFile (cacheDir dirs </> compiledConfig) False args Nothing
)
'';
whenX (recompile dirs True) $
when resume writeStateToFile
*> catchIO
( do
args <- getArgs
executeFile (cacheDir dirs </> compiledConfig) False args Nothing
)
'';
oldKeys = [
''("M-C-x", spawn "xterm")''
''("M-q", restart "xmonad" True)''
''("M-C-q", compileRestart True)''
''("M-C-t", spawn "touch /tmp/somefile")'' # create somefile
oldKeys = [
''("M-C-x", spawn "xterm")''
''("M-q", restart "xmonad" True)''
''("M-C-q", compileRestart True)''
''("M-C-t", spawn "touch /tmp/somefile")'' # create somefile
];
newKeys = [
''("M-C-x", spawn "xterm")''
''("M-q", restart "xmonad" True)''
''("M-C-q", compileRestart True)''
''("M-C-r", spawn "rm /tmp/somefile")'' # delete somefile
];
newConfig = pkgs.writeText "xmonad.hs" (mkConfig "newXMonad" newKeys);
in
{
name = "xmonad";
meta = with pkgs.lib.maintainers; {
maintainers = [
nequissimus
ivanbrennan
];
};
newKeys = [
''("M-C-x", spawn "xterm")''
''("M-q", restart "xmonad" True)''
''("M-C-q", compileRestart True)''
''("M-C-r", spawn "rm /tmp/somefile")'' # delete somefile
];
newConfig = pkgs.writeText "xmonad.hs" (mkConfig "newXMonad" newKeys);
in
{
name = "xmonad";
meta = with pkgs.lib.maintainers; {
maintainers = [
nequissimus
ivanbrennan
nodes.machine =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
services.displayManager.defaultSession = "none+xmonad";
services.xserver.windowManager.xmonad = {
enable = true;
enableConfiguredRecompile = true;
enableContribAndExtras = true;
extraPackages = with pkgs.haskellPackages; haskellPackages: [ xmobar ];
config = mkConfig "oldXMonad" oldKeys;
};
};
nodes.machine =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
services.displayManager.defaultSession = "none+xmonad";
services.xserver.windowManager.xmonad = {
enable = true;
enableConfiguredRecompile = true;
enableContribAndExtras = true;
extraPackages = with pkgs.haskellPackages; haskellPackages: [ xmobar ];
config = mkConfig "oldXMonad" oldKeys;
};
};
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
in
''
machine.wait_for_x()
machine.wait_for_file("${user.home}/.Xauthority")
machine.succeed("xauth merge ${user.home}/.Xauthority")
machine.send_key("alt-ctrl-x")
machine.wait_for_window("${user.name}.*machine")
machine.sleep(1)
machine.screenshot("terminal1")
machine.succeed("rm /tmp/oldXMonad")
machine.send_key("alt-q")
machine.wait_for_file("/tmp/oldXMonad")
machine.wait_for_window("${user.name}.*machine")
machine.sleep(1)
machine.screenshot("terminal2")
testScript =
{ nodes, ... }:
let
user = nodes.machine.config.users.users.alice;
in
''
machine.wait_for_x()
machine.wait_for_file("${user.home}/.Xauthority")
machine.succeed("xauth merge ${user.home}/.Xauthority")
machine.send_key("alt-ctrl-x")
machine.wait_for_window("${user.name}.*machine")
machine.sleep(1)
machine.screenshot("terminal1")
machine.succeed("rm /tmp/oldXMonad")
machine.send_key("alt-q")
machine.wait_for_file("/tmp/oldXMonad")
machine.wait_for_window("${user.name}.*machine")
machine.sleep(1)
machine.screenshot("terminal2")
# /tmp/somefile should not exist yet
machine.fail("stat /tmp/somefile")
# /tmp/somefile should not exist yet
machine.fail("stat /tmp/somefile")
# original config has a keybinding that creates somefile
machine.send_key("alt-ctrl-t")
machine.wait_for_file("/tmp/somefile")
# original config has a keybinding that creates somefile
machine.send_key("alt-ctrl-t")
machine.wait_for_file("/tmp/somefile")
# set up the new config
machine.succeed("mkdir -p ${user.home}/.xmonad")
machine.copy_from_host("${newConfig}", "${user.home}/.config/xmonad/xmonad.hs")
# set up the new config
machine.succeed("mkdir -p ${user.home}/.xmonad")
machine.copy_from_host("${newConfig}", "${user.home}/.config/xmonad/xmonad.hs")
# recompile xmonad using the new config
machine.send_key("alt-ctrl-q")
machine.wait_for_file("/tmp/newXMonad")
# recompile xmonad using the new config
machine.send_key("alt-ctrl-q")
machine.wait_for_file("/tmp/newXMonad")
# new config has a keybinding that deletes somefile
machine.send_key("alt-ctrl-r")
machine.wait_until_fails("stat /tmp/somefile", timeout=30)
# new config has a keybinding that deletes somefile
machine.send_key("alt-ctrl-r")
machine.wait_until_fails("stat /tmp/somefile", timeout=30)
# restart with the old config, and confirm the old keybinding is back
machine.succeed("rm /tmp/oldXMonad")
machine.send_key("alt-q")
machine.wait_for_file("/tmp/oldXMonad")
machine.send_key("alt-ctrl-t")
machine.wait_for_file("/tmp/somefile")
'';
}
)
# restart with the old config, and confirm the old keybinding is back
machine.succeed("rm /tmp/oldXMonad")
machine.send_key("alt-q")
machine.wait_for_file("/tmp/oldXMonad")
machine.send_key("alt-ctrl-t")
machine.wait_for_file("/tmp/somefile")
'';
}

View file

@ -1,21 +1,19 @@
import ./make-test-python.nix (
{ lib, pkgs, ... }:
{
name = "xpadneo";
meta.maintainers = with lib.maintainers; [ kira-bruneau ];
{ lib, pkgs, ... }:
{
name = "xpadneo";
meta.maintainers = with lib.maintainers; [ kira-bruneau ];
nodes = {
machine = {
config.hardware.xpadneo.enable = true;
};
nodes = {
machine = {
config.hardware.xpadneo.enable = true;
};
};
# This is just a sanity check to make sure the module was
# loaded. We'd have to find some way to mock an xbox controller if
# we wanted more in-depth testing.
testScript = ''
machine.start();
machine.succeed("modinfo hid_xpadneo | grep 'version:\s\+${pkgs.linuxPackages.xpadneo.version}'")
'';
}
)
# This is just a sanity check to make sure the module was
# loaded. We'd have to find some way to mock an xbox controller if
# we wanted more in-depth testing.
testScript = ''
machine.start();
machine.succeed("modinfo hid_xpadneo | grep 'version:\s\+${pkgs.linuxPackages.xpadneo.version}'")
'';
}

View file

@ -1,110 +1,108 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
# How to interactively test this module if the audio actually works
{ pkgs, ... }:
{
# How to interactively test this module if the audio actually works
# - nix run .#pulseaudio-module-xrdp.tests.xrdp-with-audio-pulseaudio.driverInteractive
# - test_script() # launches the terminal and the tests itself
# - server.send_monitor_command("hostfwd_add tcp::3389-:3389") # forward the RDP port to the host
# - Connect with the RDP client you like (ex: Remmina)
# - Don't forget to enable audio support. In remmina: Advanced -> Audio output mode to Local (default is Off)
# - Open a browser or something that plays sound. Ex: chromium
# - nix run .#pulseaudio-module-xrdp.tests.xrdp-with-audio-pulseaudio.driverInteractive
# - test_script() # launches the terminal and the tests itself
# - server.send_monitor_command("hostfwd_add tcp::3389-:3389") # forward the RDP port to the host
# - Connect with the RDP client you like (ex: Remmina)
# - Don't forget to enable audio support. In remmina: Advanced -> Audio output mode to Local (default is Off)
# - Open a browser or something that plays sound. Ex: chromium
name = "xrdp-with-audio-pulseaudio";
meta = with pkgs.lib.maintainers; {
maintainers = [ lucasew ];
};
name = "xrdp-with-audio-pulseaudio";
meta = with pkgs.lib.maintainers; {
maintainers = [ lucasew ];
};
nodes = {
server =
{ pkgs, ... }:
{
imports = [ ./common/user-account.nix ];
nodes = {
server =
{ pkgs, ... }:
{
imports = [ ./common/user-account.nix ];
environment.etc."xrdp/test.txt".text = "Shouldn't conflict";
environment.etc."xrdp/test.txt".text = "Shouldn't conflict";
services.xrdp.enable = true;
services.xrdp.audio.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.xterm}/bin/xterm";
services.xrdp.enable = true;
services.xrdp.audio.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.xterm}/bin/xterm";
services.pulseaudio = {
enable = true;
};
services.pulseaudio = {
enable = true;
};
systemd.user.services.pactl-list = {
script = ''
while [ ! -S /tmp/.xrdp/xrdp_chansrv_audio_in_socket_* ]; do
sleep 1
done
systemd.user.services.pactl-list = {
script = ''
while [ ! -S /tmp/.xrdp/xrdp_chansrv_audio_in_socket_* ]; do
sleep 1
${pkgs.pulseaudio}/bin/pactl list
echo Source:
${pkgs.pulseaudio}/bin/pactl get-default-source | tee /tmp/pulseaudio-source
echo Sink:
${pkgs.pulseaudio}/bin/pactl get-default-sink | tee /tmp/pulseaudio-sink
done
sleep 1
${pkgs.pulseaudio}/bin/pactl list
echo Source:
${pkgs.pulseaudio}/bin/pactl get-default-source | tee /tmp/pulseaudio-source
echo Sink:
${pkgs.pulseaudio}/bin/pactl get-default-sink | tee /tmp/pulseaudio-sink
'';
wantedBy = [ "default.target" ];
};
networking.firewall.allowedTCPPorts = [ 3389 ];
'';
wantedBy = [ "default.target" ];
};
client =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
networking.firewall.allowedTCPPorts = [ 3389 ];
};
environment.systemPackages = [ pkgs.freerdp ];
client =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
services.xrdp.enable = true;
services.xrdp.audio.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.icewm}/bin/icewm";
environment.systemPackages = [ pkgs.freerdp ];
services.pulseaudio = {
enable = true;
};
services.xrdp.enable = true;
services.xrdp.audio.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.icewm}/bin/icewm";
services.pulseaudio = {
enable = true;
};
};
};
};
testScript =
{ nodes, ... }:
let
user = nodes.client.config.users.users.alice;
in
''
start_all()
testScript =
{ nodes, ... }:
let
user = nodes.client.config.users.users.alice;
in
''
start_all()
client.wait_for_x()
client.wait_for_file("${user.home}/.Xauthority")
client.succeed("xauth merge ${user.home}/.Xauthority")
client.wait_for_x()
client.wait_for_file("${user.home}/.Xauthority")
client.succeed("xauth merge ${user.home}/.Xauthority")
client.sleep(5)
client.sleep(5)
client.execute("xterm >&2 &")
client.sleep(1)
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:127.0.0.1 /u:${user.name} /p:${user.password} /sound\n")
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:127.0.0.1 /u:${user.name} /p:${user.password} /sound\n")
client.sleep(10)
client.sleep(10)
client.succeed("[ -S /tmp/.xrdp/xrdp_chansrv_audio_in_socket_* ]") # checks if it's a socket
client.sleep(5)
client.screenshot("localrdp")
client.succeed("[ -S /tmp/.xrdp/xrdp_chansrv_audio_in_socket_* ]") # checks if it's a socket
client.sleep(5)
client.screenshot("localrdp")
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:server /u:${user.name} /p:${user.password} /sound\n")
client.sleep(10)
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:server /u:${user.name} /p:${user.password} /sound\n")
client.sleep(10)
server.succeed("[ -S /tmp/.xrdp/xrdp_chansrv_audio_in_socket_* ]") # checks if it's a socket
server.succeed('[ "$(cat /tmp/pulseaudio-source)" == "xrdp-source" ]')
server.succeed('[ "$(cat /tmp/pulseaudio-sink)" == "xrdp-sink" ]')
client.screenshot("remoterdp")
'';
}
)
server.succeed("[ -S /tmp/.xrdp/xrdp_chansrv_audio_in_socket_* ]") # checks if it's a socket
server.succeed('[ "$(cat /tmp/pulseaudio-source)" == "xrdp-source" ]')
server.succeed('[ "$(cat /tmp/pulseaudio-sink)" == "xrdp-sink" ]')
client.screenshot("remoterdp")
'';
}

View file

@ -1,60 +1,58 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "xrdp";
meta = with pkgs.lib.maintainers; {
maintainers = [ ];
};
{ pkgs, ... }:
{
name = "xrdp";
meta = with pkgs.lib.maintainers; {
maintainers = [ ];
};
nodes = {
server =
{ pkgs, ... }:
{
imports = [ ./common/user-account.nix ];
services.xrdp.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.xterm}/bin/xterm";
networking.firewall.allowedTCPPorts = [ 3389 ];
};
nodes = {
server =
{ pkgs, ... }:
{
imports = [ ./common/user-account.nix ];
services.xrdp.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.xterm}/bin/xterm";
networking.firewall.allowedTCPPorts = [ 3389 ];
};
client =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
environment.systemPackages = [ pkgs.freerdp ];
services.xrdp.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.icewm}/bin/icewm";
};
};
client =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
environment.systemPackages = [ pkgs.freerdp ];
services.xrdp.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.icewm}/bin/icewm";
};
};
testScript =
{ nodes, ... }:
let
user = nodes.client.config.users.users.alice;
in
''
start_all()
testScript =
{ nodes, ... }:
let
user = nodes.client.users.users.alice;
in
''
start_all()
client.wait_for_x()
client.wait_for_file("${user.home}/.Xauthority")
client.succeed("xauth merge ${user.home}/.Xauthority")
client.wait_for_x()
client.wait_for_file("${user.home}/.Xauthority")
client.succeed("xauth merge ${user.home}/.Xauthority")
client.sleep(5)
client.sleep(5)
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:127.0.0.1 /u:${user.name} /p:${user.password}\n")
client.sleep(5)
client.screenshot("localrdp")
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:127.0.0.1 /u:${user.name} /p:${user.password}\n")
client.sleep(5)
client.screenshot("localrdp")
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:server /u:${user.name} /p:${user.password}\n")
client.sleep(5)
client.screenshot("remoterdp")
'';
}
)
client.execute("xterm >&2 &")
client.sleep(1)
client.send_chars("xfreerdp /cert-tofu /w:640 /h:480 /v:server /u:${user.name} /p:${user.password}\n")
client.sleep(5)
client.screenshot("remoterdp")
'';
}

View file

@ -1,54 +1,51 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{
name = "xss-lock";
meta.maintainers = [ ];
{
name = "xss-lock";
meta.maintainers = [ ];
nodes = {
simple = {
nodes = {
simple = {
imports = [
./common/x11.nix
./common/user-account.nix
];
programs.xss-lock.enable = true;
test-support.displayManager.auto.user = "alice";
};
custom_lockcmd =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
programs.xss-lock.enable = true;
test-support.displayManager.auto.user = "alice";
};
custom_lockcmd =
{ pkgs, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
programs.xss-lock = {
enable = true;
extraOptions = [
"-n"
"${pkgs.libnotify}/bin/notify-send 'About to sleep!'"
];
test-support.displayManager.auto.user = "alice";
programs.xss-lock = {
enable = true;
extraOptions = [
"-n"
"${pkgs.libnotify}/bin/notify-send 'About to sleep!'"
];
lockerCommand = "${pkgs.xlockmore}/bin/xlock -mode ant";
};
lockerCommand = "${pkgs.xlockmore}/bin/xlock -mode ant";
};
};
};
};
testScript = ''
def perform_xsslock_test(machine, lockCmd):
machine.start()
machine.wait_for_x()
machine.wait_for_unit("xss-lock.service", "alice")
machine.fail(f"pgrep {lockCmd}")
machine.succeed("su -l alice -c 'xset dpms force standby'")
machine.wait_until_succeeds(f"pgrep {lockCmd}")
testScript = ''
def perform_xsslock_test(machine, lockCmd):
machine.start()
machine.wait_for_x()
machine.wait_for_unit("xss-lock.service", "alice")
machine.fail(f"pgrep {lockCmd}")
machine.succeed("su -l alice -c 'xset dpms force standby'")
machine.wait_until_succeeds(f"pgrep {lockCmd}")
with subtest("simple"):
perform_xsslock_test(simple, "i3lock")
with subtest("simple"):
perform_xsslock_test(simple, "i3lock")
with subtest("custom_cmd"):
perform_xsslock_test(custom_lockcmd, "xlock")
'';
}
)
with subtest("custom_cmd"):
perform_xsslock_test(custom_lockcmd, "xlock")
'';
}

View file

@ -1,26 +1,22 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "xterm";
meta = with pkgs.lib.maintainers; {
maintainers = [ nequissimus ];
};
{ pkgs, ... }:
{
name = "xterm";
meta = with pkgs.lib.maintainers; {
maintainers = [ nequissimus ];
};
nodes.machine =
{ pkgs, ... }:
{
imports = [ ./common/x11.nix ];
services.xserver.desktopManager.xterm.enable = false;
};
nodes.machine = {
imports = [ ./common/x11.nix ];
services.xserver.desktopManager.xterm.enable = false;
};
testScript = ''
machine.wait_for_x()
machine.succeed("DISPLAY=:0 xterm -title testterm -class testterm -fullscreen >&2 &")
machine.sleep(2)
machine.send_chars("echo $XTERM_VERSION >> /tmp/xterm_version\n")
machine.wait_for_file("/tmp/xterm_version")
assert "${pkgs.xterm.version}" in machine.succeed("cat /tmp/xterm_version")
machine.screenshot("window")
'';
}
)
testScript = ''
machine.wait_for_x()
machine.succeed("DISPLAY=:0 xterm -title testterm -class testterm -fullscreen >&2 &")
machine.sleep(2)
machine.send_chars("echo $XTERM_VERSION >> /tmp/xterm_version\n")
machine.wait_for_file("/tmp/xterm_version")
assert "${pkgs.xterm.version}" in machine.succeed("cat /tmp/xterm_version")
machine.screenshot("window")
'';
}

View file

@ -1,76 +1,74 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{ pkgs, lib, ... }:
let
inherit (import ./ssh-keys.nix pkgs) snakeOilPrivateKey snakeOilPublicKey;
xxh-shell-zsh = pkgs.stdenv.mkDerivation {
pname = "xxh-shell-zsh";
version = "";
src = pkgs.fetchFromGitHub {
owner = "xxh";
repo = "xxh-shell-zsh";
# gets rarely updated, we can then just replace the hash
rev = "91e1f84f8d6e0852c3235d4813f341230cac439f";
sha256 = "sha256-Y1FrIRxTd0yooK+ZzKcCd6bLSy5E2fRXYAzrIsm7rIc=";
let
inherit (import ./ssh-keys.nix pkgs) snakeOilPrivateKey snakeOilPublicKey;
xxh-shell-zsh = pkgs.stdenv.mkDerivation {
pname = "xxh-shell-zsh";
version = "";
src = pkgs.fetchFromGitHub {
owner = "xxh";
repo = "xxh-shell-zsh";
# gets rarely updated, we can then just replace the hash
rev = "91e1f84f8d6e0852c3235d4813f341230cac439f";
sha256 = "sha256-Y1FrIRxTd0yooK+ZzKcCd6bLSy5E2fRXYAzrIsm7rIc=";
};
postPatch = ''
substituteInPlace build.sh \
--replace "echo Install wget or curl" "cp ${zsh-portable-binary} zsh-5.8-linux-x86_64.tar.gz" \
--replace "command -v curl" "command -v this-should-not-trigger"
'';
installPhase = ''
mkdir -p $out
mv * $out/
'';
};
zsh-portable-binary = pkgs.fetchurl {
# kept in sync with https://github.com/xxh/xxh-shell-zsh/tree/master/build.sh#L27
url = "https://github.com/romkatv/zsh-bin/releases/download/v3.0.1/zsh-5.8-linux-x86_64.tar.gz";
sha256 = "sha256-i8flMd2Isc0uLoeYQNDnOGb/kK3oTFVqQgIx7aOAIIo=";
};
in
{
name = "xxh";
meta = with lib.maintainers; {
maintainers = [ lom ];
};
nodes = {
server =
{ ... }:
{
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keys = [ snakeOilPublicKey ];
};
postPatch = ''
substituteInPlace build.sh \
--replace "echo Install wget or curl" "cp ${zsh-portable-binary} zsh-5.8-linux-x86_64.tar.gz" \
--replace "command -v curl" "command -v this-should-not-trigger"
'';
client =
{ ... }:
{
programs.zsh.enable = true;
users.users.root.shell = pkgs.zsh;
environment.systemPackages = with pkgs; [
xxh
git
];
};
};
installPhase = ''
mkdir -p $out
mv * $out/
'';
};
testScript = ''
start_all()
zsh-portable-binary = pkgs.fetchurl {
# kept in sync with https://github.com/xxh/xxh-shell-zsh/tree/master/build.sh#L27
url = "https://github.com/romkatv/zsh-bin/releases/download/v3.0.1/zsh-5.8-linux-x86_64.tar.gz";
sha256 = "sha256-i8flMd2Isc0uLoeYQNDnOGb/kK3oTFVqQgIx7aOAIIo=";
};
in
{
name = "xxh";
meta = with lib.maintainers; {
maintainers = [ lom ];
};
client.succeed("mkdir -m 700 /root/.ssh")
nodes = {
server =
{ ... }:
{
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keys = [ snakeOilPublicKey ];
};
client.succeed(
"cat ${snakeOilPrivateKey} > /root/.ssh/id_ecdsa"
)
client.succeed("chmod 600 /root/.ssh/id_ecdsa")
client =
{ ... }:
{
programs.zsh.enable = true;
users.users.root.shell = pkgs.zsh;
environment.systemPackages = with pkgs; [
xxh
git
];
};
};
server.wait_for_unit("sshd")
testScript = ''
start_all()
client.succeed("mkdir -m 700 /root/.ssh")
client.succeed(
"cat ${snakeOilPrivateKey} > /root/.ssh/id_ecdsa"
)
client.succeed("chmod 600 /root/.ssh/id_ecdsa")
server.wait_for_unit("sshd")
client.succeed("xxh server -i /root/.ssh/id_ecdsa +hc \'echo $0\' +i +s zsh +I xxh-shell-zsh+path+${xxh-shell-zsh} | grep -Fq '/root/.xxh/.xxh/shells/xxh-shell-zsh/build/zsh-bin/bin/zsh'")
'';
}
)
client.succeed("xxh server -i /root/.ssh/id_ecdsa +hc \'echo $0\' +i +s zsh +I xxh-shell-zsh+path+${xxh-shell-zsh} | grep -Fq '/root/.xxh/.xxh/shells/xxh-shell-zsh/build/zsh-bin/bin/zsh'")
'';
}

View file

@ -1,33 +1,30 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{
name = "yabar";
meta.maintainers = [ ];
{
name = "yabar";
meta.maintainers = [ ];
nodes.machine = {
imports = [
./common/x11.nix
./common/user-account.nix
];
nodes.machine = {
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "bob";
test-support.displayManager.auto.user = "bob";
programs.yabar.enable = true;
programs.yabar.bars = {
top.indicators.date.exec = "YABAR_DATE";
};
programs.yabar.enable = true;
programs.yabar.bars = {
top.indicators.date.exec = "YABAR_DATE";
};
};
testScript = ''
machine.start()
machine.wait_for_x()
testScript = ''
machine.start()
machine.wait_for_x()
# confirm proper startup
machine.wait_for_unit("yabar.service", "bob")
machine.sleep(10)
machine.wait_for_unit("yabar.service", "bob")
# confirm proper startup
machine.wait_for_unit("yabar.service", "bob")
machine.sleep(10)
machine.wait_for_unit("yabar.service", "bob")
machine.screenshot("top_bar")
'';
}
)
machine.screenshot("top_bar")
'';
}

View file

@ -25,173 +25,169 @@ let
danIp6 = bobPrefix + "::2";
in
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "yggdrasil";
meta = with pkgs.lib.maintainers; {
maintainers = [ gazally ];
};
{ pkgs, ... }:
{
name = "yggdrasil";
meta = with pkgs.lib.maintainers; {
maintainers = [ gazally ];
};
nodes = rec {
# Alice is listening for peerings on a specified port,
# but has multicast peering disabled. Alice has part of her
# yggdrasil config in Nix and part of it in a file.
alice =
{ ... }:
{
networking = {
interfaces.eth1.ipv4.addresses = [
{
address = "192.168.1.200";
prefixLength = 24;
}
];
firewall.allowedTCPPorts = [
80
12345
];
nodes = {
# Alice is listening for peerings on a specified port,
# but has multicast peering disabled. Alice has part of her
# yggdrasil config in Nix and part of it in a file.
alice =
{ ... }:
{
networking = {
interfaces.eth1.ipv4.addresses = [
{
address = "192.168.1.200";
prefixLength = 24;
}
];
firewall.allowedTCPPorts = [
80
12345
];
};
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
services.yggdrasil = {
enable = true;
settings = {
Listen = [ "tcp://0.0.0.0:12345" ];
MulticastInterfaces = [ ];
};
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
configFile = toString (
pkgs.writeTextFile {
name = "yggdrasil-alice-conf";
text = builtins.toJSON aliceKeys;
}
);
};
};
services.yggdrasil = {
enable = true;
settings = {
Listen = [ "tcp://0.0.0.0:12345" ];
MulticastInterfaces = [ ];
};
configFile = toString (
pkgs.writeTextFile {
name = "yggdrasil-alice-conf";
text = builtins.toJSON aliceKeys;
# Bob is set up to peer with Alice, and also to do local multicast
# peering. Bob's yggdrasil config is in a file.
bob =
{ ... }:
{
networking.firewall.allowedTCPPorts = [ 54321 ];
services.yggdrasil = {
enable = true;
openMulticastPort = true;
configFile = toString (
pkgs.writeTextFile {
name = "yggdrasil-bob-conf";
text = builtins.toJSON bobConfig;
}
);
};
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = 1;
networking = {
bridges.br0.interfaces = [ ];
interfaces.br0 = {
ipv6.addresses = [
{
address = bobPrefix + "::1";
prefixLength = 64;
}
);
];
};
};
# Bob is set up to peer with Alice, and also to do local multicast
# peering. Bob's yggdrasil config is in a file.
bob =
{ ... }:
{
networking.firewall.allowedTCPPorts = [ 54321 ];
services.yggdrasil = {
enable = true;
openMulticastPort = true;
configFile = toString (
pkgs.writeTextFile {
name = "yggdrasil-bob-conf";
text = builtins.toJSON bobConfig;
}
);
};
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = 1;
networking = {
bridges.br0.interfaces = [ ];
interfaces.br0 = {
ipv6.addresses = [
# dan is a node inside a container running on bob's host.
containers.dan = {
autoStart = true;
privateNetwork = true;
hostBridge = "br0";
config = {
networking.interfaces.eth0.ipv6 = {
addresses = [
{
address = bobPrefix + "::1";
address = bobPrefix + "::2";
prefixLength = 64;
}
];
};
};
# dan is a node inside a container running on bob's host.
containers.dan = {
autoStart = true;
privateNetwork = true;
hostBridge = "br0";
config =
{ config, pkgs, ... }:
{
networking.interfaces.eth0.ipv6 = {
addresses = [
{
address = bobPrefix + "::2";
prefixLength = 64;
}
];
routes = [
{
address = "200::";
prefixLength = 7;
via = bobPrefix + "::1";
}
];
};
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
networking.firewall.allowedTCPPorts = [ 80 ];
};
};
};
# Carol only does local peering. Carol's yggdrasil config is all Nix.
carol =
{ ... }:
{
networking.firewall.allowedTCPPorts = [ 43210 ];
services.yggdrasil = {
enable = true;
extraArgs = [
"-loglevel"
"error"
];
denyDhcpcdInterfaces = [ "ygg0" ];
settings = {
IfTAPMode = true;
IfName = "ygg0";
MulticastInterfaces = [
routes = [
{
Port = 43210;
address = "200::";
prefixLength = 7;
via = bobPrefix + "::1";
}
];
openMulticastPort = true;
};
persistentKeys = true;
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
networking.firewall.allowedTCPPorts = [ 80 ];
};
};
};
};
testScript = ''
import re
# Carol only does local peering. Carol's yggdrasil config is all Nix.
carol =
{ ... }:
{
networking.firewall.allowedTCPPorts = [ 43210 ];
services.yggdrasil = {
enable = true;
extraArgs = [
"-loglevel"
"error"
];
denyDhcpcdInterfaces = [ "ygg0" ];
settings = {
IfTAPMode = true;
IfName = "ygg0";
MulticastInterfaces = [
{
Port = 43210;
}
];
openMulticastPort = true;
};
persistentKeys = true;
};
};
};
# Give Alice a head start so she is ready when Bob calls.
alice.start()
alice.wait_for_unit("yggdrasil.service")
testScript = ''
import re
bob.start()
carol.start()
bob.wait_for_unit("default.target")
carol.wait_for_unit("yggdrasil.service")
# Give Alice a head start so she is ready when Bob calls.
alice.start()
alice.wait_for_unit("yggdrasil.service")
ip_addr_show = "ip -o -6 addr show dev ygg0 scope global"
carol.wait_until_succeeds(f"[ `{ip_addr_show} | grep -v tentative | wc -l` -ge 1 ]")
carol_ip6 = re.split(" +|/", carol.succeed(ip_addr_show))[3]
bob.start()
carol.start()
bob.wait_for_unit("default.target")
carol.wait_for_unit("yggdrasil.service")
# If Alice can talk to Carol, then Bob's outbound peering and Carol's
# local peering have succeeded and everybody is connected.
alice.wait_until_succeeds(f"ping -c 1 {carol_ip6}")
alice.succeed("ping -c 1 ${bobIp6}")
ip_addr_show = "ip -o -6 addr show dev ygg0 scope global"
carol.wait_until_succeeds(f"[ `{ip_addr_show} | grep -v tentative | wc -l` -ge 1 ]")
carol_ip6 = re.split(" +|/", carol.succeed(ip_addr_show))[3]
bob.succeed("ping -c 1 ${aliceIp6}")
bob.succeed(f"ping -c 1 {carol_ip6}")
# If Alice can talk to Carol, then Bob's outbound peering and Carol's
# local peering have succeeded and everybody is connected.
alice.wait_until_succeeds(f"ping -c 1 {carol_ip6}")
alice.succeed("ping -c 1 ${bobIp6}")
carol.succeed("ping -c 1 ${aliceIp6}")
carol.succeed("ping -c 1 ${bobIp6}")
carol.succeed("ping -c 1 ${bobPrefix}::1")
carol.succeed("ping -c 8 ${danIp6}")
bob.succeed("ping -c 1 ${aliceIp6}")
bob.succeed(f"ping -c 1 {carol_ip6}")
carol.fail("journalctl -u dhcpcd | grep ygg0")
carol.succeed("ping -c 1 ${aliceIp6}")
carol.succeed("ping -c 1 ${bobIp6}")
carol.succeed("ping -c 1 ${bobPrefix}::1")
carol.succeed("ping -c 8 ${danIp6}")
alice.wait_for_unit("httpd.service")
carol.succeed("curl --fail -g http://[${aliceIp6}]")
carol.succeed("curl --fail -g http://[${danIp6}]")
'';
}
)
carol.fail("journalctl -u dhcpcd | grep ygg0")
alice.wait_for_unit("httpd.service")
carol.succeed("curl --fail -g http://[${aliceIp6}]")
carol.succeed("curl --fail -g http://[${danIp6}]")
'';
}

View file

@ -1,36 +1,34 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "your_spotify";
meta = with pkgs.lib.maintainers; {
maintainers = [ patrickdag ];
};
{ pkgs, ... }:
{
name = "your_spotify";
meta = with pkgs.lib.maintainers; {
maintainers = [ patrickdag ];
};
nodes.machine = {
services.your_spotify = {
enable = true;
spotifySecretFile = pkgs.writeText "spotifySecretFile" "deadbeef";
settings = {
CLIENT_ENDPOINT = "http://localhost";
API_ENDPOINT = "http://localhost:3000";
SPOTIFY_PUBLIC = "beefdead";
};
enableLocalDB = true;
nginxVirtualHost = "localhost";
nodes.machine = {
services.your_spotify = {
enable = true;
spotifySecretFile = pkgs.writeText "spotifySecretFile" "deadbeef";
settings = {
CLIENT_ENDPOINT = "http://localhost";
API_ENDPOINT = "http://localhost:3000";
SPOTIFY_PUBLIC = "beefdead";
};
enableLocalDB = true;
nginxVirtualHost = "localhost";
};
};
testScript = ''
machine.wait_for_unit("your_spotify.service")
testScript = ''
machine.wait_for_unit("your_spotify.service")
machine.wait_for_open_port(3000)
machine.wait_for_open_port(80)
machine.wait_for_open_port(3000)
machine.wait_for_open_port(80)
out = machine.succeed("curl --fail -X GET 'http://localhost:3000/'")
assert "Hello !" in out
out = machine.succeed("curl --fail -X GET 'http://localhost:3000/'")
assert "Hello !" in out
out = machine.succeed("curl --fail -X GET 'http://localhost:80/'")
assert "<title>Your Spotify</title>" in out
'';
}
)
out = machine.succeed("curl --fail -X GET 'http://localhost:80/'")
assert "<title>Your Spotify</title>" in out
'';
}

View file

@ -1,42 +1,38 @@
import ./make-test-python.nix (
{ lib, pkgs, ... }:
{ lib, pkgs, ... }:
{
name = "zammad";
{
name = "zammad";
meta.maintainers = with lib.maintainers; [
taeer
netali
];
meta.maintainers = with lib.maintainers; [
taeer
netali
];
nodes.machine =
{ config, ... }:
{
virtualisation = {
memorySize = 2048;
};
nodes.machine = {
virtualisation = {
memorySize = 2048;
};
services.zammad.enable = true;
services.zammad.secretKeyBaseFile = pkgs.writeText "secret" ''
52882ef142066e09ab99ce816ba72522e789505caba224a52d750ec7dc872c2c371b2fd19f16b25dfbdd435a4dd46cb3df9f82eb63fafad715056bdfe25740d6
'';
};
testScript = ''
start_all()
machine.wait_for_unit("postgresql.service")
machine.wait_for_unit("redis-zammad.service")
machine.wait_for_unit("zammad-web.service")
machine.wait_for_unit("zammad-websocket.service")
machine.wait_for_unit("zammad-worker.service")
# wait for zammad to fully come up
machine.sleep(120)
# without the grep the command does not produce valid utf-8 for some reason
with subtest("welcome screen loads"):
machine.succeed(
"curl -sSfL http://localhost:3000/ | grep '<title>Zammad Helpdesk</title>'"
)
services.zammad.enable = true;
services.zammad.secretKeyBaseFile = pkgs.writeText "secret" ''
52882ef142066e09ab99ce816ba72522e789505caba224a52d750ec7dc872c2c371b2fd19f16b25dfbdd435a4dd46cb3df9f82eb63fafad715056bdfe25740d6
'';
}
)
};
testScript = ''
start_all()
machine.wait_for_unit("postgresql.service")
machine.wait_for_unit("redis-zammad.service")
machine.wait_for_unit("zammad-web.service")
machine.wait_for_unit("zammad-websocket.service")
machine.wait_for_unit("zammad-worker.service")
# wait for zammad to fully come up
machine.sleep(120)
# without the grep the command does not produce valid utf-8 for some reason
with subtest("welcome screen loads"):
machine.succeed(
"curl -sSfL http://localhost:3000/ | grep '<title>Zammad Helpdesk</title>'"
)
'';
}

View file

@ -1,71 +1,68 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{ pkgs, lib, ... }:
{
name = "zenohd";
meta.maintainers = [ lib.maintainers.markuskowa ];
{
name = "zenohd";
meta.maintainers = [ lib.maintainers.markuskowa ];
nodes = {
router =
{
pkgs,
lib,
config,
...
}:
{
networking.firewall.allowedTCPPorts = [
7447 # zenohd default port
config.services.zenohd.settings.plugins.mqtt.port
config.services.zenohd.settings.plugins.webserver.http_port
nodes = {
router =
{
pkgs,
config,
...
}:
{
networking.firewall.allowedTCPPorts = [
7447 # zenohd default port
config.services.zenohd.settings.plugins.mqtt.port
config.services.zenohd.settings.plugins.webserver.http_port
];
services.zenohd = {
enable = true;
plugins = with pkgs; [
zenoh-plugin-mqtt
zenoh-plugin-webserver
];
services.zenohd = {
enable = true;
backends = with pkgs; [
zenoh-backend-filesystem
zenoh-backend-rocksdb
];
plugins = with pkgs; [
zenoh-plugin-mqtt
zenoh-plugin-webserver
];
backends = with pkgs; [
zenoh-backend-filesystem
zenoh-backend-rocksdb
];
settings = {
plugins = {
mqtt = {
port = 1883;
allow = ".*";
settings = {
plugins = {
mqtt = {
port = 1883;
allow = ".*";
};
webserver.http_port = 8000;
storage_manager = {
volumes = {
fs = { };
rocksdb = { };
};
webserver.http_port = 8000;
storage_manager = {
volumes = {
fs = { };
rocksdb = { };
storages = {
mem = {
key_expr = "mem/**";
volume = "memory";
};
storages = {
mem = {
key_expr = "mem/**";
volume = "memory";
fs = {
key_expr = "fs/**";
volume = {
id = "fs";
dir = "zenoh-fs";
strip_prefix = "fs";
};
fs = {
key_expr = "fs/**";
volume = {
id = "fs";
dir = "zenoh-fs";
strip_prefix = "fs";
};
};
rocksdb = {
key_expr = "rocksdb/**";
volume = {
id = "rocksdb";
dir = "zenoh-rocksdb";
strip_prefix = "rocksdb";
create_db = true;
};
};
rocksdb = {
key_expr = "rocksdb/**";
volume = {
id = "rocksdb";
dir = "zenoh-rocksdb";
strip_prefix = "rocksdb";
create_db = true;
};
};
};
@ -73,21 +70,21 @@ import ./make-test-python.nix (
};
};
};
client = {
environment.systemPackages = [
pkgs.mosquitto
];
};
client = {
environment.systemPackages = [
pkgs.mosquitto
];
};
};
testScript = ''
router.wait_for_unit("zenohd.service")
client.wait_for_unit("multi-user.target")
testScript = ''
router.wait_for_unit("zenohd.service")
client.wait_for_unit("multi-user.target")
for be in ["fs", "rocksdb", "mem" ]:
client.succeed(f"mosquitto_pub -h router -t {be}/test -m hello")
client.succeed(f"curl router:8000/{be}/test | grep hello")
'';
}
)
for be in ["fs", "rocksdb", "mem" ]:
client.succeed(f"mosquitto_pub -h router -t {be}/test -m hello")
client.succeed(f"curl router:8000/{be}/test | grep hello")
'';
}

View file

@ -1,30 +1,31 @@
{
lib,
...
}:
let
port = 43110;
in
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "zeronet-conservancy";
meta = with pkgs.lib.maintainers; {
maintainers = [ fgaz ];
{
name = "zeronet-conservancy";
meta = with lib.maintainers; {
maintainers = [ fgaz ];
};
nodes.machine =
{ pkgs, ... }:
{
services.zeronet = {
enable = true;
package = pkgs.zeronet-conservancy;
inherit port;
};
};
nodes.machine =
{ config, pkgs, ... }:
{
services.zeronet = {
enable = true;
package = pkgs.zeronet-conservancy;
inherit port;
};
};
testScript = ''
machine.wait_for_unit("zeronet.service")
testScript = ''
machine.wait_for_unit("zeronet.service")
machine.wait_for_open_port(${toString port})
machine.wait_for_open_port(${toString port})
machine.succeed("curl --fail -H 'Accept: text/html, application/xml, */*' localhost:${toString port}/Stats")
'';
}
)
machine.succeed("curl --fail -H 'Accept: text/html, application/xml, */*' localhost:${toString port}/Stats")
'';
}

View file

@ -1,44 +1,42 @@
import ./make-test-python.nix (
{ lib, ... }:
{
name = "zipline";
meta.maintainers = with lib.maintainers; [ defelo ];
{ lib, ... }:
{
name = "zipline";
meta.maintainers = with lib.maintainers; [ defelo ];
nodes.machine = {
services.zipline = {
enable = true;
settings = {
CORE_HOSTNAME = "127.0.0.1";
CORE_PORT = 8000;
};
environmentFiles = [
(builtins.toFile "zipline.env" ''
CORE_SECRET=DMlouex3W0QLRbVwkUafNnNws5jpgRDX
'')
];
nodes.machine = {
services.zipline = {
enable = true;
settings = {
CORE_HOSTNAME = "127.0.0.1";
CORE_PORT = 8000;
};
networking.hosts."127.0.0.1" = [ "zipline.local" ];
environmentFiles = [
(builtins.toFile "zipline.env" ''
CORE_SECRET=DMlouex3W0QLRbVwkUafNnNws5jpgRDX
'')
];
};
testScript = ''
import json
import re
networking.hosts."127.0.0.1" = [ "zipline.local" ];
};
machine.wait_for_unit("zipline.service")
machine.wait_for_open_port(8000)
testScript = ''
import json
import re
resp = machine.succeed("curl zipline.local:8000/api/setup -v -X POST -H 'Content-Type: application/json' -d '{\"username\": \"administrator\", \"password\": \"password\"}' 2>&1")
data = json.loads(resp.splitlines()[-1])
assert data["firstSetup"] is True
assert data["user"]["username"] == "administrator"
assert data["user"]["role"] == "SUPERADMIN"
machine.wait_for_unit("zipline.service")
machine.wait_for_open_port(8000)
resp = machine.succeed("curl zipline.local:8000/api/auth/login -v -X POST -H 'Content-Type: application/json' -d '{\"username\": \"administrator\", \"password\": \"password\"}' 2>&1")
resp = machine.succeed("curl zipline.local:8000/api/setup -v -X POST -H 'Content-Type: application/json' -d '{\"username\": \"administrator\", \"password\": \"password\"}' 2>&1")
data = json.loads(resp.splitlines()[-1])
assert data["firstSetup"] is True
assert data["user"]["username"] == "administrator"
assert data["user"]["role"] == "SUPERADMIN"
assert (cookie := re.search(r"(?m)^< set-cookie: ([^;]*)", resp))
resp = machine.succeed(f"curl zipline.local:8000/api/user -H 'Cookie: {cookie[1]}'")
assert json.loads(resp)["user"]["id"] == data["user"]["id"]
'';
}
)
resp = machine.succeed("curl zipline.local:8000/api/auth/login -v -X POST -H 'Content-Type: application/json' -d '{\"username\": \"administrator\", \"password\": \"password\"}' 2>&1")
assert (cookie := re.search(r"(?m)^< set-cookie: ([^;]*)", resp))
resp = machine.succeed(f"curl zipline.local:8000/api/user -H 'Cookie: {cookie[1]}'")
assert json.loads(resp)["user"]["id"] == data["user"]["id"]
'';
}

View file

@ -1,26 +1,24 @@
import ./make-test-python.nix (
{ lib, ... }:
{ lib, ... }:
{
name = "zoneminder";
meta.maintainers = with lib.maintainers; [ danielfullmer ];
{
name = "zoneminder";
meta.maintainers = with lib.maintainers; [ danielfullmer ];
nodes.machine =
{ ... }:
{
services.zoneminder = {
enable = true;
database.createLocally = true;
database.username = "zoneminder";
};
time.timeZone = "America/New_York";
nodes.machine =
{ ... }:
{
services.zoneminder = {
enable = true;
database.createLocally = true;
database.username = "zoneminder";
};
time.timeZone = "America/New_York";
};
testScript = ''
machine.wait_for_unit("zoneminder.service")
machine.wait_for_unit("nginx.service")
machine.wait_for_open_port(8095)
machine.succeed("curl --fail http://localhost:8095/")
'';
}
)
testScript = ''
machine.wait_for_unit("zoneminder.service")
machine.wait_for_unit("nginx.service")
machine.wait_for_open_port(8095)
machine.succeed("curl --fail http://localhost:8095/")
'';
}

View file

@ -1,54 +1,52 @@
import ./make-test-python.nix (
{ pkgs, ... }:
let
{ pkgs, ... }:
let
perlEnv = pkgs.perl.withPackages (p: [ p.NetZooKeeper ]);
perlEnv = pkgs.perl.withPackages (p: [ p.NetZooKeeper ]);
in
{
name = "zookeeper";
meta = with pkgs.lib.maintainers; {
maintainers = [
nequissimus
ztzg
];
};
in
{
name = "zookeeper";
meta = with pkgs.lib.maintainers; {
maintainers = [
nequissimus
ztzg
];
};
nodes = {
server =
{ ... }:
{
services.zookeeper = {
enable = true;
};
networking.firewall.allowedTCPPorts = [ 2181 ];
nodes = {
server =
{ ... }:
{
services.zookeeper = {
enable = true;
};
};
testScript = ''
start_all()
networking.firewall.allowedTCPPorts = [ 2181 ];
};
};
server.wait_for_unit("zookeeper")
server.wait_for_unit("network.target")
server.wait_for_open_port(2181)
testScript = ''
start_all()
server.wait_until_succeeds(
"${pkgs.zookeeper}/bin/zkCli.sh -server localhost:2181 create /foo bar"
)
server.wait_until_succeeds(
"${pkgs.zookeeper}/bin/zkCli.sh -server localhost:2181 set /foo hello"
)
server.wait_until_succeeds(
"${pkgs.zookeeper}/bin/zkCli.sh -server localhost:2181 get /foo | grep hello"
)
server.wait_for_unit("zookeeper")
server.wait_for_unit("network.target")
server.wait_for_open_port(2181)
server.wait_until_succeeds(
"${perlEnv}/bin/perl -E 'use Net::ZooKeeper qw(:acls); $z=Net::ZooKeeper->new(q(localhost:2181)); $z->create(qw(/perl foo acl), ZOO_OPEN_ACL_UNSAFE) || die $z->get_error()'"
)
server.wait_until_succeeds(
"${perlEnv}/bin/perl -E 'use Net::ZooKeeper qw(:acls); $z=Net::ZooKeeper->new(q(localhost:2181)); $z->get(qw(/perl)) eq qw(foo) || die $z->get_error()'"
)
'';
}
)
server.wait_until_succeeds(
"${pkgs.zookeeper}/bin/zkCli.sh -server localhost:2181 create /foo bar"
)
server.wait_until_succeeds(
"${pkgs.zookeeper}/bin/zkCli.sh -server localhost:2181 set /foo hello"
)
server.wait_until_succeeds(
"${pkgs.zookeeper}/bin/zkCli.sh -server localhost:2181 get /foo | grep hello"
)
server.wait_until_succeeds(
"${perlEnv}/bin/perl -E 'use Net::ZooKeeper qw(:acls); $z=Net::ZooKeeper->new(q(localhost:2181)); $z->create(qw(/perl foo acl), ZOO_OPEN_ACL_UNSAFE) || die $z->get_error()'"
)
server.wait_until_succeeds(
"${perlEnv}/bin/perl -E 'use Net::ZooKeeper qw(:acls); $z=Net::ZooKeeper->new(q(localhost:2181)); $z->get(qw(/perl)) eq qw(foo) || die $z->get_error()'"
)
'';
}

View file

@ -1,4 +1,4 @@
import ./make-test-python.nix {
{
name = "zram-generator";
nodes = {

View file

@ -1,8 +1,8 @@
import ./make-test-python.nix ({
{
name = "zrepl";
nodes.host =
{ config, pkgs, ... }:
{ pkgs, ... }:
{
config = {
# Prerequisites for ZFS and tests.
@ -73,4 +73,4 @@ import ./make-test-python.nix ({
"zrepl_zfs_snapshot_duration_count{filesystem=\"test\"}" in out
), "zrepl snapshot counter for test was not found in Prometheus output"
'';
})
}

View file

@ -1,40 +1,38 @@
import ./make-test-python.nix (
{ pkgs, ... }:
{
name = "zsh-history";
meta = with pkgs.lib.maintainers; {
maintainers = [ ];
{ pkgs, ... }:
{
name = "zsh-history";
meta = with pkgs.lib.maintainers; {
maintainers = [ ];
};
nodes.default =
{ ... }:
{
programs = {
zsh.enable = true;
};
environment.systemPackages = [ pkgs.zsh-history ];
programs.zsh.interactiveShellInit = ''
source ${pkgs.zsh-history.out}/share/zsh/init.zsh
'';
users.users.root.shell = "${pkgs.zsh}/bin/zsh";
};
nodes.default =
{ ... }:
{
programs = {
zsh.enable = true;
};
environment.systemPackages = [ pkgs.zsh-history ];
programs.zsh.interactiveShellInit = ''
source ${pkgs.zsh-history.out}/share/zsh/init.zsh
'';
users.users.root.shell = "${pkgs.zsh}/bin/zsh";
};
testScript = ''
start_all()
default.wait_for_unit("multi-user.target")
default.wait_until_succeeds("pgrep -f 'agetty.*tty1'")
testScript = ''
start_all()
default.wait_for_unit("multi-user.target")
default.wait_until_succeeds("pgrep -f 'agetty.*tty1'")
# Login
default.wait_until_tty_matches("1", "login: ")
default.send_chars("root\n")
default.wait_until_tty_matches("1", r"\nroot@default\b")
# Login
default.wait_until_tty_matches("1", "login: ")
default.send_chars("root\n")
default.wait_until_tty_matches("1", r"\nroot@default\b")
# Generate some history
default.send_chars("echo foobar\n")
default.wait_until_tty_matches("1", "foobar")
# Generate some history
default.send_chars("echo foobar\n")
default.wait_until_tty_matches("1", "foobar")
# Ensure that command was recorded in history
default.succeed("/run/current-system/sw/bin/history list | grep -q foobar")
'';
}
)
# Ensure that command was recorded in history
default.succeed("/run/current-system/sw/bin/history list | grep -q foobar")
'';
}

View file

@ -1,31 +1,29 @@
import ./make-test-python.nix (
{ lib, ... }:
{
name = "zwave-js-ui";
meta.maintainers = with lib.maintainers; [ cdombroski ];
{ lib, ... }:
{
name = "zwave-js-ui";
meta.maintainers = with lib.maintainers; [ cdombroski ];
nodes = {
machine =
{ ... }:
{
services.zwave-js-ui = {
enable = true;
serialPort = "/dev/null";
settings = {
HOST = "::";
PORT = "9999";
};
nodes = {
machine =
{ ... }:
{
services.zwave-js-ui = {
enable = true;
serialPort = "/dev/null";
settings = {
HOST = "::";
PORT = "9999";
};
};
};
};
};
testScript = ''
start_all()
testScript = ''
start_all()
machine.wait_for_unit("zwave-js-ui.service")
machine.wait_for_open_port(9999)
machine.wait_until_succeeds("journalctl --since -1m --unit zwave-js-ui --grep 'Listening on port 9999host :: protocol HTTP'")
machine.wait_for_file("/var/lib/zwave-js-ui/users.json")
'';
}
)
machine.wait_for_unit("zwave-js-ui.service")
machine.wait_for_open_port(9999)
machine.wait_until_succeeds("journalctl --since -1m --unit zwave-js-ui --grep 'Listening on port 9999host :: protocol HTTP'")
machine.wait_for_file("/var/lib/zwave-js-ui/users.json")
'';
}

View file

@ -1,38 +1,34 @@
import ./make-test-python.nix (
{ pkgs, lib, ... }:
{ pkgs, lib, ... }:
let
secretsConfigFile = pkgs.writeText "secrets.json" (
builtins.toJSON {
securityKeys = {
"S0_Legacy" = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
};
}
);
in
{
name = "zwave-js";
meta.maintainers = with lib.maintainers; [ graham33 ];
let
secretsConfigFile = pkgs.writeText "secrets.json" (
builtins.toJSON {
securityKeys = {
"S0_Legacy" = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
};
}
);
in
{
name = "zwave-js";
meta.maintainers = with lib.maintainers; [ graham33 ];
nodes = {
machine =
{ config, ... }:
{
services.zwave-js = {
enable = true;
serialPort = "/dev/null";
extraFlags = [ "--mock-driver" ];
inherit secretsConfigFile;
};
};
nodes = {
machine = {
services.zwave-js = {
enable = true;
serialPort = "/dev/null";
extraFlags = [ "--mock-driver" ];
inherit secretsConfigFile;
};
};
};
testScript = ''
start_all()
testScript = ''
start_all()
machine.wait_for_unit("zwave-js.service")
machine.wait_for_open_port(3000)
machine.wait_until_succeeds("journalctl --since -1m --unit zwave-js --grep 'ZwaveJS server listening'")
'';
}
)
machine.wait_for_unit("zwave-js.service")
machine.wait_for_open_port(3000)
machine.wait_until_succeeds("journalctl --since -1m --unit zwave-js --grep 'ZwaveJS server listening'")
'';
}

View file

@ -12,8 +12,6 @@
liblo,
libmad,
lrdf,
librdf_raptor,
librdf_rasqal,
libsamplerate,
libsndfile,
pkg-config,
@ -65,8 +63,6 @@ stdenv.mkDerivation rec {
libsamplerate
vamp-plugin-sdk
alsa-lib
librdf_raptor
librdf_rasqal
redland
serd
sord

View file

@ -8,13 +8,13 @@
melpaBuild {
pname = "edraw";
version = "1.2.0-unstable-2025-02-15";
version = "1.2.0-unstable-2025-02-21";
src = fetchFromGitHub {
owner = "misohena";
repo = "el-easydraw";
rev = "7d557a3ea1b1308d3fc56607bd00fee1be36007f";
hash = "sha256-7quQwBR5dnSkT8HZd/Tng5qQiqL+H6BCuQCWSe0B4Hw=";
rev = "f6b0f43138693b73cb65327d28bd2a4ee1b6caa7";
hash = "sha256-IU+DMw8q1Si3CJ4FhJVkaRsjkh1Oc3psmbzdUgh0YMI=";
};
propagatedUserEnvPkgs = [ gzip ];

View file

@ -718,8 +718,8 @@ let
bmalehorn.vscode-fish = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-fish";
publisher = "bmalehorn";
name = "vscode-fish";
version = "1.0.38";
hash = "sha256-QEifCTlzYMX+5H6+k2o1lsQrhW3vxVpn+KFg/3WVVFo=";
};
@ -1085,26 +1085,26 @@ let
sources = {
"x86_64-linux" = {
arch = "linux-x64";
hash = "sha256-0NSmyu+whQOSqaYQIt2C651k5CW1D9zmdn+0aLJF+CQ=";
hash = "sha256-1swpgwNLCMWjzDYziXuvvPv8cox2+8ZaYR4fUDoHRkY=";
};
"x86_64-darwin" = {
arch = "darwin-x64";
hash = "sha256-Ek5WswTcrHHC3E3zABYz1afC3oic7msq5ddSBLT2+dY=";
hash = "sha256-uBSd/6Z2689n0vExoeaEwodLjjeBULo/RaGu8cGgvsQ=";
};
"aarch64-linux" = {
arch = "linux-arm64";
hash = "sha256-e/vVKvOdt+mHp9gs+Kse13aFWX6DELeUtPdYLeuh9hE=";
hash = "sha256-WdSKNC2DjR3n9VVJh5OBasmVq/sIXiWFajhniSwxPuw=";
};
"aarch64-darwin" = {
arch = "darwin-arm64";
hash = "sha256-1oJ41WBlVUm7AUIwsIOyoucx9EtkReG8pxpYqgdZx5w=";
hash = "sha256-cwTUoVai9N2v5VmfYIKC+w8jYLcQhHGK5TLqxOBr05Q=";
};
};
in
{
name = "continue";
publisher = "Continue";
version = "0.8.68";
version = "1.1.11";
}
// sources.${stdenv.system};
nativeBuildInputs = lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ];
@ -1332,10 +1332,10 @@ let
denoland.vscode-deno = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-deno";
publisher = "denoland";
version = "3.43.5";
hash = "sha256-GDVOth8IGbRwT47cIpmzYQjhR3ITt57j+ieuK+wn9jg=";
name = "vscode-deno";
version = "3.43.6";
hash = "sha256-bZsPyffCQ++gvlK7MT1Dsrd7HQWACcViwwcEhu9HQfM=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/denoland.vscode-deno/changelog";
@ -1649,10 +1649,10 @@ let
editorconfig.editorconfig = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "EditorConfig";
publisher = "EditorConfig";
version = "0.17.0";
hash = "sha256-/NW/0KYVF0sCgat21aR/5nbVyoTHpDoqCPz+6zc0HHs=";
publisher = "editorconfig";
name = "editorconfig";
version = "0.17.2";
hash = "sha256-Xi2+mN6zjIKm0HWxfRAFs2vYkZ10Gv6poR2b2d8XCug=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/EditorConfig.EditorConfig/changelog";
@ -1879,8 +1879,8 @@ let
firefox-devtools.vscode-firefox-debug = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-firefox-debug";
publisher = "firefox-devtools";
name = "vscode-firefox-debug";
version = "2.15.0";
hash = "sha256-hBj0V42k32dj2gvsNStUBNZEG7iRYxeDMbuA15AYQqk=";
};
@ -2169,15 +2169,10 @@ let
github.vscode-pull-request-github = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-pull-request-github";
publisher = "github";
# Stable versions are listed on the GitHub releases page and use a
# semver scheme, contrary to preview versions which are listed on
# the VSCode Marketplace and use a calver scheme. We should avoid
# using preview versions, because they can require insider versions
# of VS Code
version = "0.78.1";
hash = "sha256-T9oW6o4ItZfR8E1qrcH3nhMvVB6ihi4kpiDz7YGHOcI=";
name = "vscode-pull-request-github";
version = "0.107.2025031304";
hash = "sha256-BWmcAocEWBE7eeiyMBUcTBmozPWgLkdiDOskhf7drD8=";
};
meta = {
license = lib.licenses.mit;
@ -2344,8 +2339,8 @@ let
haskell.haskell = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "haskell";
publisher = "haskell";
name = "haskell";
version = "2.5.3";
hash = "sha256-3HbUH5+YCPqypGlsaSDwwyN/PoG9KO0YnZ1Ps7ZLQ48=";
};
@ -2771,8 +2766,8 @@ let
jnoortheen.nix-ide = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "nix-ide";
publisher = "jnoortheen";
name = "nix-ide";
version = "0.4.12";
hash = "sha256-3pXypgAwg/iEBUqPeNsyoX2oYqlKMVdemEhmhy1PuGU=";
};
@ -2863,8 +2858,8 @@ let
justusadam.language-haskell = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "language-haskell";
publisher = "justusadam";
name = "language-haskell";
version = "3.6.0";
hash = "sha256-rZXRzPmu7IYmyRWANtpJp3wp0r/RwB7eGHEJa7hBvoQ=";
};
@ -3048,8 +3043,8 @@ let
llvm-vs-code-extensions.vscode-clangd = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-clangd";
publisher = "llvm-vs-code-extensions";
name = "vscode-clangd";
version = "0.1.33";
hash = "sha256-NAQ7qT99vudcb/R55pKY3M5H6sV32aB4P8IWZKVQJas=";
};
@ -3136,8 +3131,8 @@ let
matangover.mypy = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "mypy";
publisher = "matangover";
name = "mypy";
version = "0.4.1";
hash = "sha256-hCgOclEnjhWTLMZPXJkoxgFN4pqZ1MKTzmRtjeHbLeU=";
};
@ -3298,8 +3293,8 @@ let
mkhl.direnv = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "direnv";
publisher = "mkhl";
name = "direnv";
version = "0.17.0";
hash = "sha256-9sFcfTMeLBGw2ET1snqQ6Uk//D/vcD9AVsZfnUNrWNg=";
};
@ -3332,10 +3327,10 @@ let
ms-azuretools.vscode-docker = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-docker";
publisher = "ms-azuretools";
version = "1.29.0";
hash = "sha256-mVRsVsolXj31WhbWnt3Xml+NnIq7Q2uHhUUd1zgW42c=";
name = "vscode-docker";
version = "1.29.4";
hash = "sha256-j2ACz2Ww5hddoDLHGdxnuQIqerP5ogZ80/wS+Aa5Gdo=";
};
meta = {
description = "Docker Extension for Visual Studio Code";
@ -3479,8 +3474,8 @@ let
ms-toolsai.jupyter-renderers = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "jupyter-renderers";
publisher = "ms-toolsai";
name = "jupyter-renderers";
version = "1.1.2025012901";
hash = "sha256-LWKSt0D3iFPKaYphN+8/1KJl1CIS2a3fMqrvoItjsvI=";
};
@ -3491,8 +3486,8 @@ let
ms-toolsai.vscode-jupyter-cell-tags = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-jupyter-cell-tags";
publisher = "ms-toolsai";
name = "vscode-jupyter-cell-tags";
version = "0.1.9";
hash = "sha256-XODbFbOr2kBTzFc0JtjiDUcCDBX1Hd4uajlil7mhqPY=";
};
@ -3503,10 +3498,10 @@ let
ms-toolsai.vscode-jupyter-slideshow = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-jupyter-slideshow";
publisher = "ms-toolsai";
version = "0.1.5";
sha256 = "1p6r5vkzvwvxif3wxqi9599vplabzig27fzzz0bx9z0awfglzyi7";
name = "vscode-jupyter-slideshow";
version = "0.1.6";
hash = "sha256-fnsMrrcYdz6BzUWMd9pAOQGTjmtEbQeoVYG20VWxCsM=";
};
meta = {
license = lib.licenses.mit;
@ -3527,10 +3522,10 @@ let
ms-vscode.cmake-tools = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "cmake-tools";
publisher = "ms-vscode";
version = "1.21.4";
hash = "sha256-T2AcKgedZ/b9VQ1FjGP5/hKme2STFrnF0rS5PxQuH9w=";
name = "cmake-tools";
version = "1.21.6";
hash = "sha256-Y+W5lknMiUTeKLnAIP/wAY9zn3QY+XvdPrl2GsdIb5o=";
};
meta.license = lib.licenses.mit;
};
@ -3555,8 +3550,8 @@ let
ms-vscode.hexeditor = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "hexeditor";
publisher = "ms-vscode";
name = "hexeditor";
version = "1.11.1";
hash = "sha256-RB5YOp30tfMEzGyXpOwPIHzXqZlRGc+pXiJ3foego7Y=";
};
@ -3582,10 +3577,10 @@ let
ms-vscode.makefile-tools = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "makefile-tools";
publisher = "ms-vscode";
version = "0.6.0";
sha256 = "07zagq5ib9hd3w67yk2g728vypr4qazw0g9dyd5bax21shnmppa9";
name = "makefile-tools";
version = "0.12.17";
hash = "sha256-chHyYzKNEpyYMQX14pbQ/d9WKC+1QWtm8iKe6M8ZWWI=";
};
meta = {
license = lib.licenses.mit;
@ -4074,10 +4069,10 @@ let
redhat.java = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "java";
publisher = "redhat";
version = "1.41.2025031108";
hash = "sha256-wUkZV2ox8zwU+mgagKQPDq/ZZfmlO4RtcWducNaS8+4=";
name = "java";
version = "1.41.2025031208";
hash = "sha256-0VWLkztB7anIs19QN1yPQvVjNim+DICv43IOMwEaM+E=";
};
buildInputs = [ jdk ];
meta = {
@ -4093,18 +4088,18 @@ let
redhat.vscode-xml = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-xml";
publisher = "redhat";
name = "vscode-xml";
version = "0.28.2025031108";
sha256 = "sha256-SO/Q27v5rzoA5NBp5WJ8S7KcwbGLUmkK2FoaaSb6nYI=";
hash = "sha256-SO/Q27v5rzoA5NBp5WJ8S7KcwbGLUmkK2FoaaSb6nYI=";
};
meta.license = lib.licenses.epl20;
};
redhat.vscode-yaml = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-yaml";
publisher = "redhat";
name = "vscode-yaml";
version = "1.17.0";
hash = "sha256-u3smLk5yCT9DMtFnrxh5tKbfDQ2XbL6bl2bXGOD38X0=";
};
@ -4549,10 +4544,10 @@ let
sonarsource.sonarlint-vscode = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "sonarlint-vscode";
publisher = "sonarsource";
version = "3.16.0";
hash = "sha256-zWgITdvUS9fq1uT6A4Gs3fSTBwCXoEIQ/tVcC7Eigfs=";
name = "sonarlint-vscode";
version = "4.17.0";
hash = "sha256-PPMjOxPKUB5+HrpWZYc1gBaF8z4UQBFdeSbd8dlw7GI=";
};
meta.license = lib.licenses.lgpl3Only;
};
@ -4573,8 +4568,8 @@ let
sswg.swift-lang = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "swift-lang";
publisher = "sswg";
name = "swift-lang";
version = "1.12.0";
hash = "sha256-Dzf8mJCDWT2pHPJcTywEqnki8aVsMO92+wLQ4fjHzb8=";
};
@ -4640,8 +4635,8 @@ let
streetsidesoftware.code-spell-checker = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "code-spell-checker";
publisher = "streetsidesoftware";
name = "code-spell-checker";
version = "4.0.41";
hash = "sha256-M/uqzU64nqSdRtxxQ1H+pg0YdkqYXEHlxmXrVcn/UqA=";
};
@ -4807,8 +4802,8 @@ let
tamasfe.even-better-toml = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "even-better-toml";
publisher = "tamasfe";
name = "even-better-toml";
version = "0.21.2";
hash = "sha256-IbjWavQoXu4x4hpEkvkhqzbf/NhZpn8RFdKTAnRlCAg=";
};
@ -4883,10 +4878,10 @@ let
thenuprojectcontributors.vscode-nushell-lang = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-nushell-lang";
publisher = "thenuprojectcontributors";
version = "1.9.0";
hash = "sha256-E9CK/GChd/yZT+P3ttROjL2jHtKPJ0KZzc32/nbuE4w=";
name = "vscode-nushell-lang";
version = "1.10.0";
hash = "sha256-AfClskNZwQIC67VrM8XKxF6nIbXPp576CRmls0WCKwU=";
};
meta.license = lib.licenses.mit;
};
@ -5013,10 +5008,10 @@ let
twxs.cmake = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "cmake";
publisher = "twxs";
name = "cmake";
version = "0.0.17";
sha256 = "11hzjd0gxkq37689rrr2aszxng5l9fwpgs9nnglq3zhfa1msyn08";
hash = "sha256-CFiva1AO/oHpszbpd7lLtDzbv1Yi55yQOQPP/kCTH4Y=";
};
meta = {
license = lib.licenses.mit;
@ -5267,8 +5262,8 @@ let
vscjava.vscode-java-debug = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-java-debug";
publisher = "vscjava";
name = "vscode-java-debug";
version = "0.58.2025022807";
hash = "sha256-8bzDbCF03U5P15tkVkieOGuuLetUFXjZNrQKZTcKNFA=";
};
@ -5279,8 +5274,8 @@ let
vscjava.vscode-java-dependency = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-java-dependency";
publisher = "vscjava";
name = "vscode-java-dependency";
version = "0.24.1";
hash = "sha256-M0y6/9EPkcXTMxArqLpfSeVKpVF2SvjLtTWvLMIvauY=";
};
@ -5291,8 +5286,8 @@ let
vscjava.vscode-java-test = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-java-test";
publisher = "vscjava";
name = "vscode-java-test";
version = "0.43.0";
hash = "sha256-EM0S1Y4cRMBCRbAZgl9m6fIhANPrvdGVZXOLlDLnVWo=";
};
@ -5319,8 +5314,8 @@ let
vscjava.vscode-maven = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-maven";
publisher = "vscjava";
name = "vscode-maven";
version = "0.44.2024072906";
hash = "sha256-9S8Zzefg9i3nZiPZAtW5aT07dpZnhV0w9DP5vdnEtFc=";
};

View file

@ -9,6 +9,16 @@
src,
version,
}:
let
# debugservers on macOS require the 'com.apple.security.cs.debugger'
# entitlement which nixpkgs' lldb-server does not yet provide; see
# <https://github.com/NixOS/nixpkgs/pull/38624> for details
lldbServer =
if stdenv.hostPlatform.isDarwin then
"/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/Resources/debugserver"
else
"${lldb.out}/bin/lldb-server";
in
rustPlatform.buildRustPackage {
pname = "${pname}-adapter";
inherit version src;
@ -43,11 +53,13 @@ rustPlatform.buildRustPackage {
cp -t $out/share/formatters formatters/*.py
ln -s ${lib.getLib lldb} $out/share/lldb
makeWrapper $out/share/adapter/codelldb $out/bin/codelldb \
--set-default LLDB_DEBUGSERVER_PATH "${lldb.out}/bin/lldb-server"
--set-default LLDB_DEBUGSERVER_PATH "${lldbServer}"
'';
patches = [ ./patches/adapter-output-shared_object.patch ];
# Tests are linked to liblldb but it is not available here.
doCheck = false;
passthru = { inherit lldbServer; };
}

View file

@ -64,14 +64,6 @@ let
}
);
# debugservers on macOS require the 'com.apple.security.cs.debugger'
# entitlement which nixpkgs' lldb-server does not yet provide; see
# <https://github.com/NixOS/nixpkgs/pull/38624> for details
lldbServer =
if stdenv.hostPlatform.isDarwin then
"/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/Resources/debugserver"
else
"${lldb.out}/bin/lldb-server";
in
stdenv.mkDerivation {
pname = "vscode-extension-${publisher}-${pname}";
@ -130,7 +122,7 @@ stdenv.mkDerivation {
cp -t $ext/ -r ${adapter}/share/*
wrapProgram $ext/adapter/codelldb \
--prefix LD_LIBRARY_PATH : "$ext/lldb/lib" \
--set-default LLDB_DEBUGSERVER_PATH "${lldbServer}"
--set-default LLDB_DEBUGSERVER_PATH "${adapter.lldbServer}"
# Mark that all components are installed.
touch $ext/platform.ok
@ -153,7 +145,7 @@ stdenv.mkDerivation {
description = "Native debugger extension for VSCode based on LLDB";
homepage = "https://github.com/vadimcn/vscode-lldb";
license = [ lib.licenses.mit ];
maintainers = [ ];
maintainers = [ lib.maintainers.r4v3n6101 ];
platforms = lib.platforms.all;
};
}

View file

@ -1,33 +0,0 @@
{
lib,
stdenv,
fetchFromGitHub,
rustPlatform,
CoreServices,
}:
rustPlatform.buildRustPackage rec {
pname = "cobalt";
version = "0.19.8";
src = fetchFromGitHub {
owner = "cobalt-org";
repo = "cobalt.rs";
rev = "v${version}";
sha256 = "sha256-neOJ3UqRisCcyarRIXfHyl9nAe2Wl9IXVDNwIYEQYys=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-j2xmEoMV7lVhqj4lKWA3QdEDEGUpRlZc4ikZoDQJlB8=";
buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [ CoreServices ];
meta = with lib; {
description = "Static site generator written in Rust";
homepage = "https://github.com/cobalt-org/cobalt.rs/";
license = licenses.mit;
maintainers = with maintainers; [ ethancedwards8 ];
platforms = platforms.unix;
mainProgram = "cobalt";
};
}

View file

@ -38,14 +38,14 @@
}:
stdenv.mkDerivation (finalAttrs: {
version = "1.7.2";
version = "1.7.3";
pname = "syncthingtray";
src = fetchFromGitHub {
owner = "Martchus";
repo = "syncthingtray";
rev = "v${finalAttrs.version}";
hash = "sha256-pQd6Ngxcn5qJKhjqXXJ6LZLgSI8gJ/d9TNuIAZlWHGA=";
hash = "sha256-XmbdLaJzGjgbB4klu8soAV1m2/LjhbWbAczl/mNTMG4=";
};
buildInputs =

View file

@ -481,7 +481,9 @@ buildStdenv.mkDerivation {
(enableFeature enableDebugSymbols "debug-symbols")
]
++ lib.optionals enableDebugSymbols [ "--disable-strip" "--disable-install-strip" ]
++ lib.optional enableOfficialBranding "--enable-official-branding"
# As of Firefox 137 (https://bugzilla.mozilla.org/show_bug.cgi?id=1943009),
# the --enable-official-branding flag overrides the --with-branding flag.
++ lib.optional (enableOfficialBranding && branding == null) "--enable-official-branding"
++ lib.optional (branding != null) "--with-branding=${branding}"
++ extraConfigureFlags;

View file

@ -10,11 +10,11 @@
buildMozillaMach rec {
pname = "firefox-beta";
binaryName = pname;
version = "137.0b2";
version = "137.0b6";
applicationName = "Firefox Beta";
src = fetchurl {
url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "ac9d9635ede14506bf579735768cc643843c658122be89bb223f1c08702ee570757fbf091cf8191ad614688fff2330964ce728e51ea2519a801b838df94cc5d2";
sha512 = "84c010f6e21957768a6fcebe6ec2f0e6a50b45b6a416cad3701f36d69dff9a448423e5b4f2ce0dc7abe46cb40ec02872027ad855b9afef355006ba32e13f4e27";
};
meta = {

View file

@ -10,20 +10,23 @@
buildMozillaMach rec {
pname = "firefox-devedition";
binaryName = pname;
version = "137.0b2";
version = "137.0b6";
applicationName = "Firefox Developer Edition";
requireSigning = false;
branding = "browser/branding/aurora";
src = fetchurl {
url = "mirror://mozilla/devedition/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "a15eded14d6a4ddeb3798ac7bb72a9e8a6541a3ee76dc9051cf6865816079f8794e6defe2f9299f327976eefc1f4ea957d972b56d1f03816296b25f0c0173a12";
sha512 = "91fb3e010d62805ec29758bb46b3d520dc3a3e2b0f040de4e284aeb5fe812b5b084563f560a229f54a404a5130429d60b35eac15d89f1cb586fd364b61a7f8be";
};
meta = {
changelog = "https://www.mozilla.org/en-US/firefox/${lib.versions.majorMinor version}beta/releasenotes/";
description = "Web browser built from Firefox Developer Edition source tree";
homepage = "http://www.mozilla.com/en-US/firefox/";
maintainers = with lib.maintainers; [ jopejoe1 ];
maintainers = with lib.maintainers; [
jopejoe1
rhendric
];
platforms = lib.platforms.unix;
broken = stdenv.buildPlatform.is32bit;
# since Firefox 60, build on 32-bit platforms fails with "out of memory".

View file

@ -9,54 +9,54 @@ let
versions =
if stdenv.hostPlatform.isLinux then
{
stable = "0.0.87";
ptb = "0.0.132";
canary = "0.0.594";
development = "0.0.68";
stable = "0.0.88";
ptb = "0.0.134";
canary = "0.0.608";
development = "0.0.71";
}
else
{
stable = "0.0.338";
ptb = "0.0.162";
canary = "0.0.703";
development = "0.0.79";
stable = "0.0.341";
ptb = "0.0.165";
canary = "0.0.717";
development = "0.0.82";
};
version = versions.${branch};
srcs = rec {
x86_64-linux = {
stable = fetchurl {
url = "https://stable.dl2.discordapp.net/apps/linux/${version}/discord-${version}.tar.gz";
hash = "sha256-22Pi5rI0fu7A/ZoqkjIODtEnmNQt0pFBmsplh0QK0AQ=";
hash = "sha256-lkphzS5Q7UH20rKJ4SfxyyqEGgoLlfO/hcGmoWWLcYY=";
};
ptb = fetchurl {
url = "https://ptb.dl2.discordapp.net/apps/linux/${version}/discord-ptb-${version}.tar.gz";
hash = "sha256-h4nFnarW84zP+tbzvqTQKvN0IEQevYuFZplPC2klvA8=";
hash = "sha256-KkyFFxg7yuvaj/V7r0ePB2mNz+GNqeoUVvjb9v2/PQY=";
};
canary = fetchurl {
url = "https://canary.dl2.discordapp.net/apps/linux/${version}/discord-canary-${version}.tar.gz";
hash = "sha256-qSmJPKBBLDL2jykRHcuWXJ1Ve/7VE0yAkhL5i+JcR+Q=";
hash = "sha256-Nh5CZyLo5Pf5PKV8LDeGH7KZuzQtQbdeKuVEJJqfTdA=";
};
development = fetchurl {
url = "https://development.dl2.discordapp.net/apps/linux/${version}/discord-development-${version}.tar.gz";
hash = "sha256-Vfsuz7/o2iVssOi4I9MmQc5T8ct8WTaCavvT9/OycPs=";
hash = "sha256-lxtkapeYRtKyp60YJC6lCvK0P8MSOlYRmQLR+hLuwws=";
};
};
x86_64-darwin = {
stable = fetchurl {
url = "https://stable.dl2.discordapp.net/apps/osx/${version}/Discord.dmg";
hash = "sha256-PvCeKhbTgPxvR649xPWA/MBW7FZbW1g0WoLi35u1Ys0=";
hash = "sha256-FXyF7uWwnNXPe5Qn2WZBXCr392RmHZR3Q2aQTojQ29o=";
};
ptb = fetchurl {
url = "https://ptb.dl2.discordapp.net/apps/osx/${version}/DiscordPTB.dmg";
hash = "sha256-C8KTPK6a+Z4pzxc/ORbqOgQVYtI5ggPcyzXTnvrmFu4=";
hash = "sha256-M7ApSHRMZ8rzTHVZM32REPRTyaxUmbZfr9pj1uDlS9Y=";
};
canary = fetchurl {
url = "https://canary.dl2.discordapp.net/apps/osx/${version}/DiscordCanary.dmg";
hash = "sha256-o2faV+mKmgDy7fCzxxMn9meY/afiTA3djTOY0nulBCc=";
hash = "sha256-k3iviK146CcitDIKm2huUgGkJy/Qki4z5/VW3EPuaxE=";
};
development = fetchurl {
url = "https://development.dl2.discordapp.net/apps/osx/${version}/DiscordDevelopment.dmg";
hash = "sha256-xBsI5rWsRBxkWEkcAOKz4NEeIRb2SJ/KDp6acpSvBSU=";
hash = "sha256-3fPaqm9Tfr3t/96T9EX1oKCfVOw18DIiLWqBIiuSNIg=";
};
};
aarch64-darwin = x86_64-darwin;

View file

@ -82,8 +82,7 @@ let
in
rec {
# Upstream claims -latest is "for testing purposes only". Stick to -esr until this changes.
thunderbird = thunderbird-esr;
thunderbird = thunderbird-latest;
thunderbird-latest = common {
version = "136.0";

View file

@ -2,13 +2,13 @@
buildGoModule rec {
pname = "docker-compose";
version = "2.33.1";
version = "2.34.0";
src = fetchFromGitHub {
owner = "docker";
repo = "compose";
rev = "v${version}";
hash = "sha256-qallG81eGJXrBoC6Ww3Zlq1amovObOGayVzHFTOA0xw=";
hash = "sha256-AoYm2gRqNgXTc7ksQeSPVo+gTkxaFwhfLhue3Z8a4Wo=";
};
postPatch = ''
@ -16,7 +16,7 @@ buildGoModule rec {
rm -rf e2e/
'';
vendorHash = "sha256-1yIWVuI8+2tmS0gg4kebKiFxQASPVcc6XgFyN3LvXJA=";
vendorHash = "sha256-ISX+PpjapST9d/rFP0SPlFYyPb5NcwwQT6mhb1H1qEE=";
ldflags = [ "-X github.com/docker/compose/v2/internal.Version=${version}" "-s" "-w" ];

View file

@ -8,13 +8,13 @@
mkHyprlandPlugin hyprland {
pluginName = "hypr-dynamic-cursors";
version = "0-unstable-2025-02-02";
version = "0-unstable-2025-03-06";
src = fetchFromGitHub {
owner = "VirtCode";
repo = "hypr-dynamic-cursors";
rev = "fd6214629937949ecd8a39f4b5ebbce2afac0dd5";
hash = "sha256-Fg4+6Yko8V9b19/62jfKH0IWTiiRDMso1P1TnjAcs/8=";
rev = "261bc1668f7de45b48ba6a40d5d727025575390b";
hash = "sha256-2HSbWe1r5DYulPzMXZYSluiwG/T+5904YmJSrPJ8tEo=";
};
dontUseCmakeConfigure = true;

View file

@ -7,101 +7,104 @@
cctools,
}@topLevelArgs:
{
name ? "${args.pname}-${args.version}",
src ? null,
srcs ? null,
sourceRoot ? null,
prePatch ? "",
patches ? [ ],
postPatch ? "",
patchFlags ? [ ],
nativeBuildInputs ? [ ],
buildInputs ? [ ],
# The output hash of the dependencies for this project.
# Can be calculated in advance with prefetch-npm-deps.
npmDepsHash ? "",
# Whether to force the usage of Git dependencies that have install scripts, but not a lockfile.
# Use with care.
forceGitDeps ? false,
# Whether to force allow an empty dependency cache.
# This can be enabled if there are truly no remote dependencies, but generally an empty cache indicates something is wrong.
forceEmptyCache ? false,
# Whether to make the cache writable prior to installing dependencies.
# Don't set this unless npm tries to write to the cache directory, as it can slow down the build.
makeCacheWritable ? false,
# The script to run to build the project.
npmBuildScript ? "build",
# Flags to pass to all npm commands.
npmFlags ? [ ],
# Flags to pass to `npm ci`.
npmInstallFlags ? [ ],
# Flags to pass to `npm rebuild`.
npmRebuildFlags ? [ ],
# Flags to pass to `npm run ${npmBuildScript}`.
npmBuildFlags ? [ ],
# Flags to pass to `npm pack`.
npmPackFlags ? [ ],
# Flags to pass to `npm prune`.
npmPruneFlags ? npmInstallFlags,
# Value for npm `--workspace` flag and directory in which the files to be installed are found.
npmWorkspace ? null,
nodejs ? topLevelArgs.nodejs,
npmDeps ? fetchNpmDeps {
inherit
forceGitDeps
forceEmptyCache
src
srcs
sourceRoot
prePatch
patches
postPatch
patchFlags
;
name = "${name}-npm-deps";
hash = npmDepsHash;
},
# Custom npmConfigHook
npmConfigHook ? null,
# Custom npmBuildHook
npmBuildHook ? null,
# Custom npmInstallHook
npmInstallHook ? null,
...
}@args:
lib.extendMkDerivation {
constructDrv = stdenv.mkDerivation;
let
# .override {} negates splicing, so we need to use buildPackages explicitly
npmHooks = buildPackages.npmHooks.override {
inherit nodejs;
};
in
stdenv.mkDerivation (
args
// {
inherit npmDeps npmBuildScript;
extendDrvArgs =
finalAttrs:
{
name ? "${args.pname}-${args.version}",
src ? null,
srcs ? null,
sourceRoot ? null,
prePatch ? "",
patches ? [ ],
postPatch ? "",
patchFlags ? [ ],
nativeBuildInputs ? [ ],
buildInputs ? [ ],
# The output hash of the dependencies for this project.
# Can be calculated in advance with prefetch-npm-deps.
npmDepsHash ? "",
# Whether to force the usage of Git dependencies that have install scripts, but not a lockfile.
# Use with care.
forceGitDeps ? false,
# Whether to force allow an empty dependency cache.
# This can be enabled if there are truly no remote dependencies, but generally an empty cache indicates something is wrong.
forceEmptyCache ? false,
# Whether to make the cache writable prior to installing dependencies.
# Don't set this unless npm tries to write to the cache directory, as it can slow down the build.
makeCacheWritable ? false,
# The script to run to build the project.
npmBuildScript ? "build",
# Flags to pass to all npm commands.
npmFlags ? [ ],
# Flags to pass to `npm ci`.
npmInstallFlags ? [ ],
# Flags to pass to `npm rebuild`.
npmRebuildFlags ? [ ],
# Flags to pass to `npm run ${npmBuildScript}`.
npmBuildFlags ? [ ],
# Flags to pass to `npm pack`.
npmPackFlags ? [ ],
# Flags to pass to `npm prune`.
npmPruneFlags ? npmInstallFlags,
# Value for npm `--workspace` flag and directory in which the files to be installed are found.
npmWorkspace ? null,
nodejs ? topLevelArgs.nodejs,
npmDeps ? fetchNpmDeps {
inherit
forceGitDeps
forceEmptyCache
src
srcs
sourceRoot
prePatch
patches
postPatch
patchFlags
;
name = "${name}-npm-deps";
hash = npmDepsHash;
},
# Custom npmConfigHook
npmConfigHook ? null,
# Custom npmBuildHook
npmBuildHook ? null,
# Custom npmInstallHook
npmInstallHook ? null,
...
}@args:
nativeBuildInputs =
nativeBuildInputs
++ [
nodejs
# Prefer passed hooks
(if npmConfigHook != null then npmConfigHook else npmHooks.npmConfigHook)
(if npmBuildHook != null then npmBuildHook else npmHooks.npmBuildHook)
(if npmInstallHook != null then npmInstallHook else npmHooks.npmInstallHook)
nodejs.python
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ cctools ];
buildInputs = buildInputs ++ [ nodejs ];
let
# .override {} negates splicing, so we need to use buildPackages explicitly
npmHooks = buildPackages.npmHooks.override {
inherit nodejs;
};
in
{
inherit npmDeps npmBuildScript;
strictDeps = true;
nativeBuildInputs =
nativeBuildInputs
++ [
nodejs
# Prefer passed hooks
(if npmConfigHook != null then npmConfigHook else npmHooks.npmConfigHook)
(if npmBuildHook != null then npmBuildHook else npmHooks.npmBuildHook)
(if npmInstallHook != null then npmInstallHook else npmHooks.npmInstallHook)
nodejs.python
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ cctools ];
buildInputs = buildInputs ++ [ nodejs ];
# Stripping takes way too long with the amount of files required by a typical Node.js project.
dontStrip = args.dontStrip or true;
strictDeps = true;
meta = (args.meta or { }) // {
platforms = args.meta.platforms or nodejs.meta.platforms;
# Stripping takes way too long with the amount of files required by a typical Node.js project.
dontStrip = args.dontStrip or true;
meta = (args.meta or { }) // {
platforms = args.meta.platforms or nodejs.meta.platforms;
};
};
}
)
}

View file

@ -346,14 +346,14 @@
};
# Assumes it can run Command::new(env::var("CARGO")).arg("locate-project")
# https://github.com/bkchr/proc-macro-crate/blame/master/src/lib.rs#L244
# https://github.com/bkchr/proc-macro-crate/blame/master/src/lib.rs#L242
proc-macro-crate = attrs: lib.optionalAttrs (lib.versionAtLeast attrs.version "2.0") {
prePatch = (attrs.prePatch or "") + ''
postPatch = (attrs.postPatch or "") + ''
substituteInPlace \
src/lib.rs \
--replace-fail \
'env::var("CARGO").map_err(|_| Error::CargoEnvVariableNotSet)?' \
'"${lib.getBin buildPackages.cargo}/bin/cargo"'
'env::var("CARGO")' \
'Ok::<_, core::convert::Infallible>("${lib.getBin buildPackages.cargo}/bin/cargo")'
'';
};
}

View file

@ -20,14 +20,14 @@
nix-update-script,
}:
buildNpmPackage rec {
buildNpmPackage (finalAttrs: {
pname = "ags";
version = "1.8.2";
src = fetchFromGitHub {
owner = "Aylur";
repo = "ags";
rev = "v${version}";
rev = "v${finalAttrs.version}";
hash = "sha256-ebnkUaee/pnfmw1KmOZj+MP1g5wA+8BT/TPKmn4Dkwc=";
fetchSubmodules = true;
};
@ -68,7 +68,7 @@ buildNpmPackage rec {
meta = {
homepage = "https://github.com/Aylur/ags";
description = "EWW-inspired widget system as a GJS library";
changelog = "https://github.com/Aylur/ags/releases/tag/v${version}";
changelog = "https://github.com/Aylur/ags/releases/tag/v${finalAttrs.version}";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [
foo-dogsquared
@ -77,4 +77,4 @@ buildNpmPackage rec {
mainProgram = "ags";
platforms = lib.platforms.linux;
};
}
})

View file

@ -0,0 +1,55 @@
{
lib,
stdenv,
fetchFromGitHub,
rustPlatform,
nix-update-script,
pkg-config,
openssl,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "alistral";
version = "0.5.2";
src = fetchFromGitHub {
owner = "RustyNova016";
repo = "Alistral";
tag = "v${finalAttrs.version}";
hash = "sha256-bt0WCmnk/DAEuQeEvBe5Vdk/AxpfRAafPiEJ7v8HK8Y=";
};
# remove if updating to rust 1.85
postPatch = ''
substituteInPlace Cargo.toml \
--replace-fail "[package]" ''$'cargo-features = ["edition2024"]\n[package]'\
--replace-fail 'rust-version = "1.85.0"' ""
'';
useFetchCargoVendor = true;
cargoHash = "sha256-BxJmoJbnGfsA+YCvzUvgnkoHl/ClrwHoE3NjlctjCxA=";
env.RUSTC_BOOTSTRAP = 1;
nativeBuildInputs = [
pkg-config
];
buildInputs = [
openssl
];
# Wants to create config file where it s not allowed
doCheck = false;
passthru.updateScript = nix-update-script { };
meta = {
homepage = "https://rustynova016.github.io/Alistral/";
changelog = "https://github.com/RustyNova016/Alistral/blob/${finalAttrs.src.tag}/CHANGELOG.md";
description = "Power tools for Listenbrainz";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ jopejoe1 ];
mainProgram = "alistral";
};
})

View file

@ -6,13 +6,13 @@
}:
buildGoModule rec {
pname = "bitrise";
version = "2.29.1";
version = "2.30.4";
src = fetchFromGitHub {
owner = "bitrise-io";
repo = "bitrise";
rev = version;
hash = "sha256-pBaXOGFDmweyJaF+Wp4qAil8yAtUYO6UoKTLAPrq7F8=";
rev = "v${version}";
hash = "sha256-wQIoNekr4zXjhAp9XnyJ92hJ4usuWBBT1koUguGIIiU=";
};
# many tests rely on writable $HOME/.bitrise and require network access

View file

@ -13,13 +13,13 @@
buildNpmPackage rec {
pname = "bitwarden-cli";
version = "2025.1.3";
version = "2025.2.0";
src = fetchFromGitHub {
owner = "bitwarden";
repo = "clients";
rev = "cli-v${version}";
hash = "sha256-a8OQ/vQCJSjipLnuNWaWqnAJK+Str6FdHPBTbC04VxA=";
tag = "cli-v${version}";
hash = "sha256-Ls30yeqMDBA4HjQdnICJy0HVHm7VfZarsKUHn3KTatA=";
};
postPatch = ''
@ -29,7 +29,7 @@ buildNpmPackage rec {
nodejs = nodejs_20;
npmDepsHash = "sha256-BoHwgv/1QiIfUPCJ3+ZHvbMelngRSEKlbkpBHRtnoP8=";
npmDepsHash = "sha256-V77I2ZzmcCo06vq76lGkRa+NmTEUe2urD0D1HQ/gBJA=";
nativeBuildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
cctools
@ -89,12 +89,12 @@ buildNpmPackage rec {
};
};
meta = with lib; {
changelog = "https://github.com/bitwarden/clients/releases/tag/${src.rev}";
meta = {
changelog = "https://github.com/bitwarden/clients/releases/tag/${src.tag}";
description = "Secure and free password manager for all of your devices";
homepage = "https://bitwarden.com";
license = lib.licenses.gpl3Only;
mainProgram = "bw";
maintainers = with maintainers; [ dotlambda ];
maintainers = with lib.maintainers; [ dotlambda ];
};
}

View file

@ -8,16 +8,16 @@
buildGoModule rec {
pname = "bombardier";
version = "1.2.6";
version = "2.0.2";
src = fetchFromGitHub {
owner = "codesenberg";
repo = "bombardier";
rev = "v${version}";
hash = "sha256-sJ5+nxfyWSN6dFlA4INaqa3UHTY7huYkZhaTidMJFAs=";
hash = "sha256-FoaiUky0WcipkGN8KIpSd+iizinlqtHC5lskvNCnx/Y=";
};
vendorHash = "sha256-SxW/87l1w86H5cxEhiF/Fj8SxJ/uAfhtc7I1DVvIilk=";
vendorHash = "sha256-SezGoDM4xzOj1y/qmvlngYKOVdJnxBD4l9LPVErevUI=";
subPackages = [
"."

View file

@ -0,0 +1,49 @@
{
lib,
buildGoModule,
fetchFromGitHub,
libpcap,
versionCheckHook,
nix-update-script,
}:
let
version = "0.0.73";
in
buildGoModule {
pname = "bsky-cli";
inherit version;
src = fetchFromGitHub {
owner = "mattn";
repo = "bsky";
tag = "v${version}";
hash = "sha256-GTuF/ZbZ84tTcbjp8eXKdpUGCsOkg2rxEcslKTsgpu4=";
};
vendorHash = "sha256-dLhrPHjhEHEJOokkjll1Z+zhDlBXuhlJJBtCFXfhyws=";
buildInputs = [
libpcap
];
ldflags = [
"-s"
"-w"
];
doInstallCheck = true;
versionCheckProgram = "${placeholder "out"}/bin/bsky";
versionCheckProgramArg = [ "--version" ];
nativeBuildInputs = [ versionCheckHook ];
passthru.updateScript = nix-update-script { };
meta = {
description = "A cli application for bluesky social";
homepage = "https://github.com/mattn/bsky";
changelog = "https://github.com/mattn/bsky/releases/tag/v${version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ isabelroses ];
mainProgram = "bsky";
};
}

View file

@ -8,17 +8,17 @@
rustPlatform.buildRustPackage rec {
pname = "cairo";
version = "2.9.3";
version = "2.11.2";
src = fetchFromGitHub {
owner = "starkware-libs";
repo = "cairo";
rev = "v${version}";
hash = "sha256-X6aEyo3VY0C+1w1S7ZuxVKACKDHWaxPMR98ICq6/icg=";
hash = "sha256-VOyqKeiPJ3/VOqcdQXC/rZnTriC2ScmAQ4IlouHjvpI=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-yjo7nxt/oAqPRI6I3WlnFC+lfT5HiQJnsjTuijx4ekk=";
cargoHash = "sha256-e2Nire1TLcliq5KxoINJIZJdgohHRTXqIZPj1GNIe2A=";
# openssl crate requires perl during build process
nativeBuildInputs = [

View file

@ -1,12 +1,12 @@
{ lib, stdenvNoCC, fetchurl, makeBinaryWrapper, jre }:
stdenvNoCC.mkDerivation rec {
version = "10.21.2";
version = "10.21.4";
pname = "checkstyle";
src = fetchurl {
url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-${version}/checkstyle-${version}-all.jar";
sha256 = "sha256-r8uiXoaQFkQpcuxFE6jAbIEu32j1EciO9JfeAMM4ORc=";
sha256 = "sha256-PB2U1uzIPgLf9YfJultrTsT+w4x6lY61h+/smyji8xg=";
};
nativeBuildInputs = [ makeBinaryWrapper ];

View file

@ -0,0 +1,40 @@
{
lib,
stdenv,
fetchFromGitHub,
rustPlatform,
versionCheckHook,
nix-update-script,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "cobalt";
version = "0.19.8";
src = fetchFromGitHub {
owner = "cobalt-org";
repo = "cobalt.rs";
tag = "v${finalAttrs.version}";
hash = "sha256-neOJ3UqRisCcyarRIXfHyl9nAe2Wl9IXVDNwIYEQYys=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-j2xmEoMV7lVhqj4lKWA3QdEDEGUpRlZc4ikZoDQJlB8=";
nativeInstallCheckInputs = [ versionCheckHook ];
versionCheckProgramArg = "--version";
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
meta = {
description = "Static site generator written in Rust";
homepage = "https://cobalt-org.github.io/";
downloadPage = "https://github.com/cobalt-org/cobalt.rs/";
changelog = "https://github.com/cobalt-org/cobalt.rs/releases/tag/v${finalAttrs.version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ ethancedwards8 ];
platforms = lib.platforms.unix;
mainProgram = "cobalt";
};
})

View file

@ -11,7 +11,7 @@
let
# Wants at least Java 22
jdk = openjdk23;
version = "5.9.5";
version = "5.9.6";
in
maven.buildMavenPackage {
pname = "cratedb";
@ -21,7 +21,7 @@ maven.buildMavenPackage {
owner = "crate";
repo = "crate";
tag = version;
hash = "sha256-T72Cy/jU8l68Res85bcZysRB81IqUF4eqgRxW7TJ+6Q=";
hash = "sha256-IBIOxcpd1MXMz+Z2utnjZfN74qX/ZrKVNrIjFaLKBEA=";
};
nativeBuildInputs = [
@ -33,8 +33,9 @@ maven.buildMavenPackage {
(replaceVars ./fix-poms.patch { inherit jdk; })
];
mvnHash = "sha256-D5cVCx++99DJWX5UHgJydDDYCYmH1cKQ3EAKktFz+gE=";
mvnHash = "sha256-p0LSR6I876/JNfrLp19PnLAx00gL4E2mZK+CO8X2IzU=";
mvnJdk = jdk;
mvnParameters = "-DskipTests";
installPhase = ''
runHook preInstall

View file

@ -11,13 +11,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "dssp";
version = "4.4.10";
version = "4.4.11";
src = fetchFromGitHub {
owner = "PDB-REDO";
repo = "dssp";
tag = "v${finalAttrs.version}";
hash = "sha256-YNYpHjp9kEszXvLF3RrNg6gYd4GPvfRVtdkUwJ89qOc=";
hash = "sha256-7L9pdKWDa/g/r+cuou2b0pqS559qwuwHBBhDDhvM7VE=";
};
nativeBuildInputs = [

View file

@ -8,16 +8,16 @@
buildGoModule rec {
pname = "files-cli";
version = "2.13.251";
version = "2.13.258";
src = fetchFromGitHub {
repo = "files-cli";
owner = "files-com";
rev = "v${version}";
hash = "sha256-6tNee396ki+/ixPD1c3E+1duFTrUL9aGeUCVFzF/WyA=";
hash = "sha256-Idd0FJ/zi0S6hFvjKNw1a1cIEhccE+2e9azxaREtdiw=";
};
vendorHash = "sha256-Rf2JWCEQYtzhKd7v0usRHDwoJLZFCE5/HXuweXNwvuA=";
vendorHash = "sha256-fzDJSvYQkWyPSHrIoOeDHNLM3UWdCv9Wh8E1CxLLNhg=";
ldflags = [
"-s"

View file

@ -7,7 +7,7 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "flow";
pname = "flow-control";
version = "0.3.2";
src = fetchFromGitHub {

View file

@ -2,11 +2,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "flyway";
version = "11.3.2";
version = "11.3.4";
src = fetchurl {
url =
"mirror://maven/org/flywaydb/flyway-commandline/${finalAttrs.version}/flyway-commandline-${finalAttrs.version}.tar.gz";
sha256 = "sha256-n3TjM/z9kkMMqFboWT6ISBtYN3cFyhmFRgyUSfWolZs=";
sha256 = "sha256-oJ8/PWMN/9BE0waLWbHoUVMuBcwbUltr0hLzilHRqVc=";
};
nativeBuildInputs = [ makeWrapper ];
dontBuild = true;

View file

@ -8,11 +8,11 @@
stdenv.mkDerivation rec {
pname = "fortran-fpm";
version = "0.10.1";
version = "0.11.0";
src = fetchurl {
url = "https://github.com/fortran-lang/fpm/releases/download/v${version}/fpm-${version}.F90";
sha256 = "sha256-dVPQW2DCp+iJojuhCgeEFVFpugG/x+DKhG986QuE4co=";
sha256 = "sha256-mIozF+4kSO5yB9CilBDwinnIa92sMxSyoXWAGpz1jSc=";
};
dontUnpack = true;

View file

@ -16,15 +16,24 @@ let
}
else
throw "${pname}-${version} is not supported on ${stdenv.hostPlatform.system}";
appimageContents = appimageTools.extractType2 { inherit pname src; };
appimageContents = appimageTools.extractType2 {
inherit pname version src;
postExtract = ''
substituteInPlace $out/gdevelop.desktop --replace-fail 'Exec=AppRun --no-sandbox %U' 'Exec=gdevelop'
'';
};
dontPatchELF = true;
in
appimageTools.wrapType2 {
inherit pname version src;
extraInstallCommands = ''
mkdir -p $out/share/applications
cp ${appimageContents}/gdevelop.desktop $out/share/applications
mkdir -p $out/share/icons
cp -r ${appimageContents}/usr/share/icons/hicolor $out/share/icons
'';
meta = {
description = "Graphical Game Development Studio";
homepage = "https://gdevelop.io/";
@ -32,7 +41,7 @@ appimageTools.wrapType2 {
license = lib.licenses.mit;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
maintainers = with lib.maintainers; [ tombert ];
mainProgram = "gdevelop";
platforms = [ "x86_64-linux" ];
};
}

View file

@ -28,7 +28,13 @@ buildGoModule rec {
meta = with lib; {
description = "GitLab Docker toolset to pack, ship, store, and deliver content";
license = licenses.asl20;
maintainers = with maintainers; [ yayayayaka ] ++ teams.cyberus.members;
maintainers =
with maintainers;
[
leona
yayayayaka
]
++ teams.cyberus.members;
platforms = platforms.unix;
};
}

View file

@ -6,16 +6,16 @@
buildGoModule rec {
pname = "gore";
version = "0.5.7";
version = "0.6.0";
src = fetchFromGitHub {
owner = "motemen";
repo = pname;
rev = "v${version}";
sha256 = "sha256-J6rXz62y/qj4GFXnUwpfx9UEUQaUVQjf7KQCSzmNsws=";
sha256 = "sha256-7mhfegSSRE9FnKz+tWYMEtEKc+hayPQE8EEOEu33CjU=";
};
vendorHash = "sha256-MpmDQ++32Rop1yYcibEr7hQJ7YAU1QvITzTSstL5V9w=";
vendorHash = "sha256-0eCRDlcqZf+RAbs8oBRr+cd7ncWX6fXk/9jd8/GnAiw=";
doCheck = false;

View file

@ -15,11 +15,11 @@
stdenv.mkDerivation rec {
pname = "groovy";
version = "4.0.25";
version = "4.0.26";
src = fetchurl {
url = "mirror://apache/groovy/${version}/distribution/apache-groovy-binary-${version}.zip";
sha256 = "sha256-giytjgM4jyO/YT03+ZC4E7tBZf44n9P8wk+LlkdsMO8=";
sha256 = "sha256-O+aIDG3nDq2i8/XGnh6UlT4LDE4zxGBMEEDQXd3q7ZI=";
};
nativeBuildInputs = [

View file

@ -1,6 +1,6 @@
{
stdenv,
SDL2_image_2_6,
SDL2_image,
SDL2_ttf,
SDL2_net,
fpc,
@ -8,7 +8,8 @@
ffmpeg,
libglut,
lib,
fetchurl,
fetchhg,
fetchpatch,
cmake,
pkg-config,
lua5_1,
@ -19,14 +20,13 @@
libGL,
libGLU,
physfs,
qtbase,
qttools,
wrapQtAppsHook,
llvm,
qt5,
withServer ? true,
}:
let
inherit (qt5) qtbase qttools wrapQtAppsHook;
ghc = haskell.packages.ghc94.ghcWithPackages (
pkgs: with pkgs; [
SHA
@ -43,19 +43,23 @@ let
]
);
in
stdenv.mkDerivation rec {
stdenv.mkDerivation {
pname = "hedgewars";
version = "1.0.2";
version = "1.0.2-unstable-2024-03-24";
src = fetchurl {
url = "https://www.hedgewars.org/download/releases/hedgewars-src-${version}.tar.bz2";
sha256 = "sha256-IB/l5FvYyls9gbGOwGvWu8n6fCxjvwGQBeL4C+W88hI=";
src = fetchhg {
url = "https://hg.hedgewars.org/hedgewars/";
rev = "fcc98c953b5e";
hash = "sha256-bUmyYXmhOYjvbd0elyNnaUx3X1QJl3w2/hpxFK9KQCE=";
};
patches = [
# Add support for ffmpeg 6.0
# https://github.com/hedgewars/hw/pull/74
./support-ffmpeg-6.patch
(fetchpatch {
# https://github.com/hedgewars/hw/pull/74
name = "Add support for ffmpeg 6.0";
url = "https://github.com/hedgewars/hw/pull/74/commits/71691fad8654031328f4af077fc32aaf29cdb7d0.patch";
hash = "sha256-nPfSQCc4eGCa4lCGl3gDx8fJp47N0lgVeDU5A5qb1yo=";
})
];
nativeBuildInputs = [
@ -70,10 +74,9 @@ stdenv.mkDerivation rec {
SDL2_net
SDL2
SDL2_mixer
SDL2_image_2_6
SDL2_image
fpc
lua5_1
llvm # hard-requirement on aarch64, for some reason not strictly necessary on x86-64
ffmpeg
libglut
physfs
@ -87,7 +90,7 @@ stdenv.mkDerivation rec {
NIX_LDFLAGS = lib.concatMapStringsSep " " (e: "-rpath ${e}/lib") [
SDL2.out
SDL2_image_2_6
SDL2_image
SDL2_mixer
SDL2_net
SDL2_ttf
@ -110,10 +113,19 @@ stdenv.mkDerivation rec {
}"
];
meta = with lib; {
description = "Turn-based strategy artillery game similar to Worms";
meta = {
description = "Funny turn-based artillery game, featuring fighting hedgehogs!";
homepage = "https://hedgewars.org/";
license = licenses.gpl2Plus;
license = with lib.licenses; [
gpl2Only
# Assets
fdl12Only
# Fonts
bitstreamVera
asl20
];
longDescription = ''
Each player controls a team of several hedgehogs. During the course of
the game, players take turns with one of their hedgehogs. They then use
@ -137,11 +149,10 @@ stdenv.mkDerivation rec {
contact with explosions, to zero (the damage dealt to the attacked
hedgehog or hedgehogs after a player's or CPU turn is shown only when
all movement on the battlefield has ceased).'';
maintainers = with maintainers; [
maintainers = with lib.maintainers; [
kragniz
fpletz
];
broken = stdenv.hostPlatform.isDarwin;
platforms = platforms.linux;
platforms = lib.platforms.linux;
};
}

View file

@ -9,11 +9,11 @@
stdenv.mkDerivation {
pname = "heroku";
version = "10.0.2";
version = "10.2.0";
src = fetchzip {
url = "https://cli-assets.heroku.com/versions/10.0.2/7947ef4/heroku-v10.0.2-7947ef4-linux-x64.tar.xz";
hash = "sha256-+z+oP4KUhlQuhmvXJ8cxkrDJzllww1gybJCst7RIph0=";
url = "https://cli-assets.heroku.com/versions/10.2.0/9d9128b/heroku-v10.2.0-9d9128b-linux-x64.tar.xz";
hash = "sha256-RIkRcJc+pFu4czwlNgo8ntmKu/ihY25Q6jBCP6pEIdI=";
};
nativeBuildInputs = [ makeWrapper ];

View file

@ -4,21 +4,20 @@
fetchurl,
stdenv,
}:
appimageTools.wrapType2 rec {
pname = "httpie-desktop";
version = "2025.1.0";
version = "2025.2.0";
src =
if stdenv.hostPlatform.system == "aarch64-linux" then
fetchurl {
url = "https://github.com/httpie/desktop/releases/download/v${version}/HTTPie-${version}-arm64.AppImage";
hash = "sha256-YadVCoBNFFco4773COyJOGHtbFKW1zMzi5kazWqIGbY=";
hash = "sha256-FBzjlYwgCULgjaJUPALlqqRj7fZMps7hybt5m5EkeAo=";
}
else
fetchurl {
url = "https://github.com/httpie/desktop/releases/download/v${version}/HTTPie-${version}.AppImage";
hash = "sha256-8Ecamw+rmY3iun8ytMsJW3gGHLNcyuZ7VkOiNfiDEyk=";
hash = "sha256-qFDiFXQbYAhweQhgYfZW/lUMtmw09tqT9t/GPJRtZU8=";
};
extraInstallCommands =
@ -26,12 +25,10 @@ appimageTools.wrapType2 rec {
contents = appimageTools.extractType2 { inherit pname version src; };
in
''
mkdir -p $out/share
cp -r ${contents}/usr/share/* $out/share
chmod +w $out/share
install -Dm644 ${contents}/httpie.desktop $out/share/applications/httpie.desktop
substituteInPlace $out/share/applications/httpie.desktop \
--replace-fail 'Exec=AppRun' 'Exec=httpie-desktop'
cp -r ${contents}/usr/share/* $out/share
'';
meta = {

Some files were not shown because too many files have changed in this diff Show more