diff --git a/doc/languages-frameworks/python.section.md b/doc/languages-frameworks/python.section.md index f7a0ba9e4ba9..ce7ac04dd9b1 100644 --- a/doc/languages-frameworks/python.section.md +++ b/doc/languages-frameworks/python.section.md @@ -2136,7 +2136,7 @@ The following rules are desired to be respected: * `pythonImportsCheck` is set. This is still a good smoke test even if `pytestCheckHook` is set. * `meta.platforms` takes the default value in many cases. It does not need to be set explicitly unless the package requires a specific platform. -* The file is formatted with `nixfmt-rfc-style`. +* The file is formatted correctly (e.g., `nix-shell --run treefmt`). * Commit names of Python libraries must reflect that they are Python libraries (e.g. `python3Packages.numpy: 1.11 -> 1.12` rather than `numpy: 1.11 -> 1.12`). See also [`pkgs/README.md`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/README.md#commit-conventions). diff --git a/doc/release-notes/rl-2605.section.md b/doc/release-notes/rl-2605.section.md index e89a2ae6f39d..14daa0dafbfa 100644 --- a/doc/release-notes/rl-2605.section.md +++ b/doc/release-notes/rl-2605.section.md @@ -162,6 +162,8 @@ +- `balatro` now supports the Google Play and Xbox PC versions of the game. Pass the `apk` or `Assets.zip` as `balatro.override { src = "…" }`. + - `uptime-kuma` has been updated to v2, which requires an automated migration that can take a few hours. **A backup is highly recommended.** If your SQLite database is corrupted, the migration might fail and require [manual intervention](https://github.com/louislam/uptime-kuma/issues/5281). See the [migration guide](https://github.com/louislam/uptime-kuma/wiki/Migration-From-v1-To-v2) for more information. diff --git a/nixos/doc/manual/release-notes/rl-2205.section.md b/nixos/doc/manual/release-notes/rl-2205.section.md index f45258d0038b..38f503570105 100644 --- a/nixos/doc/manual/release-notes/rl-2205.section.md +++ b/nixos/doc/manual/release-notes/rl-2205.section.md @@ -99,7 +99,7 @@ In addition to numerous new and upgraded packages, this release has the followin - [input-remapper](https://github.com/sezanzeb/input-remapper), an easy to use tool to change the mapping of your input device buttons. Available at [services.input-remapper](#opt-services.input-remapper.enable). -- [InvoicePlane](https://invoiceplane.com), web application for managing and creating invoices. Available at `services.invoiceplane`. +- [InvoicePlane](https://invoiceplane.com), web application for managing and creating invoices. Available at [services.invoiceplane](#opt-services.invoiceplane.sites._name_.enable). - [k3b](https://userbase.kde.org/K3b), the KDE disk burning application. Available as [programs.k3b](#opt-programs.k3b.enable). diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index cb003fc2709e..9d81f8a6b674 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -1658,6 +1658,7 @@ ./services/web-apps/immich.nix ./services/web-apps/immichframe.nix ./services/web-apps/invidious.nix + ./services/web-apps/invoiceplane.nix ./services/web-apps/isso.nix ./services/web-apps/jirafeau.nix ./services/web-apps/jitsi-meet.nix diff --git a/nixos/modules/programs/nix-required-mounts.nix b/nixos/modules/programs/nix-required-mounts.nix index a7ec09fe5f9a..962116c97575 100644 --- a/nixos/modules/programs/nix-required-mounts.nix +++ b/nixos/modules/programs/nix-required-mounts.nix @@ -47,10 +47,7 @@ let ); driverPaths = [ - # opengl: - # NOTE: Since driverLink is just a symlink, we need to include its target as well. pkgs.addDriverRunpath.driverLink - config.systemd.tmpfiles.settings.graphics-driver."/run/opengl-driver"."L+".argument # mesa: config.hardware.graphics.package @@ -62,7 +59,9 @@ let defaults = { nvidia-gpu.onFeatures = package.allowedPatterns.nvidia-gpu.onFeatures; nvidia-gpu.paths = package.allowedPatterns.nvidia-gpu.paths ++ driverPaths; - nvidia-gpu.unsafeFollowSymlinks = false; + # TODO: Refactor `hardware.graphics` to ease referencing the closure + # NOTE: A naive implementation may e.g. introduce a conditional infinite recursion (https://github.com/NixOS/nixpkgs/pull/488199) + nvidia-gpu.unsafeFollowSymlinks = true; }; in { @@ -112,6 +111,7 @@ in lib.mkMerge [ { nix.settings.pre-build-hook = lib.getExe cfg.package; } (lib.mkIf cfg.presets.nvidia-gpu.enable { + hardware.graphics.enable = lib.mkDefault true; nix.settings.system-features = cfg.allowedPatterns.nvidia-gpu.onFeatures; programs.nix-required-mounts.allowedPatterns = { inherit (defaults) nvidia-gpu; diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix index f3fcf6055946..0e4afc8935cd 100644 --- a/nixos/modules/rename.nix +++ b/nixos/modules/rename.nix @@ -442,10 +442,6 @@ in Consider migrating or switching to Incus, or remove from your configuration. https://linuxcontainers.org/incus/docs/main/howto/server_migrate_lxd/ '') - (mkRemovedOptionModule [ "services" "invoiceplane" ] '' - services.invoiceplane has been removed since the service only supported PHP 8.1 which is EOL - and removed from nixpkgs. - '') (mkRemovedOptionModule [ "services" "filesender" ] '' services.filesender has been removed since it depends on simplesamlphp which was severely unmaintained. '') diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix index 488b817946d4..3f4cf2af05b2 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -144,7 +144,7 @@ in Enabling system-wide PipeWire is however not recommended and disabled by default according to - https://github.com/PipeWire/pipewire/blob/master/NEWS + https://github.com/PipeWire/pipewire/blob/0.3.11/NEWS#L14-L16 ''; }; diff --git a/nixos/modules/services/security/kanidm.nix b/nixos/modules/services/security/kanidm.nix index 7018c2de8889..ed904d888d03 100644 --- a/nixos/modules/services/security/kanidm.nix +++ b/nixos/modules/services/security/kanidm.nix @@ -937,6 +937,7 @@ in StateDirectory = "kanidm"; StateDirectoryMode = "0700"; RuntimeDirectory = "kanidmd"; + ExecStartPre = "${cfg.package}/bin/kanidmd domain rename -c ${serverConfigFile}"; ExecStart = "${cfg.package}/bin/kanidmd server -c ${serverConfigFile}"; ExecStartPost = mkIf cfg.provision.enable postStartScript; User = "kanidm"; diff --git a/nixos/modules/services/web-apps/invoiceplane.nix b/nixos/modules/services/web-apps/invoiceplane.nix new file mode 100644 index 000000000000..bd261ea9ec23 --- /dev/null +++ b/nixos/modules/services/web-apps/invoiceplane.nix @@ -0,0 +1,491 @@ +{ + config, + pkgs, + lib, + ... +}: + +with lib; + +let + cfg = config.services.invoiceplane; + eachSite = cfg.sites; + user = "invoiceplane"; + webserver = config.services.${cfg.webserver}; + + invoiceplane-config = + hostName: cfg: + pkgs.writeText "ipconfig.php" '' + # + + IP_URL=http://${hostName} + ENABLE_DEBUG=false + DISABLE_SETUP=false + REMOVE_INDEXPHP=false + DB_HOSTNAME=${cfg.database.host} + DB_USERNAME=${cfg.database.user} + # NOTE: file_get_contents adds newline at the end of returned string + DB_PASSWORD=${ + optionalString ( + cfg.database.passwordFile != null + ) "trim(file_get_contents('${cfg.database.passwordFile}'), \"\\r\\n\")" + } + DB_DATABASE=${cfg.database.name} + DB_PORT=${toString cfg.database.port} + SESS_EXPIRATION=864000 + ENABLE_INVOICE_DELETION=false + DISABLE_READ_ONLY=false + ENCRYPTION_KEY= + ENCRYPTION_CIPHER=AES-256 + SETUP_COMPLETED=false + REMOVE_INDEXPHP=true + ''; + + mkPhpValue = + v: + if isString v then + escapeShellArg v + # NOTE: If any value contains a , (comma) this will not get escaped + else if isList v && strings.isConvertibleWithToString v then + escapeShellArg (concatMapStringsSep "," toString v) + else if isInt v then + toString v + else if isBool v then + boolToString v + else + abort "The Invoiceplane config value ${lib.generators.toPretty { } v} can not be encoded."; + + extraConfig = + hostName: cfg: + let + settings = mapAttrsToList (k: v: "${k}=${mkPhpValue v}") cfg.settings; + in + pkgs.writeText "extraConfig.php" (concatStringsSep "\n" settings); + + pkg = + hostName: cfg: + pkgs.stdenv.mkDerivation rec { + pname = "invoiceplane-${hostName}"; + version = src.version; + src = pkgs.invoiceplane; + + postPatch = '' + # Patch index.php file to load additional config file + substituteInPlace index.php \ + --replace-fail "require __DIR__ . '/vendor/autoload.php';" "require('vendor/autoload.php'); \$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, 'extraConfig.php'); \$dotenv->load();"; + ''; + + installPhase = '' + mkdir -p $out + cp -r * $out/ + + # symlink uploads and log directories + rm -r $out/uploads $out/application/logs $out/vendor/mpdf/mpdf/tmp + ln -sf ${cfg.stateDir}/uploads $out/ + ln -sf ${cfg.stateDir}/logs $out/application/ + ln -sf ${cfg.stateDir}/tmp $out/vendor/mpdf/mpdf/ + + # symlink the InvoicePlane config + ln -s ${cfg.stateDir}/ipconfig.php $out/ipconfig.php + + # symlink the extraConfig file + ln -s ${extraConfig hostName cfg} $out/extraConfig.php + + # symlink additional templates + ${concatMapStringsSep "\n" ( + template: "cp -r ${template}/. $out/application/views/invoice_templates/pdf/" + ) cfg.invoiceTemplates} + ${concatMapStringsSep "\n" ( + template: "cp -r ${template}/. $out/application/views/quote_templates/pdf/" + ) cfg.quoteTemplates} + ''; + }; + + siteOpts = + { lib, name, ... }: + { + options = { + + enable = mkEnableOption "InvoicePlane web application"; + + stateDir = mkOption { + type = types.path; + default = "/var/lib/invoiceplane/${name}"; + description = '' + This directory is used for uploads of attachments and cache. + The directory passed here is automatically created and permissions + adjusted as required. + ''; + }; + + database = { + host = mkOption { + type = types.str; + default = "localhost"; + description = "Database host address."; + }; + + port = mkOption { + type = types.port; + default = 3306; + description = "Database host port."; + }; + + name = mkOption { + type = types.str; + default = "invoiceplane"; + description = "Database name."; + }; + + user = mkOption { + type = types.str; + default = "invoiceplane"; + description = "Database user."; + }; + + passwordFile = mkOption { + type = types.nullOr types.path; + default = null; + example = "/run/keys/invoiceplane-dbpassword"; + description = '' + A file containing the password corresponding to + {option}`database.user`. + ''; + }; + + createLocally = mkOption { + type = types.bool; + default = true; + description = "Create the database and database user locally."; + }; + }; + + invoiceTemplates = mkOption { + type = types.listOf types.path; + default = [ ]; + description = '' + List of path(s) to respective template(s) which are copied from the 'invoice_templates/pdf' directory. + + ::: {.note} + These templates need to be packaged before use, see example. + ::: + ''; + example = literalExpression '' + let + # Let's package an example template + template-vtdirektmarketing = pkgs.stdenv.mkDerivation { + name = "vtdirektmarketing"; + # Download the template from a public repository + src = pkgs.fetchgit { + url = "https://git.project-insanity.org/onny/invoiceplane-vtdirektmarketing.git"; + sha256 = "1hh0q7wzsh8v8x03i82p6qrgbxr4v5fb05xylyrpp975l8axyg2z"; + }; + sourceRoot = "."; + # Installing simply means copying template php file to the output directory + installPhase = "" + mkdir -p $out + cp invoiceplane-vtdirektmarketing/vtdirektmarketing.php $out/ + ""; + }; + # And then pass this package to the template list like this: + in [ template-vtdirektmarketing ] + ''; + }; + + quoteTemplates = mkOption { + type = types.listOf types.path; + default = [ ]; + description = '' + List of path(s) to respective template(s) which are copied from the 'quote_templates/pdf' directory. + + ::: {.note} + These templates need to be packaged before use, see example. + ::: + ''; + example = literalExpression '' + let + # Let's package an example template + template-vtdirektmarketing = pkgs.stdenv.mkDerivation { + name = "vtdirektmarketing"; + # Download the template from a public repository + src = pkgs.fetchgit { + url = "https://git.project-insanity.org/onny/invoiceplane-vtdirektmarketing.git"; + sha256 = "1hh0q7wzsh8v8x03i82p6qrgbxr4v5fb05xylyrpp975l8axyg2z"; + }; + sourceRoot = "."; + # Installing simply means copying template php file to the output directory + installPhase = "" + mkdir -p $out + cp invoiceplane-vtdirektmarketing/vtdirektmarketing.php $out/ + ""; + }; + # And then pass this package to the template list like this: + in [ template-vtdirektmarketing ] + ''; + }; + + poolConfig = mkOption { + type = + with types; + attrsOf (oneOf [ + str + int + bool + ]); + default = { + "pm" = "dynamic"; + "pm.max_children" = 32; + "pm.start_servers" = 2; + "pm.min_spare_servers" = 2; + "pm.max_spare_servers" = 4; + "pm.max_requests" = 500; + }; + description = '' + Options for the InvoicePlane PHP pool. See the documentation on `php-fpm.conf` + for details on configuration directives. + ''; + }; + + settings = mkOption { + type = types.attrsOf types.anything; + default = { }; + description = '' + Structural InvoicePlane configuration. Refer to + + for details and supported values. + ''; + example = literalExpression '' + { + SETUP_COMPLETED = true; + DISABLE_SETUP = true; + IP_URL = "https://invoice.example.com"; + } + ''; + }; + + cron = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Enable cron service which periodically runs Invoiceplane tasks. + Requires key taken from the administration page. Refer to + + on how to configure it. + ''; + }; + key = mkOption { + type = types.str; + description = "Cron key taken from the administration page."; + }; + }; + + }; + + }; +in +{ + # interface + options = { + services.invoiceplane = mkOption { + type = types.submodule { + + options.sites = mkOption { + type = types.attrsOf (types.submodule siteOpts); + default = { }; + description = "Specification of one or more InvoicePlane sites to serve"; + }; + + options.webserver = mkOption { + type = types.enum [ + "caddy" + "nginx" + ]; + default = "caddy"; + example = "nginx"; + description = '' + Which webserver to use for virtual host management. + ''; + }; + }; + default = { }; + description = "InvoicePlane configuration."; + }; + + }; + + # implementation + config = mkIf (eachSite != { }) (mkMerge [ + { + + assertions = flatten ( + mapAttrsToList (hostName: cfg: [ + { + assertion = cfg.database.createLocally -> cfg.database.user == user; + message = ''services.invoiceplane.sites."${hostName}".database.user must be ${user} if the database is to be automatically provisioned''; + } + { + assertion = cfg.database.createLocally -> cfg.database.passwordFile == null; + message = ''services.invoiceplane.sites."${hostName}".database.passwordFile cannot be specified if services.invoiceplane.sites."${hostName}".database.createLocally is set to true.''; + } + { + assertion = cfg.cron.enable -> cfg.cron.key != null; + message = ''services.invoiceplane.sites."${hostName}".cron.key must be set in order to use cron service.''; + } + ]) eachSite + ); + + services.mysql = mkIf (any (v: v.database.createLocally) (attrValues eachSite)) { + enable = true; + package = mkDefault pkgs.mariadb; + ensureDatabases = mapAttrsToList (hostName: cfg: cfg.database.name) eachSite; + ensureUsers = mapAttrsToList (hostName: cfg: { + name = cfg.database.user; + ensurePermissions = { + "${cfg.database.name}.*" = "ALL PRIVILEGES"; + }; + }) eachSite; + }; + + services.phpfpm = { + pools = mapAttrs' ( + hostName: cfg: + (nameValuePair "invoiceplane-${hostName}" { + inherit user; + group = webserver.group; + settings = { + "listen.owner" = webserver.user; + "listen.group" = webserver.group; + } + // cfg.poolConfig; + }) + ) eachSite; + }; + + } + + { + + systemd.tmpfiles.rules = flatten ( + mapAttrsToList (hostName: cfg: [ + "d ${cfg.stateDir} 0750 ${user} ${webserver.group} - -" + "f ${cfg.stateDir}/ipconfig.php 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/logs 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/uploads 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/uploads/archive 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/uploads/customer_files 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/uploads/temp 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/uploads/temp/mpdf 0750 ${user} ${webserver.group} - -" + "d ${cfg.stateDir}/tmp 0750 ${user} ${webserver.group} - -" + ]) eachSite + ); + + systemd.services.invoiceplane-config = { + serviceConfig.Type = "oneshot"; + script = concatStrings ( + mapAttrsToList (hostName: cfg: '' + mkdir -p ${cfg.stateDir}/logs \ + ${cfg.stateDir}/uploads + if ! grep -q IP_URL "${cfg.stateDir}/ipconfig.php"; then + cp "${invoiceplane-config hostName cfg}" "${cfg.stateDir}/ipconfig.php" + fi + if ! grep -q 'php exit' "${cfg.stateDir}/ipconfig.php"; then + sed -i "1i # " "${cfg.stateDir}/ipconfig.php" + fi + '') eachSite + ); + wantedBy = [ "multi-user.target" ]; + }; + + users.users.${user} = { + group = webserver.group; + isSystemUser = true; + }; + + } + { + + # Cron service implementation + + systemd.timers = mapAttrs' ( + hostName: cfg: + (nameValuePair "invoiceplane-cron-${hostName}" ( + mkIf cfg.cron.enable { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "5m"; + OnUnitActiveSec = "5m"; + Unit = "invoiceplane-cron-${hostName}.service"; + }; + } + )) + ) eachSite; + + systemd.services = mapAttrs' ( + hostName: cfg: + (nameValuePair "invoiceplane-cron-${hostName}" ( + mkIf cfg.cron.enable { + serviceConfig = { + Type = "oneshot"; + User = user; + ExecStart = "${pkgs.curl}/bin/curl --header 'Host: ${hostName}' http://localhost/invoices/cron/recur/${cfg.cron.key}"; + }; + } + )) + ) eachSite; + + } + + (mkIf (cfg.webserver == "caddy") { + services.caddy = { + enable = true; + virtualHosts = mapAttrs' ( + hostName: cfg: + (nameValuePair "http://${hostName}" { + extraConfig = '' + root * ${pkg hostName cfg} + file_server + php_fastcgi unix/${config.services.phpfpm.pools."invoiceplane-${hostName}".socket} + ''; + }) + ) eachSite; + }; + }) + + (mkIf (cfg.webserver == "nginx") { + services.nginx = { + enable = true; + virtualHosts = mapAttrs' ( + hostName: cfg: + (nameValuePair hostName { + root = pkg hostName cfg; + extraConfig = '' + index index.php index.html index.htm; + + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php break; + } + ''; + + locations = { + "/setup".extraConfig = '' + rewrite ^(.*)$ http://${hostName}/ redirect; + ''; + + "~ .php$" = { + extraConfig = '' + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_pass unix:${config.services.phpfpm.pools."invoiceplane-${hostName}".socket}; + include ${config.services.nginx.package}/conf/fastcgi_params; + include ${config.services.nginx.package}/conf/fastcgi.conf; + ''; + }; + }; + }) + ) eachSite; + }; + }) + + ]); +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 38a30c38368f..0ad508dd87ec 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -788,6 +788,7 @@ in installer-systemd-stage-1 = handleTest ./installer-systemd-stage-1.nix { }; intune = runTest ./intune.nix; invidious = runTest ./invidious.nix; + invoiceplane = runTest ./invoiceplane.nix; iodine = runTest ./iodine.nix; iosched = runTest ./iosched.nix; ipget = runTest ./ipget.nix; diff --git a/nixos/tests/invoiceplane.nix b/nixos/tests/invoiceplane.nix new file mode 100644 index 000000000000..4ead3ef94ee7 --- /dev/null +++ b/nixos/tests/invoiceplane.nix @@ -0,0 +1,116 @@ +{ pkgs, ... }: + +{ + name = "invoiceplane"; + meta = with pkgs.lib.maintainers; { + maintainers = [ + onny + ]; + }; + + nodes = { + invoiceplane_caddy = + { ... }: + { + services.invoiceplane.webserver = "caddy"; + services.invoiceplane.sites = { + "site1.local" = { + database.name = "invoiceplane1"; + database.createLocally = true; + enable = true; + }; + "site2.local" = { + database.name = "invoiceplane2"; + database.createLocally = true; + enable = true; + }; + }; + + networking.firewall.allowedTCPPorts = [ 80 ]; + networking.hosts."127.0.0.1" = [ + "site1.local" + "site2.local" + ]; + }; + + invoiceplane_nginx = + { ... }: + { + services.invoiceplane.webserver = "nginx"; + services.invoiceplane.sites = { + "site1.local" = { + database.name = "invoiceplane1"; + database.createLocally = true; + enable = true; + }; + "site2.local" = { + database.name = "invoiceplane2"; + database.createLocally = true; + enable = true; + }; + }; + + networking.firewall.allowedTCPPorts = [ 80 ]; + networking.hosts."127.0.0.1" = [ + "site1.local" + "site2.local" + ]; + }; + }; + + testScript = '' + start_all() + + invoiceplane_caddy.wait_for_unit("caddy") + invoiceplane_nginx.wait_for_unit("nginx") + + site_names = ["site1.local", "site2.local"] + + machines = [invoiceplane_caddy, invoiceplane_nginx] + + for machine in machines: + machine.wait_for_open_port(80) + machine.wait_for_open_port(3306) + + for site_name in site_names: + machine.wait_for_unit(f"phpfpm-invoiceplane-{site_name}") + + with subtest("Website returns welcome screen"): + assert "Please install InvoicePlane" in machine.succeed(f"curl -L {site_name}") + + with subtest("Finish InvoicePlane setup"): + machine.succeed( + f"curl -sSfL --cookie-jar cjar {site_name}/setup/language" + ) + csrf_token = machine.succeed( + "grep ip_csrf_cookie cjar | cut -f 7 | tr -d '\n'" + ) + machine.succeed( + f"curl -sSfL --cookie cjar --cookie-jar cjar -d '_ip_csrf={csrf_token}&ip_lang=english&btn_continue=Continue' {site_name}/setup/language" + ) + csrf_token = machine.succeed( + "grep ip_csrf_cookie cjar | cut -f 7 | tr -d '\n'" + ) + machine.succeed( + f"curl -sSfL --cookie cjar --cookie-jar cjar -d '_ip_csrf={csrf_token}&btn_continue=Continue' {site_name}/setup/prerequisites" + ) + csrf_token = machine.succeed( + "grep ip_csrf_cookie cjar | cut -f 7 | tr -d '\n'" + ) + machine.succeed( + f"curl -sSfL --cookie cjar --cookie-jar cjar -d '_ip_csrf={csrf_token}&btn_continue=Continue' {site_name}/setup/configure_database" + ) + csrf_token = machine.succeed( + "grep ip_csrf_cookie cjar | cut -f 7 | tr -d '\n'" + ) + machine.succeed( + f"curl -sSfl --cookie cjar --cookie-jar cjar -d '_ip_csrf={csrf_token}&btn_continue=Continue' {site_name}/setup/install_tables" + ) + csrf_token = machine.succeed( + "grep ip_csrf_cookie cjar | cut -f 7 | tr -d '\n'" + ) + machine.succeed( + f"curl -sSfl --cookie cjar --cookie-jar cjar -d '_ip_csrf={csrf_token}&btn_continue=Continue' {site_name}/setup/upgrade_tables" + ) + ''; +} diff --git a/pkgs/applications/editors/vscode/extensions/README.md b/pkgs/applications/editors/vscode/extensions/README.md index 9cbbd2b8f94d..2b36a38de2bb 100644 --- a/pkgs/applications/editors/vscode/extensions/README.md +++ b/pkgs/applications/editors/vscode/extensions/README.md @@ -7,7 +7,7 @@ * When adding a new extension, place its definition in a `default.nix` file in a directory with the extension's ID (e.g. `publisher.extension-name/default.nix`) and refer to it in `./default.nix`, e.g. `publisher.extension-name = callPackage ./publisher.extension-name { };`. -* Currently `nixfmt-rfc-style` formatter is being used to format the VSCode extensions. +* Use `nix-shell --run treefmt` to format the VSCode extensions. * Respect `alphabetical order` whenever adding extensions. If out of order, please kindly open a PR re-establishing the order. diff --git a/pkgs/applications/editors/vscode/vscode.nix b/pkgs/applications/editors/vscode/vscode.nix index a749560518e8..2284c514a303 100644 --- a/pkgs/applications/editors/vscode/vscode.nix +++ b/pkgs/applications/editors/vscode/vscode.nix @@ -36,20 +36,20 @@ let hash = { - x86_64-linux = "sha256-N8dBXYpBbaymuGWFb8+77/4yJ6Meo5eqoYpnlsjGlN8="; - x86_64-darwin = "sha256-li+29ukZXvwBihnHti+AntMNwhr3g1tOOdmalZchL40="; - aarch64-linux = "sha256-ASzpE721RBAiVFxnGCRMCWj/RFa+TpxA4gaZJFxk7I0="; - aarch64-darwin = "sha256-afaADPPWJlW3HdWGAMDuibGhBtR7toEm2T58jR/nsic="; - armv7l-linux = "sha256-BgG1RglSISrKm+KRq7AXhp7EUOssts2LSLCVqSD7E/Q="; + x86_64-linux = "sha256-ST5i8gvNtAaBbmcpcg9GJipr8e5d0A0qbdG1P9QViek="; + x86_64-darwin = "sha256-BRGXLasiHZSKsijq02bCa2RbaBc7iC1ZtLe29u4KTH0="; + aarch64-linux = "sha256-7plpHWoi8eYDKQZVV3OCXZJUk8j173M1xpRgTOTsPZ0="; + aarch64-darwin = "sha256-RgfhGjVFmaIAAotTYNPUDrJZ8qj8e4yR9bVfal/Hl6o="; + armv7l-linux = "sha256-Zzz4HsmiWcKiBRE19pGll8BRQy26wbmpuYSi89PDoBo="; } .${system} or throwSystem; # Please backport all compatible updates to the stable release. # This is important for the extension ecosystem. - version = "1.109.0"; + version = "1.109.2"; # This is used for VS Code - Remote SSH test - rev = "bdd88df003631aaa0bcbe057cb0a940b80a476fa"; + rev = "591199df409fbf59b4b52d5ad4ee0470152a9b31"; in buildVscode { pname = "vscode" + lib.optionalString isInsiders "-insiders"; @@ -82,7 +82,7 @@ buildVscode { src = fetchurl { name = "vscode-server-${rev}.tar.gz"; url = "https://update.code.visualstudio.com/commit:${rev}/server-linux-x64/stable"; - hash = "sha256-qdXYNkc7u1s/HexmK3Dwc4H/nsfoyhL0/c8TgK94JwU="; + hash = "sha256-CbU8VdJETTzpwCpzVgavoeSQMdz3RdwDYJ7wUqs8LJ8="; }; stdenv = stdenvNoCC; }; diff --git a/pkgs/build-support/trivial-builders/default.nix b/pkgs/build-support/trivial-builders/default.nix index b350d51455cd..0bd379b5de31 100644 --- a/pkgs/build-support/trivial-builders/default.nix +++ b/pkgs/build-support/trivial-builders/default.nix @@ -111,7 +111,7 @@ rec { allowSubstitutes ? false, preferLocalBuild ? true, derivationArgs ? { }, - }: + }@args: assert lib.assertMsg (destination != "" -> (lib.hasPrefix "/" destination && destination != "/")) '' destination must be an absolute path, relative to the derivation's out path, got '${destination}' instead. @@ -125,6 +125,7 @@ rec { runCommand name ( { + pos = builtins.unsafeGetAttrPos "name" args; inherit text executable @@ -333,7 +334,7 @@ rec { Type: Bool */ inheritPath ? true, - }: + }@args: writeTextFile { inherit name @@ -613,6 +614,13 @@ rec { "failOnMissing" ] // { + # Allow getting the proper position of the output derivation. + # Since one of these are required, it should be fairly accurate. + pos = + if args_ ? pname then + builtins.unsafeGetAttrPos "pname" args_ + else + builtins.unsafeGetAttrPos "name" args_; inherit preferLocalBuild allowSubstitutes; paths = mapPaths (path: "${path}${stripPrefix}") paths; passAsFile = [ "paths" ]; @@ -675,6 +683,14 @@ rec { in runCommand name { + # Get the position from the `entries` attrset if it exists. + # This is the best we can do since the other attrs are either defined here, or curried values that + # we cannot extract a position from + pos = + if lib.isAttrs entries then + builtins.unsafeGetAttrPos (builtins.head (builtins.attrNames entries)) entries + else + null; preferLocalBuild = true; allowSubstitutes = false; passthru.entries = entries'; @@ -744,12 +760,15 @@ rec { meta ? { }, passthru ? { }, substitutions ? { }, - }: + }@args: script: runCommand name ( substitutions // { + # Make the position of the derivation accurate. + # Since not having `name` is deprecated, this should be fairly accurate. + pos = lib.unsafeGetAttrPos "name" args; # TODO(@Artturin:) substitutions should be inside the env attrset # but users are likely passing non-substitution arguments through substitutions # turn off __structuredAttrs to unbreak substituteAll @@ -1000,76 +1019,70 @@ rec { ]; } */ - applyPatches = - { - src, - name ? - ( - if builtins.typeOf src == "path" then - baseNameOf src - else if builtins.isAttrs src && builtins.hasAttr "name" src then - src.name - else - throw "applyPatches: please supply a `name` argument because a default name can only be computed when the `src` is a path or is an attribute set with a `name` attribute." - ) - + "-patched", - patches ? [ ], - prePatch ? "", - postPatch ? "", - ... - }@args: - assert lib.assertMsg ( - !args ? meta - ) "applyPatches will not merge 'meta', change it in 'src' instead"; - assert lib.assertMsg ( - !args ? passthru - ) "applyPatches will not merge 'passthru', change it in 'src' instead"; - if patches == [ ] && prePatch == "" && postPatch == "" then - src # nothing to do, so use original src to avoid additional drv - else + applyPatches = lib.extendMkDerivation { + constructDrv = stdenvNoCC.mkDerivation; + + extendDrvArgs = + finalAttrs: + { + src, + ... + }@args: + assert lib.assertMsg ( + !args ? meta + ) "applyPatches will not merge 'meta', change it in 'src' instead"; + assert lib.assertMsg ( + !args ? passthru + ) "applyPatches will not merge 'passthru', change it in 'src' instead"; let keepAttrs = names: lib.filterAttrs (name: val: lib.elem name names); # enables tools like nix-update to determine what src attributes to replace - extraPassthru = lib.optionalAttrs (lib.isAttrs src) ( + extraPassthru = lib.optionalAttrs (lib.isAttrs finalAttrs.src) ( keepAttrs [ "rev" "tag" "url" "outputHash" "outputHashAlgo" - ] src + ] finalAttrs.src ); in - stdenvNoCC.mkDerivation ( - { - inherit - name - src - patches - prePatch - postPatch - ; - preferLocalBuild = true; - allowSubstitutes = false; - phases = "unpackPhase patchPhase installPhase"; - installPhase = "cp -R ./ $out"; - } + { + name = + args.name or ( + if builtins.isPath finalAttrs.src then + baseNameOf finalAttrs.src + "-patched" + else if builtins.isAttrs finalAttrs.src && (finalAttrs.src ? name) then + let + srcName = builtins.parseDrvName finalAttrs.src.name; + in + "${srcName.name}-patched${lib.optionalString (srcName.version != "") "-${srcName.version}"}" + else + throw "applyPatches: please supply a `name` argument because a default name can only be computed when the `src` is a path or is an attribute set with a `name` attribute." + ); + + # Manually setting `name` can mess up positioning. + # This should fix it. + pos = builtins.unsafeGetAttrPos "src" args; + + preferLocalBuild = true; + allowSubstitutes = false; + + dontConfigure = true; + dontBuild = true; + doCheck = false; + + installPhase = "cp -R ./ $out"; + + # passthru the git and hash info for nix-update, as well + # as all the src's passthru attrs. + passthru = extraPassthru // finalAttrs.src.passthru or { }; + # Carry (and merge) information from the underlying `src` if present. - // (optionalAttrs (src ? meta) { - inherit (src) meta; - }) - // (optionalAttrs (extraPassthru != { } || src ? passthru) { - passthru = extraPassthru // src.passthru or { }; - }) - # Forward any additional arguments to the derivation - // (removeAttrs args [ - "src" - "name" - "patches" - "prePatch" - "postPatch" - ]) - ); + # If there is not src.meta, this meta block will be blank regardless. + meta = lib.optionalAttrs (finalAttrs.src ? meta) removeAttrs finalAttrs.src.meta [ "position" ]; + }; + }; # TODO: move docs to Nixpkgs manual # An immutable file in the store with a length of 0 bytes. diff --git a/pkgs/by-name/ap/app2unit/package.nix b/pkgs/by-name/ap/app2unit/package.nix index 904eb912f24d..21879d196f59 100644 --- a/pkgs/by-name/ap/app2unit/package.nix +++ b/pkgs/by-name/ap/app2unit/package.nix @@ -9,13 +9,13 @@ }: stdenvNoCC.mkDerivation (finalAttrs: { pname = "app2unit"; - version = "1.2.1"; + version = "1.3.0"; src = fetchFromGitHub { owner = "Vladimir-csp"; repo = "app2unit"; tag = "v${finalAttrs.version}"; - sha256 = "sha256-DZ0W7SygOUmjIO0+K8hS9K1U+gSp1gA6Q15eXr6rOmo="; + sha256 = "sha256-HkwcYYGNReDtPxZumnz3ZDb1sr1JcngAOqs/inO/350="; }; passthru.updateScript = nix-update-script { }; diff --git a/pkgs/by-name/ar/ardour/package.nix b/pkgs/by-name/ar/ardour/package.nix index e21a47802dcd..9f7f7be04f7d 100644 --- a/pkgs/by-name/ar/ardour/package.nix +++ b/pkgs/by-name/ar/ardour/package.nix @@ -36,6 +36,7 @@ libusb1, libuv, libwebsockets, + libxi, libxml2, libxslt, lilv, @@ -71,14 +72,14 @@ stdenv.mkDerivation ( in { pname = "ardour"; - version = "8.12"; + version = "9.0"; # We can't use `fetchFromGitea` here, as attempting to fetch release archives from git.ardour.org # result in an empty archive. See https://tracker.ardour.org/view.php?id=7328 for more info. src = fetchgit { url = "git://git.ardour.org/ardour/ardour.git"; rev = finalAttrs.version; - hash = "sha256-4IgBQ53cwPA35YwNQyo+qBqsMGv+TLn6w1zaDX97erE="; + hash = "sha256-zgWNKYN45qa2xLWnL3W/UWfRVBJN3+hya9dpIZLLJvo="; }; bundledContent = fetchzip { @@ -146,6 +147,7 @@ stdenv.mkDerivation ( libusb1 libuv libwebsockets + libxi libxml2 libxslt lilv @@ -190,6 +192,15 @@ stdenv.mkDerivation ( ] ++ lib.optional optimize "--optimize"; + env.NIX_CFLAGS_COMPILE = toString [ + # 'ioprio_set' syscall support: + "-D_GNU_SOURCE" + # compiler doesn't find headers without these: + "-I${lib.getDev serd}/include/serd-0" + "-I${lib.getDev sratom}/include/sratom-0" + "-I${lib.getDev sord}/include/sord-0" + ]; + postInstall = '' # wscript does not install these for some reason install -vDm 644 "build/gtk2_ardour/ardour.xml" \ @@ -231,7 +242,7 @@ stdenv.mkDerivation ( ''; homepage = "https://ardour.org/"; license = lib.licenses.gpl2Plus; - mainProgram = "ardour8"; + mainProgram = "ardour9"; platforms = lib.platforms.linux; maintainers = with lib.maintainers; [ magnetophon diff --git a/pkgs/by-name/ar/ardour_8/as-flags.patch b/pkgs/by-name/ar/ardour_8/as-flags.patch new file mode 100644 index 000000000000..b8aab70ddca6 --- /dev/null +++ b/pkgs/by-name/ar/ardour_8/as-flags.patch @@ -0,0 +1,12 @@ +--- a/libs/ardour/wscript ++++ b/libs/ardour/wscript +@@ -379,8 +379,7 @@ def build(bld): + + # remove '${DEFINES_ST:DEFINES}' from run_str. + # x86_64-w64-mingw32-as (mingw) -D flag is for debug messages +- if bld.env['build_target'] == 'mingw': +- class asm(Task.classes['asm']): run_str = '${AS} ${ASFLAGS} ${ASMPATH_ST:INCPATHS} ${AS_SRC_F}${SRC} ${AS_TGT_F}${TGT}' ++ class asm(Task.classes['asm']): run_str = '${AS} ${ASFLAGS} ${ASMPATH_ST:INCPATHS} ${AS_SRC_F}${SRC} ${AS_TGT_F}${TGT}' + + # operate on copy to avoid adding sources twice + sources = list(libardour_sources) diff --git a/pkgs/by-name/ar/ardour_8/default-plugin-search-paths.patch b/pkgs/by-name/ar/ardour_8/default-plugin-search-paths.patch new file mode 100644 index 000000000000..68d67ce8b9bc --- /dev/null +++ b/pkgs/by-name/ar/ardour_8/default-plugin-search-paths.patch @@ -0,0 +1,55 @@ +From 1217722e4bf6c65b5c24da17a7de4bf712ca6775 Mon Sep 17 00:00:00 2001 +From: Tamara Schmitz +Date: Sat, 17 Jun 2023 14:05:53 +0200 +Subject: [PATCH] add NixOS plugin paths as default search paths + +Since NixOS uses unusual paths, we should tell Ardour about this. During +first launch, Ardour does indeed check for environmentals but not when +you press the "Reset to Defaults" button in the Settings menu. This +path fixes this by including NixOS paths in the defaults. +--- + libs/ardour/plugin_manager.cc | 5 +++-- + libs/ardour/search_paths.cc | 4 ++++ + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc +index a572ed55dd..3dd6c2fda6 100644 +--- a/libs/ardour/plugin_manager.cc ++++ b/libs/ardour/plugin_manager.cc +@@ -305,7 +305,8 @@ PluginManager::PluginManager () + if (lxvst_path.length() == 0) { + lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:" + "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:" +- "/usr/lib/vst:/usr/local/lib/vst"; ++ "/usr/lib/vst:/usr/local/lib/vst:$HOME/.nix-profile/lib/vst:" ++ "$HOME/.lxvst:$HOME/.nix-profile/lib/lxvst:/run/current-system/sw/lib/lxvst:/etc/profiles/per-user/$USER/lib/lxvst"; + } + + /* first time setup, use 'default' path */ +@@ -2040,7 +2041,7 @@ PluginManager::vst3_refresh (bool cache_only) + std::string prog = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES); + vst3_discover_from_path (Glib::build_filename (prog, "Common Files", "VST3"), cache_only); + #else +- vst3_discover_from_path ("~/.vst3:/usr/local/lib/vst3:/usr/lib/vst3", cache_only); ++ vst3_discover_from_path ("~/.vst3:/usr/local/lib/vst3:/usr/lib/vst3:~/.nix-profile/lib/vst3:/run/current-system/sw/lib/vst3:/etc/profiles/per-user/$USER/lib/vst3", cache_only); + #endif + } + +diff --git a/libs/ardour/search_paths.cc b/libs/ardour/search_paths.cc +index e6d8744369..b9774cb006 100644 +--- a/libs/ardour/search_paths.cc ++++ b/libs/ardour/search_paths.cc +@@ -112,6 +112,10 @@ ladspa_search_path () + spath.push_back ("/usr/local/lib/ladspa"); + spath.push_back ("/usr/lib64/ladspa"); + spath.push_back ("/usr/lib/ladspa"); ++ spath.push_back ("/run/current-system/sw/lib/ladspa"); ++ spath.push_back (path_expand ("$HOME/.ladspa")); ++ spath.push_back (path_expand ("$HOME/.nix-profile/lib/ladspa")); ++ spath.push_back (path_expand ("/etc/profiles/per-user/$USER/lib/ladspa")); + #endif + + #ifdef __APPLE__ +-- +2.40.1 + diff --git a/pkgs/by-name/ar/ardour_8/package.nix b/pkgs/by-name/ar/ardour_8/package.nix new file mode 100644 index 000000000000..e21a47802dcd --- /dev/null +++ b/pkgs/by-name/ar/ardour_8/package.nix @@ -0,0 +1,243 @@ +{ + lib, + stdenv, + fetchgit, + fetchzip, + alsa-lib, + aubio, + boost, + cairomm, + cppunit, + curl, + dbus, + doxygen, + ffmpeg, + fftw, + fftwSinglePrec, + flac, + fluidsynth, + glibc, + glibmm, + graphviz, + harvid, + hidapi, + itstool, + kissfft, + libarchive, + libjack2, + liblo, + libltc, + libogg, + libpulseaudio, + librdf_rasqal, + libsamplerate, + libsigcxx, + libsndfile, + libusb1, + libuv, + libwebsockets, + libxml2, + libxslt, + lilv, + lrdf, + lv2, + makeWrapper, + pango, + pangomm, + perl, + pkg-config, + python3, + qm-dsp, + readline, + rubberband, + serd, + sord, + soundtouch, + sratom, + suil, + taglib, + vamp-plugin-sdk, + wafHook, + xjadeo, + libxrandr, + libxinerama, + optimize ? true, # disable to print Lua DSP script output to stdout + videoSupport ? true, +}: +stdenv.mkDerivation ( + finalAttrs: + let + majorVersion = lib.versions.major finalAttrs.version; + in + { + pname = "ardour"; + version = "8.12"; + + # We can't use `fetchFromGitea` here, as attempting to fetch release archives from git.ardour.org + # result in an empty archive. See https://tracker.ardour.org/view.php?id=7328 for more info. + src = fetchgit { + url = "git://git.ardour.org/ardour/ardour.git"; + rev = finalAttrs.version; + hash = "sha256-4IgBQ53cwPA35YwNQyo+qBqsMGv+TLn6w1zaDX97erE="; + }; + + bundledContent = fetchzip { + url = "https://web.archive.org/web/20221026200824/http://stuff.ardour.org/loops/ArdourBundledMedia.zip"; + hash = "sha256-IbPQWFeyMuvCoghFl1ZwZNNcSvLNsH84rGArXnw+t7A="; + # archive does not contain a single folder at the root + stripRoot = false; + }; + + patches = [ + # AS=as in the environment causes build failure https://tracker.ardour.org/view.php?id=8096 + ./as-flags.patch + ./default-plugin-search-paths.patch + ]; + + # Ardour's wscript requires git revision and date to be available. + # Since they are not, let's generate the file manually. + postPatch = '' + printf '#include "libs/ardour/ardour/revision.h"\nnamespace ARDOUR { const char* revision = "${finalAttrs.version}"; const char* date = ""; }\n' > libs/ardour/revision.cc + sed 's|/usr/include/libintl.h|${glibc.dev}/include/libintl.h|' -i wscript + patchShebangs ./tools/ + substituteInPlace libs/ardour/video_tools_paths.cc \ + --replace-fail 'ffmpeg_exe = X_("");' 'ffmpeg_exe = X_("${ffmpeg}/bin/ffmpeg");' \ + --replace-fail 'ffprobe_exe = X_("");' 'ffprobe_exe = X_("${ffmpeg}/bin/ffprobe");' + ''; + + nativeBuildInputs = [ + doxygen + graphviz # for dot + itstool + makeWrapper + perl + pkg-config + python3 + wafHook + ]; + + buildInputs = [ + alsa-lib + aubio + boost + cairomm + cppunit + curl + dbus + ffmpeg + fftw + fftwSinglePrec + flac + fluidsynth + glibmm + hidapi + itstool + kissfft + libarchive + libjack2 + liblo + libltc + libogg + libpulseaudio + librdf_rasqal + libsamplerate + libsigcxx + libsndfile + libusb1 + libuv + libwebsockets + libxml2 + libxslt + lilv + lrdf + lv2 + pango + pangomm + perl + python3 + qm-dsp + readline + rubberband + serd + sord + soundtouch + sratom + suil + taglib + vamp-plugin-sdk + libxinerama + libxrandr + ] + ++ lib.optionals videoSupport [ + harvid + xjadeo + ]; + + wafConfigureFlags = [ + "--cxx17" + "--docs" + "--freedesktop" + "--no-phone-home" + "--ptformat" + "--run-tests" + "--test" + # since we don't have https://github.com/agfline/LibAAF yet, + # we need to use some of ardours internal libs, see: + # https://discourse.ardour.org/t/ardour-8-2-released/109615/6 + # and + # https://discourse.ardour.org/t/ardour-8-2-released/109615/8 + # "--use-external-libs" + ] + ++ lib.optional optimize "--optimize"; + + postInstall = '' + # wscript does not install these for some reason + install -vDm 644 "build/gtk2_ardour/ardour.xml" \ + -t "$out/share/mime/packages" + install -vDm 644 "build/gtk2_ardour/ardour${majorVersion}.desktop" \ + -t "$out/share/applications" + for size in 16 22 32 48 256 512; do + install -vDm 644 "gtk2_ardour/resources/Ardour-icon_''${size}px.png" \ + "$out/share/icons/hicolor/''${size}x''${size}/apps/ardour${majorVersion}.png" + done + install -vDm 644 "ardour.1"* -t "$out/share/man/man1" + + # install additional bundled beats, chords and progressions + cp -rp "${finalAttrs.bundledContent}"/* "$out/share/ardour${majorVersion}/media" + '' + + lib.optionalString videoSupport '' + # `harvid` and `xjadeo` must be accessible in `PATH` for video to work. + wrapProgram "$out/bin/ardour${majorVersion}" \ + --prefix PATH : "${ + lib.makeBinPath [ + harvid + xjadeo + ] + }" + ''; + + LINKFLAGS = "-lpthread"; + + meta = { + description = "Multi-track hard disk recording software"; + longDescription = '' + Ardour is a digital audio workstation (DAW), You can use it to + record, edit and mix multi-track audio and midi. Produce your + own CDs. Mix video soundtracks. Experiment with new ideas about + music and sound. + + Please consider supporting the ardour project financially: + https://community.ardour.org/donate + ''; + homepage = "https://ardour.org/"; + license = lib.licenses.gpl2Plus; + mainProgram = "ardour8"; + platforms = lib.platforms.linux; + maintainers = with lib.maintainers; [ + magnetophon + mitchmindtree + ryand56 + ]; + }; + } +) diff --git a/pkgs/by-name/ba/balatro/bridge_detour.lua b/pkgs/by-name/ba/balatro/bridge_detour.lua new file mode 100644 index 000000000000..a60126b34a36 --- /dev/null +++ b/pkgs/by-name/ba/balatro/bridge_detour.lua @@ -0,0 +1,229 @@ +--[[ +The game Balatro is implemented in Lua, with the standard LÖVE SDK. However, +each store that it's sold on (Steam, Google Play, Xbox PC, etc.) has its own SDK +to provide features like cloud saving and achievement unlocking. + +To allow the same platform-agnostic Lua codebase to be deployed in all these +contexts, each one has a custom bridge - `love.platform`. This allows the game +to call `writeSaveFile` and trust that it will be handled appropriately for +whatever platform the player has available. Unfortunately, that bridge is not +supplied by LÖVE, and is therefore missing from Nix's `pkgs.love`. + +This file implements the functions that would otherwise utilize that missing +bridge. It was created by finding all of the `love.platform` callsites in the +Balatro codebase, putting them in this file, and asking Gemini to implement a +Linux version. +]] + +love.platform = love.platform or {} +package.loaded["love.platform"] = love.platform + +local FileOperationStatus = { + SUCCESS = 0, + FETCH_ERROR = 1, + CLOUD_SAVE_ERROR = 2, + CONFLICT = 3, + OFFLINE = 4, + LOAD_ERROR = 5, + NOT_FOUND = 6 +} + +function love.platform.init(onInitSuccess, onInitFailure) + love.filesystem.setIdentity("balatro") + + if onInitSuccess then + onInitSuccess(love.system.getOS(), love.platform.getLocalPlayerName()) + end + return true +end + +function love.platform.setOnPlatformStatusChangedCallback(callback) + if callback then + callback(false, "Cloud unavailable.") + end +end + +function love.platform.earlyInit() end +function love.platform.update(dt) end +function love.platform.shutdown() end + + +function love.platform.getPlatformId() + return love.system.getOS() +end + +function love.platform.getLocalPlayerName() + return os.getenv("USER") or os.getenv("LOGNAME") or "Player" +end + +function love.platform.getLocalPlayerAvatar() + return nil +end + +function love.platform.isPremium() + return true +end + +function love.platform.isArcade() + return false +end + +function love.platform.isFirstTimePlaying() + return not love.platform.saveGameExists("1", "profile.jkr") +end + +function love.platform.isOffline() + -- If the game ever uses this for more than showing the offline warning, we + -- should set this back to true + return false +end + +function love.platform.getNotchPosition() + return nil +end + + +-- Different builds use different file APIs; therefore, we implement both the +-- thin wrapper around the framework's filesystem module and the more complex +-- signatures with individual save slots. +love.platform.localGetInfo = love.filesystem.getInfo +love.platform.localRead = love.filesystem.read +love.platform.localWrite = love.filesystem.write +love.platform.localRemove = love.filesystem.remove +love.platform.localCreateDirectory = love.filesystem.createDirectory + + +-- some versions store their settings files in `common/` +function love.filesystem.getInfo(filename, ...) + local info = love.platform.localGetInfo(filename, ...) + + if not info then + info = love.platform.localGetInfo("common/" .. filename, ...) + end + + return info +end + +function love.filesystem.read(filename, ...) + local content, size = love.platform.localRead(filename, ...) + + if not content then + content, size = love.platform.localRead("common/" .. filename, ...) + end + + return content, size +end + + +function love.platform.writeSaveGame(profile, filename, data) + local parent = tostring(profile) + + if not love.platform.localGetInfo(parent) then + love.platform.localCreateDirectory(parent) + end + + return love.platform.localWrite(parent .. "/" .. filename, data) +end + +function love.platform.loadSaveGame(profile, filename) + local parent = tostring(profile) + return love.platform.localRead(parent .. "/" .. filename) +end + +function love.platform.saveGameExists(profile, filename) + local parent = tostring(profile) + return love.platform.localGetInfo(parent .. "/" .. filename) ~= nil +end + +function love.platform.deleteSaveGameFile(profile, filename) + local parent = tostring(profile) + return love.platform.localRemove(parent .. "/" .. filename) +end + +function love.platform.deleteSaveGame(profile) + local parent = tostring(profile) + return love.platform.localRemove(parent) +end + +local load_game_callback +local save_game_callback + +function love.platform.setLoadGameCallback(callback) + load_game_callback = callback +end + +function love.platform.loadGameFile(filename) + local content, size = love.filesystem.read(filename) + + if load_game_callback then + if content then + load_game_callback(filename, FileOperationStatus.SUCCESS, "", content, nil, nil) + else + load_game_callback(filename, FileOperationStatus.NOT_FOUND, "File not found", nil, nil, nil) + end + end +end + + +function love.platform.setOnSaveInitializedCallback(callback) + if callback then + callback() + end +end + +function love.platform.setSaveGameCallback(callback) + save_game_callback = callback +end + +function love.platform.saveGameFile(filename, data) + local success, msg = love.filesystem.write(filename, data) + if save_game_callback then + if success then + save_game_callback(filename, FileOperationStatus.SUCCESS, "", data, nil, nil) + else + save_game_callback(filename, FileOperationStatus.CLOUD_SAVE_ERROR, msg, nil, nil, nil) + end + end +end + + +-- no-ops when there's no cloud saving +function love.platform.runLoadGameCallbacks() end +function love.platform.runSaveGameCallbacks() end +function love.platform.resolveConflict(file, content, conflictId) end + + +function love.platform.unlockAchievement(achievementId) + love.filesystem.append( + "unlock_awards.lua", + string.format("love.platform.unlockAchievement(%q)\n", achievementId) + ) +end + +function love.platform.unlockAward(awardName) + love.filesystem.append( + "unlock_awards.lua", + string.format("love.platform.unlockAward(%q)\n", awardName) + ) +end + + +function love.platform.event(name, ...) end +function love.platform.hideSplashScreen() end +function love.platform.anyButtonPressed() return false end + +--[[ these are checked before they're used by the game, so we don't have to +-- support them +function love.platform.requestReview() end +function love.platform.requestTrackingPermission() end +function love.platform.setProfileButtonActive(active) end +function love.platform.authenticateLocalPlayer() end +]] + +if love.graphics then + if love.graphics.isActive and not love.graphics.checkActive then + love.graphics.checkActive = love.graphics.isActive + end + + love.graphics.beginFrame = love.graphics.beginFrame or function() end +end diff --git a/pkgs/by-name/ba/balatro/globals.patch b/pkgs/by-name/ba/balatro/globals.patch deleted file mode 100644 index b896a1deb61a..000000000000 --- a/pkgs/by-name/ba/balatro/globals.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- result/share/balatro/globals.lua 1970-01-01 01:00:01.000000000 +0100 -+++ result/share/balatro/globals.lua 1970-01-01 01:00:01.000000000 +0100 -@@ -56,6 +56,12 @@ function Game:set_globals() - self.F_CRASH_REPORTS = false - end - -+ if love.system.getOS() == 'Linux' then -+ self.F_SAVE_TIMER = 5 -+ self.F_DISCORD = true -+ self.F_ENGLISH_ONLY = false -+ end -+ - if love.system.getOS() == 'Nintendo Switch' then - self.F_HIDE_BETA_LANGS = true - self.F_BASIC_CREDITS = true diff --git a/pkgs/by-name/ba/balatro/package.nix b/pkgs/by-name/ba/balatro/package.nix index eb039b8808a7..ff6fb1ab4a43 100644 --- a/pkgs/by-name/ba/balatro/package.nix +++ b/pkgs/by-name/ba/balatro/package.nix @@ -4,24 +4,62 @@ lib, love, lovely-injector, + curl, p7zip, copyDesktopItems, makeWrapper, makeDesktopItem, requireFile, + src ? null, withMods ? true, + withBridgePatch ? true, withLinuxPatch ? true, }: stdenv.mkDerivation (finalAttrs: { pname = "balatro"; version = "1.0.1o"; - src = requireFile { - name = "Balatro-${finalAttrs.version}.exe"; - url = "https://store.steampowered.com/app/2379780/Balatro/"; - # Use `nix --extra-experimental-features nix-command hash file --sri --type sha256` to get the correct hash - hash = "sha256-DXX+FkrM8zEnNNSzesmHiN0V8Ljk+buLf5DE5Z3pP0c="; - }; + src = + if src != null then + src + else + requireFile { + name = "Balatro-${finalAttrs.version}.exe"; + url = "https://store.steampowered.com/app/2379780/Balatro/"; + message = '' + You must own Balatro in order to install it with Nix. The Steam, + Google Play, and Xbox PC versions are supported. + + - If you have the Steam version, you can use Balatro.exe. Find it in + + ~/.local/share/Steam/steamapps/common/Balatro/ + + and run + + nix-store --add-fixed sha256 Balatro.exe + + - If you have the Google Play version, you'll need to pull base.apk from + your device: + + adb shell pm path com.playstack.balatro.android + adb pull ( path from above )/base.apk ~/Downloads/com.playstack.balatro.android.apk + + and add it to /nix/store: + + nix-prefetch-url file:///home/deck/Downloads/com.playstack.balatro.android.apk + + - If you have the Xbox PC version, you can do the same with Assets.zip. + + If you've used nix-prefetch-url to add it to your store, you'll need to + pass the resulting path to override: + + balatro.override { + src = /nix/store/g44bp7ymc7qlkfv5f03b55cgs1wdmkzl-com.playstack.balatro.android.apk; + } + ''; + # Use `nix --extra-experimental-features nix-command hash file --sri --type sha256` to get the correct hash + hash = "sha256-DXX+FkrM8zEnNNSzesmHiN0V8Ljk+buLf5DE5Z3pP0c="; + }; srcIcon = fetchurl { name = "balatro.png"; @@ -34,8 +72,17 @@ stdenv.mkDerivation (finalAttrs: { copyDesktopItems makeWrapper ]; - buildInputs = [ love ] ++ lib.optional withMods lovely-injector; + + buildInputs = [ + love + ] + ++ lib.optionals withMods [ + lovely-injector + curl + ]; + dontUnpack = true; + desktopItems = [ (makeDesktopItem { name = "balatro"; @@ -46,27 +93,60 @@ stdenv.mkDerivation (finalAttrs: { icon = "balatro"; }) ]; + buildPhase = '' runHook preBuild + tmpdir=$(mktemp -d) 7z x ${finalAttrs.src} -o$tmpdir -y - ${if withLinuxPatch then "patch $tmpdir/globals.lua -i ${./globals.patch}" else ""} - patchedExe=$(mktemp -u).zip - 7z a $patchedExe $tmpdir/* + + ${lib.optionalString withBridgePatch '' + cp ${./bridge_detour.lua} $tmpdir/bridge_detour.lua + + for file in main.lua engine/load_manager.lua engine/save_manager.lua; do + if [ -f "$tmpdir/$file" ]; then + sed -i '1i require("bridge_detour")' "$tmpdir/$file" + fi + done + ''} + + ${ + let + patchMarker = "if love.system.getOS() == 'Nintendo Switch' then"; + in + lib.optionalString withLinuxPatch '' + substituteInPlace "$tmpdir/globals.lua" --replace-fail \ + "${patchMarker}" \ + "if love.system.getOS() == 'Linux' then + self.F_SAVE_TIMER = 5 + self.F_DISCORD = true + self.F_ENGLISH_ONLY = false + end + + ${patchMarker}" + '' + } + + loveFile=game.love + 7z a -tzip $loveFile $tmpdir/* + runHook postBuild ''; - # The `cat` bit is a hack suggested by whitelje (https://github.com/ethangreen-dev/lovely-injector/pull/66#issuecomment-2319615509) - # to make it so that lovely will pick up Balatro as the game name. The `LD_PRELOAD` bit is used to load lovely and it is the - # 'official' way of doing it. installPhase = '' runHook preInstall + install -Dm644 $srcIcon $out/share/icons/hicolor/scalable/apps/balatro.png - cat ${lib.getExe love} $patchedExe > $out/share/Balatro + # Packaging the love file into the executable ensures lovely finds the game's name + # https://github.com/ethangreen-dev/lovely-injector/pull/66#issuecomment-2319615509 + cat ${lib.getExe love} $loveFile > $out/share/Balatro chmod +x $out/share/Balatro - makeWrapper $out/share/Balatro $out/bin/balatro ${lib.optionalString withMods "--prefix LD_PRELOAD : '${lovely-injector}/lib/liblovely.so'"} + makeWrapper $out/share/Balatro $out/bin/balatro ${lib.optionalString withMods '' + --prefix LD_PRELOAD : '${lovely-injector}/lib/liblovely.so' \ + --prefix LD_LIBRARY_PATH : '${lib.makeLibraryPath [ curl ]}''} + runHook postInstall ''; diff --git a/pkgs/by-name/ca/cargo-expand/package.nix b/pkgs/by-name/ca/cargo-expand/package.nix index e4dd50fbe586..17607da8aeb2 100644 --- a/pkgs/by-name/ca/cargo-expand/package.nix +++ b/pkgs/by-name/ca/cargo-expand/package.nix @@ -8,16 +8,16 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "cargo-expand"; - version = "1.0.119"; + version = "1.0.120"; src = fetchFromGitHub { owner = "dtolnay"; repo = "cargo-expand"; tag = finalAttrs.version; - hash = "sha256-N48BUPnVnMJSiM3EzpSiDNLGZNWFW05toHRhokNO5gI="; + hash = "sha256-KXnAKv8202Trkkr9D9HRmxTOZ67M2Jt4dhZ9o7D86uI="; }; - cargoHash = "sha256-a8swmPQ+JuE/tqRYbV+kekZV8TloxszYq9k8VOGRBrM="; + cargoHash = "sha256-eCDjGKLPy98SuknzzIE2GZEsxFjNZKuV30Y5nBQao3s="; nativeInstallCheckInputs = [ versionCheckHook ]; doInstallCheck = true; diff --git a/pkgs/by-name/cf/cfn-nag/package.nix b/pkgs/by-name/cf/cfn-nag/package.nix index 71c198c9a9b7..b5f7cd01298a 100644 --- a/pkgs/by-name/cf/cfn-nag/package.nix +++ b/pkgs/by-name/cf/cfn-nag/package.nix @@ -7,7 +7,6 @@ bundlerEnv { pname = "cfn-nag"; - version = "0.8.10"; inherit ruby; gemdir = ./.; diff --git a/pkgs/by-name/gi/gitaly/git.nix b/pkgs/by-name/gi/gitaly/git.nix index 793627658ff6..7f35dc62e87f 100644 --- a/pkgs/by-name/gi/gitaly/git.nix +++ b/pkgs/by-name/gi/gitaly/git.nix @@ -36,7 +36,7 @@ stdenv.mkDerivation (finalAttrs: { ./dont-clone-git-repo.patch ]; - sourceRoot = finalAttrs.src.name; + sourceRoot = "source"; buildFlags = [ "install-git" ]; GIT_REPO_PATH = finalAttrs.src; diff --git a/pkgs/by-name/gi/gitaly/package.nix b/pkgs/by-name/gi/gitaly/package.nix index 58a6748bdc40..1afb2c08e3df 100644 --- a/pkgs/by-name/gi/gitaly/package.nix +++ b/pkgs/by-name/gi/gitaly/package.nix @@ -7,7 +7,7 @@ }: let - version = "18.8.3"; + version = "18.8.4"; package_version = "v${lib.versions.major version}"; gitaly_package = "gitlab.com/gitlab-org/gitaly/${package_version}"; @@ -21,7 +21,7 @@ let owner = "gitlab-org"; repo = "gitaly"; rev = "v${version}"; - hash = "sha256-ALUOgSPl+tNh/hmnYq2Mfw7R0ECQ/ohUZZNnBeItQds="; + hash = "sha256-/zl25h2kYP4nUOJoNkOs3Tp1QsY5YcOutykchPEVa1I="; }; vendorHash = "sha256-CSjsxwumKUbp/tSewE8iAp4c3DH6V6fNY4OCgzjvHP0="; diff --git a/pkgs/by-name/gi/gitlab-pages/package.nix b/pkgs/by-name/gi/gitlab-pages/package.nix index 2c7e5c474f6f..8a5e35d07f6c 100644 --- a/pkgs/by-name/gi/gitlab-pages/package.nix +++ b/pkgs/by-name/gi/gitlab-pages/package.nix @@ -6,14 +6,14 @@ buildGoModule (finalAttrs: { pname = "gitlab-pages"; - version = "18.8.3"; + version = "18.8.4"; # nixpkgs-update: no auto update src = fetchFromGitLab { owner = "gitlab-org"; repo = "gitlab-pages"; rev = "v${finalAttrs.version}"; - hash = "sha256-OmIhZwNmuOGYpBe32EYXVw4nX7XArkxdj3uoP9qurN4="; + hash = "sha256-cGl/Huhy9RJxP786MVlzbMNjgBfEQzZTdHt+KRElXoA="; }; vendorHash = "sha256-AZIv/CU01OAbn5faE4EkSuDCakYzDjRprB5ox5tIlck="; diff --git a/pkgs/by-name/gi/gitlab/data.json b/pkgs/by-name/gi/gitlab/data.json index a279d1c03545..fcbf0c4eaaf0 100644 --- a/pkgs/by-name/gi/gitlab/data.json +++ b/pkgs/by-name/gi/gitlab/data.json @@ -1,17 +1,17 @@ { - "version": "18.8.3", - "repo_hash": "sha256-c9e6HhJ1ERXSMHYW+MHTVzxpqtUIfVHrlIUlCJ+zX0A=", + "version": "18.8.4", + "repo_hash": "sha256-gX5Cy3CxNqLj4HFgqGmFKLrvAhdcgag+XcQMEB9UNZ4=", "yarn_hash": "sha256-s4+NpzynaR5ab1DlXRMmtOeFZCwpexMoWjwX00hnx5o=", "frontend_islands_yarn_hash": "sha256-DiGj3eJMLnlWBTePwGmEvmY9d1Li3p/Y6h3GtZnsvhg=", "owner": "gitlab-org", "repo": "gitlab", - "rev": "v18.8.3-ee", + "rev": "v18.8.4-ee", "passthru": { - "GITALY_SERVER_VERSION": "18.8.3", - "GITLAB_KAS_VERSION": "18.8.3", - "GITLAB_PAGES_VERSION": "18.8.3", + "GITALY_SERVER_VERSION": "18.8.4", + "GITLAB_KAS_VERSION": "18.8.4", + "GITLAB_PAGES_VERSION": "18.8.4", "GITLAB_SHELL_VERSION": "14.45.5", "GITLAB_ELASTICSEARCH_INDEXER_VERSION": "5.12.2", - "GITLAB_WORKHORSE_VERSION": "18.8.3" + "GITLAB_WORKHORSE_VERSION": "18.8.4" } } diff --git a/pkgs/by-name/gi/gitlab/gitlab-workhorse/default.nix b/pkgs/by-name/gi/gitlab/gitlab-workhorse/default.nix index 87e326e59a30..8d147eb8c1d7 100644 --- a/pkgs/by-name/gi/gitlab/gitlab-workhorse/default.nix +++ b/pkgs/by-name/gi/gitlab/gitlab-workhorse/default.nix @@ -10,7 +10,7 @@ in buildGoModule (finalAttrs: { pname = "gitlab-workhorse"; - version = "18.8.3"; + version = "18.8.4"; # nixpkgs-update: no auto update src = fetchFromGitLab { diff --git a/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile b/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile index 9026b832bb45..0aa66cfebd4a 100644 --- a/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile +++ b/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile @@ -747,7 +747,7 @@ gem 'paper_trail', '~> 16.0', feature_category: :workspaces gem "i18n_data", "~> 0.13.1", feature_category: :system_access -gem "gitlab-cloud-connector", "~> 1.40", require: 'gitlab/cloud_connector', feature_category: :plan_provisioning +gem "gitlab-cloud-connector", "~> 1.43", require: 'gitlab/cloud_connector', feature_category: :plan_provisioning gem "gvltools", "~> 0.4.0", feature_category: :shared # rubocop:todo Gemfile/MissingFeatureCategory -- https://gitlab.com/gitlab-org/gitlab/-/issues/581839 diff --git a/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile.lock b/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile.lock index d369b2afc16c..70fa0bd63332 100644 --- a/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile.lock +++ b/pkgs/by-name/gi/gitlab/rubyEnv/Gemfile.lock @@ -743,7 +743,7 @@ GEM terminal-table (>= 1.5.1) gitlab-chronic (0.10.6) numerizer (~> 0.2) - gitlab-cloud-connector (1.40.0) + gitlab-cloud-connector (1.43.0) activesupport (>= 7.0) jwt (~> 2.9) gitlab-crystalball (1.1.1) @@ -2191,7 +2191,7 @@ DEPENDENCIES gitlab-active-context! gitlab-backup-cli! gitlab-chronic (~> 0.10.5) - gitlab-cloud-connector (~> 1.40) + gitlab-cloud-connector (~> 1.43) gitlab-crystalball (~> 1.1.0) gitlab-dangerfiles (~> 4.10.0) gitlab-duo-workflow-service-client (~> 0.6)! diff --git a/pkgs/by-name/gi/gitlab/rubyEnv/gemset.nix b/pkgs/by-name/gi/gitlab/rubyEnv/gemset.nix index f7e808cff9c6..aaf6b35a12a9 100644 --- a/pkgs/by-name/gi/gitlab/rubyEnv/gemset.nix +++ b/pkgs/by-name/gi/gitlab/rubyEnv/gemset.nix @@ -2886,10 +2886,10 @@ src: { platforms = [ ]; source = { remotes = [ "https://rubygems.org" ]; - sha256 = "0wkffbl793jvkjw3qdfqfb1j4adsvyakdv7sc0g3cdp2q6lrrmah"; + sha256 = "1cjn1vqnvr3lhbdqfpy88aq7qmvd1j7i08gd8cly91914cd22pi9"; type = "gem"; }; - version = "1.40.0"; + version = "1.43.0"; }; gitlab-crystalball = { dependencies = [ diff --git a/pkgs/by-name/go/gopro-tool/package.nix b/pkgs/by-name/go/gopro-tool/package.nix index a5b848d28b5d..475d2df02067 100644 --- a/pkgs/by-name/go/gopro-tool/package.nix +++ b/pkgs/by-name/go/gopro-tool/package.nix @@ -5,22 +5,30 @@ makeWrapper, ffmpeg, vlc, + vlc' ? vlc.overrideAttrs (old: { + buildInputs = old.buildInputs ++ [ x264 ]; + }), jq, + x264, + nixosTests, }: -stdenv.mkDerivation { +stdenv.mkDerivation (finalAttrs: { pname = "gopro-tool"; - version = "0-unstable-2024-04-18"; + version = "1.18"; src = fetchFromGitHub { owner = "juchem"; repo = "gopro-tool"; - rev = "a678f0ea65e24dca9b8d848b245bd2d487d3c8ca"; - sha256 = "0sh3s38m17pci24x4kdlmlhn0gwgm28aaa6p7qs16wysk0q0h6wz"; + tag = "v${finalAttrs.version}"; + hash = "sha256-nxsIMJjacxM0PtcopZCojz9gIa20TdKJiOyeUNHQA2o="; }; nativeBuildInputs = [ makeWrapper ]; + strictDeps = true; + __structuredAttrs = true; + installPhase = '' mkdir -p $out/bin cp $src/gopro-tool $out/bin/gopro-tool @@ -30,16 +38,20 @@ stdenv.mkDerivation { --prefix PATH : ${ lib.makeBinPath [ ffmpeg - vlc + vlc' jq ] } ''; + passthru.tests = { + inherit (nixosTests) gopro-tool; + }; + meta = { description = "Tool to control GoPro webcam mode in Linux (requires v4l2loopback kernel module and a firewall rule)"; license = lib.licenses.bsd3; maintainers = with lib.maintainers; [ ZMon3y ]; platforms = lib.platforms.linux; }; -} +}) diff --git a/pkgs/by-name/hy/hydraAntLogger/package.nix b/pkgs/by-name/hy/hydra-ant-logger/package.nix similarity index 100% rename from pkgs/by-name/hy/hydraAntLogger/package.nix rename to pkgs/by-name/hy/hydra-ant-logger/package.nix diff --git a/pkgs/by-name/in/invoiceplane/fix-yarn-lockfile.patch b/pkgs/by-name/in/invoiceplane/fix-yarn-lockfile.patch new file mode 100644 index 000000000000..dc25725398f5 --- /dev/null +++ b/pkgs/by-name/in/invoiceplane/fix-yarn-lockfile.patch @@ -0,0 +1,19 @@ +diff --git a/yarn.lock b/yarn.lock +index 227d51e2..11c80f04 100644 +--- a/yarn.lock ++++ b/yarn.lock +@@ -1397,10 +1397,10 @@ safe-json-parse@~1.0.1: + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +-sass@^1.89.2: +- version "1.97.2" +- resolved "https://registry.yarnpkg.com/sass/-/sass-1.97.2.tgz#e515a319092fd2c3b015228e3094b40198bff0da" +- integrity sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw== ++sass@^1.97: ++ version "1.97.3" ++ resolved "https://registry.yarnpkg.com/sass/-/sass-1.97.3.tgz#9cb59339514fa7e2aec592b9700953ac6e331ab2" ++ integrity sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg== + dependencies: + chokidar "^4.0.0" + immutable "^5.0.2" diff --git a/pkgs/by-name/in/invoiceplane/package.nix b/pkgs/by-name/in/invoiceplane/package.nix new file mode 100644 index 000000000000..a0b8b6faf144 --- /dev/null +++ b/pkgs/by-name/in/invoiceplane/package.nix @@ -0,0 +1,80 @@ +{ + lib, + fetchFromGitHub, + nixosTests, + fetchYarnDeps, + applyPatches, + php, + yarnConfigHook, + yarnBuildHook, + yarnInstallHook, + grunt-cli, + fetchzip, +}: +let + version = "1.7.0"; + # Fetch release tarball which contains language files + # https://github.com/InvoicePlane/InvoicePlane/issues/1170 + languages = fetchzip { + #url = "https://github.com/InvoicePlane/InvoicePlane/releases/download/v${version}/v${version}.zip"; + url = "https://github.com/InvoicePlane/InvoicePlane/releases/download/v1.7.0/v1.7.0.zip"; + hash = "sha256-D5wZg745xjbBsEPUbvle8ynErFB4xn9zdxOGh0xKCCU="; + }; +in +php.buildComposerProject2 (finalAttrs: { + pname = "invoiceplane"; + inherit version; + + src = fetchFromGitHub { + owner = "InvoicePlane"; + repo = "InvoicePlane"; + tag = "v${version}"; + hash = "sha256-6fuUmXe8mFSnLYwQCwBzxmSQxM06rQXe00IKUZvWnpM="; + }; + + # Fixes error: Couldn't find any versions for "sass" that matches "^1.97" in our cache + patches = [ ./fix-yarn-lockfile.patch ]; + + # Composer.lock validation currently fails for unknown reason + composerStrictValidation = false; + + vendorHash = "sha256-/fNVq3WJCr9f/NE0s1x8N48W3ZMRUxdh1Qf3pLl0Lpg="; + + nativeBuildInputs = [ + yarnConfigHook + yarnBuildHook + yarnInstallHook + # Needed for executing package.json scripts + grunt-cli + ]; + + offlineCache = fetchYarnDeps { + inherit (finalAttrs) src patches; + hash = "sha256-YDknkQzdRKRRMXS6/cPRSrfhhIyTIDRnFPNGQueu74A="; + }; + + postBuild = '' + grunt build + ''; + + # Cleanup and language files + postInstall = '' + chmod -R u+w $out/share + mv $out/share/php/invoiceplane/* $out/ + cp -r ${languages}/application/language $out/application/ + rm -r $out/{composer.json,composer.lock,CONTRIBUTING.md,docker-compose.yml,Gruntfile.js,package.json,node_modules,yarn.lock,share} + ''; + + passthru.tests = { + inherit (nixosTests) invoiceplane; + }; + + meta = { + description = "Self-hosted open source application for managing your invoices, clients and payments"; + changelog = "https://github.com/InvoicePlane/InvoicePlane/releases/tag/v${version}"; + homepage = "https://www.invoiceplane.com"; + license = lib.licenses.mit; + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ onny ]; + }; +}) diff --git a/pkgs/by-name/ka/kanboard/package.nix b/pkgs/by-name/ka/kanboard/package.nix index f1abc2a49b1f..88aa8710d0eb 100644 --- a/pkgs/by-name/ka/kanboard/package.nix +++ b/pkgs/by-name/ka/kanboard/package.nix @@ -9,13 +9,13 @@ stdenvNoCC.mkDerivation (finalAttrs: { pname = "kanboard"; - version = "1.2.49"; + version = "1.2.50"; src = fetchFromGitHub { owner = "kanboard"; repo = "kanboard"; tag = "v${finalAttrs.version}"; - hash = "sha256-d74XjURu7vJwn+6p/br76jp4zJiYhYJLSjvxLamt48Q="; + hash = "sha256-/nC+V8KfVdEFEBozFFsyinUfXzZbu7h8/ROpjJoDchI="; }; dontBuild = true; diff --git a/pkgs/by-name/li/limine/package.nix b/pkgs/by-name/li/limine/package.nix index 547fb8c08d5f..442f393016f8 100644 --- a/pkgs/by-name/li/limine/package.nix +++ b/pkgs/by-name/li/limine/package.nix @@ -47,14 +47,14 @@ in # as bootloader for various platforms and corresponding binary and helper files. stdenv.mkDerivation (finalAttrs: { pname = "limine"; - version = "10.6.6"; + version = "10.7.0"; # We don't use the Git source but the release tarball, as the source has a # `./bootstrap` script performing network access to download resources. # Packaging that in Nix is very cumbersome. src = fetchurl { url = "https://codeberg.org/Limine/Limine/releases/download/v${finalAttrs.version}/limine-${finalAttrs.version}.tar.gz"; - hash = "sha256-xU0uygvqeWfsy5FsYQQAEwc0H15j8amW0097Fojw1DM="; + hash = "sha256-1gwgzyISeOj4QE8hZ/KDCVW8qCQYvpQE6lf/N1jt0J4="; }; enableParallelBuilding = true; diff --git a/pkgs/by-name/me/mediainfo/package.nix b/pkgs/by-name/me/mediainfo/package.nix index dd9f50623d80..07f6a45dd05a 100644 --- a/pkgs/by-name/me/mediainfo/package.nix +++ b/pkgs/by-name/me/mediainfo/package.nix @@ -11,11 +11,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "mediainfo"; - version = "25.10"; + version = "26.01"; src = fetchurl { url = "https://mediaarea.net/download/source/mediainfo/${finalAttrs.version}/mediainfo_${finalAttrs.version}.tar.xz"; - hash = "sha256-NmsyUQGrGppO55+9uOPdnni8wKIcD5sZZjE6rtPTNQI="; + hash = "sha256-FQZWytiO9O+k6Cmc/CTZt6cjVFdqaTSZIFiKzuLMPHY="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/mi/mimalloc/package.nix b/pkgs/by-name/mi/mimalloc/package.nix index 1c7f1e12eb43..a808fd8e12ac 100644 --- a/pkgs/by-name/mi/mimalloc/package.nix +++ b/pkgs/by-name/mi/mimalloc/package.nix @@ -10,14 +10,14 @@ let soext = stdenv.hostPlatform.extensions.sharedLibrary; in -stdenv.mkDerivation rec { +stdenv.mkDerivation (finalAttrs: { pname = "mimalloc"; version = "3.1.5"; src = fetchFromGitHub { owner = "microsoft"; repo = "mimalloc"; - rev = "v${version}"; + tag = "v${finalAttrs.version}"; sha256 = "sha256-fk6nfyBFS1G0sJwUJVgTC1+aKd0We/JjsIYTO+IOfyg="; }; @@ -34,16 +34,29 @@ stdenv.mkDerivation rec { cmake ninja ]; - cmakeFlags = [ - "-DMI_INSTALL_TOPLEVEL=ON" - ] - ++ lib.optionals secureBuild [ "-DMI_SECURE=ON" ] - ++ lib.optionals stdenv.hostPlatform.isStatic [ "-DMI_BUILD_SHARED=OFF" ] - ++ lib.optionals (!doCheck) [ "-DMI_BUILD_TESTS=OFF" ]; + cmakeFlags = lib.mapAttrsToList lib.cmakeBool { + MI_INSTALL_TOPLEVEL = true; + MI_SECURE = secureBuild; + MI_BUILD_SHARED = stdenv.hostPlatform.hasSharedLibraries; + MI_LIBC_MUSL = stdenv.hostPlatform.libc == "musl"; + MI_BUILD_TESTS = finalAttrs.doCheck; + + # MI_OPT_ARCH is inaccurate (e.g. it assumes aarch64 == armv8.1-a). + # Nixpkgs's native platform configuration does a better job. + MI_NO_OPT_ARCH = true; + }; + + postPatch = '' + substituteInPlace cmake/mimalloc-config.cmake \ + --replace-fail 'string(REPLACE "/lib/cmake" "/lib" MIMALLOC_LIBRARY_DIR "''${MIMALLOC_CMAKE_DIR}")' \ + "set(MIMALLOC_LIBRARY_DIR \"$out/lib\")" \ + --replace-fail 'string(REPLACE "/lib/cmake/" "/lib/" MIMALLOC_OBJECT_DIR "''${CMAKE_CURRENT_LIST_DIR}")' \ + "set(MIMALLOC_OBJECT_DIR \"$out/lib\")" + ''; postInstall = let - rel = lib.versions.majorMinor version; + rel = lib.versions.majorMinor finalAttrs.version; suffix = if stdenv.hostPlatform.isLinux then "${soext}.${rel}" else ".${rel}${soext}"; in '' @@ -76,4 +89,4 @@ stdenv.mkDerivation rec { thoughtpolice ]; }; -} +}) diff --git a/pkgs/by-name/mo/moonlight/package.nix b/pkgs/by-name/mo/moonlight/package.nix index 52d9ba4da6d2..4cfc622e53a3 100644 --- a/pkgs/by-name/mo/moonlight/package.nix +++ b/pkgs/by-name/mo/moonlight/package.nix @@ -14,13 +14,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "moonlight"; - version = "1.3.39"; + version = "2026.2.1"; src = fetchFromGitHub { owner = "moonlight-mod"; repo = "moonlight"; tag = "v${finalAttrs.version}"; - hash = "sha256-85W5OrP9Ju4ZJRUEZLpBreKxgUrHgxxZEv7KzcpqNDo="; + hash = "sha256-BpTN9AdQEDD2XnEUsUxgkoq+EPGhtnYgJhLKF4GVZoc="; }; nativeBuildInputs = [ @@ -32,7 +32,7 @@ stdenv.mkDerivation (finalAttrs: { pnpmDeps = fetchPnpmDeps { inherit (finalAttrs) pname version src; fetcherVersion = 3; - hash = "sha256-+wGup5wJIqTzkr4mTo/CxofffQmUz3JD2s/s/oY0viM="; + hash = "sha256-b3d8VcfQjCkcJThebXJ2yvKZfU8u4QnpZgNyqP6XIu0="; }; env = { diff --git a/pkgs/by-name/nd/ndcurves/package.nix b/pkgs/by-name/nd/ndcurves/package.nix index ba6732ab08e6..770fea0fa4b9 100644 --- a/pkgs/by-name/nd/ndcurves/package.nix +++ b/pkgs/by-name/nd/ndcurves/package.nix @@ -13,13 +13,13 @@ stdenv.mkDerivation (finalAttrs: { pname = "ndcurves"; - version = "2.1.0"; + version = "2.1.1"; src = fetchFromGitHub { owner = "loco-3d"; repo = "ndcurves"; rev = "v${finalAttrs.version}"; - hash = "sha256-VHxGm6fzoS51PtTj/qeZumz58ZHtxy28ihbzbnoHvHg="; + hash = "sha256-YnpC2yYEe9VNcHHDyv+glLrue/J/HXbK/VP7DTAE/q0="; }; outputs = [ diff --git a/pkgs/by-name/ni/nix-required-mounts/eval-test.nix b/pkgs/by-name/ni/nix-required-mounts/eval-test.nix new file mode 100644 index 000000000000..81f1a4f8ca84 --- /dev/null +++ b/pkgs/by-name/ni/nix-required-mounts/eval-test.nix @@ -0,0 +1,26 @@ +{ + nixos, + lib, + runCommand, +}: +let + base = nixos { + services.userborn.enable = true; + programs.nix-required-mounts = { + enable = true; + presets.nvidia-gpu.enable = true; + }; + fileSystems."/".device = "/dev/null"; + boot.loader.grub.enable = false; + system.stateVersion = lib.trivial.release; + }; + machine = base.extendModules { + modules = [ { hardware.graphics.enable = true; } ]; + }; +in +runCommand "nix-required-mounts-eval-nvidia-gpu-preset" { } '' + echo "Successfully evaluated ${base.config.system.build.toplevel}" + echo "Successfully evaluated ${machine.config.system.build.toplevel}" + echo "This means that combining nix-required-mounts with userborn no longer causes infinite recursion (#488199)" + touch $out +'' diff --git a/pkgs/by-name/ni/nix-required-mounts/package.nix b/pkgs/by-name/ni/nix-required-mounts/package.nix index 89069a112051..9f91c14692a1 100644 --- a/pkgs/by-name/ni/nix-required-mounts/package.nix +++ b/pkgs/by-name/ni/nix-required-mounts/package.nix @@ -55,6 +55,7 @@ python3Packages.buildPythonApplication { inherit allowedPatterns; tests = { inherit (nixosTests) nix-required-mounts; + eval-nvidia-gpu-preset = callPackage ./eval-test.nix { }; }; }; meta = { diff --git a/pkgs/by-name/ni/nixfmt-tree/package.nix b/pkgs/by-name/ni/nixfmt-tree/package.nix index d66d23ef3d2e..2d5c3a7f1422 100644 --- a/pkgs/by-name/ni/nixfmt-tree/package.nix +++ b/pkgs/by-name/ni/nixfmt-tree/package.nix @@ -95,7 +95,7 @@ treefmtWithConfig.overrideAttrs { You can achieve similar results by manually configuring `treefmt`: ```nix pkgs.treefmt.withConfig { - runtimeInputs = [ pkgs.nixfmt-rfc-style ]; + runtimeInputs = [ pkgs.nixfmt ]; settings = { # Log level for files treefmt won't format diff --git a/pkgs/by-name/po/podman/package.nix b/pkgs/by-name/po/podman/package.nix index d18d83340e6b..b3ebfa1d4e26 100644 --- a/pkgs/by-name/po/podman/package.nix +++ b/pkgs/by-name/po/podman/package.nix @@ -176,18 +176,19 @@ buildGoModule (finalAttrs: { name = "podman-helper-binary-wrapper"; # this only works for some binaries, others may need to be added to `binPath` or in the modules - paths = [ - gvproxy - ] - ++ lib.optionals stdenv.hostPlatform.isLinux [ - aardvark-dns - catatonit # added here for the pause image and also set in `containersConf` for `init_path` - netavark - passt - conmon - crun - ] - ++ extraRuntimes; + paths = + lib.optionals stdenv.hostPlatform.isDarwin [ + gvproxy + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + aardvark-dns + catatonit # added here for the pause image and also set in `containersConf` for `init_path` + netavark + passt + conmon + crun + ] + ++ extraRuntimes; }; }; diff --git a/pkgs/by-name/se/secretspec/package.nix b/pkgs/by-name/se/secretspec/package.nix index 9d7e85329716..8040cf5e544b 100644 --- a/pkgs/by-name/se/secretspec/package.nix +++ b/pkgs/by-name/se/secretspec/package.nix @@ -9,14 +9,14 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "secretspec"; - version = "0.6.2"; + version = "0.7.0"; src = fetchCrate { inherit (finalAttrs) pname version; - hash = "sha256-ZbyeYol8TaQz4ljTHTIHIlQwxmi/fr/ReILIOtilfEY="; + hash = "sha256-ik4ieQifB5MFvyr6cmcwvcyr3HyUB5aHpVIhnpVB1i8="; }; - cargoHash = "sha256-UcSHFf9afU+2gl6K7XkYNEkJvslTkEO9u7qkNOKSNxg="; + cargoHash = "sha256-3xaJySTsGPjU8sDL7j0biEdpcrNuOspdf41iHH6BE4o="; nativeBuildInputs = [ pkg-config ]; buildInputs = [ dbus ]; diff --git a/pkgs/by-name/vu/vue-language-server/package.nix b/pkgs/by-name/vu/vue-language-server/package.nix index 7aba59e43a00..efaf36d47cee 100644 --- a/pkgs/by-name/vu/vue-language-server/package.nix +++ b/pkgs/by-name/vu/vue-language-server/package.nix @@ -11,19 +11,19 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "vue-language-server"; - version = "3.2.2"; + version = "3.2.4"; src = fetchFromGitHub { owner = "vuejs"; repo = "language-tools"; rev = "v${finalAttrs.version}"; - hash = "sha256-oVIWRCnJkJK1CsgNp7l95uuILeXv2XuwwfGElGnOEyU="; + hash = "sha256-GxIIqRK8wBVlo8jvCox6Fdp705EMg1YoHB46bvs5kkE="; }; pnpmDeps = fetchPnpmDeps { inherit (finalAttrs) pname version src; fetcherVersion = 1; - hash = "sha256-lxRify3uJnqYH6btmXU9yaO8LJDGBZcyONLUHv2rLqg="; + hash = "sha256-QLey523pqhjOBn4xhN9mZTKRAC96imVka+li7C4BXQY="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/wi/wit-bindgen/package.nix b/pkgs/by-name/wi/wit-bindgen/package.nix index 87361189e5ca..3b7bb0abbe4a 100644 --- a/pkgs/by-name/wi/wit-bindgen/package.nix +++ b/pkgs/by-name/wi/wit-bindgen/package.nix @@ -6,16 +6,16 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "wit-bindgen"; - version = "0.52.0"; + version = "0.53.0"; src = fetchFromGitHub { owner = "bytecodealliance"; repo = "wit-bindgen"; rev = "v${finalAttrs.version}"; - hash = "sha256-S3iOmkAg1H6sEcXhC/7cQcrwH5OwR5ZROn0iPkUrwEY="; + hash = "sha256-TTSc4T8QR7cmAPAFzoV/9oBfKrUzVs20qMP3rwjELr4="; }; - cargoHash = "sha256-RqDlBpwCxwwoG+u7zUz8j4t5JXonTe7mvAk8PxU7Gdc="; + cargoHash = "sha256-SybsgrOlxh27CQ73IXVYlTROTRR0MU3O7Sieh5pYeHw="; # Some tests fail because they need network access to install the `wasm32-unknown-unknown` target. # However, GitHub Actions ensures a proper build. diff --git a/pkgs/by-name/ze/zensical/package.nix b/pkgs/by-name/ze/zensical/package.nix index a17ba20eef3b..70ecee996539 100644 --- a/pkgs/by-name/ze/zensical/package.nix +++ b/pkgs/by-name/ze/zensical/package.nix @@ -8,7 +8,7 @@ python3Packages.buildPythonApplication (finalAttrs: { pname = "zensical"; - version = "0.0.21"; + version = "0.0.23"; pyproject = true; # We fetch from PyPi, because GitHub repo does not contain all sources. @@ -16,12 +16,12 @@ python3Packages.buildPythonApplication (finalAttrs: { # We could combine sources, but then nix-update won't work. src = fetchPypi { inherit (finalAttrs) pname version; - hash = "sha256-wTVjg2+mOjyr7/2D/jp3DKdAz6Wue4XfhdiYN+MbO0o="; + hash = "sha256-XE/DqvB135nYz0G58lZuTViBgNmolJMBTTYH3+UKxLw="; }; cargoDeps = rustPlatform.fetchCargoVendor { inherit (finalAttrs) pname version src; - hash = "sha256-zkF0Yf7EPFHmkWy3FEhTKYFlWW4pLFG1OZPi1z7vZXU="; + hash = "sha256-cS8gxMPRpMMHwrjqXjyxBl4dbwll01Y+G4eOBZ3/vdM="; }; nativeBuildInputs = with rustPlatform; [ diff --git a/pkgs/development/compilers/flutter/default.nix b/pkgs/development/compilers/flutter/default.nix index c8b2026c5f88..f7461b01739d 100644 --- a/pkgs/development/compilers/flutter/default.nix +++ b/pkgs/development/compilers/flutter/default.nix @@ -50,19 +50,32 @@ let ; dart = - (dart.overrideAttrs (_: { - # This overrideAttrs is used to replace the version in src.url - version = dartVersion; - __intentionallyOverridingVersion = true; - })).overrideAttrs - (oldAttrs: { - src = fetchzip { - inherit (oldAttrs.src) url; - hash = - dartHash.${stdenv.hostPlatform.system} - or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); - }; - }); + let + hash = + dartHash.${stdenv.hostPlatform.system} + or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); + in + ( + if lib.versionAtLeast version "3.41" then + (dart.overrideAttrs (oldAttrs: { + version = dartVersion; + src = oldAttrs.src.overrideAttrs (_: { + inherit hash; + }); + })) + else + (dart.overrideAttrs (_: { + # This overrideAttrs is used to replace the version in src.url + version = dartVersion; + __intentionallyOverridingVersion = true; + })).overrideAttrs + (oldAttrs: { + src = fetchzip { + inherit (oldAttrs.src) url; + inherit hash; + }; + }) + ); src = let source = fetchFromGitHub { diff --git a/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in b/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in index 326b2f672d62..0972a3578b52 100644 --- a/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in +++ b/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in @@ -1,29 +1,22 @@ { lib, - fetchzip, + fetchurl, }: let dartVersion = "@dart_version@"; - platform = "@platform@"; - channel = if lib.strings.hasSuffix ".beta" dartVersion then "beta" else "stable"; + system = + { + x86_64-linux = "linux-x64"; + aarch64-linux = "linux-arm64"; + x86_64-darwin = "macos-x64"; + aarch64-darwin = "macos-arm64"; + } + ."@platform@"; in -{ - x86_64-linux = fetchzip { - url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip"; - hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; - }; - aarch64-linux = fetchzip { - url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip"; - hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; - }; - x86_64-darwin = fetchzip { - url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-x64-release.zip"; - hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; - }; - aarch64-darwin = fetchzip { - url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-arm64-release.zip"; - hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; - }; +fetchurl { + url = "https://storage.googleapis.com/dart-archive/channels/${ + if lib.strings.hasSuffix ".beta" dartVersion then "beta" else "stable" + }/release/${dartVersion}/sdk/dartsdk-${system}-release.zip"; + hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; } -.${platform} diff --git a/pkgs/development/compilers/flutter/versions/3_41/data.json b/pkgs/development/compilers/flutter/versions/3_41/data.json index ac018edd16b4..6f8b5d74dc99 100644 --- a/pkgs/development/compilers/flutter/versions/3_41/data.json +++ b/pkgs/development/compilers/flutter/versions/3_41/data.json @@ -1,73 +1,73 @@ { - "version": "3.41.0-0.3.pre", - "engineVersion": "492bf6df86d056e47d05a3d5404f3d78939b3dae", + "version": "3.41.0", + "engineVersion": "3452d735bd38224ef2db85ca763d862d6326b17f", "engineSwiftShaderHash": "sha256-qbtCl2nTpmtp9dnaoXc7rF3RqLnAZEmzw1BzPoCRWrc=", "engineSwiftShaderRev": "794b0cfce1d828d187637e6d932bae484fbe0976", - "channel": "beta", + "channel": "stable", "engineHashes": { "aarch64-linux": { - "aarch64-linux": "sha256-sL+RfXTdy5qAzgbSdfxeZHDcHSBzBLsbJ0Q8qLC9KMU=", - "x86_64-linux": "sha256-sL+RfXTdy5qAzgbSdfxeZHDcHSBzBLsbJ0Q8qLC9KMU=" + "aarch64-linux": "sha256-XZvyhT3X4MBehSxWdceVFCNH9teXuGYjTaquuoiVp0w=", + "x86_64-linux": "sha256-XZvyhT3X4MBehSxWdceVFCNH9teXuGYjTaquuoiVp0w=" }, "x86_64-linux": { - "aarch64-linux": "sha256-82KrH53pKiLCwdwzxlFRCD/IKe0RcP8NEnjItA2whdA=", - "x86_64-linux": "sha256-82KrH53pKiLCwdwzxlFRCD/IKe0RcP8NEnjItA2whdA=" + "aarch64-linux": "sha256-u2JDoBxDdOIj7no+9Ym+JLwAQZxTKXmOjrRtaDlktuc=", + "x86_64-linux": "sha256-u2JDoBxDdOIj7no+9Ym+JLwAQZxTKXmOjrRtaDlktuc=" } }, - "dartVersion": "3.11.0-296.5.beta", + "dartVersion": "3.11.0", "dartHash": { - "x86_64-linux": "sha256-7EJPXQQrViX66lnpdqapSuTYrcT2uNwpqZClpjvNzRY=", - "aarch64-linux": "sha256-2xgSEH9HQj8oJNH8eNs0NYxK3UGGaVBWnyuDbdam7XQ=", - "x86_64-darwin": "sha256-cz7VM3lBWxnpFNaOI3ERZXVOgtEPVa6LVpvnvqFcw2M=", - "aarch64-darwin": "sha256-eSTSzsjaIQUoTHqdwc3ZVkSKcXeiz+MIc0fh2XW935Q=" + "x86_64-linux": "sha256-8xcptWe+MYx8wjva/muamX+n3b+CnfUBbwZiJ7aqDJk=", + "aarch64-linux": "sha256-dr/vXICcCCF332xRu/SADY1NdV8ulvt1Fiv40rAy74M=", + "x86_64-darwin": "sha256-Wlwpx6g4EmkzKAEyaxHMrc8M/nMB7QGj8G6BdmvLjXQ=", + "aarch64-darwin": "sha256-IjJFpC6rG4EeUC4VYluGcHX/4BLenrU3Skzd4u4IdTQ=" }, - "flutterHash": "sha256-dCfrPq1oJOmDb3bP24D2rmDQzoB8uI3qJF2hqWmXywI=", + "flutterHash": "sha256-/rgmV0BMOF3Mlw/9DVEQkptDUXzJCNEYmQX+BIXlyxY=", "artifactHashes": { "android": { - "aarch64-darwin": "sha256-+HRucNf5J3fb1uVcYEte5zw4LcnfbmBL0kmeSQBHBlw=", - "aarch64-linux": "sha256-7t3r/mq8KnWEbY2CVCv7l2HAV2dncrJj18vb2QxTh+8=", - "x86_64-darwin": "sha256-+HRucNf5J3fb1uVcYEte5zw4LcnfbmBL0kmeSQBHBlw=", - "x86_64-linux": "sha256-7t3r/mq8KnWEbY2CVCv7l2HAV2dncrJj18vb2QxTh+8=" + "aarch64-darwin": "sha256-9bjCiMYvcwMMWU8lJdJB+f2P0WxZzzjfs/pUD4qr74g=", + "aarch64-linux": "sha256-u8O8uDaGrmAPexC+TIq0/dlnt3+B5+RQNiyk2GnVWLM=", + "x86_64-darwin": "sha256-9bjCiMYvcwMMWU8lJdJB+f2P0WxZzzjfs/pUD4qr74g=", + "x86_64-linux": "sha256-u8O8uDaGrmAPexC+TIq0/dlnt3+B5+RQNiyk2GnVWLM=" }, "fuchsia": { - "aarch64-darwin": "sha256-8MjxukMuB31krOuTaQdFw3uy57bNg053xFgwVZUr9qg=", - "aarch64-linux": "sha256-8MjxukMuB31krOuTaQdFw3uy57bNg053xFgwVZUr9qg=", - "x86_64-darwin": "sha256-8MjxukMuB31krOuTaQdFw3uy57bNg053xFgwVZUr9qg=", - "x86_64-linux": "sha256-8MjxukMuB31krOuTaQdFw3uy57bNg053xFgwVZUr9qg=" + "aarch64-darwin": "sha256-hFiXjW34BhtPsw5jC22SqDsfMQzuZVidci6a6b63L4o=", + "aarch64-linux": "sha256-hFiXjW34BhtPsw5jC22SqDsfMQzuZVidci6a6b63L4o=", + "x86_64-darwin": "sha256-hFiXjW34BhtPsw5jC22SqDsfMQzuZVidci6a6b63L4o=", + "x86_64-linux": "sha256-hFiXjW34BhtPsw5jC22SqDsfMQzuZVidci6a6b63L4o=" }, "ios": { - "aarch64-darwin": "sha256-2gOpJcPdzSY1q1SAs8oUJHkKTVQluFSrS3M4U3Mh9/o=", - "aarch64-linux": "sha256-2gOpJcPdzSY1q1SAs8oUJHkKTVQluFSrS3M4U3Mh9/o=", - "x86_64-darwin": "sha256-2gOpJcPdzSY1q1SAs8oUJHkKTVQluFSrS3M4U3Mh9/o=", - "x86_64-linux": "sha256-2gOpJcPdzSY1q1SAs8oUJHkKTVQluFSrS3M4U3Mh9/o=" + "aarch64-darwin": "sha256-lPCidjKmqgotphFvjWUL2t3o6NBIFos1lfh958pCATQ=", + "aarch64-linux": "sha256-lPCidjKmqgotphFvjWUL2t3o6NBIFos1lfh958pCATQ=", + "x86_64-darwin": "sha256-lPCidjKmqgotphFvjWUL2t3o6NBIFos1lfh958pCATQ=", + "x86_64-linux": "sha256-lPCidjKmqgotphFvjWUL2t3o6NBIFos1lfh958pCATQ=" }, "linux": { - "aarch64-darwin": "sha256-NouPte/10GE7QctNlMpDXP/Yl3dDEjC52cf3Zd8Si40=", - "aarch64-linux": "sha256-NouPte/10GE7QctNlMpDXP/Yl3dDEjC52cf3Zd8Si40=", - "x86_64-darwin": "sha256-ELqekEn0ofBiDMh+cUXYhYTweu81k7Qc2f3WlO0fZzE=", - "x86_64-linux": "sha256-ELqekEn0ofBiDMh+cUXYhYTweu81k7Qc2f3WlO0fZzE=" + "aarch64-darwin": "sha256-RwXbextfT+342Zg19z0k1EykHo6flPYPHuHE5czDs+4=", + "aarch64-linux": "sha256-RwXbextfT+342Zg19z0k1EykHo6flPYPHuHE5czDs+4=", + "x86_64-darwin": "sha256-J9cGfpF5LIjY17lVJlmlcyucLCpT49jt5P8jAWyeoiU=", + "x86_64-linux": "sha256-J9cGfpF5LIjY17lVJlmlcyucLCpT49jt5P8jAWyeoiU=" }, "macos": { - "aarch64-darwin": "sha256-Aj3FdXENj5fWleC/QaWQ5qWn+RNdFzq+lQoy3UgMF84=", - "aarch64-linux": "sha256-Aj3FdXENj5fWleC/QaWQ5qWn+RNdFzq+lQoy3UgMF84=", - "x86_64-darwin": "sha256-Aj3FdXENj5fWleC/QaWQ5qWn+RNdFzq+lQoy3UgMF84=", - "x86_64-linux": "sha256-Aj3FdXENj5fWleC/QaWQ5qWn+RNdFzq+lQoy3UgMF84=" + "aarch64-darwin": "sha256-xHoNZrOn5yu734jDEE0RN+cNO/DCuiNqwlEG1br82fY=", + "aarch64-linux": "sha256-xHoNZrOn5yu734jDEE0RN+cNO/DCuiNqwlEG1br82fY=", + "x86_64-darwin": "sha256-xHoNZrOn5yu734jDEE0RN+cNO/DCuiNqwlEG1br82fY=", + "x86_64-linux": "sha256-xHoNZrOn5yu734jDEE0RN+cNO/DCuiNqwlEG1br82fY=" }, "universal": { - "aarch64-darwin": "sha256-ymXBamYKnmhcTwgc2rX/RgFdQml7obiYOpBh5ghKhlU=", - "aarch64-linux": "sha256-bULGcWqxjolrksGQYFXEx6zmlcDSD6ngw0L9kDoIVvY=", - "x86_64-darwin": "sha256-+erTasrFkQTXPQtuu8YzvfFspEVb0wIVX5jKPp9RXBE=", - "x86_64-linux": "sha256-8foy5AZZwTBPn2WrUiG8qgc+H/0bajCgSApJ/vIlVIw=" + "aarch64-darwin": "sha256-OKUry7x+5lrGzElLnmltaIaLyq5tHtNR40z33FgL+Z0=", + "aarch64-linux": "sha256-ZqmkJ5KGnKU4FGAOBGTF7vU7XZ7UmgCML0Pdg0bXNn4=", + "x86_64-darwin": "sha256-orb4XUtX9Uq3Uq1xwoZAzrd+GgkOKGiOek3NEEDVQR4=", + "x86_64-linux": "sha256-uN/wDyFnMLxqEfFR2PWesRGnigbsnqzs+mPDxEMZ+1g=" }, "web": { - "aarch64-darwin": "sha256-jFESLAj61eOQJh++mycJWjO6pPe9Icjhpr8c9qiVmv0=", - "aarch64-linux": "sha256-jFESLAj61eOQJh++mycJWjO6pPe9Icjhpr8c9qiVmv0=", - "x86_64-darwin": "sha256-jFESLAj61eOQJh++mycJWjO6pPe9Icjhpr8c9qiVmv0=", - "x86_64-linux": "sha256-jFESLAj61eOQJh++mycJWjO6pPe9Icjhpr8c9qiVmv0=" + "aarch64-darwin": "sha256-sQNM2Hx+NEMKtbCv2tX9kh45TB/NH9yaRm4eZqDfJQE=", + "aarch64-linux": "sha256-sQNM2Hx+NEMKtbCv2tX9kh45TB/NH9yaRm4eZqDfJQE=", + "x86_64-darwin": "sha256-sQNM2Hx+NEMKtbCv2tX9kh45TB/NH9yaRm4eZqDfJQE=", + "x86_64-linux": "sha256-sQNM2Hx+NEMKtbCv2tX9kh45TB/NH9yaRm4eZqDfJQE=" }, "windows": { - "x86_64-darwin": "sha256-J+N6ADOB3SF298uxN0hPydslw3k+5+nwHln2NwTQTgc=", - "x86_64-linux": "sha256-J+N6ADOB3SF298uxN0hPydslw3k+5+nwHln2NwTQTgc=" + "x86_64-darwin": "sha256-YZ7HehFv90UHmv0hfcyv0YsQxsNRRzOitPdf5BqaJJM=", + "x86_64-linux": "sha256-YZ7HehFv90UHmv0hfcyv0YsQxsNRRzOitPdf5BqaJJM=" } }, "pubspecLock": { diff --git a/pkgs/development/interpreters/octave/default.nix b/pkgs/development/interpreters/octave/default.nix index 1dfa19956730..987a08f478ef 100644 --- a/pkgs/development/interpreters/octave/default.nix +++ b/pkgs/development/interpreters/octave/default.nix @@ -1,6 +1,7 @@ { stdenv, pkgs, + config, lib, fetchurl, gfortran, @@ -207,6 +208,7 @@ stdenv.mkDerivation (finalAttrs: { octavePackages = import ../../../top-level/octave-packages.nix { pkgs = allPkgs; inherit + config lib stdenv fetchurl diff --git a/pkgs/development/lisp-modules/import/main.lisp b/pkgs/development/lisp-modules/import/main.lisp index 6671b8f22b4f..c131dc6efdb5 100644 --- a/pkgs/development/lisp-modules/import/main.lisp +++ b/pkgs/development/lisp-modules/import/main.lisp @@ -49,7 +49,7 @@ (truename "imported.nix"))) (defun run-nix-formatter () - (uiop:run-program '("nixfmt" "imported.nix"))) + (uiop:run-program '("treefmt" "imported.nix"))) (defun main () (format t "~%") diff --git a/pkgs/development/lisp-modules/shell.nix b/pkgs/development/lisp-modules/shell.nix index 811e8d3c1d28..02f9f2360828 100644 --- a/pkgs/development/lisp-modules/shell.nix +++ b/pkgs/development/lisp-modules/shell.nix @@ -1,10 +1,12 @@ let - pkgs = import ../../../. { }; - inherit (pkgs) mkShellNoCC sbcl nixfmt-rfc-style; + # Use CI-pinned (Hydra-cached) packages and formatter, + # rather than the local nixpkgs checkout. + inherit (import ../../../ci { }) pkgs fmt; + inherit (pkgs) mkShellNoCC sbcl; in mkShellNoCC { packages = [ - nixfmt-rfc-style + fmt.pkg (sbcl.withPackages ( ps: builtins.attrValues { diff --git a/pkgs/development/ocaml-modules/mirage-crypto/default.nix b/pkgs/development/ocaml-modules/mirage-crypto/default.nix index ddfd916532f7..e6004bdad6d6 100644 --- a/pkgs/development/ocaml-modules/mirage-crypto/default.nix +++ b/pkgs/development/ocaml-modules/mirage-crypto/default.nix @@ -6,8 +6,6 @@ ounit2, dune-configurator, eqaf, - withFreestanding ? false, - ocaml-freestanding, }: buildDunePackage (finalAttrs: { @@ -30,9 +28,6 @@ buildDunePackage (finalAttrs: { buildInputs = [ dune-configurator ]; propagatedBuildInputs = [ eqaf - ] - ++ lib.optionals withFreestanding [ - ocaml-freestanding ]; meta = { diff --git a/pkgs/development/ocaml-modules/mirage-crypto/ec.nix b/pkgs/development/ocaml-modules/mirage-crypto/ec.nix index b654c6dc3a05..6699de8e39cc 100644 --- a/pkgs/development/ocaml-modules/mirage-crypto/ec.nix +++ b/pkgs/development/ocaml-modules/mirage-crypto/ec.nix @@ -1,5 +1,4 @@ { - lib, buildDunePackage, mirage-crypto, dune-configurator, @@ -12,8 +11,6 @@ ppx_deriving_yojson, ppx_deriving, yojson, - withFreestanding ? false, - ocaml-freestanding, }: buildDunePackage { @@ -31,9 +28,6 @@ buildDunePackage { propagatedBuildInputs = [ mirage-crypto mirage-crypto-rng - ] - ++ lib.optionals withFreestanding [ - ocaml-freestanding ]; doCheck = true; diff --git a/pkgs/development/ocaml-modules/ocaml-freestanding/configurable-binding.patch b/pkgs/development/ocaml-modules/ocaml-freestanding/configurable-binding.patch deleted file mode 100644 index 25a7b92f01fc..000000000000 --- a/pkgs/development/ocaml-modules/ocaml-freestanding/configurable-binding.patch +++ /dev/null @@ -1,49 +0,0 @@ -commit b273c9f7ab10475787db4d6e09bd4b71b374d0ec -Author: sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org> -Date: Thu Mar 18 01:28:46 2021 +0100 - - Let user specify solo5-binding to use - - This is a little feature for the configure script I wanted to have for - the NixOS package: It allows the user to set PKG_CONFIG_DEPS before - running configure.sh to disable the autodetection mechanism. This is - useful for NixOS as we have all bindings bundled in the solo5 package, - so the result would also be solo5-bindings-xen. Additionally, it allows - us to do the binding selection declaratively and minimize the risk of - accidentally switching backend. - - PKG_CONFIG_DEPS seems like a bit of an unappropriate variable name for a - user “interface”, let me know if you want a dedicated environment - variable for this in case there will be more PKG_CONFIG_DEPS. - -diff --git a/configure.sh b/configure.sh -index c254f7b..c675a02 100755 ---- a/configure.sh -+++ b/configure.sh -@@ -11,13 +11,19 @@ if pkg_exists solo5-bindings-hvt solo5-bindings-spt solo5-bindings-virtio solo5- - echo "ERROR: Only one of solo5-bindings-hvt, solo5-bindings-spt, solo5-bindings-virtio, solo5-bindings-muen, solo5-bindings-genode, solo5-bindings-xen can be installed." 1>&2 - exit 1 - fi --PKG_CONFIG_DEPS= --pkg_exists solo5-bindings-hvt && PKG_CONFIG_DEPS=solo5-bindings-hvt --pkg_exists solo5-bindings-spt && PKG_CONFIG_DEPS=solo5-bindings-spt --pkg_exists solo5-bindings-muen && PKG_CONFIG_DEPS=solo5-bindings-muen --pkg_exists solo5-bindings-virtio && PKG_CONFIG_DEPS=solo5-bindings-virtio --pkg_exists solo5-bindings-genode && PKG_CONFIG_DEPS=solo5-bindings-genode --pkg_exists solo5-bindings-xen && PKG_CONFIG_DEPS=solo5-bindings-xen -+if [ -z "${PKG_CONFIG_DEPS}" ]; then -+ PKG_CONFIG_DEPS= -+ pkg_exists solo5-bindings-hvt && PKG_CONFIG_DEPS=solo5-bindings-hvt -+ pkg_exists solo5-bindings-spt && PKG_CONFIG_DEPS=solo5-bindings-spt -+ pkg_exists solo5-bindings-muen && PKG_CONFIG_DEPS=solo5-bindings-muen -+ pkg_exists solo5-bindings-virtio && PKG_CONFIG_DEPS=solo5-bindings-virtio -+ pkg_exists solo5-bindings-genode && PKG_CONFIG_DEPS=solo5-bindings-genode -+ pkg_exists solo5-bindings-xen && PKG_CONFIG_DEPS=solo5-bindings-xen -+else -+ pkg_exists "${PKG_CONFIG_DEPS}" \ -+ || (echo "ERROR: ${PKG_CONFIG_DEPS} is not installed" 1>&2; exit 1) \ -+ || exit 1 -+fi - if [ -z "${PKG_CONFIG_DEPS}" ]; then - echo "ERROR: No supported Solo5 bindings package found." 1>&2 - echo "ERROR: solo5-bindings-hvt, solo5-bindings-spt, solo5-bindings-virtio, solo5-bindings-muen, solo5-bindings-genode or solo5-bindings-xen must be installed." 1>&2 diff --git a/pkgs/development/ocaml-modules/ocaml-freestanding/default.nix b/pkgs/development/ocaml-modules/ocaml-freestanding/default.nix deleted file mode 100644 index a1e2906f1310..000000000000 --- a/pkgs/development/ocaml-modules/ocaml-freestanding/default.nix +++ /dev/null @@ -1,93 +0,0 @@ -{ - lib, - stdenv, - fetchFromGitHub, - ocaml, - pkg-config, - solo5, - target ? "xen", -}: - -# note: this is not technically an ocaml-module, -# but can be built with different compilers, so -# the ocamlPackages set is very useful. - -let - pname = "ocaml-freestanding"; -in - -if lib.versionOlder ocaml.version "4.08" then - throw "${pname} is not available for OCaml ${ocaml.version}" -else - - stdenv.mkDerivation rec { - name = "ocaml${ocaml.version}-${pname}-${version}"; - inherit pname; - version = "0.6.5"; - - src = fetchFromGitHub { - owner = "mirage"; - repo = pname; - rev = "v${version}"; - sha256 = "sha256:1mbyjzwcs64n7i3xkkyaxgl3r46drbl0gkqf3fqgm2kh3q03638l"; - }; - - postUnpack = '' - # get ocaml-src from the ocaml drv instead of via ocamlfind - mkdir -p "${src.name}/ocaml" - tar --strip-components=1 -xf ${ocaml.src} -C "${src.name}/ocaml" - ''; - - patches = [ - ./no-opam.patch - ./configurable-binding.patch - ]; - - strictDeps = true; - - nativeBuildInputs = [ - ocaml - pkg-config - ]; - - propagatedBuildInputs = [ solo5 ]; - - configurePhase = '' - runHook preConfigure - env PKG_CONFIG_DEPS=solo5-bindings-${target} sh configure.sh - runHook postConfigure - ''; - - installPhase = '' - runHook preInstall - ./install.sh "$out" - runHook postInstall - ''; - - meta = { - broken = true; # Not compatible with solo5 ≥ 0.7 - description = "Freestanding OCaml runtime"; - license = lib.licenses.mit; - maintainers = [ lib.maintainers.sternenseemann ]; - homepage = "https://github.com/mirage/ocaml-freestanding"; - platforms = map ({ arch, os }: "${arch}-${os}") ( - lib.cartesianProduct { - arch = [ - "aarch64" - "x86_64" - ]; - os = [ "linux" ]; - } - ++ [ - { - arch = "x86_64"; - os = "freebsd"; - } - { - arch = "x86_64"; - os = "openbsd"; - } - ] - ); - }; - } diff --git a/pkgs/development/ocaml-modules/ocaml-freestanding/no-opam.patch b/pkgs/development/ocaml-modules/ocaml-freestanding/no-opam.patch deleted file mode 100644 index 45f271ec0f25..000000000000 --- a/pkgs/development/ocaml-modules/ocaml-freestanding/no-opam.patch +++ /dev/null @@ -1,47 +0,0 @@ -commit 637b7ce639d54e617170433aa9596176b167d085 -Author: sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org> -Date: Thu Mar 18 01:07:49 2021 +0100 - - Allow building without ocamlfind and opam - - This change is the result of my first go at packaging ocaml-freestanding - for NixOS. Our build infrastructure for ocaml there is completely - independent of opam at the moment, so depending on opam for the build - time is not an option, especially in this case where the information it - would give us would be garbage. - - Fortunately the build environment plays nicely with pkg-config which is - already heavily used by ocaml-freestanding. This patch leaves pkg-config - to its own devices if opam is not present (it can be assisted by a - manually set PKG_CONFIG_PATH environment variable). - - Additionally, in configure.sh we check if the target ocaml source - directory already exists. This allows for building ocaml-freestanding - without the ocaml-src package (which would be unnecessarily cumbersome - to package for NixOS) and ocamlfind (one less dependency is always a - nice bonus). The Makefile needs no fix since the target ocaml/Makefile - won't be built if it's already present. - -diff --git a/configure.sh b/configure.sh -index 4d154ed..c254f7b 100755 ---- a/configure.sh -+++ b/configure.sh -@@ -1,6 +1,8 @@ - #!/bin/sh - --export PKG_CONFIG_PATH=$(opam config var prefix)/lib/pkgconfig -+if command -v opam &> /dev/null; then -+ export PKG_CONFIG_PATH=$(opam config var prefix)/lib/pkgconfig -+fi - pkg_exists() { - pkg-config --exists "$@" - } -@@ -21,7 +23,7 @@ if [ -z "${PKG_CONFIG_DEPS}" ]; then - echo "ERROR: solo5-bindings-hvt, solo5-bindings-spt, solo5-bindings-virtio, solo5-bindings-muen, solo5-bindings-genode or solo5-bindings-xen must be installed." 1>&2 - exit 1 - fi --ocamlfind query ocaml-src >/dev/null || exit 1 -+[ -e "$(dirname "$0")/ocaml" ] || ocamlfind query ocaml-src >/dev/null || exit 1 - - FREESTANDING_CFLAGS="$(pkg-config --cflags ${PKG_CONFIG_DEPS})" - BUILD_ARCH="$(uname -m)" diff --git a/pkgs/development/ocaml-modules/tcpip/default.nix b/pkgs/development/ocaml-modules/tcpip/default.nix index 31337aee73b9..22aa7b3beed4 100644 --- a/pkgs/development/ocaml-modules/tcpip/default.nix +++ b/pkgs/development/ocaml-modules/tcpip/default.nix @@ -26,8 +26,6 @@ ipaddr-cstruct, lru, metrics, - withFreestanding ? false, - ocaml-freestanding, }: buildDunePackage rec { @@ -64,9 +62,6 @@ buildDunePackage rec { metrics arp mirage-flow - ] - ++ lib.optionals withFreestanding [ - ocaml-freestanding ]; doCheck = true; diff --git a/pkgs/development/ocaml-modules/torch/default.nix b/pkgs/development/ocaml-modules/torch/default.nix deleted file mode 100644 index 6138fb8a69bc..000000000000 --- a/pkgs/development/ocaml-modules/torch/default.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ - lib, - stdenv, - buildDunePackage, - fetchFromGitHub, - fetchpatch, - cmdliner, - ctypes, - ctypes-foreign, - dune-configurator, - npy, - ocaml-compiler-libs, - ppx_custom_printf, - ppx_expect, - ppx_sexp_conv, - sexplib, - stdio, - torch, -}: - -buildDunePackage rec { - pname = "torch"; - version = "0.17"; - - minimalOCamlVersion = "4.08"; - - src = fetchFromGitHub { - owner = "LaurentMazare"; - repo = "ocaml-${pname}"; - rev = version; - hash = "sha256-z/9NUBjeFWE63Z/e8OyzDiy8hrn6qzjaiBH8G9MPeos="; - }; - - patches = [ - # Pytorch 2.0 support. Drop when it reaches a release - (fetchpatch { - url = "https://github.com/LaurentMazare/ocaml-torch/commit/ef7ef30cafecb09e45ec1ed8ce4bedae5947cfa5.patch"; - hash = "sha256-smdwKy40iIISp/25L2J4az6KmqFS1soeChBElUyhl5A="; - }) - ]; - - buildInputs = [ dune-configurator ]; - - propagatedBuildInputs = [ - cmdliner - ctypes - ctypes-foreign - npy - ocaml-compiler-libs - ppx_custom_printf - ppx_expect - ppx_sexp_conv - sexplib - stdio - torch - torch.dev - ]; - - preBuild = "export LIBTORCH=${torch.dev}/"; - - doCheck = !stdenv.hostPlatform.isAarch64; - - meta = { - inherit (src.meta) homepage; - description = "Ocaml bindings to Pytorch"; - maintainers = [ lib.maintainers.bcdarwin ]; - license = lib.licenses.asl20; - broken = true; # Not compatible with libtorch ≥ 2.3.0 - }; -} diff --git a/pkgs/development/octave-modules/fem-fenics/default.nix b/pkgs/development/octave-modules/fem-fenics/default.nix deleted file mode 100644 index 80029c9df0b3..000000000000 --- a/pkgs/development/octave-modules/fem-fenics/default.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchurl, - dolfin, - ffc, - pkg-config, -}: - -buildOctavePackage rec { - pname = "fem-fenics"; - version = "0.0.5"; - - src = fetchurl { - url = "mirror://sourceforge/octave/${pname}-${version}.tar.gz"; - sha256 = "1xd80nnkschldvrqx0wvrg3fzbf8sck8bvq24phr5x49xs7b8x78"; - }; - - nativeBuildInputs = [ - pkg-config - ]; - - propagatedBuildInputs = [ - dolfin - ffc - ]; - - meta = { - homepage = "https://gnu-octave.github.io/packages/fem-fenics/"; - license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "Package for the resolution of partial differential equations based on fenics"; - # Lots of compilation errors for newer octave versions and syntax errors - broken = true; - }; -} diff --git a/pkgs/development/octave-modules/level-set/default.nix b/pkgs/development/octave-modules/level-set/default.nix deleted file mode 100644 index 6ee69fa96eb3..000000000000 --- a/pkgs/development/octave-modules/level-set/default.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchgit, - automake, - autoconf, - autoconf-archive, - parallel, -}: - -buildOctavePackage rec { - pname = "level-set"; - version = "2019-04-13"; - - src = fetchgit { - url = "https://git.code.sf.net/p/octave/${pname}"; - rev = "dbf46228a7582eef4fe5470fd00bc5b421dd33a5"; - sha256 = "14qwa4j24m2j7njw8gbagkgmp040h6k0h7kyrrzgb9y0jm087qkl"; - fetchSubmodules = false; - }; - - # The monstrosity of a regex below is to ensure that only error() calls are - # corrected to have a %s format specifier. However, logic_error() also - # exists, (a simple regex also matches that), but logic_error() doesn't - # require a format specifier. So, this regex was born to handle that... - postPatch = '' - substituteInPlace build.sh --replace "level-set-0.3.1" "${pname}-${version}" \ - --replace "\`pwd\`" '/build' - sed -i -E 's#[^[:graph:]]error \(# error \(\"%s\", #g' src/*.cpp - ''; - - nativeBuildInputs = [ - automake - autoconf - autoconf-archive - ]; - - requiredOctavePackages = [ - parallel - ]; - - preBuild = '' - mkdir -p $out - source ./build.sh - cd - - ''; - - meta = { - name = "Level Set"; - homepage = "https://gnu-octave.github.io/packages/level-set/"; - license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "Routines for calculating the time-evolution of the level-set equation and extracting geometric information from the level-set function"; - # Got broke with octave 8.x update, and wasn't updated since 2019 - broken = true; - }; -} diff --git a/pkgs/development/octave-modules/parallel/default.nix b/pkgs/development/octave-modules/parallel/default.nix deleted file mode 100644 index fc0681ea0a02..000000000000 --- a/pkgs/development/octave-modules/parallel/default.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchurl, - struct, - gnutls, - pkg-config, -}: - -buildOctavePackage rec { - pname = "parallel"; - version = "4.0.1"; - - src = fetchurl { - url = "mirror://sourceforge/octave/${pname}-${version}.tar.gz"; - sha256 = "1h8vw2r42393px6dk10y3lhpxl168r9d197f9whz6lbk2rg571pa"; - }; - patches = [ - ../database/c_verror.patch - ]; - - nativeBuildInputs = [ - pkg-config - ]; - - buildInputs = [ - gnutls - ]; - - requiredOctavePackages = [ - struct - ]; - - meta = { - homepage = "https://gnu-octave.github.io/packages/parallel/"; - license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "Parallel execution package"; - # Although upstream has added an identical patch to that of ../database, it - # still won't build with octave>8.1 - broken = true; - }; -} diff --git a/pkgs/development/octave-modules/sparsersb/default.nix b/pkgs/development/octave-modules/sparsersb/default.nix deleted file mode 100644 index a55de57ccbcb..000000000000 --- a/pkgs/development/octave-modules/sparsersb/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchurl, - librsb, -}: - -buildOctavePackage rec { - pname = "sparsersb"; - version = "1.0.9"; - - src = fetchurl { - url = "mirror://sourceforge/octave/${pname}-${version}.tar.gz"; - sha256 = "0jyy2m7wylzyjqj9n6mjizhj0ccq8xnxm2g6pdlrmncxq1401khd"; - }; - - propagatedBuildInputs = [ - librsb - ]; - - meta = { - homepage = "https://gnu-octave.github.io/packages/sparsersb/"; - license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "Interface to the librsb package implementing the RSB sparse matrix format for fast shared-memory sparse matrix computations"; - # Broken since octave>8.x - broken = true; - }; -} diff --git a/pkgs/development/octave-modules/tisean/default.nix b/pkgs/development/octave-modules/tisean/default.nix deleted file mode 100644 index b575b231843f..000000000000 --- a/pkgs/development/octave-modules/tisean/default.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchurl, - # Octave dependencies - signal, # >= 1.3.0 - # Build dependencies - gfortran, -}: - -buildOctavePackage rec { - pname = "tisean"; - version = "0.2.3"; - - src = fetchurl { - url = "mirror://sourceforge/octave/${pname}-${version}.tar.gz"; - sha256 = "0nc2d9h91glxzmpizxdrc2dablw4bqhqhzs37a394c36myk4xjdv"; - }; - - nativeBuildInputs = [ - gfortran - ]; - - requiredOctavePackages = [ - signal - ]; - - meta = { - homepage = "https://gnu-octave.github.io/packages/tisean/"; - license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "Port of TISEAN 3.0.1"; - # Broken since octave 8.x update, and wasn't updated since 2021 - broken = true; - }; -} diff --git a/pkgs/development/octave-modules/vibes/default.nix b/pkgs/development/octave-modules/vibes/default.nix deleted file mode 100644 index 7bdbf20316df..000000000000 --- a/pkgs/development/octave-modules/vibes/default.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchurl, - vibes, -}: - -buildOctavePackage rec { - pname = "vibes"; - version = "0.2.0"; - - src = fetchurl { - url = "mirror://sourceforge/octave/${pname}-${version}.tar.gz"; - sha256 = "1zn86rcsjkqg67hphz5inxc5xkgr18sby8za68zhppc2z7pd91ng"; - }; - - buildInputs = [ - vibes - ]; - - meta = { - homepage = "https://gnu-octave.github.io/packages/vibes/"; - license = with lib.licenses; [ - gpl3Plus - mit - ]; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "Easily display results (boxes, pavings) from interval methods"; - longDescription = '' - The VIBes API allows one to easily display results (boxes, pavings) from - interval methods. VIBes consists in two parts: (1) the VIBes application - that features viewing, annotating and exporting figures, and (2) the - VIBes API that enables your program to communicate with the viewer in order - to draw figures. This package integrates the VIBes API into Octave. The - VIBes application is required for operation and must be installed - separately. Data types from third-party interval arithmetic libraries for - Octave are also supported. - ''; - # Marked this way until KarlJoad gets around to packaging the vibes program. - # https://github.com/ENSTABretagneRobotics/VIBES - broken = true; - }; -} diff --git a/pkgs/development/octave-modules/vrml/default.nix b/pkgs/development/octave-modules/vrml/default.nix deleted file mode 100644 index 498837478f05..000000000000 --- a/pkgs/development/octave-modules/vrml/default.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ - buildOctavePackage, - lib, - fetchurl, - # Octave dependencies - linear-algebra, - miscellaneous, - struct, - statistics, - # Runtime dependencies - freewrl, -}: - -buildOctavePackage rec { - pname = "vrml"; - version = "1.0.14"; - - src = fetchurl { - url = "mirror://sourceforge/octave/${pname}-${version}.tar.gz"; - sha256 = "sha256-Vfj0Q2CyOi7CrphZSl10Xv7QxTSvWdGk0Ya+SiewqV4="; - }; - - propagatedBuildInputs = [ - freewrl - ]; - - requiredOctavePackages = [ - linear-algebra - miscellaneous - struct - statistics - ]; - - meta = { - homepage = "https://gnu-octave.github.io/packages/vrml/"; - license = with lib.licenses; [ - gpl3Plus - fdl12Plus - ]; - maintainers = with lib.maintainers; [ KarlJoad ]; - description = "3D graphics using VRML"; - # Marked this way until KarlJoad gets freewrl as a runtime dependency. - broken = true; - }; -} diff --git a/pkgs/development/python-modules/homematicip/default.nix b/pkgs/development/python-modules/homematicip/default.nix index 1f0525638641..f6f1cc1a928b 100644 --- a/pkgs/development/python-modules/homematicip/default.nix +++ b/pkgs/development/python-modules/homematicip/default.nix @@ -16,7 +16,7 @@ buildPythonPackage (finalAttrs: { pname = "homematicip"; - version = "2.5.0"; + version = "2.6.0"; pyproject = true; disabled = pythonOlder "3.12"; @@ -25,7 +25,7 @@ buildPythonPackage (finalAttrs: { owner = "hahn-th"; repo = "homematicip-rest-api"; tag = finalAttrs.version; - hash = "sha256-UdVOYJyWLtqJaZgiRa3M9JL+gPzZeecZwElBXqrAdFM="; + hash = "sha256-0i3sXtwEBd9rXOEcoL7E3pCwviCcMcIQcTFFLSV3s+0="; }; build-system = [ diff --git a/pkgs/development/python-modules/jupyter-docprovider/default.nix b/pkgs/development/python-modules/jupyter-docprovider/default.nix index 04e2f5a615e7..55eeef745a50 100644 --- a/pkgs/development/python-modules/jupyter-docprovider/default.nix +++ b/pkgs/development/python-modules/jupyter-docprovider/default.nix @@ -7,15 +7,15 @@ jupyter-collaboration, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "jupyter-docprovider"; - version = "2.2.0"; + version = "2.2.1"; pyproject = true; src = fetchPypi { pname = "jupyter_docprovider"; - inherit version; - hash = "sha256-UZwPhBJsb7qWIOUYm+9t8GfX14nRJt69czAapLiN/Qw="; + inherit (finalAttrs) version; + hash = "sha256-2Ko7XbO5tAHeBRWd+No24th0hebc31l6IOWMkh9wXdo="; }; postPatch = '' @@ -41,4 +41,4 @@ buildPythonPackage rec { license = lib.licenses.bsd3; teams = [ lib.teams.jupyter ]; }; -} +}) diff --git a/pkgs/development/python-modules/sagemaker-core/default.nix b/pkgs/development/python-modules/sagemaker-core/default.nix index 2084a52bb7ac..d193fc110bfc 100644 --- a/pkgs/development/python-modules/sagemaker-core/default.nix +++ b/pkgs/development/python-modules/sagemaker-core/default.nix @@ -28,14 +28,14 @@ buildPythonPackage (finalAttrs: { pname = "sagemaker-core"; - version = "1.0.75"; + version = "1.0.76"; pyproject = true; src = fetchFromGitHub { owner = "aws"; repo = "sagemaker-core"; tag = "v${finalAttrs.version}"; - hash = "sha256-yRXnXGH4BoURohty/daPYd6FDGsAk9a1AiXtyCkKxug="; + hash = "sha256-IAgHAmmN00nyE1rcPV09DMb/LFCZnwrD0OhXTeNuTik="; }; build-system = [ diff --git a/pkgs/development/tools/compass/default.nix b/pkgs/development/tools/compass/default.nix index cbf28b43f425..e09f5e9f3926 100644 --- a/pkgs/development/tools/compass/default.nix +++ b/pkgs/development/tools/compass/default.nix @@ -7,7 +7,6 @@ bundlerEnv { pname = "compass"; - version = "1.0.3"; inherit ruby; gemdir = ./.; diff --git a/pkgs/development/tools/license_finder/default.nix b/pkgs/development/tools/license_finder/default.nix index 6eb7fe397a9c..2b3247c504df 100644 --- a/pkgs/development/tools/license_finder/default.nix +++ b/pkgs/development/tools/license_finder/default.nix @@ -7,7 +7,6 @@ bundlerEnv { pname = "license_finder"; - version = "7.0.1"; inherit ruby; gemdir = ./.; diff --git a/pkgs/os-specific/linux/kernel/zen-kernels.nix b/pkgs/os-specific/linux/kernel/zen-kernels.nix index 6ff6c1c44fbe..a59b8bd5075d 100644 --- a/pkgs/os-specific/linux/kernel/zen-kernels.nix +++ b/pkgs/os-specific/linux/kernel/zen-kernels.nix @@ -23,9 +23,9 @@ let }; # ./update-zen.py lqx lqx = { - version = "6.18.8"; # lqx + version = "6.18.9"; # lqx suffix = "lqx1"; # lqx - sha256 = "1fdrsq4rbr4l90qzj0qdh55n9y8859v6ixdp9bdms123l8f4iqr3"; # lqx + sha256 = "014kixm8p8xfpwsf6bk21dypknv29h5qac79n306z56mg3q79qhd"; # lqx isLqx = true; }; }; diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index e710cbae31af..c8733d1c47b9 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -886,6 +886,7 @@ mapAliases { hspellDicts = throw "'hspellDicts' has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 http-prompt = throw "'http-prompt' has been removed as it was broken and unmaintained upstream"; # Added 2025-11-26 hydra_unstable = throw "'hydra_unstable' has been renamed to/replaced by 'hydra'"; # Converted to throw 2025-10-27 + hydraAntLogger = warnAlias "'hydraAntLogger' has been renamed to 'hydra-ant-logger'" hydra-ant-logger; # Added 2026-02-08 i3-gaps = throw "'i3-gaps' has been renamed to/replaced by 'i3'"; # Converted to throw 2025-10-27 i3lock-pixeled = throw "'i3lock-pixeled' has been unmaintained for several years now."; # Converted to throw 2026-01-24 ibm-sw-tpm2 = throw "ibm-sw-tpm2 has been removed, as it was broken"; # Added 2025-08-25 @@ -900,7 +901,6 @@ mapAliases { inotifyTools = throw "'inotifyTools' has been renamed to/replaced by 'inotify-tools'"; # Converted to throw 2025-10-27 insync-emblem-icons = throw "'insync-emblem-icons' has been removed, use 'insync-nautilus' instead"; # Added 2025-05-14 invalidateFetcherByDrvHash = throw "'invalidateFetcherByDrvHash' has been renamed to/replaced by 'testers.invalidateFetcherByDrvHash'"; # Converted to throw 2025-10-27 - invoiceplane = throw "'invoiceplane' doesn't support non-EOL PHP versions"; # Added 2025-10-03 ioccheck = throw "ioccheck was dropped since it was unmaintained."; # Added 2025-07-06 ipfs = throw "'ipfs' has been renamed to/replaced by 'kubo'"; # Converted to throw 2025-10-27 ipfs-migrator = throw "'ipfs-migrator' has been renamed to/replaced by 'kubo-migrator'"; # Converted to throw 2025-10-27 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a36fa4a0c199..3a425ab4ee47 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4371,12 +4371,6 @@ with pkgs; dotnetPackages = recurseIntoAttrs (callPackage ./dotnet-packages.nix { }); - gopro-tool = callPackage ../by-name/go/gopro-tool/package.nix { - vlc = vlc.overrideAttrs (old: { - buildInputs = old.buildInputs ++ [ x264 ]; - }); - }; - gwe = callPackage ../tools/misc/gwe { nvidia_x11 = linuxPackages.nvidia_x11; }; diff --git a/pkgs/top-level/ocaml-packages.nix b/pkgs/top-level/ocaml-packages.nix index 4552fa7b837d..c988bf11ada0 100644 --- a/pkgs/top-level/ocaml-packages.nix +++ b/pkgs/top-level/ocaml-packages.nix @@ -1439,8 +1439,6 @@ let ocaml_expat = callPackage ../development/ocaml-modules/expat { }; - ocaml-freestanding = callPackage ../development/ocaml-modules/ocaml-freestanding { }; - ocaml_gettext = callPackage ../development/ocaml-modules/ocaml-gettext { }; ocaml_libvirt = callPackage ../development/ocaml-modules/ocaml-libvirt { }; @@ -2117,10 +2115,6 @@ let topkg = callPackage ../development/ocaml-modules/topkg { }; - torch = callPackage ../development/ocaml-modules/torch { - torch = pkgs.libtorch-bin; - }; - trace = callPackage ../development/ocaml-modules/trace { }; trace-tef = callPackage ../development/ocaml-modules/trace/tef.nix { }; @@ -2324,8 +2318,10 @@ let dune_2 = pkgs.dune_2; # Added 2025-12-08 dune_3 = pkgs.dune_3; # Added 2025-12-08 gd4o = throw "ocamlPackages.gd4o is not maintained, use ocamlPackages.gd instead"; + ocaml-freestanding = throw "ocamlPackages.ocaml-freestanding has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 ocaml-vdom = throw "2023-10-09: ocamlPackages.ocaml-vdom was renamed to ocamlPackages.vdom"; ocaml_lwt = throw "ocamlPackages.ocaml_lwt has been renamed to ocamlPackages.lwt"; # Added 2025-12-05 + torch = throw "ocamlPackages.torch has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 } )).overrideScope liftJaneStreet; diff --git a/pkgs/top-level/octave-packages.nix b/pkgs/top-level/octave-packages.nix index 00901a75cb5b..2a779ccac1d2 100644 --- a/pkgs/top-level/octave-packages.nix +++ b/pkgs/top-level/octave-packages.nix @@ -13,6 +13,7 @@ # from outside, we can `inherit` them from `pkgs`. { pkgs, + config, lib, stdenv, fetchurl, @@ -91,12 +92,6 @@ makeScope newScope ( econometrics = callPackage ../development/octave-modules/econometrics { }; - fem-fenics = callPackage ../development/octave-modules/fem-fenics { - # PLACEHOLDER until KarlJoad gets dolfin packaged. - dolfin = null; - ffc = null; - }; - fits = callPackage ../development/octave-modules/fits { }; financial = callPackage ../development/octave-modules/financial { }; @@ -131,8 +126,6 @@ makeScope newScope ( interval = callPackage ../development/octave-modules/interval { }; - level-set = callPackage ../development/octave-modules/level-set { }; - linear-algebra = callPackage ../development/octave-modules/linear-algebra { }; lssa = callPackage ../development/octave-modules/lssa { }; @@ -182,8 +175,6 @@ makeScope newScope ( optiminterp = callPackage ../development/octave-modules/optiminterp { }; - parallel = callPackage ../development/octave-modules/parallel { }; - quaternion = callPackage ../development/octave-modules/quaternion { }; queueing = callPackage ../development/octave-modules/queueing { }; @@ -192,8 +183,6 @@ makeScope newScope ( sockets = callPackage ../development/octave-modules/sockets { }; - sparsersb = callPackage ../development/octave-modules/sparsersb { }; - stk = callPackage ../development/octave-modules/stk { }; splines = callPackage ../development/octave-modules/splines { }; @@ -208,22 +197,10 @@ makeScope newScope ( inherit (octave) python; }; - tisean = callPackage ../development/octave-modules/tisean { }; - tsa = callPackage ../development/octave-modules/tsa { }; - vibes = callPackage ../development/octave-modules/vibes { - vibes = null; - # TODO: Need to package vibes: - # https://github.com/ENSTABretagneRobotics/VIBES - }; - video = callPackage ../development/octave-modules/video { }; - vrml = callPackage ../development/octave-modules/vrml { - freewrl = null; - }; - windows = callPackage ../development/octave-modules/windows { }; zeromq = callPackage ../development/octave-modules/zeromq { @@ -231,4 +208,13 @@ makeScope newScope ( }; } + // lib.optionalAttrs config.allowAliases { + fem-fenics = throw "octavePackages.fem-fenics has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + level-set = throw "octavePackages.level-set has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + parallel = throw "octavePackages.parallel has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + sparsersb = throw "octavePackages.sparsersb has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + tisean = throw "octavePackages.tisean has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + vibes = throw "octavePackages.vibes has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + vrml = throw "octavePackages.vrml has been removed due to being broken for more than a year; see RFC 180"; # Added 2026-02-05 + } )