diff --git a/doc/README.md b/doc/README.md index 029db7eabc7f..bcd9ffd63550 100644 --- a/doc/README.md +++ b/doc/README.md @@ -56,11 +56,7 @@ Make sure that your local files aren't added to Git history by adding the follow #### `devmode` -The shell in the manual source directory makes available a command, `devmode`. -It is a daemon, that: -1. watches the manual's source for changes and when they occur — rebuilds -2. HTTP serves the manual, injecting a script that triggers reload on changes -3. opens the manual in the default browser +Use [`devmode`](../pkgs/by-name/de/devmode/README.md) for a live preview when editing the manual. ### Testing redirects diff --git a/nixos/doc/manual/contributing-to-this-manual.chapter.md b/nixos/doc/manual/contributing-to-this-manual.chapter.md index a78a136becca..1b296918f9e2 100644 --- a/nixos/doc/manual/contributing-to-this-manual.chapter.md +++ b/nixos/doc/manual/contributing-to-this-manual.chapter.md @@ -37,7 +37,9 @@ Make sure that your local files aren't added to Git history by adding the follow /**/.direnv ``` -You might want to also use [`devmode`](https://github.com/NixOS/nixpkgs/blob/master/doc/README.md#devmode) while editing the manual. +### `devmode` {#sec-contributing-devmode} + +Use [`devmode`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/de/devmode/README.md) for a live preview when editing the manual. ## Testing redirects {#sec-contributing-redirects} diff --git a/nixos/doc/manual/redirects.json b/nixos/doc/manual/redirects.json index 86854c1065ac..fe19534a82e4 100644 --- a/nixos/doc/manual/redirects.json +++ b/nixos/doc/manual/redirects.json @@ -95,6 +95,9 @@ "sec-contributing-development-env": [ "index.html#sec-contributing-development-env" ], + "sec-contributing-devmode": [ + "index.html#sec-contributing-devmode" + ], "sec-mattermost": [ "index.html#sec-mattermost" ], @@ -551,6 +554,18 @@ "module-services-youtrack-upgrade-2022_3-2023_1": [ "index.html#module-services-youtrack-upgrade-2022_3-2023_1" ], + "module-services-szurubooru": [ + "index.html#module-services-szurubooru" + ], + "module-services-szurubooru-basic-usage": [ + "index.html#module-services-szurubooru-basic-usage" + ], + "module-services-szurubooru-reverse-proxy-configuration": [ + "index.html#module-services-szurubooru-reverse-proxy-configuration" + ], + "module-services-szurubooru-extra-config": [ + "index.html#module-services-szurubooru-extra-config" + ], "module-services-suwayomi-server": [ "index.html#module-services-suwayomi-server" ], diff --git a/nixos/doc/manual/release-notes/rl-2511.section.md b/nixos/doc/manual/release-notes/rl-2511.section.md index aaf9628049fe..03f9fc71c4a3 100644 --- a/nixos/doc/manual/release-notes/rl-2511.section.md +++ b/nixos/doc/manual/release-notes/rl-2511.section.md @@ -32,6 +32,10 @@ - [postfix-tlspol](https://github.com/Zuplu/postfix-tlspol), MTA-STS and DANE resolver and TLS policy server for Postfix. Available as [services.postfix-tlspol](#opt-services.postfix-tlspol.enable). +- [Szurubooru](https://github.com/rr-/szurubooru), an image board engine inspired by services such as Danbooru, dedicated for small and medium communities. Available as [services.szurubooru](#opt-services.szurubooru.enable). + +- [nix-store-veritysetup](https://github.com/nikstur/nix-store-veritysetup-generator), a systemd generator to unlock the Nix Store as a dm-verity protected block device. Available as [boot.initrd.nix-store-veritysetup](options.html#opt-boot.initrd.nix-store-veritysetup.enable). + - [SuiteNumérique Docs](https://github.com/suitenumerique/docs), a collaborative note taking, wiki and documentation web platform and alternative to Notion or Outline. Available as [services.lasuite-docs](#opt-services.lasuite-docs.enable). [dwl](https://codeberg.org/dwl/dwl), a compact, hackable compositor for Wayland based on wlroots. Available as [programs.dwl](#opt-programs.dwl.enable). diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index fec4eda45b8b..8b9c38d4ee71 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -1663,6 +1663,7 @@ ./services/web-apps/stirling-pdf.nix ./services/web-apps/strfry.nix ./services/web-apps/suwayomi-server.nix + ./services/web-apps/szurubooru.nix ./services/web-apps/trilium.nix ./services/web-apps/tt-rss.nix ./services/web-apps/vikunja.nix @@ -1785,6 +1786,7 @@ ./system/boot/luksroot.nix ./system/boot/modprobe.nix ./system/boot/networkd.nix + ./system/boot/nix-store-veritysetup.nix ./system/boot/plymouth.nix ./system/boot/resolved.nix ./system/boot/shutdown.nix diff --git a/nixos/modules/services/web-apps/szurubooru.md b/nixos/modules/services/web-apps/szurubooru.md new file mode 100644 index 000000000000..368fe608d450 --- /dev/null +++ b/nixos/modules/services/web-apps/szurubooru.md @@ -0,0 +1,80 @@ +# Szurubooru {#module-services-szurubooru} + +An image board engine dedicated for small and medium communities. + +## Configuration {#module-services-szurubooru-basic-usage} + +By default the module will execute Szurubooru server only, the web client only contains static files that can be reached via a reverse proxy. + +Here is a basic configuration: + +```nix +{ + services.szurubooru = { + enable = true; + + server = { + port = 8080; + + settings = { + domain = "https://szurubooru.domain.tld"; + secretFile = /path/to/secret/file; + }; + }; + + database = { + passwordFile = /path/to/secret/file; + }; + }; +} +``` + +## Reverse proxy configuration {#module-services-szurubooru-reverse-proxy-configuration} + +The prefered method to run this service is behind a reverse proxy not to expose an open port. For example, here is a minimal Nginx configuration: + +```nix +{ + services.szurubooru = { + enable = true; + + server = { + port = 8080; + ... + }; + + ... + }; + + services.nginx.virtualHosts."szurubooru.domain.tld" = { + locations = { + "/api/".proxyPass = "http://localhost:8080/"; + "/data/".root = config.services.szurubooru.dataDir; + "/" = { + root = config.services.szurubooru.client.package; + tryFiles = "$uri /index.htm"; + }; + }; + }; +} +``` + +## Extra configuration {#module-services-szurubooru-extra-config} + +Not all configuration options of the server are available directly in this module, but you can add them in `services.szurubooru.server.settings`: + +```nix +{ + services.szurubooru = { + enable = true; + + server.settings = { + domain = "https://szurubooru.domain.tld"; + delete_source_files = "yes"; + contact_email = "example@domain.tld"; + }; + }; +} +``` + +You can find all of the options in the default config file available [here](https://github.com/rr-/szurubooru/blob/master/server/config.yaml.dist). diff --git a/nixos/modules/services/web-apps/szurubooru.nix b/nixos/modules/services/web-apps/szurubooru.nix new file mode 100644 index 000000000000..95b1a7ad7e8b --- /dev/null +++ b/nixos/modules/services/web-apps/szurubooru.nix @@ -0,0 +1,331 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + cfg = config.services.szurubooru; + inherit (lib) + mkOption + mkEnableOption + mkIf + mkPackageOption + types + ; + format = pkgs.formats.yaml { }; + python = pkgs.python312; +in + +{ + options = { + services.szurubooru = { + enable = mkEnableOption "Szurubooru, an image board engine dedicated for small and medium communities"; + + user = mkOption { + type = types.str; + default = "szurubooru"; + description = '' + User account under which Szurubooru runs. + ''; + }; + + group = mkOption { + type = types.str; + default = "szurubooru"; + description = '' + Group under which Szurubooru runs. + ''; + }; + + dataDir = mkOption { + type = types.path; + default = "/var/lib/szurubooru"; + example = "/var/lib/szuru"; + description = '' + The path to the data directory in which Szurubooru will store its data. + ''; + }; + + openFirewall = mkOption { + type = types.bool; + default = false; + example = true; + description = '' + Whether to open the firewall for the port in {option}`services.szurubooru.server.port`. + ''; + }; + + server = { + package = mkPackageOption pkgs [ + "szurubooru" + "server" + ] { }; + + port = mkOption { + type = types.port; + default = 8080; + example = 9000; + description = '' + Port to expose HTTP service. + ''; + }; + + threads = mkOption { + type = types.int; + default = 4; + example = 6; + description = ''Number of waitress threads to start.''; + }; + + settings = mkOption { + type = types.submodule { + freeformType = format.type; + options = { + name = mkOption { + type = types.str; + default = "szurubooru"; + example = "Szuru"; + description = ''Name shown in the website title and on the front page.''; + }; + + domain = mkOption { + type = types.str; + example = "http://example.com"; + description = ''Full URL to the homepage of this szurubooru site (with no trailing slash).''; + }; + + # NOTE: this is not a real upstream option + secretFile = mkOption { + type = types.path; + example = "/run/secrets/szurubooru-server-secret"; + description = '' + File containing a secret used to salt the users' password hashes and generate filenames for static content. + ''; + }; + + delete_source_files = mkOption { + type = types.enum [ + "yes" + "no" + ]; + default = "no"; + example = "yes"; + description = ''Whether to delete thumbnails and source files on post delete.''; + }; + + smtp = { + host = mkOption { + type = types.nullOr types.str; + default = null; + example = "localhost"; + description = ''Host of the SMTP server used to send reset password.''; + }; + + port = mkOption { + type = types.nullOr types.port; + default = null; + example = 25; + description = ''Port of the SMTP server.''; + }; + + user = mkOption { + type = types.nullOr types.str; + default = null; + example = "bot"; + description = ''User to connect to the SMTP server.''; + }; + + # NOTE: this is not a real upstream option + passFile = mkOption { + type = types.nullOr types.path; + default = null; + example = "/run/secrets/szurubooru-smtp-pass"; + description = ''File containing the password associated to the given user for the SMTP server.''; + }; + }; + + data_url = mkOption { + type = types.str; + default = "${cfg.server.settings.domain}/data/"; + defaultText = lib.literalExpression ''"''${services.szurubooru.server.settings.domain}/data/"''; + example = "http://example.com/content/"; + description = ''Full URL to the data endpoint.''; + }; + + data_dir = mkOption { + type = types.path; + default = "${cfg.dataDir}/data"; + defaultText = lib.literalExpression ''"''${services.szurubooru.dataDir}/data"''; + example = "/srv/szurubooru/data"; + description = ''Path to the static files.''; + }; + + debug = mkOption { + type = types.int; + default = 0; + example = 1; + description = ''Whether to generate server logs.''; + }; + + show_sql = mkOption { + type = types.int; + default = 0; + example = 1; + description = ''Whether to show SQL in server logs.''; + }; + }; + }; + description = '' + Configuration to write to {file}`config.yaml`. + See for more information. + ''; + }; + }; + + client = { + package = mkPackageOption pkgs [ + "szurubooru" + "client" + ] { }; + }; + + database = { + host = mkOption { + type = types.str; + default = "localhost"; + example = "192.168.1.2"; + description = ''Host on which the PostgreSQL database runs.''; + }; + + port = mkOption { + type = types.port; + default = 5432; + description = ''The port under which PostgreSQL listens to.''; + }; + + name = mkOption { + type = types.str; + default = cfg.database.user; + defaultText = lib.literalExpression "szurubooru.database.name"; + example = "szuru"; + description = ''Name of the PostgreSQL database.''; + }; + + user = mkOption { + type = types.str; + default = "szurubooru"; + example = "szuru"; + description = ''PostgreSQL user.''; + }; + + passwordFile = mkOption { + type = types.path; + example = "/run/secrets/szurubooru-db-password"; + description = ''A file containing the password for the PostgreSQL user.''; + }; + }; + }; + }; + + config = mkIf cfg.enable { + + networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.server.port ]; + + users.groups = mkIf (cfg.group == "szurubooru") { + szurubooru = { }; + }; + + users.users = mkIf (cfg.user == "szurubooru") { + szurubooru = { + group = cfg.group; + description = "Szurubooru Daemon user"; + isSystemUser = true; + }; + }; + + systemd.services.szurubooru = + let + configFile = format.generate "config.yaml" ( + lib.pipe cfg.server.settings [ + ( + settings: + lib.recursiveUpdate settings { + secretFile = null; + secret = "$SZURUBOORU_SECRET"; + + smtp.pass = if settings.smtp.passFile != null then "$SZURUBOORU_SMTP_PASS" else null; + smtp.passFile = null; + smtp.enable = null; + + database = "postgresql://${cfg.database.user}:$SZURUBOORU_DATABASE_PASSWORD@${cfg.database.host}:${toString cfg.database.port}/${cfg.database.name}"; + } + ) + (lib.filterAttrsRecursive (_: x: x != null)) + ] + ); + pyenv = python.buildEnv.override { + extraLibs = [ (python.pkgs.toPythonModule cfg.server.package) ]; + }; + in + { + description = "Server of Szurubooru, an image board engine dedicated for small and medium communities"; + + wantedBy = [ + "multi-user.target" + "szurubooru-client.service" + ]; + before = [ "szurubooru-client.service" ]; + after = [ + "network.target" + "network-online.target" + ]; + wants = [ "network-online.target" ]; + + environment = { + PYTHONPATH = "${pyenv}/${pyenv.sitePackages}/"; + }; + + path = + with pkgs; + [ + envsubst + ffmpeg_4-full + ] + ++ (with python.pkgs; [ + alembic + waitress + ]); + + script = '' + export SZURUBOORU_SECRET="$(<${cfg.server.settings.secretFile})" + export SZURUBOORU_DATABASE_PASSWORD="$(<${cfg.database.passwordFile})" + ${lib.optionalString (cfg.server.settings.smtp.passFile != null) '' + export SZURUBOORU_SMTP_PASS=$(<${cfg.server.settings.smtp.passFile}) + ''} + install -m0640 ${cfg.server.package.src}/config.yaml.dist ${cfg.dataDir}/config.yaml.dist + envsubst -i ${configFile} -o ${cfg.dataDir}/config.yaml + sed 's|script_location = |script_location = ${cfg.server.package.src}/|' ${cfg.server.package.src}/alembic.ini > ${cfg.dataDir}/alembic.ini + alembic upgrade head + waitress-serve --port ${toString cfg.server.port} --threads ${toString cfg.server.threads} szurubooru.facade:app + ''; + + serviceConfig = { + User = cfg.user; + Group = cfg.group; + + Type = "simple"; + Restart = "on-failure"; + + StateDirectory = mkIf (cfg.dataDir == "/var/lib/szurubooru") "szurubooru"; + WorkingDirectory = cfg.dataDir; + }; + }; + }; + + meta = { + maintainers = with lib.maintainers; [ ratcornu ]; + doc = ./szurubooru.md; + }; +} diff --git a/nixos/modules/system/boot/nix-store-veritysetup.nix b/nixos/modules/system/boot/nix-store-veritysetup.nix new file mode 100644 index 000000000000..6a4d9bd9cc20 --- /dev/null +++ b/nixos/modules/system/boot/nix-store-veritysetup.nix @@ -0,0 +1,38 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.boot.initrd.nix-store-veritysetup; +in +{ + meta.maintainers = with lib.maintainers; [ nikstur ]; + + options.boot.initrd.nix-store-veritysetup = { + enable = lib.mkEnableOption "nix-store-veritysetup"; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = config.boot.initrd.systemd.dmVerity.enable; + message = "nix-store-veritysetup requires dm-verity in the systemd initrd."; + } + ]; + + boot.initrd.systemd = { + contents = { + "/etc/systemd/system-generators/nix-store-veritysetup-generator".source = + "${lib.getExe pkgs.nix-store-veritysetup-generator}"; + }; + + storePaths = [ + "${config.boot.initrd.systemd.package}/bin/systemd-escape" + ]; + }; + + }; +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 6cb04827cb77..552fb324db76 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -306,7 +306,7 @@ in cinnamon-wayland = runTest ./cinnamon-wayland.nix; cjdns = runTest ./cjdns.nix; clatd = runTest ./clatd.nix; - clickhouse = runTest ./clickhouse.nix; + clickhouse = import ./clickhouse { inherit runTest; }; cloud-init = handleTest ./cloud-init.nix { }; cloud-init-hostname = handleTest ./cloud-init-hostname.nix { }; cloudlog = runTest ./cloudlog.nix; @@ -938,6 +938,7 @@ in nix-required-mounts = runTest ./nix-required-mounts; nix-serve = runTest ./nix-serve.nix; nix-serve-ssh = runTest ./nix-serve-ssh.nix; + nix-store-veritysetup = runTest ./nix-store-veritysetup.nix; nixops = handleTest ./nixops/default.nix { }; nixos-generate-config = runTest ./nixos-generate-config.nix; nixos-rebuild-install-bootloader = handleTestOn [ @@ -1372,6 +1373,7 @@ in systemd-homed = runTest ./systemd-homed.nix; systemtap = handleTest ./systemtap.nix { }; startx = import ./startx.nix { inherit pkgs runTest; }; + szurubooru = handleTest ./szurubooru.nix { }; taler = handleTest ./taler { }; tandoor-recipes = runTest ./tandoor-recipes.nix; tandoor-recipes-script-name = runTest ./tandoor-recipes-script-name.nix; diff --git a/nixos/tests/clickhouse.nix b/nixos/tests/clickhouse/base.nix similarity index 94% rename from nixos/tests/clickhouse.nix rename to nixos/tests/clickhouse/base.nix index 165f00a1ec4e..cbeb5b64699a 100644 --- a/nixos/tests/clickhouse.nix +++ b/nixos/tests/clickhouse/base.nix @@ -1,7 +1,7 @@ { pkgs, ... }: { name = "clickhouse"; - meta.maintainers = with pkgs.lib.maintainers; [ ]; + meta.maintainers = with pkgs.lib.maintainers; [ jpds ]; nodes.machine = { services.clickhouse.enable = true; diff --git a/nixos/tests/clickhouse/default.nix b/nixos/tests/clickhouse/default.nix new file mode 100644 index 000000000000..e6568010eb66 --- /dev/null +++ b/nixos/tests/clickhouse/default.nix @@ -0,0 +1,8 @@ +{ runTest }: + +{ + base = runTest ./base.nix; + kafka = runTest ./kafka.nix; + keeper = runTest ./keeper.nix; + s3 = runTest ./s3.nix; +} diff --git a/nixos/tests/clickhouse/kafka.nix b/nixos/tests/clickhouse/kafka.nix new file mode 100644 index 000000000000..29e4f839d07f --- /dev/null +++ b/nixos/tests/clickhouse/kafka.nix @@ -0,0 +1,172 @@ +{ pkgs, ... }: + +let + kafkaNamedCollectionConfig = '' + + + + + kafka:9092 + test_topic + clickhouse + JSONEachRow + 0 + 1 + 1 + + + + all + earliest + + + + + ''; + + kafkaNamedCollection = pkgs.writeText "kafka.xml" kafkaNamedCollectionConfig; +in +{ + name = "clickhouse-kafka"; + meta.maintainers = with pkgs.lib.maintainers; [ jpds ]; + + nodes = { + clickhouse = { + environment.etc = { + "clickhouse-server/config.d/kafka.xml" = { + source = "${kafkaNamedCollection}"; + }; + }; + + services.clickhouse.enable = true; + virtualisation.memorySize = 4096; + }; + + kafka = { + networking.firewall.allowedTCPPorts = [ + 9092 + 9093 + ]; + + environment.systemPackages = [ + pkgs.apacheKafka + pkgs.jq + ]; + + services.apache-kafka = { + enable = true; + + # Randomly generated uuid. You can get one by running: + # kafka-storage.sh random-uuid + clusterId = "b81s-MuGSwyt_B9_h37wtQ"; + + formatLogDirs = true; + + settings = { + listeners = [ + "PLAINTEXT://:9092" + "CONTROLLER://:9093" + ]; + "listener.security.protocol.map" = [ + "PLAINTEXT:PLAINTEXT" + "CONTROLLER:PLAINTEXT" + ]; + "controller.quorum.voters" = [ + "1@kafka:9093" + ]; + "controller.listener.names" = [ "CONTROLLER" ]; + + "node.id" = 1; + "broker.rack" = 1; + + "process.roles" = [ + "broker" + "controller" + ]; + + "log.dirs" = [ "/var/lib/apache-kafka" ]; + "num.partitions" = 1; + "offsets.topic.replication.factor" = 1; + "transaction.state.log.replication.factor" = 1; + "transaction.state.log.min.isr" = 1; + }; + }; + + systemd.services.apache-kafka.serviceConfig.StateDirectory = "apache-kafka"; + }; + }; + + testScript = + let + jsonTestMessage = pkgs.writeText "kafka-test-data.json" '' + { "id": 1, "first_name": "Fred", "age": 32 } + { "id": 2, "first_name": "Barbara", "age": 30 } + { "id": 3, "first_name": "Nicola", "age": 12 } + ''; + # work around quote/substitution complexity by Nix, Perl, bash and SQL. + tableKafkaDDL = pkgs.writeText "ddl-kafka.sql" '' + CREATE TABLE `test_kafka_topic` ( + `id` UInt32, + `first_name` String, + `age` UInt32 + ) ENGINE = Kafka(cluster_1); + ''; + + tableDDL = pkgs.writeText "ddl.sql" '' + CREATE TABLE `test_topic` ( + `id` UInt32, + `first_name` String, + `age` UInt32 + ) ENGINE = MergeTree ORDER BY id; + ''; + + viewDDL = pkgs.writeText "view.sql" '' + CREATE MATERIALIZED VIEW kafka_view TO test_topic AS + SELECT + id, + first_name, + age, + FROM test_kafka_topic; + ''; + selectQuery = pkgs.writeText "select.sql" "SELECT sum(age) from `test_topic`"; + in + '' + kafka.start() + kafka.wait_for_unit("apache-kafka") + kafka.wait_for_open_port(9092) + + clickhouse.start() + clickhouse.wait_for_unit("clickhouse") + clickhouse.wait_for_open_port(9000) + + clickhouse.wait_until_succeeds( + """ + journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/kafka.xml'" + """ + ) + + clickhouse.succeed( + "cat ${tableKafkaDDL} | clickhouse-client" + ) + + clickhouse.succeed( + "cat ${tableDDL} | clickhouse-client" + ) + + clickhouse.succeed( + "cat ${viewDDL} | clickhouse-client" + ) + + kafka.succeed( + "jq -rc . ${jsonTestMessage} | kafka-console-producer.sh --topic test_topic --bootstrap-server kafka:9092" + ) + + kafka.wait_until_succeeds( + "journalctl -o cat -u apache-kafka.service | grep 'Created a new member id ClickHouse-clickhouse-default-test_kafka_topic'" + ) + + clickhouse.wait_until_succeeds( + "cat ${selectQuery} | clickhouse-client | grep 74" + ) + ''; +} diff --git a/nixos/tests/clickhouse/keeper.nix b/nixos/tests/clickhouse/keeper.nix new file mode 100644 index 000000000000..40be4c19f2cf --- /dev/null +++ b/nixos/tests/clickhouse/keeper.nix @@ -0,0 +1,183 @@ +{ lib, pkgs, ... }: +rec { + name = "clickhouse-keeper"; + meta.maintainers = with pkgs.lib.maintainers; [ jpds ]; + + nodes = + let + node = i: { + + environment.etc = { + "clickhouse-server/config.d/cluster.xml".text = '' + + + + ${lib.concatStrings ( + lib.imap0 (j: name: '' + + + ${name} + 9000 + + + '') (builtins.attrNames nodes) + )} + + + + ''; + + "clickhouse-server/config.d/keeper.xml".text = '' + + + ${toString i} + 9181 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + 10000 + + + + ${lib.concatStrings ( + lib.imap1 (j: name: '' + + ${toString j} + ${name} + 9444 + + '') (builtins.attrNames nodes) + )} + + + + + ${lib.concatStrings ( + lib.imap0 (j: name: '' + + ${name} + 9181 + + '') (builtins.attrNames nodes) + )} + + + + /clickhouse/testcluster/task_queue/ddl + + + ''; + + "clickhouse-server/config.d/listen.xml".text = '' + + :: + + ''; + + "clickhouse-server/config.d/macros.xml".text = '' + + + ${toString i} + perftest_2shards_1replicas + + + ''; + }; + + networking.firewall.allowedTCPPorts = [ + 9009 + 9181 + 9444 + ]; + + services.clickhouse.enable = true; + + systemd.services.clickhouse = { + after = [ "network-online.target" ]; + requires = [ "network-online.target" ]; + }; + + virtualisation.memorySize = 1024 * 4; + virtualisation.diskSize = 1024 * 10; + }; + in + { + clickhouse1 = node 1; + clickhouse2 = node 2; + }; + + testScript = + let + # work around quote/substitution complexity by Nix, Perl, bash and SQL. + clustersQuery = pkgs.writeText "clusters.sql" "SHOW clusters"; + keeperQuery = pkgs.writeText "keeper.sql" "SELECT * FROM system.zookeeper WHERE path IN ('/', '/clickhouse') FORMAT VERTICAL"; + systemClustersQuery = pkgs.writeText "system-clusters.sql" "SELECT host_name, host_address, replica_num FROM system.clusters WHERE cluster = 'perftest_2shards_1replicas'"; + + tableDDL = pkgs.writeText "table.sql" '' + CREATE TABLE test ON cluster 'perftest_2shards_1replicas' ( A Int64, S String) + Engine = ReplicatedMergeTree('/clickhouse/{cluster}/tables/{database}/{table}', '{replica}') + ORDER BY A; + ''; + + insertDDL = pkgs.writeText "insert.sql" " + INSERT INTO test SELECT number, '' FROM numbers(100000000); + "; + + selectCountQuery = pkgs.writeText "select-count.sql" " + select count() from test; + "; + in + '' + clickhouse1.start() + clickhouse2.start() + + for machine in clickhouse1, clickhouse2: + machine.wait_for_unit("clickhouse.service") + machine.wait_for_open_port(9000) + machine.wait_for_open_port(9009) + machine.wait_for_open_port(9181) + machine.wait_for_open_port(9444) + + machine.wait_until_succeeds( + """ + journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/keeper.xml'" + """ + ) + + machine.log(machine.succeed( + "cat ${clustersQuery} | clickhouse-client | grep perftest_2shards_1replicas" + )) + + machine.log(machine.succeed( + "cat ${keeperQuery} | clickhouse-client" + )) + + machine.succeed( + "cat ${systemClustersQuery} | clickhouse-client | grep clickhouse1" + ) + machine.succeed( + "cat ${systemClustersQuery} | clickhouse-client | grep clickhouse2" + ) + + machine.succeed( + "ls /var/lib/clickhouse/coordination/log | grep changelog" + ) + + clickhouse2.succeed( + "cat ${tableDDL} | clickhouse-client" + ) + + clickhouse2.succeed( + "cat ${insertDDL} | clickhouse-client" + ) + + for machine in clickhouse1, clickhouse2: + machine.wait_until_succeeds( + "cat ${selectCountQuery} | clickhouse-client | grep 100000000" + ) + ''; +} diff --git a/nixos/tests/clickhouse/s3.nix b/nixos/tests/clickhouse/s3.nix new file mode 100644 index 000000000000..2268b6128fe6 --- /dev/null +++ b/nixos/tests/clickhouse/s3.nix @@ -0,0 +1,121 @@ +{ pkgs, ... }: + +let + s3 = { + bucket = "clickhouse-bucket"; + accessKey = "BKIKJAA5BMMU2RHO6IBB"; + secretKey = "V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12"; + }; + + clickhouseS3StorageConfig = '' + + + + + s3 + http://minio:9000/${s3.bucket}/ + ${s3.accessKey} + ${s3.secretKey} + /var/lib/clickhouse/disks/s3_disk/ + + + cache + s3_disk + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+ ''; +in +{ + name = "clickhouse-s3"; + meta.maintainers = with pkgs.lib.maintainers; [ jpds ]; + + nodes = { + clickhouse = { + environment.etc = { + "clickhouse-server/config.d/s3.xml" = { + text = "${clickhouseS3StorageConfig}"; + }; + }; + + services.clickhouse.enable = true; + virtualisation.diskSize = 15 * 1024; + virtualisation.memorySize = 4 * 1024; + }; + + minio = + { pkgs, ... }: + { + virtualisation.diskSize = 2 * 1024; + networking.firewall.allowedTCPPorts = [ 9000 ]; + + services.minio = { + enable = true; + inherit (s3) accessKey secretKey; + }; + + environment.systemPackages = [ pkgs.minio-client ]; + }; + }; + + testScript = + let + # work around quote/substitution complexity by Nix, Perl, bash and SQL. + tableDDL = pkgs.writeText "ddl.sql" '' + CREATE TABLE `demo` ( + `value` String + ) + ENGINE = MergeTree + ORDER BY value + SETTINGS storage_policy = 's3_main'; + ''; + insertQuery = pkgs.writeText "insert.sql" "INSERT INTO `demo` (`value`) VALUES ('foo');"; + selectQuery = pkgs.writeText "select.sql" "SELECT * from `demo`"; + in + '' + minio.wait_for_unit("minio") + minio.wait_for_open_port(9000) + minio.succeed( + "mc alias set minio " + + "http://localhost:9000 " + + "${s3.accessKey} ${s3.secretKey} --api s3v4", + "mc mb minio/${s3.bucket}", + ) + + clickhouse.start() + clickhouse.wait_for_unit("clickhouse.service") + clickhouse.wait_for_open_port(9000) + + clickhouse.wait_until_succeeds( + """ + journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/s3.xml'" + """ + ) + + clickhouse.succeed( + "cat ${tableDDL} | clickhouse-client" + ) + clickhouse.succeed( + "cat ${insertQuery} | clickhouse-client" + ) + clickhouse.succeed( + "cat ${selectQuery} | clickhouse-client | grep foo" + ) + + minio.log(minio.succeed( + "mc ls minio/${s3.bucket}", + )) + ''; +} diff --git a/nixos/tests/nix-store-veritysetup.nix b/nixos/tests/nix-store-veritysetup.nix new file mode 100644 index 000000000000..3b6a5e6a734f --- /dev/null +++ b/nixos/tests/nix-store-veritysetup.nix @@ -0,0 +1,108 @@ +{ lib, ... }: +{ + + name = "nix-store-veritysetup"; + + meta.maintainers = with lib.maintainers; [ nikstur ]; + + nodes.machine = + { config, modulesPath, ... }: + { + + imports = [ + "${modulesPath}/image/repart.nix" + ]; + + image.repart = { + name = "nix-store"; + partitions = { + "nix-store" = { + storePaths = [ config.system.build.toplevel ]; + stripNixStorePrefix = true; + repartConfig = { + Type = "linux-generic"; + Label = "nix-store"; + Format = "erofs"; + Minimize = "best"; + Verity = "data"; + VerityMatchKey = "nix-store"; + }; + }; + "nix-store-verity" = { + repartConfig = { + Type = "linux-generic"; + Label = "nix-store-verity"; + Verity = "hash"; + VerityMatchKey = "nix-store"; + Minimize = "best"; + }; + }; + }; + }; + + boot.initrd = { + systemd = { + enable = true; + dmVerity.enable = true; + }; + nix-store-veritysetup.enable = true; + }; + + virtualisation = { + mountHostNixStore = false; + qemu.drives = [ + { + name = "nix-store"; + file = ''"$NIX_STORE"''; + } + ]; + fileSystems = { + "/nix/store" = { + fsType = "erofs"; + device = "/dev/mapper/nix-store"; + }; + }; + }; + + }; + + testScript = + { nodes, ... }: + '' + import os + import json + import subprocess + import tempfile + + with open("${nodes.machine.system.build.image}/repart-output.json") as f: + data = json.load(f) + + storehash = data[0]["roothash"] + + os.environ["QEMU_KERNEL_PARAMS"] = f"storehash={storehash}" + + tmp_disk_image = tempfile.NamedTemporaryFile() + + subprocess.run([ + "${nodes.machine.virtualisation.qemu.package}/bin/qemu-img", + "create", + "-f", + "qcow2", + "-b", + "${nodes.machine.system.build.image}/${nodes.machine.image.repart.imageFile}", + "-F", + "raw", + tmp_disk_image.name, + ]) + + os.environ["NIX_STORE"] = tmp_disk_image.name + + machine.start() + + print(machine.succeed("findmnt")) + print(machine.succeed("dmsetup info nix-store")) + + machine.wait_for_unit("multi-user.target") + ''; + +} diff --git a/nixos/tests/szurubooru.nix b/nixos/tests/szurubooru.nix new file mode 100644 index 000000000000..adcfecdbf34b --- /dev/null +++ b/nixos/tests/szurubooru.nix @@ -0,0 +1,52 @@ +import ./make-test-python.nix ( + { lib, pkgs, ... }: + { + name = "szurubooru"; + meta.maintainers = with lib.maintainers; [ ratcornu ]; + + nodes.machine = + let + dbpass = "changeme"; + in + + { config, ... }: + { + services.postgresql = { + enable = true; + initialScript = pkgs.writeText "init.sql" '' + CREATE USER ${config.services.szurubooru.database.user} WITH PASSWORD '${dbpass}'; + CREATE DATABASE ${config.services.szurubooru.database.name} WITH OWNER ${config.services.szurubooru.database.user}; + ''; + }; + + services.szurubooru = { + enable = true; + + dataDir = "/var/lib/szurubooru"; + + server = { + port = 6666; + settings = { + domain = "http://127.0.0.1"; + secretFile = pkgs.writeText "secret" "secret"; + debug = 1; + }; + }; + + database = { + host = "localhost"; + port = 5432; + name = "szurubooru"; + user = "szurubooru"; + passwordFile = pkgs.writeText "pass" "${dbpass}"; + }; + }; + }; + + testScript = '' + machine.wait_for_unit("szurubooru.service") + machine.wait_for_open_port(6666) + machine.succeed('curl -H "Content-Type: application/json" -H "Accept: application/json" --fail http://127.0.0.1:6666/info') + ''; + } +) diff --git a/pkgs/applications/editors/vim/plugins/generated.nix b/pkgs/applications/editors/vim/plugins/generated.nix index 211674e389da..b51ff99c10b0 100644 --- a/pkgs/applications/editors/vim/plugins/generated.nix +++ b/pkgs/applications/editors/vim/plugins/generated.nix @@ -13199,6 +13199,19 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + search-and-replace-nvim = buildVimPlugin { + pname = "search-and-replace.nvim"; + version = "2025-06-16"; + src = fetchFromGitHub { + owner = "mahyarmirrashed"; + repo = "search-and-replace.nvim"; + rev = "12dce26afc7f3c66d6ffbf2eae91ce19d4cdcc74"; + sha256 = "0i197fs58qk6mgqsxi7cacba8sya7kh9cdnnz6sa79ry42cdff6a"; + }; + meta.homepage = "https://github.com/mahyarmirrashed/search-and-replace.nvim/"; + meta.hydraPlatforms = [ ]; + }; + searchbox-nvim = buildVimPlugin { pname = "searchbox.nvim"; version = "2025-01-09"; diff --git a/pkgs/applications/editors/vim/plugins/overrides.nix b/pkgs/applications/editors/vim/plugins/overrides.nix index a96ed59fe44b..821a7be77646 100644 --- a/pkgs/applications/editors/vim/plugins/overrides.nix +++ b/pkgs/applications/editors/vim/plugins/overrides.nix @@ -124,6 +124,9 @@ uv, # nvim-vstsl dependencies vtsls, + # search-and-replace.nvim dependencies + fd, + sad, }: self: super: let @@ -3022,6 +3025,13 @@ in dependencies = [ self.nui-nvim ]; }; + search-and-replace-nvim = super.search-and-replace-nvim.overrideAttrs { + runtimeDeps = [ + fd + sad + ]; + }; + skim = buildVimPlugin { pname = "skim"; inherit (skim) version; diff --git a/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py b/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py index 6b19eb24ebf6..7ae13615d2ab 100755 --- a/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py +++ b/pkgs/applications/editors/vim/plugins/utils/nvim-treesitter/update.py @@ -1,56 +1,58 @@ #!/usr/bin/env nix-shell -#!nix-shell update-shell.nix -i python +#!nix-shell ./update-shell.nix -i python import json import logging import os import subprocess from concurrent.futures import ThreadPoolExecutor +from pathlib import Path import requests log = logging.getLogger("vim-updater") -NURR_JSON_URL = "https://raw.githubusercontent.com/nvim-neorocks/nurr/main/tree-sitter-parsers.json" +NURR_JSON_URL = ( + "https://raw.githubusercontent.com/nvim-neorocks/nurr/main/tree-sitter-parsers.json" +) + def generate_grammar(lang, parser_info): """Generate grammar for a language based on the parser info""" - try: - if "install_info" not in parser_info: - log.warning(f"Parser {lang} does not have install_info, skipping") - return "" + if "install_info" not in parser_info: + log.warning(f"Parser {lang} does not have install_info, skipping") + return "" - install_info = parser_info["install_info"] + install_info = parser_info["install_info"] - url = install_info["url"] - rev = install_info["revision"] + url = install_info["url"] + rev = install_info["revision"] - generated = f""" {lang} = buildGrammar {{ + generated = f""" {lang} = buildGrammar {{ language = "{lang}"; version = "0.0.0+rev={rev[:7]}"; src = """ - generated += subprocess.check_output(["nurl", url, rev, "--indent=4"], text=True) - generated += ";" + generated += subprocess.check_output( + ["nurl", url, rev, "--indent=4"], text=True + ) + generated += ";" - location = install_info.get("location", "") - if location: - generated += f""" + location = install_info.get("location", "") + if location: + generated += f""" location = "{location}";""" - if install_info.get("generate", False): - generated += """ + if install_info.get("generate", False): + generated += """ generate = true;""" - generated += f""" + generated += f""" meta.homepage = "{url}"; }}; """ - return generated - except Exception as e: - log.error(f"Error generating grammar for {lang}: {e}") - return "" + return generated def fetch_nurr_parsers(): @@ -81,12 +83,7 @@ def fetch_nurr_parsers(): def process_parser_info(parser_info): """Process a single parser info entry and generate grammar for it""" - try: - lang = parser_info["lang"] - return generate_grammar(lang, parser_info) - except Exception as e: - log.error(f"Error processing parser: {e}") - return "" + return generate_grammar(parser_info["lang"], parser_info) def update_grammars(): @@ -119,13 +116,10 @@ def update_grammars(): if __name__ == "__main__": - logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s') + logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") generated = update_grammars() - output_path = os.path.join( - os.path.dirname(__file__), - "../../nvim-treesitter/generated.nix" - ) + output_path = Path(__file__).parent.parent / "nvim-treesitter/generated.nix" log.info("Writing output to %s", output_path) with open(output_path, "w") as f: f.write(generated) diff --git a/pkgs/applications/editors/vim/plugins/vim-plugin-names b/pkgs/applications/editors/vim/plugins/vim-plugin-names index 219c65e60e87..860ce0bc9942 100644 --- a/pkgs/applications/editors/vim/plugins/vim-plugin-names +++ b/pkgs/applications/editors/vim/plugins/vim-plugin-names @@ -1013,6 +1013,7 @@ https://github.com/tiagovla/scope.nvim/,HEAD, https://github.com/0xJohnnyboy/scretch.nvim/,HEAD, https://github.com/Xuyuanp/scrollbar.nvim/,, https://github.com/cakebaker/scss-syntax.vim/,, +https://github.com/mahyarmirrashed/search-and-replace.nvim/,HEAD, https://github.com/VonHeikemen/searchbox.nvim/,, https://github.com/RobertAudi/securemodelines/,, https://github.com/megaannum/self/,, diff --git a/pkgs/applications/editors/vscode/extensions/default.nix b/pkgs/applications/editors/vscode/extensions/default.nix index db06989b0752..7db5464ac46b 100644 --- a/pkgs/applications/editors/vscode/extensions/default.nix +++ b/pkgs/applications/editors/vscode/extensions/default.nix @@ -2129,8 +2129,8 @@ let mktplcRef = { name = "gitlab-workflow"; publisher = "gitlab"; - version = "6.21.0"; - hash = "sha256-vaOAk4ovQjUcnBtxqMlRstYLvR6uzmqGk3Sx6zV6wvY="; + version = "6.25.0"; + hash = "sha256-Y4NeeT2CddHj++hE0JxionmEPQHaIeibsrwztCjHYHs="; }; meta = { description = "GitLab extension for Visual Studio Code"; diff --git a/pkgs/applications/emulators/box64/default.nix b/pkgs/applications/emulators/box64/default.nix index 04c4f768e9bd..537998c47eb3 100644 --- a/pkgs/applications/emulators/box64/default.nix +++ b/pkgs/applications/emulators/box64/default.nix @@ -21,15 +21,22 @@ assert stdenv.mkDerivation (finalAttrs: { pname = "box64"; - version = "0.3.4"; + version = "0.3.6"; src = fetchFromGitHub { owner = "ptitSeb"; repo = "box64"; rev = "v${finalAttrs.version}"; - hash = "sha256-CY5Emg5TsMVs++2EukhVzqn9440kF/BO8HZGQgCpGu4="; + hash = "sha256-Z8r7aonVj7VSifgLKx/L7VRdGNnQtTvS4mjI+2+uPxY="; }; + # Setting cpu doesn't seem to work (or maybe isn't enough / gets overwritten by the wrapper's arch flag?), errors about unsupported instructions for target + # (this is for code that gets executed conditionally if the cpu at runtime supports their features, so setting this should be fine) + postPatch = '' + substituteInPlace CMakeLists.txt \ + --replace-fail 'ASMFLAGS -pipe -mcpu=cortex-a76' 'ASMFLAGS -pipe -march=armv8.2-a+fp16+dotprod' + ''; + nativeBuildInputs = [ cmake python3 diff --git a/pkgs/applications/science/biology/sumatools/default.nix b/pkgs/applications/science/biology/sumatools/default.nix deleted file mode 100644 index fc07cd661c56..000000000000 --- a/pkgs/applications/science/biology/sumatools/default.nix +++ /dev/null @@ -1,77 +0,0 @@ -{ - lib, - gccStdenv, - fetchFromGitLab, - zlib, -}: - -let - stdenv = gccStdenv; - meta = with lib; { - description = "Fast and exact comparison and clustering of sequences"; - homepage = "https://metabarcoding.org/sumatra"; - maintainers = [ maintainers.bzizou ]; - platforms = platforms.unix; - }; - -in -rec { - - # Suma library - sumalibs = stdenv.mkDerivation rec { - version = "1.0.34"; - pname = "sumalibs"; - src = fetchFromGitLab { - domain = "git.metabarcoding.org"; - owner = "obitools"; - repo = pname; - rev = "sumalib_v${version}"; - sha256 = "0hwkrxzfz7m5wdjvmrhkjg8kis378iaqr5n4nhdhkwwhn8x1jn5a"; - }; - makeFlags = [ "PREFIX=$(out)" ]; - inherit meta; - }; - - # Sumatra - sumatra = stdenv.mkDerivation rec { - version = "1.0.34"; - pname = "sumatra"; - src = fetchFromGitLab { - domain = "git.metabarcoding.org"; - owner = "obitools"; - repo = pname; - rev = "${pname}_v${version}"; - sha256 = "1bbpbdkshdc3xffqnr1qfy8qk64ldsmdc3s8mrcrlx132rgbi5f6"; - }; - buildInputs = [ - sumalibs - zlib - ]; - makeFlags = [ - "LIBSUMA=${sumalibs}/lib/libsuma.a" - "LIBSUMAPATH=-L${sumalibs}" - "PREFIX=$(out)" - ]; - inherit meta; - }; - - # Sumaclust - sumaclust = stdenv.mkDerivation rec { - version = "1.0.34"; - pname = "sumaclust"; - src = fetchFromGitLab { - domain = "git.metabarcoding.org"; - owner = "obitools"; - repo = pname; - rev = "${pname}_v${version}"; - sha256 = "0x8yi3k3jxhmv2krp4rcjlj2f9zg0qrk7gx4kpclf9c3yxgsgrds"; - }; - buildInputs = [ sumalibs ]; - makeFlags = [ - "LIBSUMA=${sumalibs}/lib/libsuma.a" - "LIBSUMAPATH=-L${sumalibs}" - "PREFIX=$(out)" - ]; - inherit meta; - }; -} diff --git a/pkgs/by-name/an/antonio-font/package.nix b/pkgs/by-name/an/antonio-font/package.nix index d9ff06682f2b..1c15c06105ab 100644 --- a/pkgs/by-name/an/antonio-font/package.nix +++ b/pkgs/by-name/an/antonio-font/package.nix @@ -1,10 +1,10 @@ { lib, - stdenv, + stdenvNoCC, fetchFromGitHub, }: -stdenv.mkDerivation { +stdenvNoCC.mkDerivation { pname = "antonio"; version = "0-unstable-2013-11-21"; diff --git a/pkgs/by-name/cl/clean/chroot-build-support-do-not-rebuild-equal-timestamps.patch b/pkgs/by-name/cl/clean/chroot-build-support-do-not-rebuild-equal-timestamps.patch new file mode 100644 index 000000000000..3f0d0a25d3a7 --- /dev/null +++ b/pkgs/by-name/cl/clean/chroot-build-support-do-not-rebuild-equal-timestamps.patch @@ -0,0 +1,21 @@ +The clean command line compiler clm uses timestamps of dcl, icl, abc and o files +to decide what must be rebuild. However as for chroot builds, all of the +library files will have equal timestamps, this leads to clm trying to rebuild +the library modules distributed with the Clean installation every time a user +compiles any file, which fails ue to the absence of write permission on the Nix +store. + +This patch changes the freshness check to use less than instead of less than or +equal to in order to avoid this. + +--- b/src/clm/clm.c ++++ a/src/clm/clm.c +@@ -250,7 +250,7 @@ + || (t1.dwHighDateTime==t2.dwHighDateTime && (unsigned)(t1.dwLowDateTime)<=(unsigned)(t2.dwLowDateTime))) + #else + typedef unsigned long FileTime; +-# define FILE_TIME_LE(t1,t2) (t1<=t2) ++# define FILE_TIME_LE(t1,t2) (t1 (Int, Thread)) ++int start_caching_compiler_with_args (CleanCharArray coc_path, char** cocl_argv, int cocl_argv_size); + int call_caching_compiler (CleanCharArray args); + Clean (call_caching_compiler :: {#Char} Thread -> (Int, Thread)) + int stop_caching_compiler (void); diff --git a/pkgs/by-name/cl/clean/package.nix b/pkgs/by-name/cl/clean/package.nix new file mode 100644 index 000000000000..c75a7296b6ae --- /dev/null +++ b/pkgs/by-name/cl/clean/package.nix @@ -0,0 +1,80 @@ +{ + binutils, + fetchurl, + gcc, + lib, + runCommand, + stdenv, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "clean"; + version = "3.1"; + + src = + if stdenv.hostPlatform.system == "i686-linux" then + (fetchurl { + url = "https://ftp.cs.ru.nl/Clean/Clean31/linux/clean3.1_32_boot.tar.gz"; + sha256 = "Ls0IKf+o7yhRLhtSV61jzmnYukfh5x5fogHaP5ke/Ck="; + }) + else if stdenv.hostPlatform.system == "x86_64-linux" then + (fetchurl { + url = "https://ftp.cs.ru.nl/Clean/Clean31/linux/clean3.1_64_boot.tar.gz"; + sha256 = "Gg5CVZjrwDBtV7Vuw21Xj6Rn+qN1Mf6B3ls6r/16oBc="; + }) + else + throw "Architecture not supported"; + + hardeningDisable = [ "pic" ]; + + patches = [ + ./chroot-build-support-do-not-rebuild-equal-timestamps.patch + ./declare-functions-explicitly-for-gcc14.patch + ]; + + postPatch = '' + substituteInPlace Makefile \ + --replace-fail 'INSTALL_DIR = $(CURRENTDIR)' "INSTALL_DIR = $out" + substituteInPlace src/clm/clm.c \ + --replace-fail /usr/bin/as ${binutils}/bin/as \ + --replace-fail /usr/bin/gcc ${gcc}/bin/gcc + ''; + + buildFlags = [ "-C src/" ]; + + # do not strip libraries and executables since all symbols since they are + # required as is for compilation. Especially the labels of unused section need + # to be kept. + dontStrip = true; + + passthru.tests.compile-hello-world = runCommand "compile-hello-world" { } '' + cat >HelloWorld.icl <' >.dep-stubs/libsystemd.a + echo '!' >.dep-stubs/libuuid.a + echo '!' >.dep-stubs/libcrypt.a ''; postBuild = '' make -C docs \ DEB_VERSION=${version} DEB_VERSION_UPSTREAM=${version} \ - RUSTC_TARGET=${stdenv.hostPlatform.config} \ + RUSTC_TARGET=${stdenv.targetPlatform.rust.rustcTarget} \ BUILD_MODE=release \ proxmox-backup-client.1 pxar.1 ''; @@ -147,25 +150,28 @@ rustPlatform.buildRustPackage { "--bin=pxar" ]; + RUSTFLAGS = [ "-L.dep-stubs" ]; + doCheck = false; + # pbs-buildcfg requires this set, would be the git commit id + REPOID = ""; + nativeBuildInputs = [ - git - pkg-config pkgconf rustPlatform.bindgenHook installShellFiles sphinx ]; + buildInputs = [ openssl fuse3 - libuuid acl - libxcrypt - systemd.dev ]; + strictDeps = true; + doInstallCheck = true; nativeInstallCheckInputs = [ versionCheckHook ]; versionCheckProgramArg = "version"; diff --git a/pkgs/by-name/s-/s-search/package.nix b/pkgs/by-name/s-/s-search/package.nix index 3e8ba938eeb7..16fa1088f117 100644 --- a/pkgs/by-name/s-/s-search/package.nix +++ b/pkgs/by-name/s-/s-search/package.nix @@ -10,13 +10,13 @@ buildGoModule (finalAttrs: { pname = "s-search"; - version = "0.7.2"; + version = "0.7.3"; src = fetchFromGitHub { owner = "zquestz"; repo = "s"; tag = "v${finalAttrs.version}"; - hash = "sha256-5hkorROs11nrDK5/BBEPIugVYeVUWtAnpCBBuKTj15g="; + hash = "sha256-g+Gz16U5rP3v+RbutDUh5+1YdTDe+ROFEnNAlNZX1fw="; }; vendorHash = "sha256-0E/9fONanSxb2Tv5wKIpf1J/A6Hdge23xy3r6pFyV9E="; diff --git a/pkgs/by-name/sg/sgdboop/hide_desktop_entry.patch b/pkgs/by-name/sg/sgdboop/hide_desktop_entry.patch new file mode 100644 index 000000000000..422c82fc4f29 --- /dev/null +++ b/pkgs/by-name/sg/sgdboop/hide_desktop_entry.patch @@ -0,0 +1,22 @@ +From a4ca664abfac0b7efa7dbc48c6438bc1a5333962 Mon Sep 17 00:00:00 2001 +From: Fazzi +Date: Sat, 24 May 2025 20:55:50 +0100 +Subject: [PATCH] desktopFile: hide entry from app launchers + +--- + linux-release/com.steamgriddb.SGDBoop.desktop | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/linux-release/com.steamgriddb.SGDBoop.desktop b/linux-release/com.steamgriddb.SGDBoop.desktop +index 9c84cdb..9899682 100644 +--- a/linux-release/com.steamgriddb.SGDBoop.desktop ++++ b/linux-release/com.steamgriddb.SGDBoop.desktop +@@ -4,7 +4,7 @@ Comment=Apply Steam assets from SteamGridDB + Exec=SGDBoop %U + Terminal=false + Type=Application +-NoDisplay=false ++NoDisplay=true + Icon=com.steamgriddb.SGDBoop + MimeType=x-scheme-handler/sgdb + Categories=Utility diff --git a/pkgs/by-name/sg/sgdboop/package.nix b/pkgs/by-name/sg/sgdboop/package.nix new file mode 100644 index 000000000000..6ec7d9a1c03c --- /dev/null +++ b/pkgs/by-name/sg/sgdboop/package.nix @@ -0,0 +1,60 @@ +{ + lib, + stdenv, + fetchFromGitHub, + curl, + pkg-config, + wrapGAppsHook3, +}: +stdenv.mkDerivation rec { + pname = "sgdboop"; + version = "1.3.1"; + + src = fetchFromGitHub { + owner = "SteamGridDB"; + repo = "SGDBoop"; + tag = "v${version}"; + hash = "sha256-FpVQQo2N/qV+cFhYZ1FVm+xlPHSVMH4L+irnQEMlUQs="; + }; + + patches = [ + # Hide the app from app launchers, as it is not meant to be run directly + # Remove when https://github.com/SteamGridDB/SGDBoop/pull/112 is merged + ./hide_desktop_entry.patch + ]; + + makeFlags = [ + # The flatpak install just copies things to /app - otherwise wants to do things with XDG + "FLATPAK_ID=fake" + ]; + + postPatch = '' + substituteInPlace Makefile \ + --replace-fail "/app/" "$out/" + ''; + + postInstall = '' + rm -r "$out/share/metainfo" + ''; + + nativeBuildInputs = [ + pkg-config + wrapGAppsHook3 + ]; + + buildInputs = [ + curl + ]; + + meta = { + description = "Applying custom artwork to Steam, using SteamGridDB"; + homepage = "https://github.com/SteamGridDB/SGDBoop/"; + license = lib.licenses.zlib; + maintainers = with lib.maintainers; [ + saturn745 + fazzi + ]; + mainProgram = "SGDBoop"; + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/by-name/sm/smfh/package.nix b/pkgs/by-name/sm/smfh/package.nix new file mode 100644 index 000000000000..d59d42a9221c --- /dev/null +++ b/pkgs/by-name/sm/smfh/package.nix @@ -0,0 +1,30 @@ +{ + lib, + rustPlatform, + fetchFromGitHub, +}: + +rustPlatform.buildRustPackage (finalAttrs: { + pname = "smfh"; + version = "1.1"; + + src = fetchFromGitHub { + owner = "feel-co"; + repo = "smfh"; + tag = finalAttrs.version; + hash = "sha256-/9Ww10kYopxfCNNnNDwENTubs7Wzqlw+O6PJAHNOYQw="; + }; + + cargoHash = "sha256-MpqbmhjNsE1krs7g3zWSXGxzb4G/A+cz/zxD2Jk2HC8="; + + meta = { + description = "Sleek Manifest File Handler"; + homepage = "https://github.com/feel-co/smfh"; + license = lib.licenses.agpl3Only; + maintainers = with lib.maintainers; [ + arthsmn + gerg-l + ]; + mainProgram = "smfh"; + }; +}) diff --git a/pkgs/by-name/st/station/package.nix b/pkgs/by-name/st/station/package.nix deleted file mode 100644 index c80a0ad5a3b4..000000000000 --- a/pkgs/by-name/st/station/package.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - lib, - appimageTools, - fetchurl, - makeWrapper, - nix-update-script, -}: -let - version = "3.3.0"; - pname = "station"; - src = fetchurl { - url = "https://github.com/getstation/desktop-app/releases/download/v${version}/Station-x86_64.AppImage"; - hash = "sha256-OiUVRKpU2W1dJ6z9Dqvxd+W4/oNpG+Zolj43ZHpKaO0="; - }; - appimageContents = appimageTools.extractType2 { - inherit pname version src; - }; -in -appimageTools.wrapType2 { - inherit pname version src; - extraInstallCommands = '' - source "${makeWrapper}/nix-support/setup-hook" - wrapProgram $out/bin/${pname} \ - --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" - install -m 444 -D ${appimageContents}/station-desktop-app.desktop \ - $out/share/applications/station-desktop-app.desktop - install -m 444 -D ${appimageContents}/usr/share/icons/hicolor/512x512/apps/station-desktop-app.png \ - $out/share/icons/hicolor/512x512/apps/station-desktop-app.png - substituteInPlace $out/share/applications/station-desktop-app.desktop \ - --replace-fail 'Exec=AppRun' 'Exec=station' - ''; - - passthru = { - updateScript = nix-update-script { - extraArgs = [ "--url=https://github.com/getstation/desktop-app" ]; - }; - }; - - meta = { - changelog = "https://github.com/getstation/desktop-app/releases/tag/v${version}"; - description = "A single place for all of your web applications"; - downloadPage = "https://github.com/getstation/desktop-app/releases"; - homepage = "https://getstation.com/"; - license = lib.licenses.asl20; - mainProgram = "station"; - maintainers = with lib.maintainers; [ flexiondotorg ]; - platforms = [ "x86_64-linux" ]; - sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; - }; -} diff --git a/pkgs/by-name/te/termscp/package.nix b/pkgs/by-name/te/termscp/package.nix index a32508c59623..0cc5c2c8159c 100644 --- a/pkgs/by-name/te/termscp/package.nix +++ b/pkgs/by-name/te/termscp/package.nix @@ -13,17 +13,17 @@ rustPlatform.buildRustPackage rec { pname = "termscp"; - version = "0.17.0"; + version = "0.18.0"; src = fetchFromGitHub { owner = "veeso"; repo = "termscp"; tag = "v${version}"; - hash = "sha256-ClCPXux1sM3hRbtJ3YngrAmc4btTgQmg/Bg/7uFHCOw="; + hash = "sha256-QBvxXl1+f2617dwoZzSJq9vQY6hOXeHZjEh4xqMyayA="; }; useFetchCargoVendor = true; - cargoHash = "sha256-k/6+EWHAXd8BN551xDlQkYsBZsP/jgT+NO5GbVXJkVI="; + cargoHash = "sha256-ghJdAou3IsDVmOnDYiYO1yR3BtkrfUek10Bh9GuVH1E="; nativeBuildInputs = [ pkg-config diff --git a/pkgs/development/python-modules/heif-image-plugin/default.nix b/pkgs/development/python-modules/heif-image-plugin/default.nix new file mode 100644 index 000000000000..0216fa39fb53 --- /dev/null +++ b/pkgs/development/python-modules/heif-image-plugin/default.nix @@ -0,0 +1,34 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + cffi, + piexif, + pillow, +}: + +buildPythonPackage rec { + pname = "heif-image-plugin"; + version = "0.6.2"; + format = "setuptools"; + + src = fetchFromGitHub { + owner = "uploadcare"; + repo = "heif-image-plugin"; + rev = "v${version}"; + hash = "sha256-SlnnlBscNelNH0XkOenq3nolyqzRMK10SzVii61Moi4="; + }; + + propagatedBuildInputs = [ + cffi + piexif + pillow + ]; + + meta = { + description = "Simple HEIF/HEIC images plugin for Pillow base on pyhief library"; + homepage = "https://github.com/uploadcare/heif-image-plugin"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ ratcornu ]; + }; +} diff --git a/pkgs/development/python-modules/pillow-avif-plugin/default.nix b/pkgs/development/python-modules/pillow-avif-plugin/default.nix new file mode 100644 index 000000000000..3750e1d1dd4c --- /dev/null +++ b/pkgs/development/python-modules/pillow-avif-plugin/default.nix @@ -0,0 +1,30 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + libavif, + pillow, +}: + +buildPythonPackage rec { + pname = "pillow-avif-plugin"; + version = "1.4.6"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + sha256 = "sha256-hVz1DQP2/Bbh/V42SzzqC3n0v5DTn/ISOWlzXYUeCLo="; + }; + + nativeBuildInputs = [ setuptools ]; + buildInputs = [ libavif ]; + propagatedBuildInputs = [ pillow ]; + + meta = { + description = "Pillow plugin that adds support for AVIF files"; + homepage = "https://github.com/fdintino/pillow-avif-plugin"; + license = lib.licenses.bsd2; + maintainers = with lib.maintainers; [ ratcornu ]; + }; +} diff --git a/pkgs/os-specific/linux/cpupower/default.nix b/pkgs/os-specific/linux/cpupower/default.nix index c80352a1e7e3..e439be715d9a 100644 --- a/pkgs/os-specific/linux/cpupower/default.nix +++ b/pkgs/os-specific/linux/cpupower/default.nix @@ -42,6 +42,7 @@ stdenv.mkDerivation { doc = "share/doc/cpupower"; conf = "etc"; bash_completion_ = "share/bash-completion/completions"; + unit = "lib/systemd/system"; }; enableParallelBuilding = true; diff --git a/pkgs/os-specific/linux/kernel/kernels-org.json b/pkgs/os-specific/linux/kernel/kernels-org.json index 2d18f73d36c6..6c7ddb2bbea1 100644 --- a/pkgs/os-specific/linux/kernel/kernels-org.json +++ b/pkgs/os-specific/linux/kernel/kernels-org.json @@ -1,7 +1,7 @@ { "testing": { - "version": "6.16-rc1", - "hash": "sha256:0wi66d2wma4lfs3pbwqg7k1pavxc3wyr54yxii3mmaab81pfdx27" + "version": "6.16-rc2", + "hash": "sha256:1hzkpp5161ss40d8j9nzvzyw6vljslx0pk5fin0klj884l5i8igh" }, "6.1": { "version": "6.1.141", diff --git a/pkgs/servers/web-apps/szurubooru/client.nix b/pkgs/servers/web-apps/szurubooru/client.nix new file mode 100644 index 000000000000..9553390862d4 --- /dev/null +++ b/pkgs/servers/web-apps/szurubooru/client.nix @@ -0,0 +1,36 @@ +{ + src, + version, + lib, + buildNpmPackage, +}: + +buildNpmPackage { + pname = "szurubooru-client"; + inherit version; + + src = "${src}/client"; + + npmDepsHash = "sha256-HtcitZl2idgVleB6c0KCTSNLxh7hP8/G/RGdMaQG3iI="; + makeCacheWritable = true; + + npmBuildFlags = [ + "--gzip" + ]; + + installPhase = '' + runHook preInstall + + mkdir $out + mv ./public/* $out + + runHook postInstall + ''; + + meta = with lib; { + description = "Client of szurubooru, an image board engine for small and medium communities"; + homepage = "https://github.com/rr-/szurubooru"; + license = licenses.gpl3; + maintainers = with maintainers; [ ratcornu ]; + }; +} diff --git a/pkgs/servers/web-apps/szurubooru/default.nix b/pkgs/servers/web-apps/szurubooru/default.nix new file mode 100644 index 000000000000..67d7b57aa20f --- /dev/null +++ b/pkgs/servers/web-apps/szurubooru/default.nix @@ -0,0 +1,20 @@ +{ + callPackage, + fetchFromGitHub, + recurseIntoAttrs, +}: + +let + version = "2.5-unstable-2025-02-11"; + src = fetchFromGitHub { + owner = "rr-"; + repo = "szurubooru"; + rev = "376f687c386f65522b2f65e98b998b21af26ee29"; + hash = "sha256-4w1iOYp+CVg60dYxRilj08D4Hle6R9Y0v+Nd3fws1Zc="; + }; +in + +recurseIntoAttrs { + client = callPackage ./client.nix { inherit src version; }; + server = callPackage ./server.nix { inherit src version; }; +} diff --git a/pkgs/servers/web-apps/szurubooru/server.nix b/pkgs/servers/web-apps/szurubooru/server.nix new file mode 100644 index 000000000000..0d5a7b65e257 --- /dev/null +++ b/pkgs/servers/web-apps/szurubooru/server.nix @@ -0,0 +1,85 @@ +{ + src, + version, + lib, + nixosTests, + fetchPypi, + python3, +}: + +let + overrides = [ + (self: super: { + alembic = super.alembic.overridePythonAttrs (oldAttrs: rec { + version = "1.14.1"; + src = fetchPypi { + pname = "alembic"; + inherit version; + sha256 = "sha256-SW6IgkWlOt8UmPyrMXE6Rpxlg2+N524BOZqhw+kN0hM="; + }; + doCheck = false; + }); + + pyheif = super.pyheif.overridePythonAttrs (oldAttrs: { + doCheck = false; + }); + + sqlalchemy = super.sqlalchemy.overridePythonAttrs (oldAttrs: rec { + version = "1.3.23"; + src = fetchPypi { + pname = "SQLAlchemy"; + inherit version; + sha256 = "sha256-b8ozZyV4Zm9lfBMVUsTviXnBYG5JT3jNUZl0LfsmkYs="; + }; + + doCheck = false; + }); + }) + ]; + + python = python3.override { + self = python; + packageOverrides = lib.composeManyExtensions overrides; + }; +in + +python.pkgs.buildPythonApplication { + pname = "szurubooru-server"; + inherit version; + pyproject = true; + + src = "${src}/server"; + + nativeBuildInputs = with python.pkgs; [ setuptools ]; + propagatedBuildInputs = with python.pkgs; [ + alembic + certifi + coloredlogs + heif-image-plugin + numpy + pillow-avif-plugin + pillow + psycopg2-binary + pyheif + pynacl + pyrfc3339 + pytz + pyyaml + sqlalchemy + yt-dlp + ]; + + postInstall = '' + mkdir $out/bin + install -m0755 $src/szuru-admin $out/bin/szuru-admin + ''; + + passthru.tests.szurubooru = nixosTests.szurubooru; + + meta = with lib; { + description = "Server of szurubooru, an image board engine for small and medium communities"; + homepage = "https://github.com/rr-/szurubooru"; + license = licenses.gpl3; + maintainers = with maintainers; [ ratcornu ]; + }; +} diff --git a/pkgs/tools/text/reckon/Gemfile.lock b/pkgs/tools/text/reckon/Gemfile.lock index 7409a4bae84f..4242ab5536c8 100644 --- a/pkgs/tools/text/reckon/Gemfile.lock +++ b/pkgs/tools/text/reckon/Gemfile.lock @@ -1,15 +1,19 @@ GEM remote: https://rubygems.org/ specs: + abbrev (0.1.2) chronic (0.10.2) + csv (3.3.5) highline (2.1.0) matrix (0.4.2) rchardet (1.8.0) - reckon (0.9.2) + reckon (0.11.1) + abbrev (> 0.1) chronic (>= 0.3.0) - highline (>= 1.5.2) + csv (> 0.1) + highline (~> 2.0) matrix (>= 0.4.2) - rchardet (>= 1.8.0) + rchardet (= 1.8.0) PLATFORMS ruby @@ -18,4 +22,4 @@ DEPENDENCIES reckon BUNDLED WITH - 2.4.13 + 2.6.6 diff --git a/pkgs/tools/text/reckon/default.nix b/pkgs/tools/text/reckon/default.nix index 7efdfe91cf64..a1dc52c8fe8a 100644 --- a/pkgs/tools/text/reckon/default.nix +++ b/pkgs/tools/text/reckon/default.nix @@ -5,6 +5,8 @@ bundlerUpdateScript, makeWrapper, file, + testers, + reckon, }: stdenv.mkDerivation rec { @@ -31,7 +33,13 @@ stdenv.mkDerivation rec { runHook postInstall ''; - passthru.updateScript = bundlerUpdateScript "reckon"; + passthru = { + tests.version = testers.testVersion { + package = reckon; + version = "${version}"; + }; + updateScript = bundlerUpdateScript "reckon"; + }; meta = with lib; { description = "Flexibly import bank account CSV files into Ledger for command line accounting"; diff --git a/pkgs/tools/text/reckon/gemset.nix b/pkgs/tools/text/reckon/gemset.nix index d8903b9adf4e..1aae5dd9be0e 100644 --- a/pkgs/tools/text/reckon/gemset.nix +++ b/pkgs/tools/text/reckon/gemset.nix @@ -1,4 +1,14 @@ { + abbrev = { + groups = [ "default" ]; + platforms = [ ]; + source = { + remotes = [ "https://rubygems.org" ]; + sha256 = "0hj2qyx7rzpc7awhvqlm597x7qdxwi4kkml4aqnp5jylmsm4w6xd"; + type = "gem"; + }; + version = "0.1.2"; + }; chronic = { groups = [ "default" ]; platforms = [ ]; @@ -9,6 +19,16 @@ }; version = "0.10.2"; }; + csv = { + groups = [ "default" ]; + platforms = [ ]; + source = { + remotes = [ "https://rubygems.org" ]; + sha256 = "0gz7r2kazwwwyrwi95hbnhy54kwkfac5swh2gy5p5vw36fn38lbf"; + type = "gem"; + }; + version = "3.3.5"; + }; highline = { groups = [ "default" ]; platforms = [ ]; @@ -41,7 +61,9 @@ }; reckon = { dependencies = [ + "abbrev" "chronic" + "csv" "highline" "matrix" "rchardet" @@ -50,9 +72,9 @@ platforms = [ ]; source = { remotes = [ "https://rubygems.org" ]; - sha256 = "0188k41lvz5vnn03qw1hbi6c2i88n5p3183rb0xz9rfjcngh2ly3"; + sha256 = "1y4iqjmgzj9nrp22pmayia54mpb4d6ga85q9xzqir7mhcd2bdca1"; type = "gem"; }; - version = "0.9.2"; + version = "0.11.1"; }; } diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index 5ef666197848..a6897f7a9864 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -439,7 +439,6 @@ mapAliases { citra = throw "citra has been removed from nixpkgs, as it has been taken down upstream"; # added 2024-03-04 citra-nightly = throw "citra-nightly has been removed from nixpkgs, as it has been taken down upstream"; # added 2024-03-04 citra-canary = throw "citra-canary has been removed from nixpkgs, as it has been taken down upstream"; # added 2024-03-04 - clean = throw "'clean' has been removed from nixpkgs, as it is unmaintained and broken"; # Added 2025-05-18 cloog = throw "cloog has been removed from Nixpkgs, as it is unmaintained and obsolete"; # Added 2024-09-13 cloog_0_18_0 = throw "cloog_0_18_0 has been removed from Nixpkgs, as it is unmaintained and obsolete"; # Added 2024-09-13 cloogppl = throw "cloogppl has been removed from Nixpkgs, as it is unmaintained and obsolete"; # Added 2024-09-13 @@ -538,6 +537,7 @@ mapAliases { demjson = with python3Packages; toPythonApplication demjson; # Added 2022-01-18 devdash = throw "'devdash' has been removed as the upstream project was archived"; # Added 2025-03-27 + devdocs-desktop = throw "'devdocs-desktop' has been removed as it is unmaintained upstream and vendors insecure dependencies"; # Added 2025-06-11 dfilemanager = throw "'dfilemanager' has been dropped as it was unmaintained"; # Added 2025-06-03 dgsh = throw "'dgsh' has been removed, as it was broken and unmaintained"; # added 2024-05-09 dibbler = throw "dibbler was removed because it is not maintained anymore"; # Added 2024-05-14 @@ -940,6 +940,7 @@ mapAliases { ### J ### jack2Full = throw "'jack2Full' has been renamed to/replaced by 'jack2'"; # Converted to throw 2024-10-17 + jack_rack = throw "'jack_rack' has been removed due to lack of maintenance upstream."; # Added 2025-06-10 jami-client-qt = jami-client; # Added 2022-11-06 jami-client = jami; # Added 2023-02-10 jami-daemon = jami.daemon; # Added 2023-02-10 @@ -1834,6 +1835,7 @@ mapAliases { ssm-agent = amazon-ssm-agent; # Added 2023-10-17 starpls-bin = starpls; starspace = throw "starspace has been removed from nixpkgs, as it was broken"; # Added 2024-07-15 + station = throw "station has been removed from nixpkgs, as there were no committers among its maintainers to unblock security issues"; # added 2025-06-16 steamPackages = { steamArch = throw "`steamPackages.steamArch` has been removed as it's no longer applicable"; steam = lib.warnOnInstantiate "`steamPackages.steam` has been moved to top level as `steam-unwrapped`" steam-unwrapped; @@ -1855,6 +1857,9 @@ mapAliases { suidChroot = throw "'suidChroot' has been dropped as it was unmaintained, failed to build and had questionable security considerations"; # Added 2025-05-17 suitesparse_4_2 = throw "'suitesparse_4_2' has been removed as it was unmaintained upstream"; # Added 2025-05-17 suitesparse_4_4 = throw "'suitesparse_4_4' has been removed as it was unmaintained upstream"; # Added 2025-05-17 + sumaclust = throw "'sumaclust' has been removed as it was archived upstream and broken with GCC 14"; # Added 2025-06-14 + sumalibs = throw "'sumalibs' has been removed as it was archived upstream and broken with GCC 14"; # Added 2025-06-14 + sumatra = throw "'sumatra' has been removed as it was archived upstream and broken with GCC 14"; # Added 2025-06-14 sumneko-lua-language-server = lua-language-server; # Added 2023-02-07 sumokoin = throw "sumokoin has been removed as it was abandoned upstream"; # Added 2024-11-23 supertag = throw "supertag has been removed as it was abandoned upstream and fails to build"; # Added 2025-04-20 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 129f26470e16..f61314ea606a 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9676,6 +9676,8 @@ with pkgs; svxlink = libsForQt5.callPackage ../applications/radio/svxlink { }; + szurubooru = callPackage ../servers/web-apps/szurubooru { }; + tclap = tclap_1_2; tclap_1_2 = callPackage ../development/libraries/tclap/1.2.nix { }; @@ -15498,12 +15500,6 @@ with pkgs; samtools = callPackage ../applications/science/biology/samtools { }; - inherit (callPackages ../applications/science/biology/sumatools { }) - sumalibs - sumaclust - sumatra - ; - trimmomatic = callPackage ../applications/science/biology/trimmomatic { jdk = pkgs.jdk21_headless; # Reduce closure size diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 3d1226c72b1b..f5207bcf11d7 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -6386,6 +6386,8 @@ self: super: with self; { hebg = callPackage ../development/python-modules/hebg { }; + heif-image-plugin = callPackage ../development/python-modules/heif-image-plugin { }; + help2man = callPackage ../development/python-modules/help2man { }; helpdev = callPackage ../development/python-modules/helpdev { }; @@ -11378,6 +11380,8 @@ self: super: with self; { inherit (pkgs.xorg) libxcb; }; + pillow-avif-plugin = callPackage ../development/python-modules/pillow-avif-plugin { }; + pillow-heif = callPackage ../development/python-modules/pillow-heif { }; pillow-jpls = callPackage ../development/python-modules/pillow-jpls { };