Merge master into staging-next
This commit is contained in:
@@ -109,6 +109,8 @@
|
||||
|
||||
- [Ente Auth](https://ente.io/auth/), an open source 2FA authenticator, with end-to-end encrypted backups. Available as [programs.ente-auth](#opt-programs.ente-auth.enable).
|
||||
|
||||
- [linkding](https://linkding.link/), a self-hosted bookmark manager designed to be minimal, fast, and easy to set up. Available as [services.linkding](#opt-services.linkding.enable).
|
||||
|
||||
- [Tinyauth](https://tinyauth.app/), a simple authentication middleware for web apps, with OAuth and LDAP support. Available as [services.tinyauth](#opt-services.tinyauth.enable).
|
||||
|
||||
- [Strichliste](https://www.strichliste.org), a digital self-service tallysheet used in hackerspaces, clubs and offices. Available as [services.strichliste](#opt-services.strichliste.enable).
|
||||
@@ -327,8 +329,6 @@ See <https://github.com/NixOS/nixpkgs/issues/481673>.
|
||||
|
||||
- [hardware.xpadneo](#opt-hardware.xpadneo.enable) now supports configuring kernel module parameters via a freeform [settings](#opt-hardware.xpadneo.settings) option, with convenience options for [rumble attenuation](#opt-hardware.xpadneo.rumbleAttenuation) and [controller quirks](#opt-hardware.xpadneo.quirks).
|
||||
|
||||
- The `services.prometheus.exporters` module interface now accepts an optional `socketOpts` attribute, allowing individual exporter modules to describe an accompanying `systemd.sockets.prometheus-${name}-exporter` unit alongside their service, enabling socket activation support.
|
||||
|
||||
- Wine has been updated to the 11.0 branch. Please check the [upstream announcement](https://gitlab.winehq.org/wine/wine/-/releases/wine-11.0) for more details.
|
||||
|
||||
- `security.acme` now defaults to a dynamic renewal duration, if
|
||||
|
||||
@@ -356,6 +356,13 @@ in
|
||||
It is suggested to use the open source kernel modules on Turing or later GPUs (RTX series, GTX 16xx), and the closed source modules otherwise.
|
||||
'';
|
||||
}
|
||||
{
|
||||
assertion = !cfg.open || (nvidia_x11.open != null);
|
||||
message = ''
|
||||
The selected NVIDIA package does not provide open kernel modules.
|
||||
Set hardware.nvidia.open = false or choose a package branch with open module support.
|
||||
'';
|
||||
}
|
||||
];
|
||||
boot = {
|
||||
blacklistedKernelModules = [
|
||||
|
||||
@@ -1698,6 +1698,7 @@
|
||||
./services/web-apps/librespeed.nix
|
||||
./services/web-apps/libretranslate.nix
|
||||
./services/web-apps/limesurvey.nix
|
||||
./services/web-apps/linkding.nix
|
||||
./services/web-apps/linkwarden.nix
|
||||
./services/web-apps/lubelogger.nix
|
||||
./services/web-apps/mainsail.nix
|
||||
|
||||
@@ -138,23 +138,12 @@ example:
|
||||
DynamicUser = false;
|
||||
ExecStart = ''
|
||||
${pkgs.prometheus-postfix-exporter}/bin/postfix_exporter \
|
||||
--web.systemd-socket \
|
||||
--web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
|
||||
--web.telemetry-path ${cfg.telemetryPath} \
|
||||
${lib.concatStringsSep " \\\n " cfg.extraFlags}
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
# `socketOpts` is an optional attribute set describing a
|
||||
# `systemd.sockets.prometheus-${name}-exporter` unit that
|
||||
# accompanies the exporter's service. When set, it is merged
|
||||
# with a default definition that includes
|
||||
# `wantedBy = [ "sockets.target" ]`, enabling socket activation
|
||||
# for exporters that support it.
|
||||
# Note that this attribute is optional.
|
||||
socketOpts = {
|
||||
socketConfig.ListenStream = "${cfg.listenAddress}:${toString cfg.port}";
|
||||
};
|
||||
}
|
||||
```
|
||||
- This should already be enough for the postfix exporter. Additionally one
|
||||
|
||||
@@ -36,15 +36,10 @@ let
|
||||
# - extraOpts (types.attrs): extra configuration options to
|
||||
# configure the exporter with, which
|
||||
# are appended to the default options
|
||||
# - socketOpts (types.attrs): optional config that is merged with
|
||||
# the default definition of the
|
||||
# exporter's systemd socket unit. When
|
||||
# set, a `prometheus-${name}-exporter.socket`
|
||||
# unit is created, enabling socket activation.
|
||||
#
|
||||
# Note that `extraOpts` and `socketOpts` are optional, but a script
|
||||
# for the exporter's systemd service must be provided by specifying
|
||||
# either `serviceOpts.script` or `serviceOpts.serviceConfig.ExecStart`
|
||||
# Note that `extraOpts` is optional, but a script for the exporter's
|
||||
# systemd service must be provided by specifying either
|
||||
# `serviceOpts.script` or `serviceOpts.serviceConfig.ExecStart`
|
||||
|
||||
exporterOpts =
|
||||
(genAttrs
|
||||
@@ -316,7 +311,6 @@ let
|
||||
name,
|
||||
conf,
|
||||
serviceOpts,
|
||||
socketOpts,
|
||||
}:
|
||||
let
|
||||
enableDynamicUser = serviceOpts.serviceConfig.DynamicUser or true;
|
||||
@@ -374,12 +368,6 @@ let
|
||||
"-m comment --comment ${name}-exporter -j nixos-fw-accept"
|
||||
]);
|
||||
networking.firewall.extraInputRules = mkIf (conf.openFirewall && nftables) conf.firewallRules;
|
||||
systemd.sockets."prometheus-${name}-exporter" = mkIf (socketOpts != null) (mkMerge [
|
||||
{
|
||||
wantedBy = [ "sockets.target" ];
|
||||
}
|
||||
socketOpts
|
||||
]);
|
||||
systemd.services."prometheus-${name}-exporter" = mkMerge [
|
||||
{
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
@@ -615,7 +603,6 @@ in
|
||||
mkExporterConf {
|
||||
inherit name;
|
||||
inherit (conf) serviceOpts;
|
||||
socketOpts = conf.socketOpts or null;
|
||||
conf = cfg.${name};
|
||||
}
|
||||
) exporterOpts)
|
||||
|
||||
@@ -39,7 +39,6 @@ in
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
serviceOpts = {
|
||||
serviceConfig = {
|
||||
DynamicUser = false;
|
||||
@@ -48,7 +47,7 @@ in
|
||||
${pkgs.prometheus-node-exporter}/bin/node_exporter \
|
||||
${concatMapStringsSep " " (x: "--collector." + x) cfg.enabledCollectors} \
|
||||
${concatMapStringsSep " " (x: "--no-collector." + x) cfg.disabledCollectors} \
|
||||
--web.systemd-socket ${concatStringsSep " " cfg.extraFlags}
|
||||
--web.listen-address ${cfg.listenAddress}:${toString cfg.port} ${concatStringsSep " " cfg.extraFlags}
|
||||
'';
|
||||
RestrictAddressFamilies =
|
||||
optionals (collectorIsEnabled "logind" || collectorIsEnabled "systemd") [
|
||||
@@ -68,8 +67,4 @@ in
|
||||
ProtectHome = true;
|
||||
};
|
||||
};
|
||||
|
||||
socketOpts = {
|
||||
socketConfig.ListenStream = "${cfg.listenAddress}:${toString cfg.port}";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -85,7 +85,6 @@ in
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serviceOpts = {
|
||||
after = mkIf cfg.systemd.enable [ cfg.systemd.unit ];
|
||||
serviceConfig = {
|
||||
@@ -96,7 +95,7 @@ in
|
||||
SupplementaryGroups = mkIf cfg.systemd.enable [ "systemd-journal" ];
|
||||
ExecStart = ''
|
||||
${lib.getExe cfg.package} \
|
||||
--web.systemd-socket \
|
||||
--web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
|
||||
--web.telemetry-path ${cfg.telemetryPath} \
|
||||
--postfix.showq_path ${escapeShellArg cfg.showqPath} \
|
||||
${concatStringsSep " \\\n " (
|
||||
@@ -116,8 +115,4 @@ in
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
socketOpts = {
|
||||
socketConfig.ListenStream = "${cfg.listenAddress}:${toString cfg.port}";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,403 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (lib)
|
||||
mkEnableOption
|
||||
mkIf
|
||||
mkOption
|
||||
mkPackageOption
|
||||
optionalAttrs
|
||||
types
|
||||
;
|
||||
|
||||
cfg = config.services.linkding;
|
||||
in
|
||||
{
|
||||
options.services.linkding = {
|
||||
enable = mkEnableOption "linkding, a self-hosted bookmark manager";
|
||||
|
||||
package = mkPackageOption pkgs "linkding" { };
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "linkding";
|
||||
description = ''
|
||||
User account under which linkding runs.
|
||||
|
||||
::: {.note}
|
||||
If left as the default value this user will automatically be created
|
||||
on system activation, otherwise you are responsible for ensuring the
|
||||
user exists before the linkding service starts.
|
||||
:::
|
||||
'';
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "linkding";
|
||||
description = ''
|
||||
Group under which linkding runs.
|
||||
|
||||
::: {.note}
|
||||
If left as the default value this group will automatically be created
|
||||
on system activation, otherwise you are responsible for ensuring the
|
||||
group exists before the linkding service starts.
|
||||
:::
|
||||
'';
|
||||
};
|
||||
|
||||
dataDir = mkOption {
|
||||
type = types.path;
|
||||
default = "/var/lib/linkding";
|
||||
description = "Directory used for all mutable state: SQLite database, secret key, favicons, previews, and assets.";
|
||||
};
|
||||
|
||||
address = mkOption {
|
||||
type = types.str;
|
||||
default = "127.0.0.1";
|
||||
description = "Address on which linkding listens.";
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 9090;
|
||||
description = "Port on which linkding listens.";
|
||||
};
|
||||
|
||||
contextPath = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "linkding/";
|
||||
description = ''
|
||||
Configures a URL context path under which linkding is accessible.
|
||||
When set, linkding is available at `http://host:<port>/<contextPath>`.
|
||||
Must end with a `/` when non-empty.
|
||||
'';
|
||||
};
|
||||
|
||||
environmentFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
example = "/run/secrets/linkding.env";
|
||||
description = ''
|
||||
Path to an environment file loaded by all linkding services.
|
||||
Useful for injecting secrets that should not appear in the Nix store,
|
||||
such as `LD_DB_PASSWORD` or `LD_SUPERUSER_PASSWORD`.
|
||||
'';
|
||||
};
|
||||
|
||||
settings = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = { };
|
||||
example = {
|
||||
LD_DISABLE_BACKGROUND_TASKS = "True";
|
||||
LD_DISABLE_URL_VALIDATION = "True";
|
||||
LD_ENABLE_OIDC = "True";
|
||||
};
|
||||
description = ''
|
||||
Additional environment variables passed to linkding.
|
||||
Refer to the [linkding documentation](https://linkding.link/options/)
|
||||
for the full list of supported `LD_*` options.
|
||||
'';
|
||||
};
|
||||
|
||||
database = {
|
||||
type = mkOption {
|
||||
type = types.enum [
|
||||
"sqlite"
|
||||
"postgres"
|
||||
];
|
||||
default = "sqlite";
|
||||
description = "Database engine to use. Defaults to SQLite.";
|
||||
};
|
||||
|
||||
host = mkOption {
|
||||
type = types.str;
|
||||
default = "localhost";
|
||||
description = "PostgreSQL server host.";
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 5432;
|
||||
description = "PostgreSQL server port.";
|
||||
};
|
||||
|
||||
name = mkOption {
|
||||
type = types.str;
|
||||
default = "linkding";
|
||||
description = "PostgreSQL database name.";
|
||||
};
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "linkding";
|
||||
description = "PostgreSQL user name.";
|
||||
};
|
||||
|
||||
createLocally = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Whether to automatically create a local PostgreSQL database and user.";
|
||||
};
|
||||
};
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Open the linkding port in the firewall.";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (
|
||||
let
|
||||
pkg = cfg.package;
|
||||
|
||||
usePostgres = cfg.database.type == "postgres";
|
||||
|
||||
pythonPath =
|
||||
"${pkg.passthru.python.pkgs.makePythonPath pkg.passthru.dependencies}:${lib.getBin pkg}/${pkg.passthru.python.sitePackages}"
|
||||
+ lib.strings.optionalString usePostgres ":${pkg.passthru.python.pkgs.makePythonPath pkg.optional-dependencies.postgres}";
|
||||
|
||||
# Build the environment passed to every linkding process.
|
||||
environment = {
|
||||
DJANGO_SETTINGS_MODULE = "bookmarks.settings.prod";
|
||||
_NIXOS_LINKDING_DATA_DIR = cfg.dataDir;
|
||||
LD_SERVER_PORT = toString cfg.port;
|
||||
}
|
||||
// optionalAttrs (cfg.contextPath != "") {
|
||||
LD_CONTEXT_PATH = cfg.contextPath;
|
||||
}
|
||||
// optionalAttrs usePostgres {
|
||||
LD_DB_ENGINE = "postgres";
|
||||
LD_DB_DATABASE = cfg.database.name;
|
||||
LD_DB_USER = cfg.database.user;
|
||||
LD_DB_HOST = "/run/postgresql";
|
||||
}
|
||||
// optionalAttrs (usePostgres && !cfg.database.createLocally) {
|
||||
LD_DB_HOST = cfg.database.host;
|
||||
LD_DB_PORT = toString cfg.database.port;
|
||||
}
|
||||
// cfg.settings;
|
||||
|
||||
environmentFile = pkgs.writeText "linkding-environment" (lib.generators.toKeyValue { } environment);
|
||||
|
||||
# Generate a uwsgi.ini for the linkding instance, adapted for NixOS from
|
||||
# the upstream uwsgi.ini. The static-map entries serve pre-generated
|
||||
# static files from the Nix store as well as the mutable user-data
|
||||
# directories (favicons, previews) from the data directory.
|
||||
uwsgiIni = pkgs.writeText "linkding-uwsgi.ini" ''
|
||||
[uwsgi]
|
||||
plugins-dir = ${pkg.passthru.uwsgiWithPython}/lib/uwsgi
|
||||
plugin = python3
|
||||
module = bookmarks.wsgi:application
|
||||
env = DJANGO_SETTINGS_MODULE=bookmarks.settings.prod
|
||||
processes = 2
|
||||
threads = 2
|
||||
buffer-size = 8192
|
||||
die-on-term = true
|
||||
mime-file = ${pkgs.mailcap}/etc/mime.types
|
||||
http = ${cfg.address}:${toString cfg.port}
|
||||
static-map = /${cfg.contextPath}static=${pkg}/${pkg.passthru.python.sitePackages}/bookmarks/static
|
||||
static-map = /${cfg.contextPath}static=${cfg.dataDir}/favicons
|
||||
static-map = /${cfg.contextPath}static=${cfg.dataDir}/previews
|
||||
static-map = /${cfg.contextPath}robots.txt=${pkg}/${pkg.passthru.python.sitePackages}/bookmarks/static/robots.txt
|
||||
|
||||
if-env = LD_REQUEST_TIMEOUT
|
||||
http-timeout = %(_)
|
||||
socket-timeout = %(_)
|
||||
harakiri = %(_)
|
||||
endif =
|
||||
|
||||
if-env = LD_REQUEST_MAX_CONTENT_LENGTH
|
||||
limit-post = %(_)
|
||||
endif =
|
||||
|
||||
if-env = LD_LOG_X_FORWARDED_FOR
|
||||
log-x-forwarded-for = %(_)
|
||||
endif =
|
||||
|
||||
if-env = LD_DISABLE_REQUEST_LOGS=true
|
||||
disable-logging = true
|
||||
log-4xx = true
|
||||
log-5xx = true
|
||||
endif =
|
||||
'';
|
||||
|
||||
# Manage wrapper script installed into the system PATH so administrators can
|
||||
# run Django management commands as the linkding service user.
|
||||
linkdingManageScript =
|
||||
let
|
||||
args = lib.escapeShellArgs (
|
||||
[
|
||||
"--uid=${cfg.user}"
|
||||
"--gid=${cfg.group}"
|
||||
"--working-directory=${cfg.dataDir}"
|
||||
"--property=EnvironmentFile=${environmentFile}"
|
||||
]
|
||||
++ lib.optional (cfg.environmentFile != null) "--property=EnvironmentFile=${cfg.environmentFile}"
|
||||
++ [
|
||||
"--property=ReadWritePaths=${cfg.dataDir}"
|
||||
"--setenv=PYTHONPATH=${pythonPath}"
|
||||
"--pty"
|
||||
"--wait"
|
||||
"--collect"
|
||||
"--service-type=exec"
|
||||
"--quiet"
|
||||
"--"
|
||||
"${lib.getExe' pkg "linkding"}"
|
||||
]
|
||||
);
|
||||
in
|
||||
pkgs.writeShellScriptBin "linkding-manage" ''
|
||||
exec ${lib.getExe' config.systemd.package "systemd-run"} ${args} "$@"
|
||||
'';
|
||||
|
||||
commonServiceConfig = {
|
||||
Slice = "system-linkding.slice";
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
EnvironmentFile = [
|
||||
environmentFile
|
||||
]
|
||||
++ lib.optional (cfg.environmentFile != null) cfg.environmentFile;
|
||||
Environment = "PYTHONPATH=${pythonPath}";
|
||||
WorkingDirectory = cfg.dataDir;
|
||||
StateDirectory = [
|
||||
"linkding"
|
||||
"linkding/favicons"
|
||||
"linkding/previews"
|
||||
"linkding/assets"
|
||||
];
|
||||
StateDirectoryMode = "0750";
|
||||
# Hardening
|
||||
NoNewPrivileges = true;
|
||||
PrivateTmp = true;
|
||||
PrivateDevices = true;
|
||||
ProtectSystem = "strict";
|
||||
ProtectHome = true;
|
||||
ReadWritePaths = [ cfg.dataDir ];
|
||||
PrivateMounts = true;
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectProc = "invisible";
|
||||
RemoveIPC = true;
|
||||
RestrictRealtime = true;
|
||||
RestrictSUIDSGID = true;
|
||||
};
|
||||
in
|
||||
{
|
||||
assertions = [
|
||||
{
|
||||
assertion = cfg.database.createLocally -> usePostgres;
|
||||
message = "services.linkding.database.createLocally requires services.linkding.database.type = \"postgres\"";
|
||||
}
|
||||
{
|
||||
assertion =
|
||||
cfg.database.createLocally -> cfg.database.host == "localhost" || cfg.database.host == "";
|
||||
message = "services.linkding.database.host should be empty or \"localhost\" when createLocally is enabled";
|
||||
}
|
||||
{
|
||||
assertion =
|
||||
cfg.database.createLocally
|
||||
-> cfg.database.user == cfg.user && cfg.database.user == cfg.database.name;
|
||||
message = "services.linkding.database.user must match services.linkding.user and services.linkding.database.name when createLocally is enabled";
|
||||
}
|
||||
{
|
||||
assertion = cfg.contextPath == "" || lib.hasSuffix "/" cfg.contextPath;
|
||||
message = "services.linkding.contextPath must end with \"/\" when non-empty";
|
||||
}
|
||||
];
|
||||
|
||||
networking.firewall = mkIf cfg.openFirewall {
|
||||
allowedTCPPorts = [ cfg.port ];
|
||||
};
|
||||
|
||||
environment.systemPackages = [ linkdingManageScript ];
|
||||
|
||||
users.users.${cfg.user} = {
|
||||
isSystemUser = true;
|
||||
group = cfg.group;
|
||||
home = cfg.dataDir;
|
||||
};
|
||||
|
||||
users.groups.${cfg.group} = { };
|
||||
|
||||
systemd.slices.system-linkding = {
|
||||
description = "linkding bookmark manager System Slice";
|
||||
documentation = [ "https://linkding.link/" ];
|
||||
};
|
||||
|
||||
# One-shot setup service: run database migrations and first-time
|
||||
# initialization steps taken from the upstream bootstrap.sh.
|
||||
systemd.services.linkding-setup = {
|
||||
description = "linkding database migrations and initialization";
|
||||
after = [
|
||||
"network.target"
|
||||
]
|
||||
++ lib.optionals (usePostgres && cfg.database.createLocally) [ "postgresql.target" ];
|
||||
requires = lib.optionals (usePostgres && cfg.database.createLocally) [ "postgresql.target" ];
|
||||
|
||||
serviceConfig = commonServiceConfig // {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${lib.getExe' pkg "linkding-bootstrap"}";
|
||||
};
|
||||
};
|
||||
|
||||
# Main WSGI service — starts after setup completes.
|
||||
systemd.services.linkding = {
|
||||
description = "linkding bookmark manager";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "linkding-setup.service" ];
|
||||
requires = [ "linkding-setup.service" ];
|
||||
startLimitBurst = 5;
|
||||
startLimitIntervalSec = 60;
|
||||
serviceConfig = commonServiceConfig // {
|
||||
Type = "exec";
|
||||
ExecStart = "${lib.getExe pkgs.uwsgi} --ini ${uwsgiIni}";
|
||||
Restart = "on-failure";
|
||||
};
|
||||
};
|
||||
|
||||
# Background task processor (Huey). Can be disabled via
|
||||
# services.linkding.settings.LD_DISABLE_BACKGROUND_TASKS = "True".
|
||||
systemd.services.linkding-background-tasks =
|
||||
mkIf ((cfg.settings.LD_DISABLE_BACKGROUND_TASKS or "False") != "True")
|
||||
{
|
||||
description = "linkding background task processor";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "linkding-setup.service" ];
|
||||
requires = [ "linkding-setup.service" ];
|
||||
|
||||
serviceConfig = commonServiceConfig // {
|
||||
Type = "exec";
|
||||
ExecStart = "${lib.getExe' pkg "linkding"} run_huey -f";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "5s";
|
||||
};
|
||||
};
|
||||
|
||||
# Automatically provision a local PostgreSQL database when requested.
|
||||
services.postgresql = mkIf cfg.database.createLocally {
|
||||
enable = true;
|
||||
ensureDatabases = [ cfg.database.name ];
|
||||
ensureUsers = [
|
||||
{
|
||||
name = cfg.database.user;
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
meta.maintainers = with lib.maintainers; [ squat ];
|
||||
}
|
||||
@@ -248,7 +248,7 @@ in
|
||||
'';
|
||||
example = literalExpression ''
|
||||
{
|
||||
umount = ''${pkgs.util-linux}/bin/umount;
|
||||
umount = "''${pkgs.util-linux}/bin/umount";
|
||||
}
|
||||
'';
|
||||
type = types.attrsOf types.path;
|
||||
@@ -640,6 +640,10 @@ in
|
||||
) cfg.automounts
|
||||
);
|
||||
|
||||
services."modprobe@" = lib.mkIf (config.system.build.kernel.config.isYes "MODULES") {
|
||||
serviceConfig.ExecSearchPath = lib.makeBinPath [ cfg.package.kmod ];
|
||||
};
|
||||
|
||||
services.initrd-find-nixos-closure = lib.mkIf (!config.system.nixos-init.enable) {
|
||||
description = "Find NixOS closure";
|
||||
|
||||
|
||||
@@ -891,6 +891,8 @@ in
|
||||
lighttpd = runTest ./lighttpd.nix;
|
||||
limesurvey = runTest ./limesurvey.nix;
|
||||
limine = import ./limine { inherit runTest; };
|
||||
linkding = runTest ./web-apps/linkding.nix;
|
||||
linkding-postgres = runTest ./web-apps/linkding-postgres.nix;
|
||||
linkwarden = runTest ./web-apps/linkwarden.nix;
|
||||
listmonk = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./listmonk.nix { };
|
||||
litellm = runTest ./litellm.nix;
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
rtt = machine.succeed("cat /sys/module/tcp_hybla/parameters/rtt0")
|
||||
assert int(rtt) == 42, "Parameter should be respected for initrd kernel modules"
|
||||
|
||||
with subtest("modprobe@ services work"):
|
||||
modprobe_service_status = machine.succeed("systemctl show --property ExecMainStatus modprobe@9pnet_virtio.service")
|
||||
t.assertEqual("ExecMainStatus=0\n", modprobe_service_status)
|
||||
|
||||
# Make sure it sticks in stage 2
|
||||
machine.switch_root()
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
{ lib, ... }:
|
||||
{
|
||||
name = "linkding-postgres";
|
||||
|
||||
meta = {
|
||||
maintainers = with lib.maintainers; [ squat ];
|
||||
};
|
||||
|
||||
nodes.machine =
|
||||
{ ... }:
|
||||
{
|
||||
services.linkding = {
|
||||
enable = true;
|
||||
port = 9090;
|
||||
database = {
|
||||
createLocally = true;
|
||||
type = "postgres";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.start()
|
||||
machine.wait_for_unit("linkding.service")
|
||||
machine.wait_for_open_port(9090)
|
||||
|
||||
with subtest("Login page loads"):
|
||||
machine.succeed(
|
||||
"curl -sSfL http://127.0.0.1:9090 | grep -i 'linkding'"
|
||||
)
|
||||
|
||||
with subtest("Health endpoint responds"):
|
||||
machine.succeed(
|
||||
"curl -sSf http://127.0.0.1:9090/health"
|
||||
)
|
||||
|
||||
with subtest("linkding-manage works"):
|
||||
machine.succeed(
|
||||
"linkding-manage version"
|
||||
)
|
||||
'';
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{ lib, pkgs, ... }:
|
||||
{
|
||||
name = "linkding";
|
||||
|
||||
meta = {
|
||||
maintainers = with lib.maintainers; [ squat ];
|
||||
};
|
||||
|
||||
nodes.machine =
|
||||
{ ... }:
|
||||
{
|
||||
services.linkding = {
|
||||
enable = true;
|
||||
port = 9090;
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.start()
|
||||
machine.wait_for_unit("linkding.service")
|
||||
machine.wait_for_open_port(9090)
|
||||
|
||||
with subtest("Login page loads"):
|
||||
machine.succeed(
|
||||
"curl -sSfL http://127.0.0.1:9090 | grep -i 'linkding'"
|
||||
)
|
||||
|
||||
with subtest("Health endpoint responds"):
|
||||
machine.succeed(
|
||||
"curl -sSf http://127.0.0.1:9090/health"
|
||||
)
|
||||
|
||||
with subtest("linkding-manage works"):
|
||||
machine.succeed(
|
||||
"linkding-manage version"
|
||||
)
|
||||
'';
|
||||
}
|
||||
@@ -26,9 +26,9 @@ let
|
||||
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2025.3.4.5/android-studio-panda4-rc1-linux.tar.gz";
|
||||
};
|
||||
latestVersion = {
|
||||
version = "2025.3.4.4"; # "Android Studio Panda 4 | 2025.3.4 Canary 4"
|
||||
sha256Hash = "sha256-sPGJuOm5T7EZV5hhOJsZc7P8CTXyv9A6k82hM1GZGpY=";
|
||||
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2025.3.4.4/android-studio-panda4-canary4-linux.tar.gz";
|
||||
version = "2026.1.1.1"; # "Android Studio Quail 1 | 2026.1.1 Canary 1"
|
||||
sha256Hash = "sha256-Nr7V6B4sEZrcwkMdKoevLEkyIHawxUx/ejN0nBL4KW0=";
|
||||
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.1.1/android-studio-quail1-canary1-linux.tar.gz";
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
}:
|
||||
mkLibretroCore {
|
||||
core = "mednafen-supafaust";
|
||||
version = "0-unstable-2026-03-31";
|
||||
version = "0-unstable-2026-04-20";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "libretro";
|
||||
repo = "supafaust";
|
||||
rev = "584ef2c5571f1ece95f6117aa04b7e8fee213fb1";
|
||||
hash = "sha256-aptn3igUIvU/ho+6iXAg0J7X5ymdWeTM+zL+BA06tG4=";
|
||||
rev = "2b93c0d7dff5b8f6c4e60e049d66849923fa8bba";
|
||||
hash = "sha256-cK+2MR4dJBhTRkPRuRtP2zWGw+mROZMgUOLc8BOxuz8=";
|
||||
};
|
||||
|
||||
makefile = "Makefile";
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
}:
|
||||
mkLibretroCore {
|
||||
core = "desmume2015";
|
||||
version = "0-unstable-2022-04-05";
|
||||
version = "0-unstable-2026-04-20";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "libretro";
|
||||
repo = "desmume2015";
|
||||
rev = "af397ff3d1f208c27f3922cc8f2b8e08884ba893";
|
||||
hash = "sha256-kEb+og4g7rJvCinBZKcb42geZO6W8ynGsTG9yqYgI+U=";
|
||||
rev = "f43dd42aae0816fcc69b2ebaa9299cbfef2ce2cc";
|
||||
hash = "sha256-jozi1aFgrvlBJ2cc+gXRHi1TguzSTz+GC4C3UNMl1D4=";
|
||||
};
|
||||
|
||||
extraBuildInputs = [
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -23,14 +23,14 @@ in
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "chameleon-cli";
|
||||
version = "2.1.0-unstable-2026-04-06";
|
||||
version = "2.1.0-unstable-2026-04-19";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "RfidResearchGroup";
|
||||
repo = "ChameleonUltra";
|
||||
rev = "93c1e150ab17b81cec40639fea7e88b1920e2c95";
|
||||
rev = "75eb389fe97a18b5ba6c8754cdfa0ec716a2dcf1";
|
||||
rootDir = "software";
|
||||
hash = "sha256-5yxXmKRBNmmJgiA2E3gUmGRgPZpO/CRFlMw5YFCFUUs=";
|
||||
hash = "sha256-RnP+j6ZZxE167Xr6C0Hs/d6zV8jjQUyI91Ya8JVMrcs=";
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
|
||||
@@ -23,13 +23,13 @@ let
|
||||
in
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "davmail";
|
||||
version = "6.5.1";
|
||||
version = "6.6.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "mguessan";
|
||||
repo = "davmail";
|
||||
tag = finalAttrs.version;
|
||||
hash = "sha256-D/MEWq696PFXlarQZdSrTS9VFODg7u7yhUsbCwHV9qs=";
|
||||
hash = "sha256-La6nrbAGeZlIhs0i5dm6pIcvn+V1wQjuqBza4w+Aa3A=";
|
||||
};
|
||||
|
||||
buildPhase = ''
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{ mkDprintPlugin }:
|
||||
mkDprintPlugin {
|
||||
description = "Biome (JS/TS/JSON) wrapper plugin";
|
||||
hash = "sha256-OCnhTv0UfRX4ntmkhNlswfhHbxVFiGu8ovYagEITlI8=";
|
||||
hash = "sha256-dje/9QfRL9D16J6NXErK1HdJyMZaLpI/L/lq3WdyQso=";
|
||||
initConfig = {
|
||||
configExcludes = [ "**/node_modules" ];
|
||||
configKey = "biome";
|
||||
@@ -17,6 +17,6 @@ mkDprintPlugin {
|
||||
};
|
||||
pname = "dprint-plugin-biome";
|
||||
updateUrl = "https://plugins.dprint.dev/dprint/biome/latest.json";
|
||||
url = "https://plugins.dprint.dev/biome-0.12.7.wasm";
|
||||
version = "0.12.7";
|
||||
url = "https://plugins.dprint.dev/biome-0.12.8.wasm";
|
||||
version = "0.12.8";
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
versionCheckHook,
|
||||
}:
|
||||
let
|
||||
version = "1.37.1";
|
||||
version = "1.37.2";
|
||||
inherit (stdenvNoCC.hostPlatform) system;
|
||||
throwSystem = throw "envoy-bin is not available for ${system}.";
|
||||
|
||||
@@ -20,8 +20,8 @@ let
|
||||
|
||||
hash =
|
||||
{
|
||||
aarch64-linux = "sha256-ZYEeEq6PedT09kGNJ6LTL+vEzIpSM9Wuik2g4+Dz/nU=";
|
||||
x86_64-linux = "sha256-jbkO4KoIWuaHPb8hISgW0p9sRV1HYMSuz01lk3Y9sYw=";
|
||||
aarch64-linux = "sha256-sNf78pVUOEziPnGQCQJX/rXKE28UViazre+rstU/h4s=";
|
||||
x86_64-linux = "sha256-MtPMIDuKvc6MLtkWopgSQ2TgxI6DtxlvVR52m2pIm/g=";
|
||||
}
|
||||
.${system} or throwSystem;
|
||||
in
|
||||
|
||||
@@ -20,20 +20,20 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
# the Equicord repository. Dates as tags (and automatic releases) were the compromise
|
||||
# we came to with upstream. Please do not change the version schema (e.g., to semver)
|
||||
# unless upstream changes the tag schema from dates.
|
||||
version = "2026-04-06";
|
||||
version = "2026-04-22";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Equicord";
|
||||
repo = "Equicord";
|
||||
tag = finalAttrs.version;
|
||||
hash = "sha256-3wFmi+SzInP+1PH3pwBquTrU757I8z6PmvPxuyygIwU=";
|
||||
hash = "sha256-KhGSQTnpOWSvrsoghF/kpzUVdNTZUlzpsm6UikySRHY=";
|
||||
};
|
||||
|
||||
pnpmDeps = fetchPnpmDeps {
|
||||
inherit (finalAttrs) pname version src;
|
||||
pnpm = pnpm_10;
|
||||
fetcherVersion = 3;
|
||||
hash = "sha256-9DNn38JdFQMQh48UEJo5d6CUMbjlzs5LEma6095o508=";
|
||||
hash = "sha256-RwppRWrEzIKZDb3QLVAMd1bHXyFwiatYNiNccVgrcWA=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
}:
|
||||
buildNpmPackage rec {
|
||||
pname = "factoriolab";
|
||||
version = "3.18.2";
|
||||
version = "3.19.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "factoriolab";
|
||||
repo = "factoriolab";
|
||||
tag = "v${version}";
|
||||
hash = "sha256-M7u9pqr7OGHgNMly1am11R6EcV6LKyPw2JzIAbzt6Wo=";
|
||||
hash = "sha256-DjNsn3PVGf+36m+k2j9NMQTqhPj8HF6V8wqaQKUB4Ho=";
|
||||
fetchLFS = true;
|
||||
};
|
||||
buildInputs = [ vips ];
|
||||
|
||||
@@ -13,18 +13,19 @@
|
||||
lua,
|
||||
miniupnpc,
|
||||
SDL2,
|
||||
systemdLibs,
|
||||
vulkan-loader,
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "flycast";
|
||||
version = "2.5";
|
||||
version = "2.6";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "flyinghead";
|
||||
repo = "flycast";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-OnlSkwPDUrpj9uEPEAxZO1iSgd5ZiQUJLneu14v9pKQ=";
|
||||
hash = "sha256-Lq6Oj+U4mpwNlL/t3ZB9gjE5NAVQyhdvBwLUGu1C+j0=";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
|
||||
@@ -43,6 +44,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
lua
|
||||
miniupnpc
|
||||
SDL2
|
||||
systemdLibs
|
||||
];
|
||||
|
||||
cmakeFlags = [
|
||||
|
||||
@@ -8,16 +8,19 @@
|
||||
|
||||
rustPlatform.buildRustPackage (finalAttrs: {
|
||||
pname = "hanko";
|
||||
version = "0.5.4";
|
||||
version = "1.1.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "SRv6d";
|
||||
repo = "hanko";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-9HRoXqZ3wdD6xf33tooEHiBWSZlggjUFomblwF4cFtA=";
|
||||
hash = "sha256-tmspfsIIxYa9fTPhHJrVRUcpC8gZ0R4prTLTDstuwbg=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-wHvhlWi99igZ2gKAIcBYg207JrbQNCOjlcVttIy3MV0=";
|
||||
cargoHash = "sha256-IcQtG29qTQl4U0HwG+kvPT07RhSgUADtejV7ObWyjG0=";
|
||||
|
||||
# Upstream tests require network access, which is unavailable in the sandbox.
|
||||
doCheck = false;
|
||||
|
||||
passthru = {
|
||||
updateScript = nix-update-script { };
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
withDocumentation ? stdenv.buildPlatform.canExecute stdenv.hostPlatform,
|
||||
}:
|
||||
let
|
||||
version = "1.49.0";
|
||||
version = "1.50.0";
|
||||
in
|
||||
rustPlatform.buildRustPackage {
|
||||
inherit version;
|
||||
@@ -34,10 +34,10 @@ rustPlatform.buildRustPackage {
|
||||
owner = "casey";
|
||||
repo = "just";
|
||||
tag = version;
|
||||
hash = "sha256-4vUcKHoQto4TQce4y4/MwdES0+PPlSjNvzLW77FodWs=";
|
||||
hash = "sha256-2hq7lgjL4XbcaaWxuDfqU0UcC4DRYKL6WFjdnb5AmjY=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-5hhwzkNgF+i5aCUoVh1VNfkNJFttyy5cLhBwu8uHmAQ=";
|
||||
cargoHash = "sha256-tKeVE5BpDvElnpN/CO6lOqDUwhWD1dGm7k51Z3wAviE=";
|
||||
|
||||
nativeBuildInputs =
|
||||
lib.optionals (installShellCompletions || installManPages) [ installShellFiles ]
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "KDSingleApplication";
|
||||
version = "1.2.0";
|
||||
version = "1.2.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "KDAB";
|
||||
repo = "KDSingleApplication";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-rglt89Gw6OHXXVOEwf0TxezDzyHEvWepeGeup7fBlLs=";
|
||||
hash = "sha256-LmiQL8hQR5U4S/L5FS9Pb2WpOoZJyiAaWGoMkGl5aUM=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake ];
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
{
|
||||
lib,
|
||||
buildNpmPackage,
|
||||
fetchFromGitHub,
|
||||
fetchurl,
|
||||
gcc,
|
||||
icu,
|
||||
nix-update-script,
|
||||
nixosTests,
|
||||
pkg-config,
|
||||
python3,
|
||||
sqlite,
|
||||
stdenv,
|
||||
uwsgi,
|
||||
}:
|
||||
let
|
||||
version = "1.45.0";
|
||||
|
||||
python = python3.override {
|
||||
self = python;
|
||||
packageOverrides = final: prev: {
|
||||
django = prev.django_6;
|
||||
};
|
||||
};
|
||||
|
||||
uwsgiWithPython = uwsgi.override {
|
||||
plugins = [ "python3" ];
|
||||
python3 = python;
|
||||
};
|
||||
|
||||
# Compile the SQLite ICU extension for case-insensitive search and ordering.
|
||||
# This mirrors the compile-icu stage in the upstream Dockerfile.
|
||||
icuExtension = stdenv.mkDerivation {
|
||||
pname = "linkding-sqlite-icu";
|
||||
inherit version;
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://www.sqlite.org/src/raw/ext/icu/icu.c?name=91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60";
|
||||
name = "icu.c";
|
||||
hash = "sha256-DkELE5p82yZVz0GVFdWWAEU8eo10ob0fqx66Q7rxv+U=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
gcc
|
||||
pkg-config
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
icu.dev
|
||||
sqlite.dev
|
||||
];
|
||||
|
||||
dontUnpack = true;
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
gcc -fPIC -shared $src \
|
||||
-I${sqlite.dev}/include \
|
||||
$(pkg-config --libs --cflags icu-uc icu-io) \
|
||||
-o libicu.so
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
install -Dm755 libicu.so $out/lib/libicu.so
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
in
|
||||
python.pkgs.buildPythonApplication (finalAttrs: {
|
||||
pname = "linkding";
|
||||
inherit version;
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "sissbruecker";
|
||||
repo = "linkding";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-iGvUKmOPL0akfR52hzSGH6wu06/WP9ygiQ/HxsmrYWg=";
|
||||
};
|
||||
|
||||
__structuredAttrs = true;
|
||||
|
||||
build-system = with python.pkgs; [
|
||||
setuptools
|
||||
];
|
||||
|
||||
dependencies = with python.pkgs; [
|
||||
beautifulsoup4
|
||||
bleach
|
||||
bleach-allowlist
|
||||
django
|
||||
djangorestframework
|
||||
huey
|
||||
markdown
|
||||
mozilla-django-oidc
|
||||
requests
|
||||
waybackpy
|
||||
];
|
||||
|
||||
optional-dependencies = {
|
||||
postgres = with python.pkgs; [ psycopg ];
|
||||
};
|
||||
|
||||
dontCheckRuntimeDeps = true;
|
||||
# Django's runserver re-executes sys.argv[0] via the Python interpreter,
|
||||
# so manage.py must remain a valid Python script and cannot be wrapped in bash.
|
||||
dontWrapPythonPrograms = true;
|
||||
|
||||
pyprojectAppendix = ''
|
||||
[tool.setuptools.packages.find]
|
||||
include = ["bookmarks*"]
|
||||
[tool.setuptools.package-data]
|
||||
bookmarks = ["static/**/*", "styles/**/*", "templates/**/*", "version.txt"]
|
||||
'';
|
||||
|
||||
ui = buildNpmPackage {
|
||||
inherit (finalAttrs) version;
|
||||
|
||||
pname = "${finalAttrs.pname}-ui";
|
||||
src = finalAttrs.src;
|
||||
|
||||
npmDepsHash = "sha256-zUMgl+h0BPm9QzGi1WZG8f0tDoYk8p+Al3q6uEKXqLk=";
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
mkdir -p $out/bookmarks
|
||||
mv bookmarks/static $out/bookmarks
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
echo "$pyprojectAppendix" >> pyproject.toml
|
||||
|
||||
# Point the SQLite ICU extension to its store path so it is found
|
||||
# regardless of the working directory at runtime.
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'SQLITE_ICU_EXTENSION_PATH = "./libicu.so"' \
|
||||
'SQLITE_ICU_EXTENSION_PATH = "${icuExtension}/lib/libicu.so"'
|
||||
|
||||
# Allow overriding the data directory via an internal environment variable
|
||||
# so that the NixOS module can point it at the mutable state directory
|
||||
# (/var/lib/linkding). The variable name is intentionally NixOS-specific
|
||||
# and not a real linkding option to avoid confusing users.
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))' \
|
||||
'BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))''\nDATA_DIR = os.getenv("_NIXOS_LINKDING_DATA_DIR", os.path.join(os.getcwd(), "data"))'
|
||||
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'"filename": os.path.join(BASE_DIR, "data", "tasks.sqlite3"),' \
|
||||
'"filename": os.path.join(DATA_DIR, "tasks.sqlite3"),'
|
||||
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'"NAME": os.path.join(BASE_DIR, "data", "db.sqlite3"),' \
|
||||
'"NAME": os.path.join(DATA_DIR, "db.sqlite3"),'
|
||||
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'LD_FAVICON_FOLDER = os.path.join(BASE_DIR, "data", "favicons")' \
|
||||
'LD_FAVICON_FOLDER = os.path.join(DATA_DIR, "favicons")'
|
||||
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'LD_PREVIEW_FOLDER = os.path.join(BASE_DIR, "data", "previews")' \
|
||||
'LD_PREVIEW_FOLDER = os.path.join(DATA_DIR, "previews")'
|
||||
|
||||
substituteInPlace bookmarks/settings/base.py \
|
||||
--replace-fail \
|
||||
'LD_ASSET_FOLDER = os.path.join(BASE_DIR, "data", "assets")' \
|
||||
'LD_ASSET_FOLDER = os.path.join(DATA_DIR, "assets")'
|
||||
|
||||
substituteInPlace bookmarks/utils.py \
|
||||
--replace-fail \
|
||||
'import datetime' \
|
||||
'import datetime''\nimport os'
|
||||
|
||||
substituteInPlace bookmarks/utils.py \
|
||||
--replace-fail \
|
||||
'with open("version.txt") as f:' \
|
||||
'with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "version.txt")) as f:'
|
||||
|
||||
substituteInPlace bookmarks/settings/prod.py \
|
||||
--replace-fail \
|
||||
'with open(os.path.join(BASE_DIR, "data", "secretkey.txt")) as f:' \
|
||||
'with open(os.path.join(DATA_DIR, "secretkey.txt")) as f:'
|
||||
|
||||
substituteInPlace bookmarks/settings/dev.py \
|
||||
--replace-fail \
|
||||
'os.path.join(BASE_DIR, "data", "favicons"),' \
|
||||
'os.path.join(DATA_DIR, "favicons"),'
|
||||
|
||||
substituteInPlace bookmarks/settings/dev.py \
|
||||
--replace-fail \
|
||||
'os.path.join(BASE_DIR, "data", "previews"),' \
|
||||
'os.path.join(DATA_DIR, "previews"),'
|
||||
|
||||
# Patch management commands that bypass Django settings and use hardcoded
|
||||
# relative "data/" paths. Replace them with paths derived from DATA_DIR
|
||||
# via django.conf.settings so the data directory is always correct.
|
||||
substituteInPlace bookmarks/management/commands/generate_secret_key.py \
|
||||
--replace-fail \
|
||||
'from django.core.management.utils import get_random_secret_key' \
|
||||
'from django.conf import settings''\nfrom django.core.management.utils import get_random_secret_key'
|
||||
substituteInPlace bookmarks/management/commands/generate_secret_key.py \
|
||||
--replace-fail \
|
||||
'secret_key_file = os.path.join("data", "secretkey.txt")' \
|
||||
'secret_key_file = os.path.join(settings.DATA_DIR, "secretkey.txt")'
|
||||
substituteInPlace bookmarks/management/commands/migrate_tasks.py \
|
||||
--replace-fail \
|
||||
'import sqlite3' \
|
||||
'import sqlite3''\nfrom django.conf import settings'
|
||||
substituteInPlace bookmarks/management/commands/migrate_tasks.py \
|
||||
--replace-fail \
|
||||
'db = sqlite3.connect(os.path.join("data", "db.sqlite3"))' \
|
||||
'db = sqlite3.connect(os.path.join(settings.DATA_DIR, "db.sqlite3"))'
|
||||
|
||||
# Place the version.txt file inside of the bookmarks package
|
||||
# so that it can be installed by setuptools alongside the package
|
||||
# in the Nix store.
|
||||
mv version.txt bookmarks/version.txt
|
||||
'';
|
||||
|
||||
preBuild = ''
|
||||
cp -r ${finalAttrs.ui}/bookmarks/static/* bookmarks/static
|
||||
'';
|
||||
|
||||
# Collect static files at build time so the result is a pure store path
|
||||
# that can be served directly by the NixOS module without any runtime step.
|
||||
# STATIC_ROOT in base.py defaults to $PWD/static, so the collected files
|
||||
# land there and are picked up by postInstall.
|
||||
postBuild = ''
|
||||
mkdir data
|
||||
${python.interpreter} manage.py collectstatic --no-input
|
||||
'';
|
||||
|
||||
postInstall =
|
||||
let
|
||||
pythonPath = python.pkgs.makePythonPath finalAttrs.passthru.dependencies;
|
||||
in
|
||||
''
|
||||
mkdir $out/bin
|
||||
|
||||
cp -r static/* $out/${python.sitePackages}/bookmarks/static
|
||||
|
||||
cp ./manage.py $out/bin/.manage.py
|
||||
chmod +x $out/bin/.manage.py
|
||||
|
||||
makeWrapper $out/bin/.manage.py $out/bin/linkding \
|
||||
--prefix PYTHONPATH : "${pythonPath}:$out/${python.sitePackages}"
|
||||
|
||||
# Bootstrap script mirroring the upstream bootstrap.sh: creates data
|
||||
# directories and runs Django management commands to initialize a fresh
|
||||
# linkding installation. The linkding binary is referenced by its
|
||||
# absolute store path so the script works without PATH manipulation.
|
||||
cat > $out/bin/linkding-bootstrap << EOF
|
||||
#!/bin/sh
|
||||
DATA_DIR="\''${_NIXOS_LINKDING_DATA_DIR:-data}"
|
||||
mkdir -p "\$DATA_DIR"/favicons "\$DATA_DIR"/previews "\$DATA_DIR"/assets
|
||||
$out/bin/linkding generate_secret_key
|
||||
$out/bin/linkding migrate
|
||||
$out/bin/linkding enable_wal
|
||||
$out/bin/linkding create_initial_superuser
|
||||
$out/bin/linkding migrate_tasks
|
||||
EOF
|
||||
chmod +x $out/bin/linkding-bootstrap
|
||||
'';
|
||||
|
||||
passthru = {
|
||||
inherit
|
||||
python
|
||||
icuExtension
|
||||
uwsgiWithPython
|
||||
;
|
||||
tests = {
|
||||
inherit (nixosTests) linkding linkding-postgres;
|
||||
};
|
||||
updateScript = nix-update-script {
|
||||
extraArgs = [
|
||||
"--subpackage"
|
||||
"ui"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
meta = {
|
||||
description = "Self-hosted bookmark manager designed to be minimal, fast, and easy to set up";
|
||||
homepage = "https://linkding.link/";
|
||||
changelog = "https://github.com/sissbruecker/linkding/releases/tag/v${finalAttrs.version}";
|
||||
license = lib.licenses.mit;
|
||||
maintainers = with lib.maintainers; [
|
||||
squat
|
||||
];
|
||||
platforms = lib.platforms.linux;
|
||||
};
|
||||
})
|
||||
@@ -7,13 +7,13 @@
|
||||
|
||||
python3Packages.buildPythonApplication (finalAttrs: {
|
||||
pname = "mcuboot-imgtool";
|
||||
version = "2.3.0";
|
||||
version = "2.4.0";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchPypi {
|
||||
inherit (finalAttrs) version;
|
||||
pname = "imgtool";
|
||||
hash = "sha256-//cuTnk6wOwCpJPBlUhxXMwKI1ivruqhC0nMwuC9EpU=";
|
||||
hash = "sha256-7y2x2eP2K5vJQlqOhsTqchLBZPChbpI9VSUPDYdDNC4=";
|
||||
};
|
||||
|
||||
passthru.updateScript = nix-update-script { };
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
}:
|
||||
buildGoModule (finalAttrs: {
|
||||
pname = "memogram";
|
||||
version = "0.4.2";
|
||||
version = "0.5.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "usememos";
|
||||
repo = "telegram-integration";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-OkNx5qAF7Gxk50S9a31NUWRoC9uHPUwUHG3jA8gy7AQ=";
|
||||
hash = "sha256-kXn3m7o+WqxONUUiy6PVfdJfKuo9hJfpaAaXQx0LsnU=";
|
||||
};
|
||||
|
||||
vendorHash = "sha256-iSJU/FyyEbZlpTT3isJlsEvDzNpg3ylE5367KPBeUxM=";
|
||||
vendorHash = "sha256-aSq+wjWZUK4Rh7bw9NqqxnD9H3X+EgMF6F4w+SUtm70=";
|
||||
|
||||
subPackages = [ "bin/memogram" ];
|
||||
|
||||
|
||||
@@ -726,7 +726,11 @@ def switch_to_configuration(
|
||||
)
|
||||
|
||||
|
||||
def upgrade_channels(all_channels: bool = False, sudo: bool = False) -> None:
|
||||
def upgrade_channels(
|
||||
all_channels: bool = False,
|
||||
sudo: bool = False,
|
||||
channels_dir: Path = Path("/nix/var/nix/profiles/per-user/root/channels/"),
|
||||
) -> None:
|
||||
"""Upgrade channels for classic Nix.
|
||||
|
||||
It will either upgrade just the `nixos` channel (including any channel
|
||||
@@ -739,7 +743,7 @@ def upgrade_channels(all_channels: bool = False, sudo: bool = False) -> None:
|
||||
)
|
||||
|
||||
channel_updated = False
|
||||
for channel_path in Path("/nix/var/nix/profiles/per-user/root/channels/").glob("*"):
|
||||
for channel_path in channels_dir.glob("*"):
|
||||
if channel_path.is_dir() and (
|
||||
all_channels
|
||||
or channel_path.name == "nixos"
|
||||
|
||||
@@ -882,44 +882,63 @@ def test_switch_to_configuration_with_systemd_run(
|
||||
)
|
||||
|
||||
|
||||
@patch(
|
||||
"pathlib.Path.glob",
|
||||
autospec=True,
|
||||
return_value=[
|
||||
Path("/nix/var/nix/profiles/per-user/root/channels/nixos"),
|
||||
Path("/nix/var/nix/profiles/per-user/root/channels/nixos-hardware"),
|
||||
Path("/nix/var/nix/profiles/per-user/root/channels/home-manager"),
|
||||
],
|
||||
)
|
||||
@patch("pathlib.Path.is_dir", autospec=True, return_value=True)
|
||||
@patch("os.geteuid", autospec=True, return_value=1000)
|
||||
@patch(get_qualified_name(n.run_wrapper, n), autospec=True)
|
||||
def test_upgrade_channels(
|
||||
mock_run: Mock,
|
||||
mock_geteuid: Mock,
|
||||
mock_is_dir: Mock,
|
||||
mock_glob: Mock,
|
||||
) -> None:
|
||||
def test_upgrade_channels(mock_run: Mock, mock_geteuid: Mock, tmpdir: Path) -> None:
|
||||
tmp_path = Path(tmpdir)
|
||||
|
||||
with pytest.raises(m.NixOSRebuildError) as e:
|
||||
n.upgrade_channels(all_channels=False, sudo=False)
|
||||
n.upgrade_channels(all_channels=False, sudo=False, channels_dir=tmp_path)
|
||||
assert str(e.value) == (
|
||||
"error: if you pass the '--upgrade' or '--upgrade-all' flag, you must "
|
||||
"also pass '--sudo' or run the command as root (e.g., with sudo)"
|
||||
)
|
||||
|
||||
n.upgrade_channels(all_channels=False, sudo=True)
|
||||
mock_run.assert_called_once_with(
|
||||
["nix-channel", "--update", "nixos"], check=False, sudo=True
|
||||
)
|
||||
(tmp_path / "nixos").mkdir()
|
||||
(tmp_path / "nixos-hardware").mkdir()
|
||||
(tmp_path / "nixos-hardware" / ".update-on-nixos-rebuild").touch()
|
||||
(tmp_path / "home-manager").mkdir()
|
||||
|
||||
mock_geteuid.return_value = 0
|
||||
n.upgrade_channels(all_channels=True, sudo=False)
|
||||
# should work because we are passing sudo=True even with os.geteuid == 1000
|
||||
n.upgrade_channels(all_channels=False, sudo=True, channels_dir=tmp_path)
|
||||
mock_run.assert_has_calls(
|
||||
[
|
||||
call(["nix-channel", "--update", "nixos"], check=False, sudo=False),
|
||||
call(
|
||||
["nix-channel", "--update", "nixos-hardware"], check=False, sudo=False
|
||||
["nix-channel", "--update", "nixos-hardware"],
|
||||
check=False,
|
||||
sudo=True,
|
||||
),
|
||||
call(["nix-channel", "--update", "home-manager"], check=False, sudo=False),
|
||||
]
|
||||
call(
|
||||
["nix-channel", "--update", "nixos"],
|
||||
check=False,
|
||||
sudo=True,
|
||||
),
|
||||
],
|
||||
any_order=True,
|
||||
)
|
||||
mock_run.reset_mock()
|
||||
|
||||
# root check
|
||||
mock_geteuid.return_value = 0
|
||||
|
||||
n.upgrade_channels(all_channels=True, sudo=False, channels_dir=tmp_path)
|
||||
mock_run.assert_has_calls(
|
||||
[
|
||||
call(
|
||||
["nix-channel", "--update", "home-manager"],
|
||||
check=False,
|
||||
sudo=False,
|
||||
),
|
||||
call(
|
||||
["nix-channel", "--update", "nixos-hardware"],
|
||||
check=False,
|
||||
sudo=False,
|
||||
),
|
||||
call(
|
||||
["nix-channel", "--update", "nixos"],
|
||||
check=False,
|
||||
sudo=False,
|
||||
),
|
||||
],
|
||||
any_order=True,
|
||||
)
|
||||
|
||||
+694
-1392
File diff suppressed because it is too large
Load Diff
@@ -8,16 +8,16 @@
|
||||
|
||||
buildNpmPackage rec {
|
||||
pname = "node-gyp";
|
||||
version = "12.2.0";
|
||||
version = "12.3.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "nodejs";
|
||||
repo = "node-gyp";
|
||||
tag = "v${version}";
|
||||
hash = "sha256-0XTv7kDc5Mt7e4VuVQeuJusIxwQzePm4PaE9ms6oRoM=";
|
||||
hash = "sha256-+QPQxWrO2n5QsyAmM5UfL/posEyQQGHmDG7EL0jBNeE=";
|
||||
};
|
||||
|
||||
npmDepsHash = "sha256-MflhEEUuzhXb6HTdnz2pvfZJN5w4/dAQ6Cw/C5jSbLs=";
|
||||
npmDepsHash = "sha256-43YHmebfSYNb7glSjycQqjnLY13Bp9syXRAWNDjBIXY=";
|
||||
|
||||
postPatch = ''
|
||||
ln -s ${./package-lock.json} package-lock.json
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
versionCheckHook,
|
||||
rolldown,
|
||||
installShellFiles,
|
||||
version ? "2026.4.12",
|
||||
version ? "2026.4.21",
|
||||
}:
|
||||
stdenvNoCC.mkDerivation (finalAttrs: {
|
||||
pname = "openclaw";
|
||||
@@ -21,10 +21,10 @@ stdenvNoCC.mkDerivation (finalAttrs: {
|
||||
owner = "openclaw";
|
||||
repo = "openclaw";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-d0/Y3s+MQFaG1lZr9nk00KU7bJhglApFZFLRCLJ4Hc4=";
|
||||
hash = "sha256-K1Pl9lXzGKfoq/fXWxYX5PoY3IBzJr0PPstUDGET/gs=";
|
||||
};
|
||||
|
||||
pnpmDepsHash = "sha256-Tkraoxlux/lUS1ilpAIvSl5VUT0ZA9DWptNXRNl8B8o=";
|
||||
pnpmDepsHash = "sha256-FDajXHs4s0+QDRPq4ZxQWWW9rqeSJVYACAl/5Mw2Agc=";
|
||||
|
||||
pnpmDeps = fetchPnpmDeps {
|
||||
inherit (finalAttrs) pname version src;
|
||||
@@ -70,15 +70,31 @@ stdenvNoCC.mkDerivation (finalAttrs: {
|
||||
continue;
|
||||
}' \
|
||||
--replace-fail \
|
||||
'stageInstalledRootRuntimeDeps({ fingerprint, packageJson, pluginDir, repoRoot })
|
||||
) {
|
||||
return;
|
||||
}' \
|
||||
'stageInstalledRootRuntimeDeps({ fingerprint, packageJson, pluginDir, repoRoot })
|
||||
) {
|
||||
return;
|
||||
}
|
||||
return; // nix: sandbox has no npm'
|
||||
' if (
|
||||
stageInstalledRootRuntimeDeps({
|
||||
directDependencyPackageRoot,
|
||||
fingerprint,
|
||||
packageJson,
|
||||
pluginDir,
|
||||
pruneConfig,
|
||||
repoRoot,
|
||||
})
|
||||
) {
|
||||
continue;
|
||||
}' \
|
||||
' if (
|
||||
stageInstalledRootRuntimeDeps({
|
||||
directDependencyPackageRoot,
|
||||
fingerprint,
|
||||
packageJson,
|
||||
pluginDir,
|
||||
pruneConfig,
|
||||
repoRoot,
|
||||
})
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
continue; // nix: sandbox has no npm'
|
||||
pnpm build
|
||||
pnpm ui:build
|
||||
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
|
||||
python3Packages.buildPythonApplication (finalAttrs: {
|
||||
pname = "ciel";
|
||||
version = "2.4.0";
|
||||
version = "2.4.1";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "fossi-foundation";
|
||||
repo = "ciel";
|
||||
tag = finalAttrs.version;
|
||||
hash = "sha256-AWbkHL0zO3tD0mE3dZIcj8mVND7o3imTxOpEfOtlRDI=";
|
||||
hash = "sha256-p35R0wfoGR8CmI++ae7iKLJs00RHHMdaSckgC18EIyM=";
|
||||
};
|
||||
|
||||
build-system = [ python3Packages.poetry-core ];
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "qmk-udev-rules";
|
||||
version = "0.27.13";
|
||||
version = "0.1.20";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "qmk";
|
||||
repo = "qmk_firmware";
|
||||
tag = finalAttrs.version;
|
||||
hash = "sha256-Zs508OQ0RYCg0f9wqR+VXUmVvhP/jCA3piwRq2ZpR84=";
|
||||
repo = "qmk_udev";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-sxwvyMniEXTnmHEs8ldsBjwReKUT5FlqYxcUULV0cpI=";
|
||||
};
|
||||
|
||||
dontBuild = true;
|
||||
@@ -30,7 +30,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
install -D util/udev/50-qmk.rules $out/lib/udev/rules.d/50-qmk.rules
|
||||
install -D 50-qmk.rules $out/lib/udev/rules.d/50-qmk.rules
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
@@ -8,16 +8,16 @@
|
||||
|
||||
rustPlatform.buildRustPackage (finalAttrs: {
|
||||
pname = "rage";
|
||||
version = "0.11.1";
|
||||
version = "0.11.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "str4d";
|
||||
repo = "rage";
|
||||
rev = "v${finalAttrs.version}";
|
||||
hash = "sha256-aZs1iqfpsiMuhxXNqRatpKD99eDBCsWHk4OPpnnaB70=";
|
||||
hash = "sha256-uBRXdDdfKTlw006LfCrIvbng7b/fhJDHrmHDLLxdmAU=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-GdvqkB/jHAGUbzhOLPkIX664JJH3WrZZtv+/E/PhTR8=";
|
||||
cargoHash = "sha256-b5x6ESGsF0Mn5dNVagBSopuawbrNcJuMK1//Ns+xuJs=";
|
||||
|
||||
nativeBuildInputs = [
|
||||
installShellFiles
|
||||
|
||||
@@ -14,16 +14,16 @@
|
||||
}:
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "sequoia-git";
|
||||
version = "0.5.0";
|
||||
version = "0.6.0";
|
||||
|
||||
src = fetchFromGitLab {
|
||||
owner = "sequoia-pgp";
|
||||
repo = "sequoia-git";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-7ynaz48j/ebQAZ2QxeWwkf7kFP70HKtHCv4/wGxxaVY=";
|
||||
hash = "sha256-1nSFzpz0Rl9uoE59teP3o7PduSmA20QEhe+fvTM6JGA=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-+sIH4zFLewNNkpd42co2B0rLrIsde5gsBDsqSSc0HZQ=";
|
||||
cargoHash = "sha256-/9/nTqCRi74TMToWQjtnnzQ8en+nqKT8gUipNcHTxvs=";
|
||||
|
||||
buildInputs = [
|
||||
openssl.dev
|
||||
|
||||
@@ -11,16 +11,16 @@
|
||||
|
||||
rustPlatform.buildRustPackage (finalAttrs: {
|
||||
pname = "speakersafetyd";
|
||||
version = "1.1.2-unstable-2026-03-28";
|
||||
version = "2.0.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "AsahiLinux";
|
||||
repo = "speakersafetyd";
|
||||
rev = "a97c341e39e3f89e99f65d2a35d4e060b3b0168a";
|
||||
hash = "sha256-FWpO2cp8licwevpAP25fmiIUEehkQp61E4A7RmsKJH0=";
|
||||
tag = finalAttrs.version;
|
||||
hash = "sha256-tHHoVJqWcip5u/e7M9l74opdzfe0Y9Q6ItIT7w7XfA8=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-xcCnzDN/U3sp12UwznaYjalzcKxo8Eo4vHnO/Sf++Zk=";
|
||||
cargoHash = "sha256-v0w/eA/qd9xBivgq7BgdaGRGDdX2NA1gbRgv84cB6d4=";
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkg-config
|
||||
|
||||
@@ -12,20 +12,16 @@
|
||||
|
||||
rustPlatform.buildRustPackage (finalAttrs: {
|
||||
pname = "usage";
|
||||
version = "3.2.0";
|
||||
version = "3.2.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "jdx";
|
||||
repo = "usage";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-0yonwl/2BIkGUs0uOBP+Pjo93NvLVK4QQQj/K4C4NNY=";
|
||||
hash = "sha256-L8OQ6GdHoxJROA/lczichG4nNx5UGKxInihel5AaFIc=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-jxTN+La7Ye2okRZGAY6niIvvRf2E4vFFHd1nny7JJDo=";
|
||||
|
||||
patches = [
|
||||
./use-bin-exe-env.patch
|
||||
];
|
||||
cargoHash = "sha256-JauKSCp5Fk1shzXE2dy/joYamv7XW2rnIsu4hjIkBUA=";
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace ./examples/*.sh \
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
diff --git a/cli/tests/shell_completions_integration.rs b/cli/tests/shell_completions_integration.rs
|
||||
index 815c44c..51b5dd9 100644
|
||||
--- a/cli/tests/shell_completions_integration.rs
|
||||
+++ b/cli/tests/shell_completions_integration.rs
|
||||
@@ -25,6 +25,13 @@ fn run_complete_word(usage_bin: &Path, shell: &str, spec_file: &Path, words: &[&
|
||||
|
||||
/// Build the usage binary and return its path
|
||||
fn build_usage_binary() -> PathBuf {
|
||||
+ if let Some(usage_path) = std::env::var("CARGO_BIN_EXE_usage")
|
||||
+ .ok()
|
||||
+ .filter(|s| !s.is_empty())
|
||||
+ {
|
||||
+ return PathBuf::from(usage_path);
|
||||
+ }
|
||||
+
|
||||
let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||
let workspace_root = manifest_dir.parent().unwrap();
|
||||
@@ -13,18 +13,18 @@
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "vivify";
|
||||
version = "0.13.0";
|
||||
version = "0.14.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "jannis-baum";
|
||||
repo = "Vivify";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-LjVxSf2rddg9DyAY6MAVFzuoxIT4d1a/8Wv8DukxeYM=";
|
||||
hash = "sha256-CszMG+c0bNHfXWqcI3b4iGpeFJ+FmzHDzxflPS+wEe0=";
|
||||
};
|
||||
|
||||
yarnOfflineCache = fetchYarnDeps {
|
||||
yarnLock = "${finalAttrs.src}/yarn.lock";
|
||||
hash = "sha256-61NXUEpXIFJXRuIZgLAkDqsk6WvV7WU2Qm24ID0oDtw=";
|
||||
hash = "sha256-svgEanFiBSQn0TdTuB0CnLR71lkANABEaDiKB+Vc0Rc=";
|
||||
};
|
||||
|
||||
installPhase = ''
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"aarch64-darwin": {
|
||||
"version": "1.9600.41",
|
||||
"version": "2.0.67",
|
||||
"vscodeVersion": "1.110.1",
|
||||
"url": "https://windsurf-stable.codeiumdata.com/darwin-arm64/stable/f90ca8311d630b9b77e7537222ecfce0a0ac990b/Windsurf-darwin-arm64-1.9600.41.zip",
|
||||
"sha256": "db935596cf4f27018eca94529c807f1d3e42fb040b75ee99726a0bd9089fcf0b"
|
||||
"url": "https://windsurf-stable.codeiumdata.com/darwin-arm64/stable/08b5de9bae1728a5ad46386c9b8903192a125c51/Windsurf-darwin-arm64-2.0.67.zip",
|
||||
"sha256": "1be5a36addf99211aa4deed9476184defb94d6fe58ba30e7f84833834915961f"
|
||||
},
|
||||
"x86_64-darwin": {
|
||||
"version": "1.9600.41",
|
||||
"version": "2.0.67",
|
||||
"vscodeVersion": "1.110.1",
|
||||
"url": "https://windsurf-stable.codeiumdata.com/darwin-x64/stable/f90ca8311d630b9b77e7537222ecfce0a0ac990b/Windsurf-darwin-x64-1.9600.41.zip",
|
||||
"sha256": "6b7403b6405b9961f5a5d004120da7991ca3b35f140437b6b4ee4ac8d3e72795"
|
||||
"url": "https://windsurf-stable.codeiumdata.com/darwin-x64/stable/08b5de9bae1728a5ad46386c9b8903192a125c51/Windsurf-darwin-x64-2.0.67.zip",
|
||||
"sha256": "2186862bf20f5968837ea777b171f05a65320259063b1343117c53ceef8cdc97"
|
||||
},
|
||||
"x86_64-linux": {
|
||||
"version": "1.9600.41",
|
||||
"version": "2.0.67",
|
||||
"vscodeVersion": "1.110.1",
|
||||
"url": "https://windsurf-stable.codeiumdata.com/linux-x64/stable/f90ca8311d630b9b77e7537222ecfce0a0ac990b/Windsurf-linux-x64-1.9600.41.tar.gz",
|
||||
"sha256": "b8c9e9dad0bc51e40e393f5a16e8c20cedefcd91d0bd879c15200039f0933962"
|
||||
"url": "https://windsurf-stable.codeiumdata.com/linux-x64/stable/08b5de9bae1728a5ad46386c9b8903192a125c51/Windsurf-linux-x64-2.0.67.tar.gz",
|
||||
"sha256": "f2f10ef446096bc77c6d0513ea7ceb8a59398d5119a93f5b88a7c77a59727b67"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,12 @@
|
||||
pip,
|
||||
pyte,
|
||||
pytest-mock,
|
||||
pytest-rerunfailures,
|
||||
pytest-subprocess,
|
||||
pytest-timeout,
|
||||
pytestCheckHook,
|
||||
requests,
|
||||
virtualenv,
|
||||
|
||||
man,
|
||||
util-linux,
|
||||
@@ -32,7 +35,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "xonsh";
|
||||
version = "0.22.8";
|
||||
version = "0.23.0";
|
||||
pyproject = true;
|
||||
|
||||
# PyPI package ships incomplete tests
|
||||
@@ -40,7 +43,7 @@ buildPythonPackage rec {
|
||||
owner = "xonsh";
|
||||
repo = "xonsh";
|
||||
tag = version;
|
||||
hash = "sha256-NOQs21Ahp2oMx1Lw1ekvb2aqUWwIXw1WyC9ZE5V9wJI=";
|
||||
hash = "sha256-hZMA1GMyzo2297iTrgOdRuqjqR55KughPsaL0EZWLWM=";
|
||||
};
|
||||
|
||||
build-system = [
|
||||
@@ -61,9 +64,14 @@ buildPythonPackage rec {
|
||||
pip
|
||||
pyte
|
||||
pytest-mock
|
||||
pytest-rerunfailures
|
||||
pytest-subprocess
|
||||
pytest-timeout
|
||||
pytestCheckHook
|
||||
requests
|
||||
|
||||
# required by test_xonsh_activator
|
||||
virtualenv
|
||||
]
|
||||
++ lib.optionals (!stdenv.isDarwin) [
|
||||
# required by test_man_completion
|
||||
@@ -74,16 +82,16 @@ buildPythonPackage rec {
|
||||
disabledTests = [
|
||||
# fails on sandbox
|
||||
"test_colorize_file"
|
||||
"test_xonsh_activator"
|
||||
"test_repath_HOME_PATH_itself"
|
||||
"test_repath_HOME_PATH_var"
|
||||
"test_repath_HOME_PATH_var_brace"
|
||||
|
||||
# flaky tests in test_integrations.py
|
||||
"test_script"
|
||||
"test_catching_system_exit"
|
||||
"test_catching_exit_signal"
|
||||
"test_alias_stability"
|
||||
"test_captured_subproc_is_not_affected_next_command"
|
||||
"test_spec_decorator_alias"
|
||||
"test_alias_stability_exception"
|
||||
|
||||
# flaky tests in test_python.py
|
||||
"test_complete_import"
|
||||
@@ -112,18 +120,22 @@ buildPythonPackage rec {
|
||||
"test_on_command_not_found_replacement"
|
||||
"test_skipper_command"
|
||||
"test_xonsh_lexer_no_win"
|
||||
"test_on_command_not_found_dict_without_env"
|
||||
];
|
||||
|
||||
disabledTestPaths = [
|
||||
# don't run stress tests when building package
|
||||
"tests/xintegration/test_stress.py"
|
||||
];
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/issues/248978
|
||||
dontWrapPythonPrograms = true;
|
||||
|
||||
env.LC_ALL = "en_US.UTF-8";
|
||||
|
||||
postPatch = ''
|
||||
sed -i -e 's|/bin/ls|${lib.getExe' coreutils "ls"}|' tests/test_execer.py
|
||||
sed -i -e 's|SHELL=xonsh|SHELL=$out/bin/xonsh|' tests/test_integrations.py
|
||||
sed -i -e 's|SHELL=xonsh|SHELL=$out/bin/xonsh|' tests/xintegration/test_integrations.py
|
||||
|
||||
for script in tests/test_integrations.py scripts/xon.sh $(find -name "*.xsh"); do
|
||||
for script in tests/xintegration/test_integrations.py scripts/xon.sh $(find -name "*.xsh"); do
|
||||
sed -i -e 's|/usr/bin/env|${lib.getExe' coreutils "env"}|' $script
|
||||
done
|
||||
patchShebangs .
|
||||
@@ -139,7 +151,7 @@ buildPythonPackage rec {
|
||||
|
||||
meta = {
|
||||
homepage = "https://xon.sh/";
|
||||
description = "Python-ish, BASHwards-compatible shell";
|
||||
description = "Python-powered shell";
|
||||
changelog = "https://github.com/xonsh/xonsh/blob/${version}/CHANGELOG.md";
|
||||
license = with lib.licenses; [ bsd3 ];
|
||||
mainProgram = "xonsh";
|
||||
|
||||
@@ -11,16 +11,16 @@
|
||||
|
||||
buildGoModule (finalAttrs: {
|
||||
pname = "yq-go";
|
||||
version = "4.52.5";
|
||||
version = "4.53.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "mikefarah";
|
||||
repo = "yq";
|
||||
tag = "v${finalAttrs.version}";
|
||||
hash = "sha256-ZOgAPnONzRBTjNeOgQK4fXwUrypHH51XI/JWbE/momE=";
|
||||
hash = "sha256-So0yUblAxLgbw1/BrOp6zj9wGMTtsspjk2UQaBIBIYE=";
|
||||
};
|
||||
|
||||
vendorHash = "sha256-QTcDE5qs46ryWhZlKHIC2G1jbEO12XGJa6QvEJC5oL8=";
|
||||
vendorHash = "sha256-t+u3rJNbe8JcfWBb+jMaZuTcSWYmhMiCeKbI2noVaCo=";
|
||||
|
||||
nativeBuildInputs = lib.optionals (stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
|
||||
installShellFiles
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "hueble";
|
||||
version = "2.2.1";
|
||||
version = "2.2.2";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "flip-dots";
|
||||
repo = "HueBLE";
|
||||
tag = "v${version}";
|
||||
hash = "sha256-JbihHDG44PeS6rxUOXSRF9NlH/smUGz3/JrCmXqTT5s=";
|
||||
hash = "sha256-ASegu+kssupiJD6IFDAmZk7kl+RVUsTep6Zjs6IhVBI=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
|
||||
@@ -36,14 +36,14 @@
|
||||
|
||||
buildPythonPackage (finalAttrs: {
|
||||
pname = "plopp";
|
||||
version = "26.4.0";
|
||||
version = "26.4.1";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "scipp";
|
||||
repo = "plopp";
|
||||
tag = finalAttrs.version;
|
||||
hash = "sha256-qjuhM0/qrGIZw00DOnaGODGHqzGn4r3gIAguJS5OPZ8=";
|
||||
hash = "sha256-fx+jMqso/ISB6KiWVGGBgvsT9vayfe+MCrSciAIyKks=";
|
||||
};
|
||||
|
||||
build-system = [
|
||||
|
||||
@@ -11,7 +11,11 @@ let
|
||||
inherit (buildPackages) gnused python3;
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -14,7 +14,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -10,7 +10,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -11,7 +11,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -22,7 +22,11 @@ let
|
||||
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -19,7 +19,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -10,7 +10,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -15,7 +15,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -18,7 +18,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -9,7 +9,11 @@
|
||||
let
|
||||
f =
|
||||
pkgs: prev:
|
||||
if !pkgs.stdenv.hostPlatform.isDarwin || pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin" then
|
||||
if
|
||||
!pkgs.stdenv.hostPlatform.isDarwin
|
||||
|| pkgs.stdenv.name == "bootstrap-stage0-stdenv-darwin"
|
||||
|| !(pkgs.stdenv ? __bootPackages)
|
||||
then
|
||||
prev.darwin.sourceRelease
|
||||
else
|
||||
f pkgs.stdenv.__bootPackages pkgs;
|
||||
|
||||
@@ -25,23 +25,23 @@
|
||||
"lts": true
|
||||
},
|
||||
"6.12": {
|
||||
"version": "6.12.82",
|
||||
"hash": "sha256:1a8r1wzfssrnqbf4yvbcfynf5w6la4vy1w5wlns1p63krl2hnmqf",
|
||||
"version": "6.12.83",
|
||||
"hash": "sha256:0cfzvhm876jm61cy023apwmi5axjilwfc0xnag9jd9fzs4n1gqrr",
|
||||
"lts": true
|
||||
},
|
||||
"6.18": {
|
||||
"version": "6.18.23",
|
||||
"hash": "sha256:0d2ihdz5hdy1ywhck76y9rnzzvkl2lhrb5xvc6w5l4ydpxv8wb9a",
|
||||
"version": "6.18.24",
|
||||
"hash": "sha256:0pr5s7hkmn7n17bm7p6sqrkq8g9z42jnvqihv96kn42qrrbwa1y2",
|
||||
"lts": true
|
||||
},
|
||||
"6.19": {
|
||||
"version": "6.19.13",
|
||||
"hash": "sha256:0j2ncikwi4mkx9v33ahzmi2qq2bx5f82701nnha1grs0lzzb2n85",
|
||||
"version": "6.19.14",
|
||||
"hash": "sha256:11giqsz9qa7s9lm94nn4h1bcb2411crsbfyvzrvhfjmy75kvzs6d",
|
||||
"lts": false
|
||||
},
|
||||
"7.0": {
|
||||
"version": "7.0",
|
||||
"hash": "sha256:1w4i705i0nl1xqv7fdhdbhy7j3xrzhl31fabs6vmgiw7nf06szxv",
|
||||
"version": "7.0.1",
|
||||
"hash": "sha256:1gw7v1j0pp2w6fm5y1n0krhnfvgab2jkrvcvwl8hx614dnikbjdj",
|
||||
"lts": false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,6 +126,7 @@ rec {
|
||||
sha256_64bit = "sha256-ueL4BpN4FDHMh/TNKRCeEz3Oy1ClDWto1LO/LWlr1ok=";
|
||||
persistencedSha256 = "sha256-wsNeuw7IaY6Qc/i/AzT/4N82lPjkwfrhxidKWUtcwW8=";
|
||||
fabricmanagerSha256 = "sha256-f/AQ8HrgoqBQyXNrXA/UaI4OMQ9QcjjYWIhr1/5uM74=";
|
||||
openSha256 = "sha256-hECHfguzwduEfPo5pCDjWE/MjtRDhINVr4b1awFdP44=";
|
||||
useSettings = false;
|
||||
usePersistenced = true;
|
||||
useFabricmanager = true;
|
||||
@@ -137,6 +138,7 @@ rec {
|
||||
sha256_64bit = "sha256-TKxT5I+K3/Zh1HyHiO0kBZokjJ/YCYzq/QiKSYmG7CY=";
|
||||
persistencedSha256 = "sha256-J1UwS0o/fxz45gIbH9uaKxARW+x4uOU1scvAO4rHU5Y=";
|
||||
fabricmanagerSha256 = "sha256-tyCHKIr8nxVfZIqcWKAwRoMLzmGlsOUhDlO5V/9W97Y=";
|
||||
openSha256 = "sha256-ychsaurbQ2KNFr/SAprKI2tlvAigoKoFU1H7+SaxSrY=";
|
||||
useSettings = false;
|
||||
usePersistenced = true;
|
||||
useFabricmanager = true;
|
||||
@@ -148,6 +150,7 @@ rec {
|
||||
sha256_64bit = "sha256-AlaGfggsr5PXsl+nyOabMWBiqcbHLG4ij617I4xvoX0=";
|
||||
persistencedSha256 = "sha256-x4K0Gp89LdL5YJhAI0AydMRxl6fyBylEnj+nokoBrK8=";
|
||||
fabricmanagerSha256 = "sha256-jSTKzeRVTUcYma1Cb0ajSdXKCi6KzUXCp2OByPSWSR4=";
|
||||
openSha256 = "sha256-aTV5J4zmEgRCOavo6wLwh5efOZUG+YtoeIT/tnrC1Hg=";
|
||||
useSettings = false;
|
||||
usePersistenced = true;
|
||||
useFabricmanager = true;
|
||||
|
||||
@@ -175,73 +175,6 @@ lib.makeExtensible (
|
||||
{
|
||||
inherit makeLixScope;
|
||||
|
||||
lix_2_93 = self.makeLixScope {
|
||||
attrName = "lix_2_93";
|
||||
|
||||
lix-args = rec {
|
||||
version = "2.93.3";
|
||||
|
||||
src = fetchFromGitea {
|
||||
domain = "git.lix.systems";
|
||||
owner = "lix-project";
|
||||
repo = "lix";
|
||||
rev = version;
|
||||
hash = "sha256-Oqw04eboDM8rrUgAXiT7w5F2uGrQdt8sGX+Mk6mVXZQ=";
|
||||
};
|
||||
|
||||
cargoDeps = rustPlatform.fetchCargoVendor {
|
||||
name = "lix-${version}";
|
||||
inherit src;
|
||||
hash = "sha256-YMyNOXdlx0I30SkcmdW/6DU0BYc3ZOa2FMJSKMkr7I8=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# Support for lowdown >= 1.4, https://gerrit.lix.systems/c/lix/+/3731
|
||||
(fetchpatch2 {
|
||||
name = "lix-lowdown-1.4.0.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/858de5f47a1bfd33835ec97794ece339a88490f1.patch";
|
||||
hash = "sha256-FfLO2dFSWV1qwcupIg8dYEhCHir2XX6/Hs89eLwd+SY=";
|
||||
})
|
||||
|
||||
# Support for toml11 >= 4.0, https://gerrit.lix.systems/c/lix/+/3953
|
||||
(fetchpatch {
|
||||
name = "lix-2.93-toml11-4-1.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/96a39dc464165a3e503a6dc7bd44518a116fe846.patch";
|
||||
hash = "sha256-j1DOScY2IFvcouhoap9CQwIZf99MZ92HtY7CjInF/s4=";
|
||||
})
|
||||
(fetchpatch {
|
||||
name = "lix-2.93-toml11-4-2.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/699d3a63a6351edfdbc8c05f814cc93d6c3637ca.patch";
|
||||
hash = "sha256-2iUynAdimxhe5ZSDB7DlzFG3tu1yWhq+lTvjf6+M0pM=";
|
||||
})
|
||||
(fetchpatch {
|
||||
name = "lix-2.93-toml11-4-3.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/ad52cbde2faa677b711ec950dae74e4aede965a4.patch";
|
||||
hash = "sha256-ajQwafL3yZDJMVrR+D9eTGh7L0xbDbqhAUagRur4HDE=";
|
||||
})
|
||||
(fetchpatch {
|
||||
name = "lix-2.93-toml11-4-4.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/e29a1ccf0af2e2890ec7b7fde82f0e53a1d0aad9.patch";
|
||||
hash = "sha256-sXqZxCUtZsO7uEVk2AZx3IkP8b8EPVghYboetcQTp2A=";
|
||||
})
|
||||
(fetchpatch {
|
||||
name = "lix-2.93-toml11-4-5.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/176b834464b7285b74a72d35df7470a46362ce60.patch";
|
||||
hash = "sha256-/KIszfHf2XoB+GeVvXad2AV8pazffYdQRDtIXb9tbj8=";
|
||||
})
|
||||
(fetchpatch {
|
||||
name = "lix-2.93-toml11-4-6.patch";
|
||||
url = "https://git.lix.systems/lix-project/lix/commit/b6d5670bcffebdd43352ea79b36135e35a8148d9.patch";
|
||||
hash = "sha256-f4s0TR5MhNMNM5TYLOR7K2/1rtZ389KDjTCKFVK0OcE=";
|
||||
})
|
||||
|
||||
lixMdbookPatch
|
||||
|
||||
lixLowdown30Patch
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
lix_2_94 = self.makeLixScope {
|
||||
attrName = "lix_2_94";
|
||||
|
||||
@@ -344,5 +277,6 @@ lib.makeExtensible (
|
||||
lix_2_90 = throw (removedMessage "2.90"); # added in 2025-09-11
|
||||
lix_2_91 = throw (removedMessage "2.91"); # added in 2025-09-11
|
||||
lix_2_92 = throw (removedMessage "2.92"); # added in 2025-09-11
|
||||
lix_2_93 = throw (removedMessage "2.93"); # added in 2026-04-19
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user