Merge branch 'master' into current

This commit is contained in:
2026-07-25 22:52:58 +02:00
369 changed files with 5982 additions and 2139 deletions
+3 -3
View File
@@ -88,7 +88,7 @@ jobs:
GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }}
run: gh api /rate_limit | jq
- uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0
- uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
name: Labels from touched files
if: |
github.event_name == 'pull_request_target' &&
@@ -98,7 +98,7 @@ jobs:
configuration-path: .github/labeler.yml # default
sync-labels: true
- uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0
- uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
name: Labels from touched files (no sync)
if: |
github.event_name == 'pull_request_target' &&
@@ -108,7 +108,7 @@ jobs:
configuration-path: .github/labeler-no-sync.yml
sync-labels: false
- uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0
- uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
name: Labels from touched files (development branches)
# Development branches like staging-next, haskell-updates and python-updates get special labels.
# This is to avoid the mass of labels there, which is mostly useless - and really annoying for
+16 -3
View File
@@ -9,9 +9,22 @@
},
"branch": "nixpkgs-unstable",
"submodules": false,
"revision": "421eebfd0ec7bccd4abe826ce62d7e6e83129493",
"url": "https://github.com/NixOS/nixpkgs/archive/421eebfd0ec7bccd4abe826ce62d7e6e83129493.tar.gz",
"hash": "sha256:1lxfhfgiv1sz2v7fg43gny57sa6wf59n98q7ldsyb2p06f4sal7w"
"revision": "7525d999cd850b9a488817abc89c75dc733acf17",
"url": "https://github.com/NixOS/nixpkgs/archive/7525d999cd850b9a488817abc89c75dc733acf17.tar.gz",
"hash": "sha256-4IHyyLgLBdKefkljdKod4IMn023pQiDXAWJA187cmdY="
},
"nixpkgs-26.05-darwin": {
"type": "Git",
"repository": {
"type": "GitHub",
"owner": "NixOS",
"repo": "nixpkgs"
},
"branch": "nixpkgs-26.05-darwin",
"submodules": false,
"revision": "51fe96f9107566e6b8eeb7fc4ba696c01e548b04",
"url": "https://github.com/NixOS/nixpkgs/archive/51fe96f9107566e6b8eeb7fc4ba696c01e548b04.tar.gz",
"hash": "sha256-yj0LPLnsmYoLmA3FGANjeTEwej0/DHjZBXWnDQDUuIs="
}
},
"version": 8
+2 -1
View File
@@ -199,7 +199,8 @@
&& system != "riscv64-linux"
# Exclude x86_64-freebsd because "Package go-1.22.12-freebsd-amd64-bootstrap in /nix/store/0yw40qnrar3lvc5hax5n49abl57apjbn-source/pkgs/development/compilers/go/binary.nix:50 is not available on the requested hostPlatform"
&& system != "x86_64-freebsd"
) (forAllSystems (system: (import ./ci { inherit system; }).fmt.pkg));
# TODO: revert to importing fmt.pkg directly from ./ci when support for 26.05 ends
) (forAllSystems (system: (import ./shell.nix { inherit system; }).formatter));
/**
A nested structure of [packages](https://nix.dev/manual/nix/latest/glossary#package-attribute-set) and other values.
+7 -3
View File
@@ -1259,6 +1259,11 @@ lib.mapAttrs mkLicense (
fullName = "SIL Open Font License 1.1";
};
ogluk30 = {
spdxId = "OGL-UK-3.0";
fullName = "Open Government Licence v3.0";
};
oml = {
spdxId = "OML";
fullName = "Open Market License";
@@ -1421,9 +1426,8 @@ lib.mapAttrs mkLicense (
};
stk = {
shortName = "stk";
fullName = "Synthesis Tool Kit 4.3";
url = "https://github.com/thestk/stk/blob/master/LICENSE";
spdxId = "MIT-STK";
fullName = "MIT-STK License";
};
sudo = {
+43 -12
View File
@@ -3423,13 +3423,6 @@
githubId = 32903896;
keys = [ { fingerprint = "CB5C 7B3C 3E6F 2A59 A583 A90A 8A60 0376 7BE9 5976"; } ];
};
benesim = {
name = "Benjamin Isbarn";
email = "benjamin.isbarn@gmail.com";
github = "BeneSim";
githubId = 29384538;
keys = [ { fingerprint = "D35E C9CE E631 638F F1D8 B401 6F0E 410D C3EE D02"; } ];
};
bengsparks = {
email = "benjamin.sparks@protonmail.com";
github = "bengsparks";
@@ -7340,6 +7333,13 @@
githubId = 39825;
name = "Dominik Honnef";
};
donottellmetonottellyou = {
name = "Jade Masker";
email = "donottellmetonottellyou@gmail.com";
github = "donottellmetonottellyou";
githubId = 115233539;
keys = [ { fingerprint = "5C8B 7128 4AB3 000D 4AC6 6234 9B81 35A2 4A75 CB86"; } ];
};
donovanglover = {
github = "donovanglover";
githubId = 2374245;
@@ -12960,11 +12960,6 @@
name = "Jez Cope";
keys = [ { fingerprint = "D9DA 3E47 E8BD 377D A317 B3D0 9E42 CE07 1C45 59D1"; } ];
};
jf-uu = {
github = "jf-uu";
githubId = 181011550;
name = "jf-uu";
};
jfchevrette = {
email = "jfchevrette@gmail.com";
github = "jfchevrette";
@@ -13581,6 +13576,12 @@
name = "Jonas Wunderlich";
matrix = "@matrix:03j.de";
};
jonascarpay = {
name = "Jonas Carpay";
email = "jonascarpay@gmail.com";
github = "jonascarpay";
githubId = 3593851;
};
jonasfranke = {
name = "Jonas Franke";
email = "info@jonasfranke.xyz";
@@ -18868,6 +18869,11 @@
githubId = 45770;
name = "Mitsuhiro Nakamura";
};
MNThomson = {
github = "MNThomson";
githubId = 73045936;
name = "Max Thomson";
};
moaxcp = {
email = "moaxcp@gmail.com";
github = "moaxcp";
@@ -20282,6 +20288,12 @@
github = "niklaskorz";
githubId = 590517;
};
niklasravnsborg = {
name = "Niklas Ravnsborg";
github = "niklasravnsborg";
githubId = 6717303;
keys = [ { fingerprint = "0C90 DD8A 0EE9 93DF 8D58 7AF9 8360 E6C5 8AE8 F3ED"; } ];
};
niklasthorild = {
name = "Niklas Thorild";
email = "niklas@thorild.se";
@@ -23315,6 +23327,13 @@
github = "DaRacci";
githubId = 90304606;
};
rachalaraj = {
name = "Rachala Raj Kumar";
email = "rachaalaraj@gmail.com";
matrix = "@rachalaraj:matrix.org";
github = "rachalaraj";
githubId = 124191100;
};
RadxaYuntian = {
# This is the work account for @MakiseKurisu
name = "ZHANG Yuntian";
@@ -29372,6 +29391,11 @@
github = "UnsolvedCypher";
githubId = 3170853;
};
untio11 = {
name = "Robin Kneepkens";
github = "untio11";
githubId = 14060658;
};
uralbash = {
email = "root@uralbash.ru";
github = "uralbash";
@@ -29699,6 +29723,13 @@
githubId = 116078858;
keys = [ { fingerprint = "CDEA 7E04 69E3 0885 A754 4B05 0104 BC05 F41B 77B8"; } ];
};
vherrmann = {
name = "Valentin Herrmann";
email = "me@valentin-herrmann.de";
github = "vherrmann";
githubId = 50072577;
keys = [ { fingerprint = "309D A29B 4070 FDFD C01A 3AB4 9E60 CB44 5C4B BC4C"; } ];
};
videl = {
email = "thibaut.smith@mailbox.org";
github = "videl";
+1 -1
View File
@@ -43,7 +43,7 @@ When reviewing a modular service, you should check the following. Details and ra
### NixOS VM test
See the initial [Modular Services PR](https://github.com/NixOS/nixpkgs/pull/372170) for an [example](https://github.com/NixOS/nixpkgs/pull/372170/files#diff-e7fe16489cf3cd08ecc22b2c7896039d407a329b75691c046c95447423b3153f) of a NixOS VM test.
TBD: describe best practices here.
Best practices: keep tests minimal and focused (boot a VM, enable the service, and assert a basic request succeeds). For general guidance, see the [NixOS Tests chapter](https://nixos.org/manual/nixos/unstable/#sec-nixos-tests).
### `_class = "service"`
@@ -129,7 +129,7 @@
- [nvme-rs](https://github.com/liberodark/nvme-rs), NVMe monitoring [services.nvme-rs](#opt-services.nvme-rs.enable).
- [Overseerr](https://overseerr.dev), a request management and media discovery tool for the Plex ecosystem. Available as [services.overseerr](#opt-services.overseerr.enable).
- [Overseerr](https://overseerr.dev), a request management and media discovery tool for the Plex ecosystem. Available as {option}`opt-services.overseerr.enable`.
- [PairDrop](https://github.com/schlagmichdoch/pairdrop), a peer-to-peer file transfer web app. Available as [services.pairdrop](#opt-services.pairdrop.enable).
@@ -84,7 +84,7 @@
- [PdfDing](https://www.pdfding.com/), manage, view and edit your PDFs seamlessly on all your devices wherever you are. Available as [services.pdfding](#opt-services.pdfding.enable).
- [mangowc](https://github.com/DreamMaoMao/mangowc), a lightweight and feature-rich Wayland compositor based on dwl. Available as [programs.mangowc](#opt-programs.mangowc.enable).
- [mangowc](https://github.com/DreamMaoMao/mangowc), a lightweight and feature-rich Wayland compositor based on dwl. Available as [programs.mangowc](#opt-programs.mango.enable).
- [reaction](https://reaction.ppom.me/), a daemon that scans program outputs for repeated patterns, and takes action. A common usage is to scan ssh and webserver logs, and to ban hosts that cause multiple authentication errors. A modern alternative to fail2ban. Available as [services.reaction](#opt-services.reaction.enable).
@@ -89,9 +89,9 @@
- Apache Kafka has dropped support for ZooKeeper mode. The `apacheKafka_3_9` and `apacheKafka_4_0` packages have been removed, as every remaining packaged version is KRaft-only. The `services.apache-kafka.zookeeper` option (previously an alias for `services.apache-kafka.settings."zookeeper.connect"`) has been removed; migrate your cluster to [KRaft](#module-services-apache-kafka-kraft) mode instead.
- `virtualisation.registries.block` / `insecure` / `search` were deprecated,
- `virtualisation.containers.registries.block` / `insecure` / `search` were deprecated,
because they mapped to the deprecated V1 `registries.conf` format.
See the new option {option}`virtualisation.registries.settings`
See the new option {option}`virtualisation.containers.registries.settings`
and [containers-registries.conf(5)](https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md)
to migrate to the new configuration format.
@@ -113,6 +113,8 @@
- `services.komodo-periphery` has been updated to support version 2.0.0. Some options have been renamed to match the new configuration structure; compatibility aliases are provided for the renamed options. The `passkeys` and `outbound.onboardingKey` options have been removed; use `passkeyFiles`, `auth.privateKey`/`auth.corePublicKeys`, or `outbound.onboardingKeyFile` instead. New outbound mode configuration is available under `outbound.*`.
- Package `overseerr` has been removed as the `overseerr` and `jellyseerr` projects were merged under `seerr`.
## Other Notable Changes {#sec-release-26.11-notable-changes}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
@@ -140,6 +142,8 @@
- `security.run0.persistentAuth` options have been added to support persistent Authentication of session. Timeout configurable via `security.polkit.settings.Polkitd.ExpirationSeconds`.
- [`virtualisation.qemu.firmware.enable`](#opt-virtualisation.qemu.firmware.enable) has been added to install QEMU firmware descriptors to {file}`/etc/qemu/firmware`, making the corresponding firmware images discoverable by tools such as `systemd-vmspawn`. By default this exposes the firmware bundled with QEMU. Further firmware can be added via [`virtualisation.qemu.firmware.packages`](#opt-virtualisation.qemu.firmware.packages), for example the new `OVMF-amdsev` and `OVMF-inteltdx` packages, which provide UEFI firmware for AMD SEV-SNP and Intel TDX confidential VMs.
- `boot.loader.systemd-boot` gained support for [Automatic Boot Assessment](https://systemd.io/AUTOMATIC_BOOT_ASSESSMENT/) via the new [`boot.loader.systemd-boot.bootCounting`](#opt-boot.loader.systemd-boot.bootCounting.enable) options, allowing automatic detection of and recovery from bad NixOS generations. As part of this change, boot loader entries on the ESP/XBOOTLDR partition are now named `nixos-<content-hash>.conf` instead of `nixos-generation-<n>.conf`; existing entries are migrated automatically on the next `nixos-rebuild boot`/`switch`.
- `services.nginx` gained a [`lua`](#opt-services.nginx.lua.enable) option to enable Lua scripting via OpenResty's lua-nginx-module on a stock nginx, configuring `lua_package_path`/`lua_package_cpath` from the packages listed in [`services.nginx.lua.extraPackages`](#opt-services.nginx.lua.extraPackages). Use this to add Lua to a regular nginx; for the full OpenResty platform (libraries that rely on its bundled lualib, such as `lua-resty-openidc`), set `services.nginx.package` to `pkgs.openresty` instead — the option configures the Lua search path for it too.
@@ -89,6 +89,11 @@ def main() -> None:
type=Path,
required=True,
)
arg_parser.add_argument(
"--test-script",
help="path to a test script to run, taking precedence over the one defined in the config file",
type=Path,
)
arg_parser.add_argument(
"--keep-vm-state",
help=argparse.SUPPRESS,
@@ -163,8 +168,12 @@ def main() -> None:
if args.debug_hook_attach is not None:
debugger = Debug(logger, args.debug_hook_attach)
config = load_driver_configuration(args.config)
if args.test_script is not None:
config.test_script = args.test_script
with Driver(
config=load_driver_configuration(args.config),
config=config,
out_dir=output_directory,
logger=logger,
keep_machine_state=args.keep_machine_state,
+2 -2
View File
@@ -355,7 +355,7 @@
./programs/wayland/hyprland.nix
./programs/wayland/hyprlock.nix
./programs/wayland/labwc.nix
./programs/wayland/mangowc.nix
./programs/wayland/mango.nix
./programs/wayland/miracle-wm.nix
./programs/wayland/niri.nix
./programs/wayland/pinnacle.nix
@@ -938,7 +938,6 @@
./services/misc/open-webui.nix
./services/misc/orthanc.nix
./services/misc/osrm.nix
./services/misc/overseerr.nix
./services/misc/owncast.nix
./services/misc/packagekit.nix
./services/misc/paisa.nix
@@ -2052,6 +2051,7 @@
./virtualisation/openvswitch.nix
./virtualisation/parallels-guest.nix
./virtualisation/podman/default.nix
./virtualisation/qemu-firmware.nix
./virtualisation/qemu-guest-agent.nix
./virtualisation/rosetta.nix
./virtualisation/spice-usb-redirection.nix
+66 -28
View File
@@ -14,56 +14,93 @@ in
Miriway, a Mir based Wayland compositor. You can manually launch Miriway by
executing "exec miriway" on a TTY, or launch it from a display manager. Copy
/etc/xdg/xdg-miriway/miriway-shell.config to ~/.config/miriway-shell.config
and /etc/xdg/xdg-miriway/miriway-shell.settings to ~/.config/miriway-shell.settings
to modify the system-wide configuration on a per-user basis. See <https://github.com/Miriway/Miriway>,
and "miriway --help" for more information'';
config = lib.mkOption {
description = ''
Contents of system-wide miriway-shell.config. See Miriway's configuration documentation for details.
'';
type = lib.types.lines;
default = ''
x11-window-title=Miriway (Mir-on-X)
idle-timeout=600
ctrl-alt=t:miriway-terminal # Default "terminal emulator finder"
shell-component=dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY
meta=Left:@dock-left
meta=Right:@dock-right
meta=Space:@toggle-maximized
meta=Home:@workspace-begin
meta=End:@workspace-end
meta=Page_Up:@workspace-up
meta=Page_Down:@workspace-down
ctrl-alt=BackSpace:@exit
'';
example = ''
idle-timeout=300
ctrl-alt=t:weston-terminal
add-wayland-extensions=all
shell-components=dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY
shell-component=waybar
shell-component=wbg Pictures/wallpaper
shell-meta=a:synapse
meta=Left:@dock-left
meta=Right:@dock-right
meta=Space:@toggle-maximized
meta=Home:@workspace-begin
meta=End:@workspace-end
meta=Page_Up:@workspace-up
meta=Page_Down:@workspace-down
ctrl-alt=BackSpace:@exit
'';
};
settings = lib.mkOption {
description = ''
Miriway's config. This will be installed system-wide.
The default will install the miriway package's barebones example config.
Contents of system-wide miriway-shell.settings. See Miriway's configuration documentation for details.
'';
type = lib.types.lines;
default = ''
command_ctrl_alt=t:miriway-terminal # Default "terminal emulator finder"
command_meta=Left:@dock-left
command_meta=Right:@dock-right
command_meta=Space:@toggle-maximized
command_meta=Home:@workspace-begin
command_meta=End:@workspace-end
command_meta=Page_Up:@workspace-up
command_meta=Page_Down:@workspace-down
command_ctrl_alt=BackSpace:@exit
'';
example = ''
command_ctrl_alt=t:weston-terminal
command_shell_meta=a:synapse
command_meta=Left:@dock-left
command_meta=Right:@dock-right
command_meta=Space:@toggle-maximized
command_meta=Home:@workspace-begin
command_meta=End:@workspace-end
command_meta=Page_Up:@workspace-up
command_meta=Page_Down:@workspace-down
command_ctrl_alt=BackSpace:@exit
'';
};
};
config = lib.mkIf cfg.enable {
warnings =
let
optionsNoLongerInConfig = [
"ctrl-alt"
"meta"
"shell-ctrl-alt"
"shell-meta"
"shell-plain"
"command_ctrl_alt"
"command_meta"
"command_shell_ctrl_alt"
"command_shell_meta"
"command_plain"
];
in
# Added 2026-07-17
lib.optional
(builtins.foldl' (
acc: option: acc || (lib.strings.hasInfix "${option}=" cfg.config)
) false optionsNoLongerInConfig)
''
Since Miriway 26.06, configuration options got partially renamed and split across different files.
A new option `programs.miriway.settings` got introduced for options that belong into miriway-shell.settings
instead of miriway-shell.config.
You appear to have one of the following options in `programs.miriway.config` that should now go into
`programs.miriway.settings`, and may need to be renamed:
${lib.strings.concatStringsSep ", " optionsNoLongerInConfig}
'';
environment = {
systemPackages = with pkgs; [
miriway
@@ -71,6 +108,7 @@ in
];
etc = {
"xdg/xdg-miriway/miriway-shell.config".text = cfg.config;
"xdg/xdg-miriway/miriway-shell.settings".text = cfg.settings;
};
};
+8 -9
View File
@@ -15,14 +15,13 @@ in
description = ''
Enable ReGreet, a clean and customizable greeter for greetd.
To use ReGreet, {option}`services.greetd` has to be enabled and
{option}`services.greetd.settings.default_session` should contain the
appropriate configuration to launch
{option}`config.programs.regreet.package`. For examples, see the
[ReGreet Readme](https://github.com/rharish101/ReGreet#set-as-default-session).
By default enables {option}`services.greetd` and configures a
{command}`default_session` to launch ReGreet using the
{command}`cage` compositor.
A minimal configuration that launches ReGreet in {command}`cage` is
enabled by this module by default.
See the
[ReGreet Readme](https://github.com/rharish101/ReGreet#set-as-default-session)
for other examples.
'';
};
@@ -48,8 +47,8 @@ in
[ "-s" "-d" "-m" "last" ]
'';
description = ''
Additional arguments to be passed to
[cage](https://github.com/cage-kiosk/cage).
Arguments to be passed to [cage](https://github.com/cage-kiosk/cage)
when using it as the default compositor.
'';
};
@@ -6,18 +6,22 @@
}:
let
cfg = config.programs.mangowc;
cfg = config.programs.mango;
in
{
options.programs.mangowc = {
enable = lib.mkEnableOption "MangoWC, a Wayland compositor based on dwl and scenefx";
options.programs.mango = {
enable = lib.mkEnableOption "Mango, a Wayland compositor based on dwl and scenefx";
package = lib.mkPackageOption pkgs "mangowc" {
default = [ "mangowc" ];
example = "pkgs.mangowc.override { enableXWayland = false; }";
package = lib.mkPackageOption pkgs "mango" {
default = [ "mango" ];
example = "pkgs.mango.override { enableXWayland = false; }";
};
};
imports = [
(lib.mkRenamedOptionModule [ "programs" "mangowc" ] [ "programs" "mango" ])
];
config = lib.mkIf cfg.enable {
environment.systemPackages = [ cfg.package ];
+12
View File
@@ -403,6 +403,11 @@ in
as the underlying package isn't being maintained. Working alternatives are
libinput and synaptics.
'')
(mkRemovedOptionModule [ "services" "xserver" "windowManager" "afterstep" ] ''
The services.xserver.windowManager.afterstep module and the corresponding
package have been removed from Nixpkgs because they were unmaintained
upstream.
'')
(mkRemovedOptionModule [ "services" "xserver" "windowManager" "ragnarwm" ] ''
The services.xserver.windowManager.ragnarwm module has been removed
because the corresponding package was removed from nixpkgs.
@@ -534,6 +539,13 @@ in
(mkRemovedOptionModule [ "services" "xserver" "cmt" ] ''
services.xserver.cmt has been removed as it was broken and unmaintained upstream
'')
(mkRemovedOptionModule
[
"services"
"overseerr"
]
"`services.overseerr` has been replaced by `services.seerr` as the project has been merged with Jellyseerr under Seerr."
)
# Do NOT add any option renames here, see top of the file
];
}
-1
View File
@@ -1422,7 +1422,6 @@ let
modulePath = config.security.pam.pam_unixModulePath;
settings = {
nullok = true;
yescrypt = lib.mkIf config.security.pam.enableLegacySettings true;
};
}
{
@@ -577,7 +577,6 @@ in
control = "requisite";
modulePath = config.security.pam.pam_unixModulePath;
settings.nullok = true;
settings.yescrypt = true;
}
];
@@ -1,6 +1,7 @@
{
config,
lib,
utils,
pkgs,
...
}:
@@ -76,9 +77,37 @@ in
services.greetd.settings.default_session.user = lib.mkDefault "greeter";
security.pam.services.greetd = {
allowNullPassword = true;
startSession = true;
enableGnomeKeyring = lib.mkDefault config.services.gnome.gnome-keyring.enable;
useDefaultRules = false;
rules = {
auth = utils.pam.autoOrderRules [
{
name = "login";
control = "substack";
modulePath = "login";
}
];
account = utils.pam.autoOrderRules [
{
name = "login";
control = "include";
modulePath = "login";
}
];
password = utils.pam.autoOrderRules [
{
name = "login";
control = "substack";
modulePath = "login";
}
];
session = utils.pam.autoOrderRules [
{
name = "login";
control = "include";
modulePath = "login";
}
];
};
};
# This prevents nixos-rebuild from killing greetd by activating getty again
+31 -3
View File
@@ -100,9 +100,37 @@ in
security.pam.services = {
ly = {
startSession = true;
unixAuth = true;
enableGnomeKeyring = lib.mkDefault config.services.gnome.gnome-keyring.enable;
useDefaultRules = false;
rules = {
auth = utils.pam.autoOrderRules [
{
name = "login";
control = "substack";
modulePath = "login";
}
];
account = utils.pam.autoOrderRules [
{
name = "login";
control = "include";
modulePath = "login";
}
];
password = utils.pam.autoOrderRules [
{
name = "login";
control = "substack";
modulePath = "login";
}
];
session = utils.pam.autoOrderRules [
{
name = "login";
control = "include";
modulePath = "login";
}
];
};
};
}
// optionalAttrs dmcfg.autoLogin.enable {
@@ -242,7 +242,9 @@ let
"elkm1"
"elv"
"enocean"
"homeassistant_connect_zbt2"
"homeassistant_hardware"
"homeassistant_sky_connect"
"homeassistant_yellow"
"firmata"
"flexit"
-89
View File
@@ -1,89 +0,0 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.services.overseerr;
in
{
meta.maintainers = [ lib.maintainers.jf-uu ];
options.services.overseerr = {
enable = lib.mkEnableOption "Overseerr, a request management and media discovery tool for the Plex ecosystem";
package = lib.mkPackageOption pkgs "overseerr" { };
openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Open a port in the firewall for the Overseerr web interface.";
};
port = lib.mkOption {
type = lib.types.port;
default = 5055;
description = "The port which the Overseerr web UI should listen on.";
};
};
config = lib.mkIf cfg.enable {
systemd.services.overseerr = {
description = "Request management and media discovery tool for the Plex ecosystem";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
environment = {
CONFIG_DIRECTORY = "/var/lib/overseerr";
PORT = toString cfg.port;
};
serviceConfig = {
CapabilityBoundingSet = "";
DynamicUser = true;
ExecStart = lib.getExe cfg.package;
LockPersonality = true;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateIPC = true;
PrivateMounts = true;
PrivateTmp = true;
PrivateUsers = true;
ProcSubset = "pid";
ProtectClock = true;
ProtectControlGroups = true;
ProtectHome = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectProc = "invisible";
ProtectSystem = "strict";
RemoveIPC = true;
Restart = "on-failure";
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_UNIX"
];
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
StateDirectory = "overseerr";
StateDirectoryMode = "0700";
SystemCallArchitectures = "native";
SystemCallErrorNumber = "EPERM";
SystemCallFilter = [
"@system-service"
"~@privileged"
"~@resources"
];
Type = "exec";
};
};
networking.firewall = lib.mkIf cfg.openFirewall {
allowedTCPPorts = [ cfg.port ];
};
};
}
+2 -1
View File
@@ -988,8 +988,9 @@ in
systemd.services.nsd = {
description = "NSD authoritative only domain name service";
after = [ "network.target" ];
after = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
wants = [ "network-online.target" ];
startLimitBurst = 4;
startLimitIntervalSec = 5 * 60; # 5 mins
@@ -115,7 +115,7 @@ in
default = true;
description = ''
Whether unbound should resolve local queries (i.e. add 127.0.0.1 to
/etc/resolv.conf).
/etc/resolv.conf and set name servers to localhost respectively).
'';
};
@@ -276,6 +276,7 @@ in
resolvconf = {
useLocalResolver = mkDefault true;
};
nameservers = lib.mkBefore ([ "127.0.0.1" ] ++ (optional config.networking.enableIPv6 "::1"));
};
environment.etc."unbound/unbound.conf".source = confFile;
+8 -2
View File
@@ -36,8 +36,14 @@ let
userbornConfigJson = pkgs.writeText "userborn.json" (builtins.toJSON userbornConfig);
userbornStaticFiles =
pkgs.runCommand "static-userborn" { }
"mkdir -p $out; ${lib.getExe cfg.package} ${userbornConfigJson} $out";
pkgs.runCommand "static-userborn"
{
nativeBuildInputs = [ cfg.package ];
}
''
mkdir -p $out
userborn ${userbornConfigJson} $out
'';
previousConfigPath = "/var/lib/userborn/previous-userborn.json";
immutableEtc = config.system.etc.overlay.enable && !config.system.etc.overlay.mutable;
@@ -458,7 +458,6 @@ in
control = "requisite";
modulePath = config.security.pam.pam_unixModulePath;
settings.nullok = true;
settings.yescrypt = true;
}
];
@@ -1,30 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.services.xserver.windowManager.afterstep;
in
{
###### interface
options = {
services.xserver.windowManager.afterstep.enable = mkEnableOption "afterstep";
};
###### implementation
config = mkIf cfg.enable {
services.xserver.windowManager.session = singleton {
name = "afterstep";
start = ''
${pkgs.afterstep}/bin/afterstep &
waitPID=$!
'';
};
environment.systemPackages = [ pkgs.afterstep ];
};
}
@@ -8,7 +8,6 @@ in
{
imports = [
./2bwm.nix
./afterstep.nix
./berry.nix
./bspwm.nix
./cwm.nix
+5 -5
View File
@@ -30,8 +30,9 @@ let
dnsmasqResolve = config.services.dnsmasq.enable && config.services.dnsmasq.resolveLocalQueries;
transformSettings = settings: {
Resolve = lib.mapAttrs (
transformSettings =
settings:
lib.mapAttrs (
key: value:
# concat lists for options that should result in space-separated values
if
@@ -45,10 +46,9 @@ let
concatStringsSep " " value
else
value
) settings.Resolve;
};
) settings;
resolvedConf = settingsToSections (transformSettings cfg.settings);
resolvedConf = settingsToSections { Resolve = transformSettings cfg.settings.Resolve; };
in
{
imports = [
+1 -1
View File
@@ -69,7 +69,7 @@ in
config = lib.mkIf (cfg.enable) {
environment.systemPackages = [ cfg.package ];
# we also want these mounts in virtual machines.
fileSystems = if config.virtualisation ? qemu then lib.mkVMOverride mounts else mounts;
fileSystems = if config.virtualisation.qemu ? package then lib.mkVMOverride mounts else mounts;
# We no longer need those when using envfs
system.activationScripts.usrbinenv = lib.mkForce "";
@@ -196,7 +196,7 @@ in
# that do not specify any nodes, or an empty attr set as nodes) will not
# have the QEMU module loaded and thuse these options can't and should not
# be set.
virtualisation = lib.optionalAttrs (options ? virtualisation.qemu) {
virtualisation = lib.optionalAttrs (options ? virtualisation.qemu.package) {
qemu = {
# NOTE: optionalAttrs
# test-instrumentation.nix appears to be used without qemu-vm.nix, so
@@ -0,0 +1,50 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.virtualisation.qemu.firmware;
in
{
options.virtualisation.qemu.firmware = {
enable = lib.mkEnableOption "QEMU firmware descriptors in {file}`/etc/qemu/firmware`";
packages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ pkgs.qemu ];
defaultText = lib.literalExpression "[ pkgs.qemu ]";
example = lib.literalExpression "[ pkgs.qemu pkgs.OVMF-amdsev.fd ]";
description = ''
Packages providing QEMU firmware descriptors under
{file}`share/qemu/firmware`, following the QEMU firmware interop
convention (see {file}`docs/interop/firmware.json` in the QEMU
source tree). The descriptors are merged and linked to
{file}`/etc/qemu/firmware`, where tools like
{command}`systemd-vmspawn` discover the firmware available for
running virtual machines.
The default exposes the descriptors of the firmware images
bundled with QEMU. Note that setting this option replaces the
default, so include `pkgs.qemu` when adding further firmware.
'';
};
};
config = lib.mkIf cfg.enable {
environment.etc."qemu/firmware".source =
let
merged = pkgs.buildEnv {
name = "qemu-firmware-descriptors";
paths = cfg.packages;
pathsToLink = [ "/share/qemu/firmware" ];
};
in
"${merged}/share/qemu/firmware";
};
meta.maintainers = [ lib.maintainers.katexochen ];
}
+2 -1
View File
@@ -153,6 +153,7 @@ in
console-log = runTest ./nixos-test-driver/console-log.nix;
containers = runTest ./nixos-test-driver/containers.nix;
nspawn-daemon-reexec-dbus = runTest ./nspawn-daemon-reexec-dbus.nix;
multi-arch-test = runTest ./nixos-test-driver/multi-arch-test.nix;
skip-typecheck = runTest ./nixos-test-driver/skip-typecheck.nix;
console-timeout = runTest ./nixos-test-driver/console-timeout.nix;
options-doc-regression = import ./nixos-test-driver/options-doc-regression.nix { inherit pkgs; };
@@ -1302,7 +1303,6 @@ in
osrm-backend = runTest ./osrm-backend.nix;
outline = runTest ./outline.nix;
overlayfs = runTest ./overlayfs.nix;
overseerr = runTest ./overseerr.nix;
owi = runTest ./owi.nix;
owncast = runTest ./owncast.nix;
oxidized = handleTest ./oxidized.nix { };
@@ -1448,6 +1448,7 @@ in
pykms = runTest ./pykms.nix;
qbittorrent = runTest ./qbittorrent.nix;
qboot = runTestOn [ "x86_64-linux" "i686-linux" ] ./qboot.nix;
qemu-firmware = runTestOn [ "x86_64-linux" ] ./qemu-firmware.nix;
qemu-vm-external-disk-image = runTest ./qemu-vm-external-disk-image.nix;
qemu-vm-restrictnetwork = handleTest ./qemu-vm-restrictnetwork.nix { };
qemu-vm-store = runTest ./qemu-vm-store.nix;
+1
View File
@@ -57,6 +57,7 @@
with subtest("create user"):
machine.succeed("useradd -m alice")
machine.succeed("(echo foobar; echo foobar) | passwd alice")
machine.succeed("grep -F 'alice:$y$' /etc/shadow")
with subtest("Check whether switching VTs works"):
machine.fail("pgrep -f 'agetty.*tty2'")
+1
View File
@@ -28,6 +28,7 @@
with subtest("create user"):
machine.succeed("useradd -m alice")
machine.succeed("(echo foobar; echo foobar) | passwd alice")
machine.succeed("grep -F 'alice:$y$' /etc/shadow")
with subtest("Check whether switching VTs works"):
machine.fail("pgrep -f 'agetty.*tty2'")
+6 -6
View File
@@ -33,13 +33,12 @@
add-wayland-extensions=all
enable-x11=
ctrl-alt=t:foot --maximized
ctrl-alt=a:env WINIT_UNIX_BACKEND=x11 WAYLAND_DISPLAY= alacritty --option window.startup_mode=\"maximized\"
shell-component=dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY
shell-component=foot --maximized
'';
settings = ''
command_ctrl_alt=t:foot --maximized
command_ctrl_alt=a:env WINIT_UNIX_BACKEND=x11 WAYLAND_DISPLAY= alacritty --option window.startup_mode=\"maximized\"
'';
};
environment = {
@@ -59,8 +58,9 @@
etc."xdg/foot/foot.ini".source = (pkgs.formats.ini { }).generate "foot.ini" {
main = {
font = "inconsolata:size=16";
initial-color-theme = "light";
};
colors = rec {
colors-light = rec {
foreground = "000000";
background = "ffffff";
regular2 = foreground;
@@ -0,0 +1,55 @@
{ pkgs, lib, ... }:
{
name = "multi-arch-test";
meta.maintainers = with pkgs.lib.maintainers; [ tfc ];
node.pkgsReadOnly = false;
nodes = {
# Setting build = host platform because such standard VM setups
# are well-cached by the multi-arch build infrastructure of the
# project.
vmIntel = {
nixpkgs.buildPlatform = "x86_64-linux";
nixpkgs.hostPlatform = "x86_64-linux";
};
vmArm = {
nixpkgs.buildPlatform = "aarch64-linux";
nixpkgs.hostPlatform = "aarch64-linux";
};
};
defaults = {
# not needed for this test and shrinks the closure
# because we dont' need qemu for all architectures
virtualisation.qemu.guestAgent.enable = false;
# the test is already very slow but we don't need DHCP anyway
networking.dhcpcd.enable = false;
# fix the network-online target, otherwise it doesn't work
# properly as a synchronization mechanism.
systemd.network.wait-online.enable = true;
systemd.network.wait-online.anyInterface = true;
};
# slow due to SW emulation but shouldn't be slower than that
globalTimeout = 5 * 60;
testScript = { nodes, ... }: /* python */ ''
start_all()
vmIntel.systemctl("start network-online.target")
vmArm.systemctl("start network-online.target")
vmIntel.wait_for_unit("network-online.target")
vmArm.wait_for_unit("network-online.target")
vmIntel.succeed("ping -c 1 vmArm")
vmArm.succeed("ping -c 1 vmIntel")
archIntel = vmIntel.succeed("uname -m")
t.assertIn("${nodes.vmIntel.nixpkgs.hostPlatform.qemuArch}", archIntel, "machine1 is an intel VM")
archArm = vmArm.succeed("uname -m")
t.assertIn("${nodes.vmArm.nixpkgs.hostPlatform.qemuArch}", archArm, "machine1 is an ARM VM")
'';
}
-20
View File
@@ -1,20 +0,0 @@
{ lib, pkgs, ... }:
{
name = "overseerr";
meta.maintainers = with lib.maintainers; [ jf-uu ];
nodes.machine =
{ pkgs, ... }:
{
environment.systemPackages = [ pkgs.jq ];
services.overseerr.enable = true;
};
testScript = ''
machine.wait_for_unit("overseerr.service")
machine.wait_for_open_port(5055)
version = machine.succeed("curl --fail http://localhost:5055/api/v1/status | jq --raw-output .version").rstrip("\n")
assert version == "${pkgs.overseerr.version}", f"expected version to be ${pkgs.overseerr.version}, got {version}"
'';
}
+41
View File
@@ -0,0 +1,41 @@
{ lib, ... }:
{
name = "qemu-firmware";
meta.maintainers = [ lib.maintainers.katexochen ];
nodes.machine =
{ pkgs, ... }:
{
virtualisation.qemu.firmware = {
enable = true;
packages = [
pkgs.qemu
pkgs.OVMF-amdsev.fd
pkgs.OVMF-inteltdx.fd
];
};
environment.systemPackages = [ pkgs.jq ];
};
testScript = ''
machine.wait_for_unit("multi-user.target")
with subtest("descriptors are merged into /etc/qemu/firmware"):
machine.succeed("test -e /etc/qemu/firmware/60-edk2-x86_64.json")
machine.succeed("test -e /etc/qemu/firmware/61-edk2-ovmf-x64-amdsev.json")
machine.succeed("test -e /etc/qemu/firmware/61-edk2-ovmf-x64-inteltdx.json")
with subtest("descriptors reference existing firmware images"):
machine.succeed(
"jq -er '.mapping | .filename // .executable.filename' "
+ "/etc/qemu/firmware/*.json | xargs stat --"
)
with subtest("systemd-vmspawn discovers the descriptors"):
listed = machine.succeed("systemd-vmspawn --firmware=list")
assert "61-edk2-ovmf-x64-amdsev.json" in listed
assert "61-edk2-ovmf-x64-inteltdx.json" in listed
assert "60-edk2-x86_64.json" in listed
'';
}
+3
View File
@@ -91,6 +91,9 @@ let
click_when_unobstructed((By.XPATH, "//a[contains(., 'Skip to web app')]"))
# Skip the tour on first login
click_when_unobstructed((By.XPATH, "//button[contains(., 'Skip')]"))
click_when_unobstructed((By.XPATH, "//button[contains(., 'New item')]"))
driver.find_element(By.XPATH, '//input[@formcontrolname="name"]').send_keys(
@@ -0,0 +1,19 @@
{
lib,
b4,
melpaBuild,
}:
melpaBuild {
pname = "b4-review-mode";
inherit (b4) version;
src = b4.src-misc;
sourceRoot = "${b4.src-misc.name}/misc/emacs";
meta = {
description = "Emacs major mode with highlighting for the b4 review reply editor";
homepage = "https://git.kernel.org/pub/scm/utils/b4/b4.git/about";
license = lib.licenses.gpl2Only;
maintainers = with lib.maintainers; [ fzakaria ];
};
}
@@ -6,22 +6,26 @@
magit,
transient,
with-editor,
consult,
plz,
}:
melpaBuild {
pname = "majutsu";
version = "0.6.0-unstable-2026-07-09";
version = "0.6.0-unstable-2026-07-23";
src = fetchFromGitHub {
owner = "0WD0";
repo = "majutsu";
rev = "59aff9b93eac575fbccc1f4ab2d48d048e0ead9b";
hash = "sha256-GJ62hsHgLEFIY0ghij0VPFt1jMUGRKhI2eCroBjkxtc=";
rev = "8eaf8cb4db2f0737d0a131ef8b61ce6393660369";
hash = "sha256-QqvzRfqWa4Ql7bpuShqHmXzXJCu1VU8ObnImiK7ZyvE=";
};
packageRequires = [
magit
transient
with-editor
consult
plz
];
passthru.updateScript = nix-update-script { extraArgs = [ "--version=branch=main" ]; };
+3 -3
View File
@@ -107,10 +107,10 @@ in
{
emacs31 = import ./make-emacs.nix (mkArgs {
pname = "emacs";
version = "31.0.90";
version = "31.0.91";
variant = "mainline";
rev = "emacs-31.0.90";
hash = "sha256-Rzlnn+NKQ+jICXLNop27RnVInq79myn4hueJieDO2Ck=";
rev = "emacs-31.0.91";
hash = "sha256-3nvCiLiEtII1C57CLfDIbVqhiwadYViF9Nv32yDtLIQ=";
});
emacs30 = import ./make-emacs.nix (mkArgs {
@@ -0,0 +1,19 @@
{
lib,
vimUtils,
b4,
}:
vimUtils.buildVimPlugin {
pname = "b4-review-vim";
inherit (b4) version;
src = b4.src-misc;
sourceRoot = "${b4.src-misc.name}/misc/vim";
meta = {
description = "Vim syntax highlighting for the b4 review reply editor";
homepage = "https://git.kernel.org/pub/scm/utils/b4/b4.git/about";
license = lib.licenses.gpl2Only;
maintainers = with lib.maintainers; [ fzakaria ];
};
}
@@ -74,6 +74,9 @@ let
];
env = {
# Build zlob for a portable CPU baseline (https://github.com/dmtrKovalenko/fff/issues/705)
CI = "1";
OPENSSL_NO_VENDOR = true;
# Allow undefined symbols on Darwin - they will be provided by Neovim's LuaJIT runtime
@@ -21,22 +21,22 @@ vscode-utils.buildVscodeMarketplaceExtension (finalAttrs: {
sources = {
"x86_64-linux" = {
arch = "linux-x64";
hash = "sha256-Y6MXjJBmhMzuQMwhkPLHK/vtciTdjsGvkEblH3ofju0=";
hash = "sha256-Z/tQ+KV+3MdbknA/1kmiIpVfOsUM8NUu+0iHlPVbYV0=";
};
"aarch64-linux" = {
arch = "linux-arm64";
hash = "sha256-8VvDtb+8SoLTRC7pXwH40amRurxTQgCmhdi0u7e5AfU=";
hash = "sha256-d2GjWr0FHOoORI5KRdwUQvcFfBB8xV6j9wj5OS9VL9o=";
};
"aarch64-darwin" = {
arch = "darwin-arm64";
hash = "sha256-bqjEgsjY+zyG1g/KtkRNxAlazIpc+HwGWvsMQNnPI2M=";
hash = "sha256-dlfGTxf2EoiNb0g9uqwjTNW8fi2d1tzubGdIDyp4xTw=";
};
};
in
{
name = "claude-code";
publisher = "anthropic";
version = "2.1.218";
version = "2.1.219";
}
// sources.${stdenvNoCC.hostPlatform.system}
or (throw "Unsupported system ${stdenvNoCC.hostPlatform.system}");
@@ -7,8 +7,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-eslint";
publisher = "dbaeumer";
version = "3.0.24";
hash = "sha256-ZQVzpSSLf3tpO4QtLjbCOje3L5/EqzT9A9IOssl6e54=";
version = "3.0.34";
hash = "sha256-ynCPFzne4YS4WNjQSmGky+e2IaE3SLxj6FkjKyLPcAs=";
};
meta = {
@@ -10,8 +10,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
publisher = "oxc";
name = "oxc-vscode";
version = "1.58.0";
hash = "sha256-30dFeguNbY8WM3fLym6aUMkHYH5wA5scSNn04Ukbj9U=";
version = "1.59.0";
hash = "sha256-avfW91oF8PGCoDYocC744wpQ3zE8fv5582n55Ugb8k8=";
};
nativeBuildInputs = [
@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "mednafen-vb";
version = "0-unstable-2026-06-14";
version = "0-unstable-2026-07-22";
src = fetchFromGitHub {
owner = "libretro";
repo = "beetle-vb-libretro";
rev = "38e7a0ec9ac7079ca1c1e3dd9aaf5b56f527efca";
hash = "sha256-+57qsfH2wygKdD66yauzKD9XDf01q4LeiWdIeYbVUmc=";
rev = "7cc663e9044459b3dab1790bdce8f48dc7358ed6";
hash = "sha256-ntw8SXzyu0PTDQgaLmT5Wy172A8TI3JLN6A5WQ2T/OI=";
};
makefile = "Makefile";
@@ -7,13 +7,13 @@
}:
mkLibretroCore {
core = "melonds";
version = "0-unstable-2026-06-25";
version = "0-unstable-2026-07-19";
src = fetchFromGitHub {
owner = "libretro";
repo = "melonds";
rev = "c9550d18923fe86a5ad9faa159399b55c12b47f1";
hash = "sha256-xvBdt/TMxZOrC//DLHRWRMqIibt7dNsfLM/FeMTRA60=";
rev = "66b5d2634cd0a79030562811e6e05f5532f800ba";
hash = "sha256-nQvnXoB8UeaSr6QfYwn18Y18KyLyWvcv/Q3L3SHvaNU=";
};
extraBuildInputs = [
@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "picodrive";
version = "0-unstable-2026-04-02";
version = "0-unstable-2026-07-23";
src = fetchFromGitHub {
owner = "libretro";
repo = "picodrive";
rev = "f0d4a0118a9733a1f10bce5a4ac772c474f9300d";
hash = "sha256-q584bnqIbKoXSCRHUAcqSJAIhholnXfbphvLVcbm57o=";
rev = "78a662e3135871a6c657d5e61900f6704152e594";
hash = "sha256-3+x1ILIUq+/nwfUGXweNIq3PFTAaP56/6G+dX4dEZ/Y=";
fetchSubmodules = true;
};
@@ -0,0 +1,37 @@
{ callPackage }:
let
flavorData = {
browser = {
optStem = "brave";
fileStem = "brave-browser";
appIdStem = "com.brave.Browser";
darwinStem = "Brave Browser";
changelogFile = "CHANGELOG_DESKTOP.md";
homepage = "https://brave.com/";
innerBinary = "brave";
};
origin = {
optStem = "brave-origin";
fileStem = "brave-origin";
appIdStem = "com.brave.Origin";
darwinStem = "Brave Origin";
changelogFile = "CHANGELOG_DESKTOP_ORIGIN.md";
homepage = "https://brave.com/origin/";
innerBinary = "brave";
};
};
mkBrave =
release:
let
pkg = import release;
fd = flavorData.${pkg.flavor or "browser"};
in
callPackage ./make-brave.nix { } (pkg // fd);
in
{
brave = mkBrave ./packages/brave.nix;
brave-origin = mkBrave ./packages/brave-origin.nix;
}
@@ -49,26 +49,20 @@
coreutils,
libxcb,
zlib,
# Darwin dependencies
unzip,
makeWrapper,
# command line arguments which are always set e.g "--disable-gpu"
commandLineArgs ? "",
# Necessary for USB audio devices.
pulseSupport ? stdenv.hostPlatform.isLinux,
libpulseaudio,
# For GPU acceleration support on Wayland (without the lib it doesn't seem to work)
libGL,
# For video acceleration via VA-API (--enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder)
libvaSupport ? stdenv.hostPlatform.isLinux,
libva,
enableVideoAcceleration ? libvaSupport,
# For Vulkan support (--enable-features=Vulkan); disabled by default as it seems to break VA-API
vulkanSupport ? false,
addDriverRunpath,
@@ -78,8 +72,22 @@
{
pname,
version,
hash,
url,
# Map from Nix system strings ("x86_64-linux", "aarch64-darwin", ...) to
# the corresponding upstream `{ url, hash }` record. Encoding the per-system
# sources as data rather than positional arguments lets channel-specific
# package.nix files drop platforms that upstream hasn't published yet.
archives,
# Upstream product flavor: "browser" (the regular Brave) or "origin" (the
# stripped-down Brave Origin).
flavor ? "browser",
# Flavor-specific paths supplied by the caller (default.nix).
optStem,
fileStem,
appIdStem,
darwinStem,
changelogFile,
homepage,
innerBinary,
}:
let
@@ -94,6 +102,19 @@ let
escapeShellArg
;
# /opt/brave.com/<optName>/
optName = optStem;
# Basename used for .desktop, gnome-control-center xml and icon files.
fileBase = fileStem;
# Secondary .desktop app-id.
appId = appIdStem;
# Upstream shell wrapper inside /opt.
innerWrapper = fileStem;
# macOS .app bundle name (inside the zip).
darwinApp = darwinStem;
# Upstream Exec= target in .desktop files (replaced with our wrapper).
upstreamBin = "brave-${flavor}-stable";
deps = [
alsa-lib
at-spi2-atk
@@ -156,13 +177,19 @@ let
] # disable automatic updates
# The feature disable is needed for VAAPI to work correctly: https://github.com/brave/brave-browser/issues/20935
++ optionals enableVideoAcceleration [ "UseChromeOSDirectVideoDecoder" ];
archive =
assert lib.assertMsg (builtins.hasAttr stdenv.hostPlatform.system archives)
"${pname} is not available for ${stdenv.hostPlatform.system}";
archives.${stdenv.hostPlatform.system};
in
stdenv.mkDerivation {
inherit pname version;
src = fetchurl {
inherit url hash;
};
__structuredAttrs = true;
strictDeps = true;
src = fetchurl { inherit (archive) url hash; };
dontConfigure = true;
dontBuild = true;
@@ -201,27 +228,27 @@ stdenv.mkDerivation {
cp -R usr/share $out
cp -R opt/ $out/opt
export BINARYWRAPPER=$out/opt/brave.com/brave/brave-browser
export BINARYWRAPPER=$out/opt/brave.com/${optName}/${innerWrapper}
# Fix path to bash in $BINARYWRAPPER
substituteInPlace $BINARYWRAPPER \
--replace-fail /bin/bash ${stdenv.shell} \
--replace-fail 'CHROME_WRAPPER' 'WRAPPER'
ln -sf $BINARYWRAPPER $out/bin/brave
ln -sf $BINARYWRAPPER $out/bin/${pname}
for exe in $out/opt/brave.com/brave/{brave,chrome_crashpad_handler}; do
for exe in $out/opt/brave.com/${optName}/{${innerBinary},chrome_crashpad_handler}; do
patchelf \
--set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
--set-rpath "${rpath}" $exe
done
# Fix paths
substituteInPlace $out/share/applications/{brave-browser,com.brave.Browser}.desktop \
--replace-fail /usr/bin/brave-browser-stable $out/bin/brave
substituteInPlace $out/share/gnome-control-center/default-apps/brave-browser.xml \
substituteInPlace $out/share/applications/{${fileBase},${appId}}.desktop \
--replace-fail /usr/bin/${upstreamBin} $out/bin/${pname}
substituteInPlace $out/share/gnome-control-center/default-apps/${fileBase}.xml \
--replace-fail /opt/brave.com $out/opt/brave.com
substituteInPlace $out/opt/brave.com/brave/default-app-block \
substituteInPlace $out/opt/brave.com/${optName}/default-app-block \
--replace-fail /opt/brave.com $out/opt/brave.com
# Correct icons location
@@ -229,13 +256,13 @@ stdenv.mkDerivation {
for icon in ''${icon_sizes[*]}
do
mkdir -p $out/share/icons/hicolor/$icon\x$icon/apps
ln -s $out/opt/brave.com/brave/product_logo_$icon.png $out/share/icons/hicolor/$icon\x$icon/apps/brave-browser.png
mkdir -p $out/share/icons/hicolor/''${icon}x''${icon}/apps
ln -s $out/opt/brave.com/${optName}/product_logo_''${icon}.png $out/share/icons/hicolor/''${icon}x''${icon}/apps/${fileBase}.png
done
# Replace xdg-settings and xdg-mime
ln -sf ${xdg-utils}/bin/xdg-settings $out/opt/brave.com/brave/xdg-settings
ln -sf ${xdg-utils}/bin/xdg-mime $out/opt/brave.com/brave/xdg-mime
ln -sf ${xdg-utils}/bin/xdg-settings $out/opt/brave.com/${optName}/xdg-settings
ln -sf ${xdg-utils}/bin/xdg-mime $out/opt/brave.com/${optName}/xdg-mime
runHook postInstall
''
@@ -244,9 +271,9 @@ stdenv.mkDerivation {
mkdir -p $out/{Applications,bin}
cp -r . "$out/Applications/Brave Browser.app"
cp -r . "$out/Applications/${darwinApp}.app"
makeWrapper "$out/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" $out/bin/brave
makeWrapper "$out/Applications/${darwinApp}.app/Contents/MacOS/${darwinApp}" $out/bin/${pname}
runHook postInstall
'';
@@ -279,22 +306,33 @@ stdenv.mkDerivation {
installCheckPhase = ''
# Bypass upstream wrapper which suppresses errors
$out/opt/brave.com/brave/brave --version
$out/opt/brave.com/${optName}/brave --version
'';
passthru.updateScript = ./update.sh;
meta = {
homepage = "https://brave.com/";
description = "Privacy-oriented browser for Desktop and Laptop computers";
homepage = homepage;
description =
"Privacy-oriented browser for Desktop and Laptop computers"
+ lib.optionalString (flavor == "origin") " (Origin variant)";
changelog =
"https://github.com/brave/brave-browser/blob/master/CHANGELOG_DESKTOP.md#"
"https://github.com/brave/brave-browser/blob/master/${changelogFile}#"
+ lib.replaceStrings [ "." ] [ "" ] version;
longDescription = ''
Brave browser blocks the ads and trackers that slow you down,
chew up your bandwidth, and invade your privacy. Brave lets you
contribute to your favorite creators automatically.
'';
longDescription =
if flavor == "origin" then
''
Brave Origin is a stripped-down variant of the Brave browser that
removes most non-privacy features (rewards, wallet, AI, etc.) while
keeping the core privacy, adblock and Chromium-based browsing
experience.
''
else
''
Brave browser blocks the ads and trackers that slow you down,
chew up your bandwidth, and invade your privacy. Brave lets you
contribute to your favorite creators automatically.
'';
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.mpl20;
maintainers = with lib.maintainers; [
@@ -302,12 +340,9 @@ stdenv.mkDerivation {
jefflabonte
nasirhm
buckley310
rachalaraj
];
platforms = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
];
mainProgram = "brave";
platforms = builtins.attrNames archives;
mainProgram = if flavor == "origin" then "brave-origin" else "brave";
};
}
@@ -0,0 +1,21 @@
# Expression generated by update.sh; do not edit it by hand!
rec {
pname = "brave-origin";
version = "1.92.144";
flavor = "origin";
archives = {
aarch64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-origin_${version}_arm64.deb";
hash = "sha256-zqjpiBMogYhtuEhIlPlK8J2j9hzfd1M8RYlT/c74Na8=";
};
x86_64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-origin_${version}_amd64.deb";
hash = "sha256-KF5WXF7GJPLCcEQyASEVfNrYyFJRXBSyWVPPAZPCa/E=";
};
aarch64-darwin = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-origin-v${version}-darwin-arm64.zip";
hash = "sha256-kkP8cBRnC34+SjC9EvkpKcDYP3cxW7sdJgni0+zXwbk=";
};
};
}
@@ -0,0 +1,20 @@
# Expression generated by update.sh; do not edit it by hand!
rec {
pname = "brave";
version = "1.92.144";
archives = {
aarch64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_arm64.deb";
hash = "sha256-Z9uUJRaMx+P35oXtvAnjHyOQOXt8mW5oyyEtnD754x8=";
};
x86_64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb";
hash = "sha256-no/KD+3EB6CqvVWEmDB/8k2rv1wau469FBXMNWN7z6k=";
};
aarch64-darwin = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-v${version}-darwin-arm64.zip";
hash = "sha256-YidWCVGP36wn1goAulSbVrKFoHI1NA/pLtfPjIXBO48=";
};
};
}
+100
View File
@@ -0,0 +1,100 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl nix jq
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
VERSIONS_URL="https://versions.brave.com/latest/brave-versions.json"
sri_hash() {
nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "$1")"
}
find_release_with_asset() {
local versionsJson="$1" channel="$2" template="$3"
local match
match="$(
jq -c --arg channel "$channel" --arg tmpl "$template" '
[.[]
| select(.channel == $channel)
| . as $r
| select(
$r.github.assets
| map(.name)
| any(. == ($tmpl | gsub("\\$\\{version\\}"; $r.name)))
)
]
| sort_by(.published)
| last
' <<<"$versionsJson"
)"
if [[ "$match" != "null" ]]; then
printf '%s' "$match"
return 0
fi
echo "update.sh: no ${channel} release with asset matching '${template}' found" >&2
return 1
}
emit_archive_entry() {
local releaseJson="$1" version="$2" template="$3" platform="$4"
local name="${template//\$\{version\}/$version}"
local url
url="$(
jq -r --arg n "$name" '
.github.assets[]
| select(.name == $n)
| .download_url
' <<<"$releaseJson"
)"
if [[ -z "$url" ]]; then
return 0
fi
local hash
hash="$(sri_hash "$url")"
local nixUrl="${url//${version}/\$\{version\}}"
cat <<EOF
${platform} = {
url = "${nixUrl}";
hash = "${hash}";
};
EOF
}
write_package_nix() {
local pname="$1" releaseJson="$2" debStem="$3" darwinStem="$4"
local version
version="$(jq -r '.name' <<<"$releaseJson")"
echo "=> ${pname}: ${version}" >&2
local flavorLine=""
if [[ "$pname" == brave-origin || "$pname" == brave-origin-* ]]; then
flavorLine=' flavor = "origin";'
fi
local outFile="${SCRIPT_DIR}/packages/${pname}.nix"
{
echo '# Expression generated by update.sh; do not edit it by hand!'
echo 'rec {'
echo " pname = \"${pname}\";"
echo " version = \"${version}\";"
[[ -n "$flavorLine" ]] && echo "$flavorLine"
echo ''
echo ' archives = {'
emit_archive_entry "$releaseJson" "$version" "${debStem}_\${version}_arm64.deb" "aarch64-linux"
emit_archive_entry "$releaseJson" "$version" "${debStem}_\${version}_amd64.deb" "x86_64-linux"
emit_archive_entry "$releaseJson" "$version" "${darwinStem}-v\${version}-darwin-arm64.zip" "aarch64-darwin"
echo ' };'
echo '}'
} > "$outFile"
}
versionsJson="$(curl --fail -s "$VERSIONS_URL")"
entries=(
"brave brave-browser brave"
"brave-origin brave-origin brave-origin"
)
for entry in "${entries[@]}"; do
read -r pname debStem darwinStem <<<"$entry"
releaseJson="$(find_release_with_asset "$versionsJson" "release" "${debStem}_\${version}_amd64.deb")"
write_package_nix "$pname" "$releaseJson" "$debStem" "$darwinStem"
done
@@ -837,7 +837,7 @@
}
},
"ungoogled-chromium": {
"version": "150.0.7871.181",
"version": "150.0.7871.186",
"deps": {
"depot_tools": {
"rev": "f4fadaf6a5ba1bced9d3d9021060667b563bf583",
@@ -849,16 +849,16 @@
"hash": "sha256-/1A+DkzAQj2zGPe/A/G0Z3VrYJXUxq4Hd/+d/o5p3G8="
},
"ungoogled-patches": {
"rev": "150.0.7871.181-1",
"hash": "sha256-ifqEnOcvi49cFOYan8ShiwteXYnFrLPclrIBZiE1rGY="
"rev": "150.0.7871.186-1",
"hash": "sha256-kL9xE/w0W4Wf+z9qX5EFLGMYWQ3Hvyzhy7PtF59a/Sk="
},
"npmHash": "sha256-pF0JtwFpPC4/fodbhSJnQKkczA9WlDg4VqEAy9aDVLg="
},
"DEPS": {
"src": {
"url": "https://chromium.googlesource.com/chromium/src.git",
"rev": "24b04c927b23c39cf9c5227cc8dc6f64a744c8e9",
"hash": "sha256-F52wmxyNPEV26v8YgAz+MRhyEGyV7YUX+/wj95H4Lf0=",
"rev": "0fcdce5f4fdec8d442d7df760cb541f1ca6e446d",
"hash": "sha256-6coAYewN8RC5kx0PmmiV6mXQhLqWF3BZP320PmOcPvw=",
"recompress": true
},
"src/third_party/clang-format/script": {
@@ -45,11 +45,11 @@
"vendorHash": "sha256-031RZo1EqWrt79NvdrrZ9FW/E+mfwkGmr7wyMYX4SHg="
},
"aliyun_alicloud": {
"hash": "sha256-G52l+5WlcxSNflx0ioD0jEKI1GBWe5D4qW8VH8k6uTA=",
"hash": "sha256-es2ti8tSgShwUWYtZ7OEff88LLiAnK4B/Hq9PaNEEOc=",
"homepage": "https://registry.terraform.io/providers/aliyun/alicloud",
"owner": "aliyun",
"repo": "terraform-provider-alicloud",
"rev": "v1.285.0",
"rev": "v1.286.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-sZeXHTrMUUPllPzvpbFjwA5FjFJXnO1k5h9B5i8U+vs="
},
@@ -445,13 +445,13 @@
"vendorHash": "sha256-FcxAh8EOvnT8r1GHu0Oj2C5Jgbr2WPwD7/vY4/qIvTA="
},
"gitlabhq_gitlab": {
"hash": "sha256-BMOFi/g0W6xo/Kfqw8oqsMeeU3aXyWAKSgF9lIS4AbA=",
"hash": "sha256-eTtmEW3sdCkpojxshhdQq+8qNTYjzin5TmCGil/3F5E=",
"homepage": "https://registry.terraform.io/providers/gitlabhq/gitlab",
"owner": "gitlabhq",
"repo": "terraform-provider-gitlab",
"rev": "v19.1.0",
"rev": "v19.2.1",
"spdx": "MPL-2.0",
"vendorHash": "sha256-9aoJGVTC9t76auYy8K3QSWGzSAq9aTxemKNc3aCLjRY="
"vendorHash": "sha256-uEXZEYlQZ24h4IffJQEmqqrmHbiRSKVGJ1OCv4k1zVQ="
},
"go-gandi_gandi": {
"hash": "sha256-fsCtmwyxkXfOtiZG27VEb010jglK35yr4EynnUWlFog=",
@@ -905,13 +905,13 @@
"vendorHash": "sha256-t4dbDJNjEQ6/u+/6zqk2Sdd3LVn/L2BCJujpiLdGc58="
},
"metio_migadu": {
"hash": "sha256-Aef1H/L2EFeU9mhecOnlPAbJbt3XfBL0Wz67IqxCI10=",
"hash": "sha256-qeN2Zlx4qSrjb7qxjDf4v3uG1GR/faTiCNKD/HZkoyw=",
"homepage": "https://registry.terraform.io/providers/metio/migadu",
"owner": "metio",
"repo": "terraform-provider-migadu",
"rev": "2026.7.2",
"rev": "2026.7.23",
"spdx": "0BSD",
"vendorHash": "sha256-wUX2smEhKUftBCRi7ANq8NpHXpB+EmlVshrhI2ltY2I="
"vendorHash": "sha256-rwIHdtVVWygfxadoJigGBIUV0xoQ6vqDsHJgjYQ2RBM="
},
"mongey_kafka": {
"hash": "sha256-rTa6c7jAMH027V7h/yUGVGz6TS0PDdObilxU0Vpr6FI=",
@@ -13,7 +13,6 @@
gst_all_1,
gtk2,
gtk2-x11,
gtkspell2,
intltool,
lib,
libice,
@@ -94,7 +93,6 @@ let
]
++ lib.optionals stdenv.hostPlatform.isLinux [
gtk2
gtkspell2
farstream
]
++ lib.optional stdenv.hostPlatform.isDarwin gtk2-x11;
@@ -126,16 +124,14 @@ let
"--disable-nm"
"--disable-tcl"
"--disable-gevolution"
"--disable-gtkspell"
]
++ lib.optionals withCyrus_sasl [ "--enable-cyrus-sasl=yes" ]
++ lib.optionals withGnutls [
"--enable-gnutls=yes"
"--enable-nss=no"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
"--disable-gtkspell"
"--disable-vv"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ "--disable-vv" ]
++ lib.optionals stdenv.cc.isClang [ "CFLAGS=-Wno-error=int-conversion" ];
enableParallelBuilding = true;
@@ -78,8 +78,8 @@ rec {
thunderbird = thunderbird-latest;
thunderbird-latest = common {
version = "152.0.1";
sha512 = "f66c87de4dd73c3c45e420a55d76c3cb6ac091a61794ccf58ba59d1a40cf8001dee19a6a7f4c6bef7d36ea94ed4e4f677449d3006b2004abbd3fab42ad1c9228";
version = "153.0";
sha512 = "f77bde3dd0933dd35870a889386c41d55ff0cbe276ec3373b27e9885f7db7e35529e7ecc2fc149ae4f8c5ae53eddb3ad444e7499a850a59a82b8940c7a4c7747";
updateScript = callPackage ./update.nix {
attrPath = "thunderbirdPackages.thunderbird-latest";
@@ -89,6 +89,19 @@ rec {
# Eventually, switch to an updateScript without versionPrefix hardcoded...
thunderbird-esr = thunderbird-140;
thunderbird-153 = common {
applicationName = "Thunderbird ESR";
version = "153.0.1esr";
sha512 = "3773b49b69341aea108a627faa0dd5b7cfb52cdb4c37e625fbb8cbaef7f9166f925ecbc199173302d5bef7994e6bff3b56cd56a3a4c38a9d702cc3e5aeafcf7c";
updateScript = callPackage ./update.nix {
attrPath = "thunderbirdPackages.thunderbird-153";
versionPrefix = "153";
versionSuffix = "esr";
};
};
thunderbird-140 = common {
applicationName = "Thunderbird ESR";
@@ -12,13 +12,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "droidcam-obs";
version = "2.5.0";
version = "2.5.1";
src = fetchFromGitHub {
owner = "dev47apps";
repo = "droidcam-obs-plugin";
tag = finalAttrs.version;
hash = "sha256-JPAQoGZFzTIdBQ7GpCPaYUVPkkcBdCRFkVPU+nyRa7Q=";
hash = "sha256-T7CQrjQK5OV1bgqa2il9snsK7nScuVhV06NuX2SoIeI=";
};
preBuild = ''
@@ -97,6 +97,82 @@ let
buildPrefix = "Build/*/*";
isQemuPlatform = builtins.elem projectDscPath [
"OvmfPkg/OvmfPkgX64.dsc"
"ArmVirtPkg/ArmVirtQemu.dsc"
"OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc"
"OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc"
];
# QEMU firmware interop descriptors to install, keyed by file name.
# Add an attribute to ship an additional descriptor.
qemuDescriptors =
let
description = "${fwPrefix} UEFI firmware for ${cpuName}${lib.optionalString secureBoot " with Secure Boot"}";
flashMapping = varsFile: {
device = "flash";
mode = "split";
executable = {
filename = "${placeholder "fd"}/FV/${fwPrefix}_CODE.fd";
format = "raw";
};
nvram-template = {
filename = "${placeholder "fd"}/FV/${varsFile}";
format = "raw";
};
};
common = {
interface-types = [ "uefi" ];
targets = [
{
architecture = cpuName;
machines =
{
x86_64 =
if systemManagementModeRequired then
[ "pc-q35-*" ]
else
[
"pc-i440fx-*"
"pc-q35-*"
];
aarch64 = [ "virt-*" ];
riscv64 = [ "virt*" ];
loongarch64 = [ "virt*" ];
}
.${cpuName} or [ ];
}
];
features =
lib.optionals stdenv.hostPlatform.isx86 [
"acpi-s3"
"amd-sev"
]
++ lib.optionals (stdenv.hostPlatform.isx86 && !systemManagementModeRequired) [ "amd-sev-es" ]
++ lib.optionals secureBoot [ "secure-boot" ]
++ lib.optionals systemManagementModeRequired [ "requires-smm" ]
++ lib.optionals (stdenv.hostPlatform.isx86 && !debug) [ "verbose-dynamic" ];
tags = [ ];
};
in
lib.optionalAttrs isQemuPlatform (
{
"50-edk2-${cpuName}${lib.optionalString secureBoot "-sb"}.json" = common // {
inherit description;
mapping = flashMapping "${fwPrefix}_VARS.fd";
};
}
// lib.optionalAttrs msVarsTemplate {
"40-edk2-${cpuName}${lib.optionalString secureBoot "-sb"}-enrolled.json" = common // {
description = "${description}, Microsoft keys enrolled";
mapping = flashMapping "${fwPrefix}_VARS.ms.fd";
features = common.features ++ [ "enrolled-keys" ];
};
}
);
in
assert msVarsTemplate -> fdSize4MB;
@@ -242,7 +318,17 @@ edk2.mkDerivation projectDscPath (finalAttrs: {
mkdir -vp $fd/AAVMF
ln -s $fd/FV/AAVMF_CODE.fd $fd/AAVMF/QEMU_EFI-pflash.raw
ln -s $fd/FV/AAVMF_VARS.fd $fd/AAVMF/vars-template-pflash.raw
'';
''
+ lib.optionalString (qemuDescriptors != { }) ''
mkdir -vp $fd/share/qemu/firmware
''
+ lib.concatStrings (
lib.mapAttrsToList (name: descriptor: ''
python3 -m json.tool > $fd/share/qemu/firmware/${name} <<'EOF'
${builtins.toJSON descriptor}
EOF
'') qemuDescriptors
);
dontPatchELF = true;
@@ -143,6 +143,27 @@ let
hash = mobyHash;
};
extraMobyPath = lib.optionals stdenv.hostPlatform.isLinux (
lib.makeBinPath [
iproute2
iptables
e2fsprogs
xz
xfsprogs
procps
util-linuxMinimal
gitMinimal
]
);
extraMobyUserPath = lib.optionals (stdenv.hostPlatform.isLinux && !clientOnly) (
lib.makeBinPath [
rootlesskit
slirp4netns
fuse-overlayfs
]
);
moby = buildGoModule (
lib.optionalAttrs stdenv.hostPlatform.isLinux {
pname = "moby";
@@ -170,27 +191,6 @@ let
++ lib.optionals withSystemd [ systemd ]
++ lib.optionals withSeccomp [ libseccomp ];
extraPath = lib.optionals stdenv.hostPlatform.isLinux (
lib.makeBinPath [
iproute2
iptables
e2fsprogs
xz
xfsprogs
procps
util-linuxMinimal
gitMinimal
]
);
extraUserPath = lib.optionals (stdenv.hostPlatform.isLinux && !clientOnly) (
lib.makeBinPath [
rootlesskit
slirp4netns
fuse-overlayfs
]
);
postPatch = ''
patchShebangs hack/make.sh hack/make/
''
@@ -218,7 +218,9 @@ let
install -Dm755 ./bundles/dynbinary-daemon/docker-proxy $out/libexec/docker/docker-proxy
makeWrapper $out/libexec/docker/dockerd $out/bin/dockerd \
--prefix PATH : "$out/libexec/docker:$extraPath"
--prefix PATH : "$out/libexec/docker${
lib.optionalString (extraMobyPath != "") ":${extraMobyPath}"
}"
ln -s ${docker-containerd}/bin/containerd $out/libexec/docker/containerd
ln -s ${docker-containerd}/bin/containerd-shim${lib.optionalString (lib.versionAtLeast version "29.0.0") "-runc-v2"} $out/libexec/docker/containerd-shim${lib.optionalString (lib.versionAtLeast version "29.0.0") "-runc-v2"}
@@ -233,7 +235,9 @@ let
# rootless Docker
install -Dm755 ./contrib/dockerd-rootless.sh $out/libexec/docker/dockerd-rootless.sh
makeWrapper $out/libexec/docker/dockerd-rootless.sh $out/bin/dockerd-rootless \
--prefix PATH : "$out/libexec/docker:$extraPath:$extraUserPath"
--prefix PATH : "$out/libexec/docker${
lib.optionalString (extraMobyPath != "") ":${extraMobyPath}"
}${lib.optionalString (extraMobyUserPath != "") ":${extraMobyUserPath}"}"
runHook postInstall
'';
@@ -335,7 +339,7 @@ let
install -Dm755 ./build/docker $out/libexec/docker/docker
makeWrapper $out/libexec/docker/docker $out/bin/docker \
--prefix PATH : "$out/libexec/docker:$extraPath" \
--prefix PATH : "$out/libexec/docker" \
--prefix DOCKER_CLI_PLUGIN_DIRS : "${dockerCliPluginsDirs}"
''
+ lib.optionalString (!clientOnly) ''
@@ -7,13 +7,13 @@
mkHyprlandPlugin (finalAttrs: {
pluginName = "hypr-darkwindow";
version = "0.55.4";
version = "0.56.0";
src = fetchFromGitHub {
owner = "micha4w";
repo = "Hypr-DarkWindow";
tag = "v${finalAttrs.version}";
hash = "sha256-91l5TD46OMfvmhd1WqWxm42cEnjR1yAj2Qk/73mr3ks=";
hash = "sha256-2upGTy7IRhrhxf+5VPjzrua8ebOtED6i8kSN8ka+ffg=";
};
installPhase = ''
@@ -349,6 +349,7 @@ runCommandLocal name
inherit nativeBuildInputs;
__structuredAttrs = true;
strictDeps = true;
passthru = passthru // {
env =
@@ -122,7 +122,8 @@ in
stdenvNoCC.mkDerivation (
{
name = baseNameOf src;
name =
if (attrs ? pname && attrs ? version) then "${attrs.pname}-${attrs.version}" else baseNameOf src;
}
// optionalAttrs
// forcedAttrs
@@ -1,81 +0,0 @@
From 081d9c3284075c65b70837079bd67621c3b64da7 Mon Sep 17 00:00:00 2001
From: Moraxyc <i@qaq.li>
Date: Sun, 28 Dec 2025 00:39:49 +0800
Subject: [PATCH] fix build with c23
---
libAfterBase/fs.c | 2 +-
src/ASDocGen/ASDocGen.c | 2 +-
src/Ident/Ident.c | 2 +-
src/afterstep/dirtree.c | 2 +-
src/afterstep/menus.h | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/libAfterBase/fs.c b/libAfterBase/fs.c
index 731bfd3..954bfd6 100644
--- a/libAfterBase/fs.c
+++ b/libAfterBase/fs.c
@@ -818,7 +818,7 @@ my_scandir (char *dirname, struct direntry *(*namelist[]),
}
/* Optionally sort the list */
if (dcomp)
- qsort (*namelist, n, sizeof (struct direntry *), (int (*)())dcomp);
+ qsort (*namelist, n, sizeof (struct direntry *), (int (*)(const void *, const void *))dcomp);
/* Return the count of the entries */
return n;
diff --git a/src/ASDocGen/ASDocGen.c b/src/ASDocGen/ASDocGen.c
index 31d7a70..9a86219 100644
--- a/src/ASDocGen/ASDocGen.c
+++ b/src/ASDocGen/ASDocGen.c
@@ -667,7 +667,7 @@ write_options_keywords(const char *source_dir, const char *syntax_dir, SyntaxDef
sorted_list = safecalloc( max_i, sizeof(TermDef*));
for (i = 0; i < max_i; i++)
sorted_list[i] = &(syntax->terms[i]) ;
- qsort(sorted_list, max_i, sizeof(TermDef*), (int (*)())sort_terms_by_alpha );
+ qsort(sorted_list, max_i, sizeof(TermDef*), (int (*)(const void *, const void *))sort_terms_by_alpha );
for (i = 0; i < max_i; i++)
{
SyntaxDef *sub_syntax = sorted_list[i]->sub_syntax ;
diff --git a/src/Ident/Ident.c b/src/Ident/Ident.c
index 1497d06..d6ddad6 100644
--- a/src/Ident/Ident.c
+++ b/src/Ident/Ident.c
@@ -89,7 +89,7 @@ void HandleEvents();
void DispatchEvent (ASEvent * event);
void process_message (send_data_type type, send_data_type *body);
-Window make_ident_window();
+Window make_ident_window(int width, int height);
void fill_window_data();
void display_window_data();
void add_property( const char *name, const char *value, unsigned long value_encoding, Bool span_cols );
diff --git a/src/afterstep/dirtree.c b/src/afterstep/dirtree.c
index 46ce782..48f7e30 100644
--- a/src/afterstep/dirtree.c
+++ b/src/afterstep/dirtree.c
@@ -675,7 +675,7 @@ void dirtree_sort (dirtree_t * tree)
list = (dirtree_t **) safemalloc (n * sizeof (dirtree_t *));
for (n = 0, t = tree->child; t != NULL; t = t->next, n++)
list[n] = t;
- qsort (list, n, sizeof (dirtree_t *), (int (*)())dirtree_compar);
+ qsort (list, n, sizeof (dirtree_t *), (int (*)(const void *, const void *))dirtree_compar);
tree->child = list[0];
for (i = 1; i < n; i++)
list[i - 1]->next = list[i];
diff --git a/src/afterstep/menus.h b/src/afterstep/menus.h
index 98b2ad3..bb2a5b1 100644
--- a/src/afterstep/menus.h
+++ b/src/afterstep/menus.h
@@ -95,7 +95,7 @@ MenuData* FindPopup( const char* name, int quiet );
void DeleteMenuItem( MenuDataItem* item );
-MenuData *CreateMenuData();
+MenuData *CreateMenuData(char *name);
MenuData *NewMenuData (char *name);
void DeleteMenuData (MenuData * menu);
--
2.51.2
-101
View File
@@ -1,101 +0,0 @@
{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
dbus,
fltk_1_3,
gtk2,
libice,
libsm,
libtiff,
pkg-config,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "afterstep";
version = "2.2.12";
src = fetchFromGitHub {
owner = "afterstep";
repo = "afterstep";
rev = finalAttrs.version;
hash = "sha256-j1ADTRZ3Mxv9VNZWhWCFMnM/CJfkphdrgbw9Ca3bBw0=";
};
patches = [
(fetchpatch {
url = "https://salsa.debian.org/debian/afterstep/raw/master/debian/patches/44-Fix-build-with-gcc-5.patch";
hash = "sha256-RNLB6PuFVA1PsYt2VwLyLyvY2OO3oIl1xk+0/6nwN+4=";
})
# Fix pending upstream inclusion for binutils-2.36 support:
# https://github.com/afterstep/afterstep/pull/7
(fetchpatch {
name = "binutils-2.36.patch";
url = "https://github.com/afterstep/afterstep/commit/5e9e897cf8c455390dd6f5b27fec49707f6b9088.patch";
hash = "sha256-aGMTyojzXEHGjO9lMT6dwLl01Fd333BUuCIX0FU9ac4=";
})
# fix build with c23
# fs.c:821:66: error: passing argument 4 of 'qsort' from incompatible pointer type [-Wincompatible-pointer-types]
# Ident.c:326:1: error: conflicting types for 'make_ident_window'; have 'Window(int, int)' {aka 'long unsigned int(int, int)'}
# menuitem.c:85:11: error: conflicting types for 'CreateMenuData'; have 'MenuData *(char *)'
./fix-build-with-c23.patch
];
postPatch = ''
# Causes fatal ldconfig cache generation attempt on non-NixOS Linux
for mkfile in autoconf/Makefile.common.lib.in libAfter{Base,Image}/Makefile.in; do
substituteInPlace $mkfile \
--replace-fail 'test -w /etc' 'false'
done
'';
nativeBuildInputs = [
pkg-config
];
buildInputs = [
dbus
fltk_1_3
gtk2
libice
libsm
libtiff
];
outputs = [
"out"
"man"
];
strictDeps = true;
preConfigure = ''
# A strange type of bug: dbus is not immediately found by pkg-config
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE $(pkg-config dbus-1 --cflags)"
'';
# Parallel build fails due to missing dependencies between private libraries:
# ld: cannot find ../libAfterConf/libAfterConf.a: No such file or directory
# Let's disable parallel builds until it's fixed upstream:
# https://github.com/afterstep/afterstep/issues/8
enableParallelBuilding = false;
meta = {
homepage = "http://www.afterstep.org/";
description = "NEXTStep-inspired window manager";
longDescription = ''
AfterStep is a window manager for the Unix X Window System. Originally
based on the look and feel of the NeXTStep interface, it provides end
users with a consistent, clean, and elegant desktop. The goal of AfterStep
development is to provide for flexibility of desktop configuration,
improving aestetics, and efficient use of system resources.
'';
license = lib.licenses.gpl2Plus;
maintainers = [ ];
mainProgram = "afterstep";
platforms = lib.platforms.linux;
};
})
+5 -6
View File
@@ -15,12 +15,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "algol68g";
version = "3.12.2";
version = "3.12.3";
src = fetchurl {
# Uses archive.org because the original site removes older versions.
url = "https://web.archive.org/web/20260515052918/https://algol68genie.nl/algol68g-3.12.2.tar.gz";
hash = "sha256-4fiubqpgoH3YOlCg1bJHQ3kOayKNulW3CYbOK1awE7k";
url = "https://algol68genie.nl/algol68g-${finalAttrs.version}.tar.gz";
hash = "sha256-TS5m+Byi+5j4jiOuQbR159QERfNJsQiGNngtoyC9IrE=";
};
outputs = [
@@ -48,8 +47,8 @@ stdenv.mkDerivation (finalAttrs: {
postInstall =
let
pdfdoc = fetchurl {
url = "https://web.archive.org/web/20260503174213/https://algol68genie.nl/learning-algol-68-genie.pdf";
hash = "sha256-eLMRf3XcAkr/Dmk7ieRe62x76VcCj+2QltHH7YtL15s=";
url = "https://algol68genie.nl/learning-algol-68-genie.pdf";
hash = "sha256-BrVjYXd5sknV0+UCRgQMf0H3QMzMQcLhytEEuiTGkLE=";
};
in
lib.optionalString withPDFDoc ''
+3 -3
View File
@@ -12,16 +12,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "alistral";
version = "0.6.7";
version = "0.6.8";
src = fetchFromGitHub {
owner = "RustyNova016";
repo = "Alistral";
tag = "v${finalAttrs.version}";
hash = "sha256-XsN4UyIXkd0YVtO/q9EcFP/sBYkH9leISmbJZ93ef6E=";
hash = "sha256-NDWQl2Gq4Q0OMMCrHQhybInaJRjY3Fxe3GXrGb32MMY=";
};
cargoHash = "sha256-KFNFioZ/5moC5FNXw+hA+NrPjsqu+3V8A5mtZ4FZUHw=";
cargoHash = "sha256-QxTmjtntp5zy7UijRn0hF3DyOOl3dIpZjPSASCuHaEk=";
buildNoDefaultFeatures = true;
# Would be cleaner with an "--all-features" option
@@ -7,16 +7,16 @@
buildNpmPackage rec {
pname = "all-the-package-names";
version = "2.0.2503";
version = "2.0.2511";
src = fetchFromGitHub {
owner = "nice-registry";
repo = "all-the-package-names";
tag = "v${version}";
hash = "sha256-UtwbQXhX8dmmA6dVuVFcMQkM98kOt/U//OAVMGBImDU=";
hash = "sha256-KnEvFnPXQZ+XhNyweWIE0mjM4vqcqXcJKuus/dFq5f0=";
};
npmDepsHash = "sha256-V7MWSEJT2RtYE1iYJHj2ltrfzke+GO1PfT/wo+MqlZk=";
npmDepsHash = "sha256-Xw/SXRpQkPd+EcemeHO89tC9amDiVV/RD/1H0H8rax0=";
passthru.updateScript = nix-update-script { };
+6 -4
View File
@@ -15,21 +15,21 @@
buildGoModule (finalAttrs: {
pname = "anubis";
version = "1.25.0";
version = "1.26.0";
src = fetchFromGitHub {
owner = "TecharoHQ";
repo = "anubis";
tag = "v${finalAttrs.version}";
hash = "sha256-9/XIwSMEmnS3L/Wzg6ABso7R6W3TYkJomC8aFMycxZo=";
hash = "sha256-0ceF4Te0H5edBhvGJgGc/NLJxEAcDVGnnKlqHKnpW60=";
};
vendorHash = "sha256-9CMD8Rn4q8b+hyrph+BqqS32ijZyJRNsop6ML7z5Zuk=";
vendorHash = "sha256-+NPwL4p0p/s74m1Ld0z2GEcsWk5FqhcLbHrTNP3yEzk=";
npmDeps = fetchNpmDeps {
name = "anubis-npm-deps";
inherit (finalAttrs) src;
hash = "sha256-2U91Dt+ymspjYgTtgCjahCNr6fIs85TT/k+I8M2aC9s=";
hash = "sha256-6sj9C8GHm+RzFl/X5HIPhIDl5l8muBzDSXSRCHumGBs=";
};
nativeBuildInputs = [
@@ -75,6 +75,8 @@ buildGoModule (finalAttrs: {
export DONT_USE_NETWORK=1
'';
__darwinAllowLocalNetworking = true;
passthru = {
tests = { inherit (nixosTests) anubis; };
updateScript = nix-update-script { extraArgs = [ "--version-regex=^v(\\d+\\.\\d+\\.\\d+)$" ]; };
-1
View File
@@ -9,7 +9,6 @@
let
opencv4WithGtk = python3Packages.opencv4.override {
enableGtk2 = true; # For GTK2 support
enableGtk3 = true; # For GTK3 support
};
in
+1 -1
View File
@@ -6,7 +6,7 @@
rustPlatform.buildRustPackage {
pname = "as-tree";
version = "unstable-2021-03-09";
version = "0.12.0-unstable-2021-03-09";
src = fetchFromGitHub {
owner = "jez";
+3 -3
View File
@@ -10,16 +10,16 @@
buildGoModule (finalAttrs: {
pname = "assh";
version = "2.17.2";
version = "2.17.3";
src = fetchFromGitHub {
repo = "assh";
owner = "moul";
tag = "v${finalAttrs.version}";
hash = "sha256-/w4RluA7py6d75S04czNsgHpmR5rmAUZx8OnZfu9oNg=";
hash = "sha256-CH6QM/dy5fKo7Tq2ekrc06iqjJDZl8JHMG7jalho7BI=";
};
vendorHash = "sha256-EA39KqAN9SHPU362j6/j6okvT+eZb2R4unMA0bB+bVg=";
vendorHash = "sha256-ENCJNgMLTZDlKL0DIt48F1G8TYo2blPdsFH6v8dNC8w=";
ldflags = [
"-s"
+4 -3
View File
@@ -12,16 +12,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "aube";
version = "1.29.1";
version = "1.32.0";
src = fetchFromGitHub {
owner = "jdx";
repo = "aube";
tag = "v${finalAttrs.version}";
hash = "sha256-87r9qltKUhjnYG9O484OUzKFiO8Xoge9VZ13l6RgrdA=";
hash = "sha256-0BnaxRk6+KY4AGZ31lis0zxc9uWp3OrxCgp9SgOrqNI=";
};
cargoHash = "sha256-Cy5Ea/rF2IJ5WppKKI7E1toy9N+bQEArVW9o2pHzBMc=";
cargoHash = "sha256-vYbbnEpVWG6kjnycl1kk3D+lXuzTzOKuilA0ImBHYAI=";
nativeBuildInputs = [ cmake ]; # libz-ng-sys
@@ -36,6 +36,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
checkFlags = [
# failed on x86_64-linux
"--skip=concurrency::tests::floor_and_ceiling_inclusive"
"--skip=http::ticket_cache::tests::max_per_host_evicts_oldest"
"--skip=http::ticket_cache::tests::invalidate_removes_all_for_host"
# require network access
@@ -7,16 +7,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "automatic-timezoned";
version = "2.0.143";
version = "2.0.149";
src = fetchFromGitHub {
owner = "maxbrunet";
repo = "automatic-timezoned";
rev = "v${finalAttrs.version}";
sha256 = "sha256-bbdhvQ9THiBRf1rLExXQiwlrkgZBFZlaV2CUszDmwo4=";
sha256 = "sha256-FQ4SJcHkdNJcZOncY0BHg+CwnUcyszzfYPCUhWZHhi0=";
};
cargoHash = "sha256-J7h1hVp8wK6UlkstcLCq4uMKJ9ZyLwGR75tcxpWnHT8=";
cargoHash = "sha256-4+gNtQrlaDrSCUFEIByFUQnITSkF9Mo9bq6Ug9d7t1w=";
nativeInstallCheckInputs = [ versionCheckHook ];
+3 -3
View File
@@ -11,13 +11,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "autoprefixer";
version = "10.5.3";
version = "10.5.4";
src = fetchFromGitHub {
owner = "postcss";
repo = "autoprefixer";
tag = finalAttrs.version;
hash = "sha256-hjckcgWojItp2gseQI18zzxizjw/HxQPiTb/JegSCcs=";
hash = "sha256-616VFB6qJiNfsDsaxR4Y+xoqKDrBOtKgWfGMeiaDeGQ=";
};
nativeBuildInputs = [
@@ -30,7 +30,7 @@ stdenv.mkDerivation (finalAttrs: {
inherit (finalAttrs) pname version src;
pnpm = pnpm_10;
fetcherVersion = 4;
hash = "sha256-diOgX9lXKOwCx9V737mmmtrhqDg5beXJH/PjlJHFpto=";
hash = "sha256-+EPzrG2vt2FRIwcJqwwiYPevQFCNAbX7kgFlY+vLbqE=";
};
installPhase = ''
+3 -3
View File
@@ -7,16 +7,16 @@
}:
buildGoModule (finalAttrs: {
pname = "aztfexport";
version = "0.19.0";
version = "0.20.0";
src = fetchFromGitHub {
owner = "Azure";
repo = "aztfexport";
tag = "v${finalAttrs.version}";
hash = "sha256-97lahgEsth2YUeqTe8J58brykpFV0lG6KwB7FJgODAE=";
hash = "sha256-wHI/osu2Jq85zCgh1HfOTuO81mYtQJcSbvlDnXd7Duc=";
};
vendorHash = "sha256-4u40PdRT3E+BZ8bIrnIgRnJkpws6EPK5DRyXu9oY7hc=";
vendorHash = "sha256-QDpoOlu1qGNK0ennplusXBgeQWZP3EH7aSStllP8uzw=";
ldflags = [
"-s"
+82
View File
@@ -0,0 +1,82 @@
{
lib,
stdenv,
fetchzip,
autoPatchelfHook,
azure-cli,
makeWrapper,
}:
let
version = "3.0.0-beta.10";
srcs = {
x86_64-linux = {
url = "https://github.com/microsoft/mcp/releases/download/Azure.Mcp.Server-${version}/Azure.Mcp.Server-linux-x64-native.zip";
hash = "sha256-2wrpyTVunT54dYD1ascVDRTW2AN5NpoV+q3UUt5dQSg=";
};
aarch64-linux = {
url = "https://github.com/microsoft/mcp/releases/download/Azure.Mcp.Server-${version}/Azure.Mcp.Server-linux-arm64.zip";
hash = "sha256-K1QRpj5/RzZx2mrmtnB5lGX9CoaAC+pRVGqqHtXWncY=";
};
x86_64-darwin = {
url = "https://github.com/microsoft/mcp/releases/download/Azure.Mcp.Server-${version}/Azure.Mcp.Server-osx-x64.zip";
hash = "sha256-ebT6sipbA7IdGx98kF/8GLpHL1fVSVqnmL4rEwsa43k=";
};
aarch64-darwin = {
url = "https://github.com/microsoft/mcp/releases/download/Azure.Mcp.Server-${version}/Azure.Mcp.Server-osx-arm64.zip";
hash = "sha256-33rg+fnIB/VJZbVKTP7b8829BbcDnfnaYFMOyPLFzEw=";
};
};
unavailable = throw "azure-mcp package is not available for this platform.";
src = fetchzip {
inherit (srcs.${stdenv.hostPlatform.system} or unavailable) url hash;
stripRoot = false;
};
in
stdenv.mkDerivation {
pname = "azure-mcp";
inherit version src;
strictDeps = true;
__structuredAttrs = true;
nativeBuildInputs = [
makeWrapper
]
++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ];
buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
stdenv.cc.cc.lib
];
dontConfigure = true;
dontBuild = true;
installPhase = ''
runHook preInstall
install -Dm755 ./azmcp $out/bin/azure-mcp
wrapProgram $out/bin/azure-mcp \
--prefix PATH : ${lib.makeBinPath [ azure-cli ]}
runHook postInstall
'';
meta = {
description = "Model Context Protocol server for Azure services";
longDescription = ''
The Azure MCP Server implements the Model Context Protocol (MCP)
specification to create a seamless connection between AI agents and
Azure services. It provides 321+ tools for interacting with Azure
resources including storage, compute, databases, and more.
'';
homepage = "https://github.com/microsoft/mcp";
changelog = "https://github.com/microsoft/mcp/blob/Azure.Mcp.Server-${version}/servers/Azure.Mcp.Server/CHANGELOG.md";
license = lib.licenses.mit;
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
platforms = lib.attrNames srcs;
mainProgram = "azure-mcp";
maintainers = with lib.maintainers; [ sheeeng ];
};
}
+2 -2
View File
@@ -8,13 +8,13 @@
buildGoModule (finalAttrs: {
pname = "azurehound";
version = "2.12.2";
version = "3.0.0";
src = fetchFromGitHub {
owner = "SpecterOps";
repo = "AzureHound";
tag = "v${finalAttrs.version}";
hash = "sha256-w8PmSt+QvU0HELkgdYLfIUgK3R5vCYzlPbMyrHztiPw=";
hash = "sha256-4uc4XSjvuMUSeCsJl9uHBFIaeG1KZ1xDaACXnXkp7v0=";
};
vendorHash = "sha256-WF46wXaNU/Em0KpF6hkuuJ+7K1IKLGqpNS/HxpxX5WY=";
+10
View File
@@ -2,6 +2,7 @@
lib,
python3Packages,
fetchPypi,
fetchgit,
patatt,
}:
@@ -31,6 +32,15 @@ python3Packages.buildPythonApplication (finalAttrs: {
textual
];
passthru = {
src-misc = fetchgit {
url = "https://git.kernel.org/pub/scm/utils/b4/b4.git";
rev = "v${finalAttrs.version}";
hash = "sha256-NjYL3RKQpjDkU98qbXyl/cvLTJYVAfIowm8E2Rg8AgI=";
fetchSubmodules = false;
};
};
meta = {
homepage = "https://git.kernel.org/pub/scm/utils/b4/b4.git/about";
license = lib.licenses.gpl2Only;
+2 -2
View File
@@ -20,13 +20,13 @@ let
in
buildBazelPackage rec {
pname = "bant";
version = "0.3.0";
version = "0.3.3";
src = fetchFromGitHub {
owner = "hzeller";
repo = "bant";
rev = "v${version}";
hash = "sha256-T/BQRYCFAHkaGi5T485I9vbr3g7PzgIEHC27w6mg/3A=";
hash = "sha256-6c403+DK1tcQxC16FKEtdhnJEA9LJl8H8Usnw08FBnA=";
};
bazelFlags = [
+3 -3
View File
@@ -6,16 +6,16 @@
buildGoModule (finalAttrs: {
pname = "bazel-remote";
version = "2.6.1";
version = "2.6.2";
src = fetchFromGitHub {
owner = "buchgr";
repo = "bazel-remote";
rev = "v${finalAttrs.version}";
hash = "sha256-9vPaTm/HTJ3ftlFg+AkcwXX7xyhmGTgKL3PXhtUHRDk=";
hash = "sha256-wE0l1tBtj44l1Eamd4wCHzjnPhT7W5yZ5MkTA5cOUrg=";
};
vendorHash = "sha256-uh8ST1AQ8OsFMfXly23TMMcheNmhb1MknmPMjB76GIQ=";
vendorHash = "sha256-DGyGQLEAwy79ibWGxAWa7gmaXTajcW3jqGJou2Wnykc=";
subPackages = [ "." ];
+3 -3
View File
@@ -8,17 +8,17 @@
buildGoModule (finalAttrs: {
pname = "bento";
version = "1.18.1";
version = "1.19.0";
src = fetchFromGitHub {
owner = "warpstreamlabs";
repo = "bento";
tag = "v${finalAttrs.version}";
hash = "sha256-KIlCHOAHShOwrxO9F414PQ07+SzCWhpo8auhyjkuNZA=";
hash = "sha256-3ZISLZzh8FYAE9riZ5Ya5h3LhwzHK4a5jJl8jeHiNoA=";
};
proxyVendor = true;
vendorHash = "sha256-uzB98AiJKw9TCbKSdQDiztfw7nIT0mVt80JALAPp2Aw=";
vendorHash = "sha256-h9bH5aewbDAuOVAps3TMihjCITFiBT/bbqNJCUT0NN8=";
subPackages = [
"cmd/bento"
+4 -4
View File
@@ -1,8 +1,8 @@
# Generated by ./update.sh - do not update manually!
# Generated by ./update.sh
{
version = "1.10.3";
deb-hash = "sha256-kzLtadq8gfX6j9XU3PD5kNV43wLDoICPlXdJqULkAWE=";
sig-hash = "sha256-+51j+SBp7buukop1T4Gz0YDUga6540BVxDRoU2YE3pY=";
version = "1.10.4";
deb-hash = "sha256-rOFbiuEbeO2qZntUhO+LNhwX6XlvWRU9v0HIAjyHwd8=";
sig-hash = "sha256-3fAGauXHA8S+XIuHeOIFxp7TsXd1LdqFg8hpWIU4P7k=";
key-E222AA02-hash = "sha256-Ue/UmS6F440/ybEEIAR+pdPEIksAt6QSMN6G5TZVWzc=";
key-4A133008-hash = "sha256-UijG3DkJNNTakVJd2wl30mDepa27n6R/Xxfl4sjt0sk=";
key-387C8307-hash = "sha256-PrRYZLT0xv82dUscOBgQGKNf6zwzWUDhriAffZbNpmI=";
@@ -1,8 +1,8 @@
diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts
index 791b4d6f88..dfee0bbf8d 100644
--- a/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts
+++ b/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts
@@ -115,7 +115,7 @@ export default class OsBiometricsServiceLinux implements OsBiometricService {
diff --git a/apps/desktop/src/key-management/biometrics/native-v2/os-biometrics-linux.service.ts b/apps/desktop/src/key-management/biometrics/native-v2/os-biometrics-linux.service.ts
index 110db23ec79..dfaf600bcdf 100644
--- a/apps/desktop/src/key-management/biometrics/native-v2/os-biometrics-linux.service.ts
+++ b/apps/desktop/src/key-management/biometrics/native-v2/os-biometrics-linux.service.ts
@@ -83,7 +83,7 @@ export default class OsBiometricsServiceLinux implements OsBiometricService {
// The user needs to manually set up the polkit policy outside of the sandbox
// since we allow access to polkit via dbus for the sandboxed clients, the authentication works from
// the sandbox, once the policy is set up outside of the sandbox.
@@ -10,4 +10,4 @@ index 791b4d6f88..dfee0bbf8d 100644
+ return false;
}
async osBiometricsSetup(): Promise<void> {
async runSetup(): Promise<void> {
@@ -5,14 +5,14 @@
copyDesktopItems,
dart-sass,
darwin,
electron_39,
electron_41,
fetchFromGitHub,
gnome-keyring,
jq,
makeDesktopItem,
makeWrapper,
nix-update-script,
nodejs_22,
nodejs_24,
pkg-config,
rustc,
rustPlatform,
@@ -22,17 +22,17 @@
let
icon = "bitwarden";
electron = electron_39;
electron = electron_41;
in
buildNpmPackage (finalAttrs: {
pname = "bitwarden-desktop";
version = "2026.6.1";
version = "2026.7.0";
src = fetchFromGitHub {
owner = "bitwarden";
repo = "clients";
tag = "desktop-v${finalAttrs.version}";
hash = "sha256-ee+C58Y5pZWEmqbRO/w7rdY+e6gy4EL7Sn0S1AxGMXI=";
hash = "sha256-E4glf4G70BuT0GYu1kEb5Z9B76ElIlDPe1rdGSdmCzo=";
};
patches = [
@@ -64,7 +64,7 @@ buildNpmPackage (finalAttrs: {
rm -r apps/cli
'';
nodejs = nodejs_22;
nodejs = nodejs_24;
makeCacheWritable = true;
npmFlags = [
@@ -74,7 +74,7 @@ buildNpmPackage (finalAttrs: {
npmWorkspace = "apps/desktop";
npmDepsFetcherVersion = 3;
npmDepsHash = "sha256-C5GLei/WWetd4qLv7obBJWbQR9LBy+Sqdbjko3/W7VY=";
npmDepsHash = "sha256-8wjt5wnJG4S4EeGWGxbo6Bwt76GIqrSiwqwwwQ17Y5Y=";
cargoDeps = rustPlatform.fetchCargoVendor {
inherit (finalAttrs)
@@ -84,7 +84,7 @@ buildNpmPackage (finalAttrs: {
cargoRoot
patches
;
hash = "sha256-xyK3+z2yfCG9K5XAB6LNEeyqMRknONi6ZfY/3oko7Z8=";
hash = "sha256-PLfR+yS+MtscRRuyLaK/qIWJVDoefhOobev1fpNeHNo=";
};
cargoRoot = "apps/desktop/desktop_native";
@@ -197,7 +197,7 @@ buildNpmPackage (finalAttrs: {
# Extract the polkit policy file from the multiline string in the source code.
# This may break in the future but its better than copy-pasting it manually.
mkdir -p $out/share/polkit-1/actions/
pushd apps/desktop/src/key-management/biometrics
pushd apps/desktop/src/key-management/biometrics/native-v2
awk '/const polkitPolicy = `/{gsub(/^.*`/, ""); print; str=1; next} str{if (/`;/) str=0; gsub(/`;/, ""); print}' os-biometrics-linux.service.ts > $out/share/polkit-1/actions/com.bitwarden.Bitwarden.policy
popd
+3 -3
View File
@@ -7,16 +7,16 @@
buildGoModule (finalAttrs: {
pname = "bobgen";
version = "0.48.0";
version = "0.49.0";
src = fetchFromGitHub {
owner = "stephenafamo";
repo = "bob";
tag = "v${finalAttrs.version}";
hash = "sha256-iD9GPYBt1s6xx4vNRlArERmv5AyBR6Q4mLLDNDWy1qY=";
hash = "sha256-5uwYw5CraOBUG55MIWa9I6GGIdJz/K+OXHIjOrjFuTQ=";
};
vendorHash = "sha256-tL6f8XkAsBL76idEVxlAAcdYyzo9Rh9fEHy6ysfZWG8=";
vendorHash = "sha256-fQmhAuxl23jRGJ4ysKh9QiiA8dtZlM37dE9aBXrYwao=";
subPackages = [
"gen/bobgen-sql"
+3 -3
View File
@@ -12,16 +12,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "bottom";
version = "0.14.4";
version = "0.14.6";
src = fetchFromGitHub {
owner = "ClementTsang";
repo = "bottom";
tag = finalAttrs.version;
hash = "sha256-axzZEviUVosXo5XzQB32A2+sUdiLzEtjZg52Z6hp4lM=";
hash = "sha256-52aUYfFm72nSG7bAlwa18kMu13i+c4myl2QfaA2YZmw=";
};
cargoHash = "sha256-RUFlv95VoRhfHeIXWFWWtbwn71uJnEYoi2NozU4ybK8=";
cargoHash = "sha256-N+dfYORAdWAg5qUrFEgXbiRtYJpcvV1AcbLR5WiD0QI=";
nativeBuildInputs = [
autoAddDriverRunpath
-35
View File
@@ -1,35 +0,0 @@
# Expression generated by update.sh; do not edit it by hand!
{ stdenv, callPackage, ... }@args:
let
pname = "brave";
version = "1.92.143";
allArchives = {
aarch64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_arm64.deb";
hash = "sha256-IHBJm9uow2d/X4Z9e117aGdP1Y+3R1ApWu40sPtdbr8=";
};
x86_64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb";
hash = "sha256-jaxNneurduBiw3jho5Fp7gXnBfSpLB5hlE06i/JK+ic=";
};
aarch64-darwin = {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-v${version}-darwin-arm64.zip";
hash = "sha256-EvfZgO8FAijof1Ml6gqSOyRndL8KYFdT0MNmVmuxAnU=";
};
};
archive =
if builtins.hasAttr stdenv.system allArchives then
allArchives.${stdenv.system}
else
throw "Unsupported platform.";
in
callPackage ./make-brave.nix (removeAttrs args [ "callPackage" ]) (
archive
// {
inherit pname version;
}
)
-48
View File
@@ -1,48 +0,0 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl gnused nix jq
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
latestVersion="$(curl --fail -s ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} "https://api.github.com/repos/brave/brave-browser/releases/latest" | jq -r '.tag_name' | sed 's/^v//')"
hashAarch64="$(nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "https://github.com/brave/brave-browser/releases/download/v${latestVersion}/brave-browser_${latestVersion}_arm64.deb")")"
hashAmd64="$(nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "https://github.com/brave/brave-browser/releases/download/v${latestVersion}/brave-browser_${latestVersion}_amd64.deb")")"
hashAarch64Darwin="$(nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "https://github.com/brave/brave-browser/releases/download/v${latestVersion}/brave-v${latestVersion}-darwin-arm64.zip")")"
cat > $SCRIPT_DIR/package.nix << EOF
# Expression generated by update.sh; do not edit it by hand!
{ stdenv, callPackage, ... }@args:
let
pname = "brave";
version = "${latestVersion}";
allArchives = {
aarch64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v\${version}/brave-browser_\${version}_arm64.deb";
hash = "${hashAarch64}";
};
x86_64-linux = {
url = "https://github.com/brave/brave-browser/releases/download/v\${version}/brave-browser_\${version}_amd64.deb";
hash = "${hashAmd64}";
};
aarch64-darwin = {
url = "https://github.com/brave/brave-browser/releases/download/v\${version}/brave-v\${version}-darwin-arm64.zip";
hash = "${hashAarch64Darwin}";
};
};
archive =
if builtins.hasAttr stdenv.system allArchives then
allArchives.\${stdenv.system}
else
throw "Unsupported platform.";
in
callPackage ./make-brave.nix (removeAttrs args [ "callPackage" ]) (
archive
// {
inherit pname version;
}
)
EOF
+7 -3
View File
@@ -21,13 +21,13 @@
buildNpmPackage rec {
pname = "bruno";
version = "3.5.2";
version = "4.0.0";
src = fetchFromGitHub {
owner = "usebruno";
repo = "bruno";
tag = "v${version}";
hash = "sha256-Lll/ywDkHv0xvLk8iiBEySek7A3dBmfO4V/q2xaNtBQ=";
hash = "sha256-M4oNx3nSe8hSAtZMVyXIW0qQIQkaOeQgpPsfjmmJ30E=";
postFetch = ''
${lib.getExe npm-lockfile-fix} $out/package-lock.json
@@ -36,7 +36,7 @@ buildNpmPackage rec {
nodejs = nodejs_22;
npmDepsHash = "sha256-4VsSXiHj/INCu4ryZ+JxPbfDpsgIb5eYvOUYz+gbKEE=";
npmDepsHash = "sha256-Jrlpztg1JxuPaLD4O9elOaU1eFH3dmr6oWwi4Ch9Zv8=";
npmFlags = [ "--legacy-peer-deps" ];
nativeBuildInputs = [
@@ -77,6 +77,10 @@ buildNpmPackage rec {
# fix version reported in sidebar and about page
${jq}/bin/jq '.version |= "${version}"' packages/bruno-electron/package.json | ${moreutils}/bin/sponge packages/bruno-electron/package.json
${jq}/bin/jq '.version |= "${version}"' packages/bruno-app/package.json | ${moreutils}/bin/sponge packages/bruno-app/package.json
# disable remote image download to prevent network calls to comply with build sandboxing
substituteInPlace packages/bruno-app/plugins/remote-images/loader.cjs \
--replace-fail 'const urls = findRemoteImageUrls(source, domains);' 'const urls = [];'
'';
postConfigure = ''
+2 -2
View File
@@ -21,11 +21,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "btrfs-progs";
version = "7.0";
version = "7.1";
src = fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${finalAttrs.version}.tar.xz";
hash = "sha256-wobWh2y81yMnoLQX5M/SgDU+wj43tUn9vNeACoMtmpk=";
hash = "sha256-0fVcwpcTmMkULqp50gPmPVhqO0uGf5VmZKHWgyLNTjQ=";
};
nativeBuildInputs = [
+3 -3
View File
@@ -15,20 +15,20 @@ let
in
stdenv.mkDerivation (finalAttrs: {
pname = "bumpp";
version = "11.1.0";
version = "12.0.0";
src = fetchFromGitHub {
owner = "antfu-collective";
repo = "bumpp";
tag = "v${finalAttrs.version}";
hash = "sha256-LzFusuzFpbqh/gNV0c0vhoKE17CzTPJUppdpdKaGOFs=";
hash = "sha256-9o3eUZ4cCusvV+IwQbLqbEI4NhTKkcwgqv4Mqe/VxZ4=";
};
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
inherit pnpm;
fetcherVersion = 3;
hash = "sha256-KYTz/SO4rV+c57G8dv4ExCZrunA0xvgCNk8Td4HbCig=";
hash = "sha256-Em3HvH5nCiyxgaPQvenqAnOraYnvQNxLVdHQd1lz3+o=";
};
nativeBuildInputs = [
+2 -2
View File
@@ -13,7 +13,7 @@
clutter-gtk,
gst_all_1,
glib,
gtk2,
gtk3,
libgsf,
libxml2,
fluidsynth,
@@ -52,7 +52,7 @@ stdenv.mkDerivation {
gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good
glib
gtk2
gtk3
libgsf
libxml2
# optional packages
+3 -3
View File
@@ -11,16 +11,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "cargo-binstall";
version = "1.21.0";
version = "1.21.1";
src = fetchFromGitHub {
owner = "cargo-bins";
repo = "cargo-binstall";
tag = "v${finalAttrs.version}";
hash = "sha256-6msYAVCN1i2srA4DquqcdJxUrJP1jub34c/a/4RbWCg=";
hash = "sha256-7YXdKK6P6LSf/DGDL6jroR3VVqAD4uGUOGJS/dZbcvw=";
};
cargoHash = "sha256-r9iGWxrLlD83QtvZuWXIxjI2S0RO1GNwOed531FVvJk=";
cargoHash = "sha256-iUYTFtx0KBi4qgJNyuIAGcTCbS4KMyBbTIgR3nDiNAI=";
nativeBuildInputs = [
pkg-config
+3 -3
View File
@@ -8,15 +8,15 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "cargo-shear";
version = "1.13.2";
version = "1.13.3";
src = fetchCrate {
pname = "cargo-shear";
version = finalAttrs.version;
hash = "sha256-69OwhT4vc4xwvuVxZ0C7F/Us01TsuYJnnTKT6PHsOF8=";
hash = "sha256-Qaq3nBZZR0biG5kVL15zhI8GwLEWBNzgeD3rHeZZOeU=";
};
cargoHash = "sha256-x0lZ8E/P9IaPSdzUo2O3t5qR2I3959So9uaAm4PBM4E=";
cargoHash = "sha256-3YMdOCCK+rVx0XZfBqiMAw+aep1TBU5Ok6//c433h4o=";
env = {
# https://github.com/Boshen/cargo-shear/blob/v1.6.2/src/lib.rs#L51-L54
+3 -3
View File
@@ -16,14 +16,14 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "cargo-update";
version = "22.0.0";
version = "22.1.0";
src = fetchCrate {
inherit (finalAttrs) pname version;
hash = "sha256-7SjJ+v+6PzwV8dTXxSVxKrj4/yUlyGVJtt0A+WaWNc8=";
hash = "sha256-0iXO+cmW1vfKc9sPTnw132fZlqTMfInVCIgT8NLrhwM=";
};
cargoHash = "sha256-xRjPnZPewo/5pCDUem8+9Ko0XJ1p5HJtLLmErtZQb8w=";
cargoHash = "sha256-6yE4zdGosZhXhT3Q3mh/1h33OXqXrAWhZ0b18qaI1vs=";
nativeBuildInputs = [
cmake
+2 -2
View File
@@ -13,7 +13,6 @@
libxml2,
libxklavier,
libxtst,
gtk2,
intltool,
libxslt,
at-spi2-core,
@@ -82,7 +81,6 @@ stdenv.mkDerivation (finalAttrs: {
pythonEnv
python3.pkgs.pygobject3
libxtst
gtk2
];
propagatedBuildInputs = [
@@ -90,6 +88,8 @@ stdenv.mkDerivation (finalAttrs: {
libxklavier
];
configureFlags = [ "--enable-gtk2-module=no" ];
postPatch = ''
patchShebangs .
substituteInPlace libcaribou/Makefile.am --replace "--shared-library=libcaribou.so.0" "--shared-library=$out/lib/libcaribou.so.0"
+52 -14
View File
@@ -8,40 +8,45 @@
apple-sdk_15,
libiconv,
versionCheckHook,
nix-update-script,
nix-update,
writeShellApplication,
curl,
runCommand,
jq,
}:
let
# ccusage embeds the LiteLLM model-pricing table at build time. Its build
# script otherwise downloads this file from the network, which fails in the
# sandbox. Upstream pins the data via a flake input and points
# CCUSAGE_PRICING_JSON_PATH at it; mirror that exact revision here so the
# build is offline and reproducible (see package.nix + flake.lock in the
# upstream repo at tag v20.0.6). Bump this revision together with the package
# version; nix-update only refreshes the src and cargo hashes.
# ccusage embeds the LiteLLM model-pricing table at build time instead of
# downloading it (the Nix sandbox has no network). Upstream pins the exact
# data revision via its flake.lock and points CCUSAGE_PRICING_JSON_PATH at it;
# we mirror that revision here so the build is offline, reproducible, and
# byte-identical to what upstream ships.
#
# Both values below are kept in sync with the package version by
# passthru.updateScript — do not edit them by hand.
litellmPricingRev = "49ca04d8c3ddea336237ce6f3082dbc26d19e944";
litellmPricingHash = "sha256-rkUyugxdoD7WlPN//6BQpl4OJQuBbc20db7gt7exqpc=";
litellmPricing = fetchurl {
url = "https://raw.githubusercontent.com/BerriAI/litellm/f27df8d516802ce4c1b32973992154fe83b851cf/model_prices_and_context_window.json";
hash = "sha256-zJa6H2EwP9s+hMVs78Y+hwo4UX1dHRtvX5J3MdGh5aI=";
url = "https://raw.githubusercontent.com/BerriAI/litellm/${litellmPricingRev}/model_prices_and_context_window.json";
hash = litellmPricingHash;
};
in
rustPlatform.buildRustPackage (finalAttrs: {
pname = "ccusage";
version = "20.0.6";
version = "20.0.17";
src = fetchFromGitHub {
owner = "ccusage";
repo = "ccusage";
tag = "v${finalAttrs.version}";
hash = "sha256-uf/FlPprxx4jh74YwjmYMtoIHpTkKrWTLetbNoYiFv4=";
hash = "sha256-486iLPRqQVRnKVbVT93D08RTRzd6/h503ckB//24nho=";
};
# The Cargo workspace lives in rust/, not at the repo root.
cargoRoot = "rust";
buildAndTestSubdir = "rust";
cargoHash = "sha256-izA2Gs5nPmt0zn6/e1xM80vyyQHYKGEUDpUFRpyFiB8=";
cargoHash = "sha256-23l/BCCGcZ1i5mFBC6Q+FE7sQRHnPLbU4QoQe7TfoiQ=";
__structuredAttrs = true;
strictDeps = true;
@@ -72,7 +77,40 @@ rustPlatform.buildRustPackage (finalAttrs: {
doInstallCheck = true;
passthru = {
updateScript = nix-update-script { };
# Plain nix-update only refreshes version + src/cargo hashes; it can't know
# about the LiteLLM pricing pin above. This wrapper bumps the package as
# usual, then reads the litellm revision that ccusage locks at the new tag
# and rewrites litellmPricingRev/litellmPricingHash to match, so automated
# (r-ryantm) bumps stay complete instead of shipping stale pricing data.
updateScript = lib.getExe (writeShellApplication {
name = "ccusage-update";
runtimeInputs = [
curl
jq
nix-update
];
text = ''
set -euo pipefail
attr="''${UPDATE_NIX_ATTR_PATH:-ccusage}"
nix-update "$attr"
version=$(nix-instantiate --eval --raw -A "$attr.version")
rev=$(curl --fail --silent --show-error --location \
"https://raw.githubusercontent.com/ccusage/ccusage/v''${version}/flake.lock" \
| jq --raw-output '.nodes.litellm.locked.rev')
hash=$(nix-prefetch-url --type sha256 \
"https://raw.githubusercontent.com/BerriAI/litellm/''${rev}/model_prices_and_context_window.json" \
| xargs nix --extra-experimental-features nix-command hash convert --hash-algo sha256 --to sri)
file=$(nix-instantiate --eval --raw -A "$attr.meta.position" | sed -re 's/:[0-9]+$//')
sed -i \
-e "s|litellmPricingRev = \"[0-9a-f]*\"|litellmPricingRev = \"''${rev}\"|" \
-e "s|litellmPricingHash = \"sha256-[^\"]*\"|litellmPricingHash = \"''${hash}\"|" \
"$file"
'';
});
tests = {
# With no agent data on disk, ccusage must still emit a valid, empty JSON

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