Merge 3bf343717d into haskell-updates

This commit is contained in:
nixpkgs-ci[bot]
2026-10-12 00:38:02 +00:00
committed by GitHub
538 changed files with 4778 additions and 2441 deletions

View File

@@ -1,12 +1,12 @@
Thanks for contributing to the documentation
Thanks for contributing to the documentation.
Make sure you follow the [documentation style guide](https://github.com/NixOS/nixpkgs/blob/master/doc/styleguide.md), most notably:
Follow the [documentation style guide](https://github.com/NixOS/nixpkgs/blob/master/doc/styleguide.md), especially:
- Show, don't tell: lead with a minimal working example; explanation follows the code.
- No meta-commentary: don't write "This section explains how to…", just do it.
- Imperative mood and active voice: "Run the command", not "The user should run the following command".
- Present tense: "This creates a folder", not "This will create a folder".
- Be confident: no hedging with "should", "might", "typically", "usually".
- Cut filler words: "simply", "just", "easily", "basically"; "to", not "in order to".
- Show, don’t tell. Start with a minimal working example. Explain after the code.
- Avoid meta-commentary. Don’t write "This section explains how to…".
- Use present tense, imperative mood, and active voice. For example: "Run the command," not "The user should run the following command."
- Avoid vague references like "this" when the referent is unclear. Write "This command creates a folder," not "This will create a folder."
- Be direct. Avoid "should", "might", "typically", and "usually".
- Cut filler words like "simply", "just", "easily", and "basically". Use "to" instead of "in order to".
For larger changes, like adding or removing whole sections, ask the NixOS documentation team for a review.
For larger changes, such as adding or removing whole sections, ask the NixOS documentation team for review.

View File

@@ -225,15 +225,13 @@ writeShellScript "evaluate-my-file.sh" ''
### `makeDesktopItem` {#trivial-builder-makeDesktopItem}
Write an [XDG desktop file](https://specifications.freedesktop.org/desktop-entry-spec/1.4/) to the Nix store.
Write an [XDG desktop file](https://specifications.freedesktop.org/desktop-entry-spec/latest) to the Nix store.
This function is usually used to add desktop items to a package through the `copyDesktopItems` hook.
`makeDesktopItem` adheres to version 1.4 of the specification.
#### Inputs {#trivial-builder-makeDesktopItem-inputs}
`makeDesktopItem` takes an attribute set that accepts most values from the [XDG specification](https://specifications.freedesktop.org/desktop-entry-spec/1.4/ar01s06.html).
`makeDesktopItem` takes an attribute set that accepts most values from the [XDG specification](https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s06.html).
All recognised keys from the specification are supported with the exception of the "Hidden" field. The keys are converted into camelCase format, but correspond 1:1 to their equivalent in the specification: `genericName`, `noDisplay`, `comment`, `icon`, `onlyShowIn`, `notShowIn`, `dbusActivatable`, `tryExec`, `exec`, `path`, `terminal`, `mimeTypes`, `categories`, `implements`, `keywords`, `startupNotify`, `startupWMClass`, `url`, `prefersNonDefaultGPU`.

View File

@@ -1,3 +1,4 @@
# Perl {#setup-hook-perl}
Adds the `lib/site_perl` subdirectory of each build input to the `PERL5LIB` environment variable. For instance, if `buildInputs` contains Perl, then the `lib/site_perl` subdirectory of each input is added to the `PERL5LIB` environment variable.
Adds the `lib/perl5/site_perl` subdirectory of each build input to the `PERL5LIB` environment variable.
The hook applies when `perl` is in `buildInputs`.

View File

@@ -1,5 +1,14 @@
# `xfce4-dev-tools` {#xfce4-dev-tools}
This setup hook attempts to run `xdt-autogen` in `xdtAutogenPhase`, which is part of `preConfigurePhases`.
This setup hook adds an `xdtAutogenPhase` that runs `xdt-autogen` before configure.
[]{#dontUseXdtAutogenPhase} This behavior can be disabled by setting `dontUseXdtAutogenPhase` to `true`.
Use this hook for Xfce packages that need `xdt-autogen` before configure.
Add `xfce4-dev-tools` to `nativeBuildInputs` to enable the phase.
```nix
{
nativeBuildInputs = [ xfce4-dev-tools ];
}
```
[]{#dontUseXdtAutogenPhase} Disable this behavior by setting `dontUseXdtAutogenPhase` to `true`.

View File

@@ -86,8 +86,7 @@ weechat.override {
{ availablePlugins, ... }:
{
scripts = with pkgs.weechatScripts; [
weechat-xmpp
weechat-matrix-bridge
weechat-matrix
wee-slack
];
init = ''

View File

@@ -247,6 +247,11 @@
[pnpm `fetcherVersion` section](#javascript-pnpm-fetcherVersion) of the manual
for details.
- `services.opencloud.package` now requires explicit package selection. Possibilities are `opencloud` (the previous default) and `opencloud-production` to reflect [upstream release cycle](https://docs.opencloud.eu/docs/admin/resources/lifecycle/).
- Users updating from `nixos-26.05` will prefer the new `opencloud-production` package.
- Users updating from `nixos-unstable` will prefer to keep using the existing `opencloud` package.
- Please note upstream does not support downgrading existing installations. Switching from `opencloud` to `opencloud-production` is considered a downgrade.
- `makeSetupHook` now uses structured attributes and only makes substitutions based on the values of the `substitutions` argument - other derivation attributes are no longer considered.
- `rebuilderd` has been updated to 0.27.0 introducing breaking changes. See upstream changelog for details: [0.26.0](https://github.com/kpcyrd/rebuilderd/releases/tag/v0.26.0), [0.27.0](https://github.com/kpcyrd/rebuilderd/releases/tag/v0.27.0)

View File

@@ -401,6 +401,11 @@
github = "a-camarillo";
githubId = 58638902;
};
a-hassanin = {
github = "a-hassanin";
name = "Ahmed Hassanin";
githubId = 112945643;
};
a-jay98 = {
email = "ali@jamadi.me";
github = "A-jay98";
@@ -9425,6 +9430,11 @@
githubId = 84565547;
name = "fernvenue";
};
ferris-qq = {
name = "heki";
github = "ferris-qq";
githubId = 186204649;
};
feyorsh = {
email = "george@feyor.sh";
github = "Feyorsh";
@@ -10917,10 +10927,10 @@
};
grimmauld = {
name = "Sören Bender";
email = "soeren@benjos.de";
github = "LordGrimmauld";
email = "grimmauld@grimmauld.de";
github = "GrimmTheShrimp";
githubId = 49513131;
matrix = "@grimmauld:grimmauld.de";
matrix = "@grimmauld:m.grimmauld.de";
};
grindhold = {
name = "grindhold";
@@ -22091,6 +22101,11 @@
githubId = 1538622;
name = "Michael Reilly";
};
onaips = {
github = "oNaiPs";
githubId = 374130;
name = "José Luis Pereira";
};
onatustun = {
email = "contact@onatustun.com";
name = "Onat Ustun";
@@ -22385,6 +22400,13 @@
githubId = 5948762;
name = "Berk Özkütük";
};
ozozka = {
email = "ozkaya.ogzhn@gmail.com";
matrix = "@oguzhanozkaya:matrix.org";
github = "ozozka";
githubId = 53692091;
name = "Oğuzhan Özkaya";
};
ozturkkl = {
email = "97kemalozturk@gmail.com";
github = "ozturkkl";

View File

@@ -760,6 +760,7 @@ with lib.maintainers;
];
scope = "Maintain Swift compiler suite for NixOS.";
shortName = "Swift";
enableFeatureFreezePing = true;
};
systemd = {

View File

@@ -270,6 +270,8 @@
`services.bazarr.listenPort` is now `services.bazarr.settings.general.port`; existing configurations continue working via `mkRenamedOptionModule`.
[`services.bazarr.settings.analytics.enabled`](#opt-services.bazarr.settings.analytics.enabled) defaults to `false` on NixOS to opt users out of upstream's enabled-by-default telemetry.
- The [bazarr](#opt-services.bazarr.enable) systemd service has been security hardened. If you are storing/accessing data in `/home`, you will need to adjust the `ProtectHome` option.
- `security.polkit.enablePkexecWrapper` has been introduced, making the `pkexec` setuid wrapper opt-in.
- `services.pghero` has been removed because the `pghero` package was unmaintained and thus dropped from Nixpkgs.

View File

@@ -9,7 +9,7 @@ import tempfile
import threading
import traceback
import warnings
from collections.abc import Callable, Generator, Iterator
from collections.abc import Callable, Generator
from contextlib import AbstractContextManager, contextmanager
from dataclasses import dataclass
from pathlib import Path
@@ -314,7 +314,7 @@ class Driver:
def test_symbols(self) -> dict[str, Any]:
@contextmanager
def subtest(name: str) -> Iterator[None]:
def subtest(name: str) -> Generator[None]:
return self.subtest(name)
general_symbols = dict(

View File

@@ -4,7 +4,7 @@ import sys
import time
import unicodedata
from abc import ABC, abstractmethod
from collections.abc import Iterator
from collections.abc import Generator
from contextlib import ExitStack, contextmanager
from enum import IntEnum
from pathlib import Path
@@ -31,12 +31,12 @@ class AbstractLogger(ABC):
@abstractmethod
@contextmanager
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Generator[None]:
pass
@abstractmethod
@contextmanager
def nested(self, message: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def nested(self, message: str, attributes: dict[str, str] = {}) -> Generator[None]:
pass
@abstractmethod
@@ -94,7 +94,7 @@ class JunitXMLLogger(AbstractLogger):
self.tests[self.currentSubtest].stdout += message + os.linesep
@contextmanager
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Generator[None]:
old_test = self.currentSubtest
self.tests.setdefault(name, self.TestCaseState())
self.currentSubtest = name
@@ -104,7 +104,7 @@ class JunitXMLLogger(AbstractLogger):
self.currentSubtest = old_test
@contextmanager
def nested(self, message: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def nested(self, message: str, attributes: dict[str, str] = {}) -> Generator[None]:
self.log(message)
yield
@@ -185,14 +185,14 @@ class CompositeLogger(AbstractLogger):
logger.log(message, attributes)
@contextmanager
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Generator[None]:
with ExitStack() as stack:
for logger in self.logger_list:
stack.enter_context(logger.subtest(name, attributes))
yield
@contextmanager
def nested(self, message: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def nested(self, message: str, attributes: dict[str, str] = {}) -> Generator[None]:
with ExitStack() as stack:
for logger in self.logger_list:
stack.enter_context(logger.nested(message, attributes))
@@ -250,12 +250,12 @@ class TerminalLogger(AbstractLogger):
self._eprint(self.maybe_prefix(message, attributes))
@contextmanager
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Generator[None]:
with self.nested("subtest: " + name, attributes):
yield
@contextmanager
def nested(self, message: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def nested(self, message: str, attributes: dict[str, str] = {}) -> Generator[None]:
self._eprint(
self.maybe_prefix(
Style.BRIGHT + Fore.GREEN + message + Style.RESET_ALL, # ty: ignore[unsupported-operator]
@@ -381,12 +381,12 @@ class XMLLogger(AbstractLogger):
pass
@contextmanager
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def subtest(self, name: str, attributes: dict[str, str] = {}) -> Generator[None]:
with self.nested("subtest: " + name, attributes):
yield
@contextmanager
def nested(self, message: str, attributes: dict[str, str] = {}) -> Iterator[None]:
def nested(self, message: str, attributes: dict[str, str] = {}) -> Generator[None]:
self.xml.startElement("nest", attrs=AttributesImpl({}))
self.xml.startElement("head", attrs=AttributesImpl(attributes))
self.xml.characters(message)

View File

@@ -14,9 +14,10 @@ logger = logging.getLogger(__name__)
class QMPAPIError(RuntimeError):
def __init__(self, message: dict[str, Any]):
assert "error" in message, "Not an error message!"
error = message["error"]
try:
self.class_name = message["class"]
self.description = message["desc"]
self.class_name = error["class"]
self.description = error["desc"]
# NOTE: Some errors can occur before the Server is able to read the
# id member; in these cases the id member will not be part of the
# error response, even if provided by the client.

View File

@@ -347,7 +347,6 @@ in
trusted-users = mkOption {
type = types.listOf types.str;
example = [
"root"
"alice"
"@wheel"
];
@@ -357,8 +356,9 @@ in
additional binary caches, or to import unsigned NARs. You
can also specify groups by prefixing them with
`@`; for instance,
`@wheel` means all users in the wheel
group.
`@wheel` means all users in the wheel group.
`root` is included as a regular definition, so you do not have to repeat it.
Furthermore, `root` normally bypasses the daemon.
'';
};

View File

@@ -777,7 +777,7 @@ in
})
];
services.acpid.enable = true;
services.acpid.enable = lib.mkDefault true;
services.dbus.packages = lib.optional cfg.dynamicBoost.enable nvidia_x11.bin;

View File

@@ -361,16 +361,18 @@ in
###### wrappers consistency checks
system.checks = lib.singleton (
pkgs.runCommandLocal "ensure-all-wrappers-paths-exist"
pkgs.runCommandLocal "ensure-wrapper-integrity"
{
nativeBuildInputs = [ pkgs.libcap-text-verifier ];
nativeBuildInputs = [
pkgs.libcap-text-verifier
];
preferLocalBuild = true;
}
''
# make sure we produce output
mkdir -p $out
echo -n "Checking that Nix store paths of all wrapped programs exist... "
echo -n "Checking that Nix store paths of all wrapped programs exist and are ELF executables... "
${lib.toShellVar "wrappers" (lib.mapAttrs (n: v: v.source) wrappers)}
for name in "''${!wrappers[@]}"; do
path="''${wrappers[$name]}"
@@ -382,6 +384,15 @@ in
test -t 1 && echo -ne '\033[0m'
exit 1
fi
read -r -n 4 magic < "$path"
if ! [[ "$magic" = $'\x7fELF' ]]; then
test -t 1 && echo -ne '\033[1;31m'
echo "FAIL"
echo "The target executable $path is not an ELF! This is a security risk."
echo "Script wrappers (e.g. bash or python) are commonly susceptible to dangerous env var injections."
test -t 1 && echo -ne '\033[0m'
exit 1
fi
done
echo "OK"

View File

@@ -599,6 +599,11 @@ in
Whether builders upload to S3 themselves instead of the queue
runner. Requires an S3 remote store as well as substitution on
the builders, see {option}`forcedSubstituters`.
Presigned URLs stop working when the credentials that signed
them expire. With temporary credentials, such as instance
profiles or STS, uploads can fail before
`presigned-url-expiry` is reached.
'';
};
@@ -1264,10 +1269,9 @@ in
pkgs.jq
hydra-package # hydra-eval-jobset
];
restartTriggers = [
hydraConf
config.environment.etc."hydra/evaluator.toml".source
];
# Not `hydra.conf`: only the Perl the evaluator runs reads it, and that
# starts afresh for each evaluation.
restartTriggers = [ config.environment.etc."hydra/evaluator.toml".source ];
environment = env // {
HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-evaluator";
};

View File

@@ -324,12 +324,12 @@ in
})
(mkIf serviceCfg.apps.enable {
programs.evince.enable = mkDefault (notExcluded pkgs.evince);
environment.systemPackages = utils.removePackagesByName (
[
pkgs.epiphany
pkgs.gnome-font-viewer
pkgs.file-roller
pkgs.papers
]
++ (
with pkgs.pantheon;
@@ -348,7 +348,6 @@ in
elementary-tasks
elementary-terminal
elementary-videos
epiphany
]
++ lib.optionals config.services.flatpak.enable [
# Only install appcenter if flatpak is enabled before

View File

@@ -193,6 +193,41 @@ in
KillSignal = "SIGINT";
SuccessExitStatus = "0 156";
LoadCredential = credentials;
# Hardening
CapabilityBoundingSet = "";
LockPersonality = true;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateIPC = true;
PrivateTmp = "disconnected";
PrivateUsers = true;
ProcSubset = "pid";
ProtectClock = true;
ProtectControlGroups = "strict";
ProtectHome = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectProc = "invisible";
ProtectSystem = "full";
RemoveIPC = true;
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_UNIX"
];
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
SystemCallErrorNumber = "EPERM";
SystemCallFilter = [
"@system-service"
"~@privileged"
"~@resources"
];
};
unitConfig.RequiresMountsFor = [ cfg.dataDir ];
};

View File

@@ -801,9 +801,11 @@ in
// lib.listToAttrs (map (e: lib.nameValuePair e.env "%d/${e.env}") secrets);
};
services.openssh.settings.AcceptEnv = mkIf (!cfg.settings.server.START_SSH_SERVER or false) [
"GIT_PROTOCOL"
];
services.openssh.extraConfig = mkIf (!cfg.settings.server.START_SSH_SERVER or false) ''
Match User ${cfg.user}
AcceptEnv GIT_PROTOCOL
Match All
'';
users.users = mkIf (cfg.user == "forgejo") {
forgejo = {

View File

@@ -64,7 +64,7 @@ in
# Hooks must be executable, but DynamicUser mounts /var/lib/private as noexec
ExecPaths = "${stateDir}/repos";
StateDirectory = "soft-serve";
StateDirectory = "soft-serve soft-serve/repos";
WorkingDirectory = stateDir;
ProcSubset = "pid";
ProtectProc = "invisible";

View File

@@ -76,7 +76,7 @@ in
{
options = {
services.netdata = {
enable = lib.mkEnableOption "netdata";
enable = lib.mkEnableOption "Netdata";
package = lib.mkPackageOption pkgs "netdata" { };
@@ -180,7 +180,7 @@ in
config = lib.mkOption {
type = lib.types.attrsOf lib.types.attrs;
default = { };
description = "netdata.conf configuration as nix attributes. cannot be combined with configText.";
description = "Configuration for `netdata.conf` as Nix attributes, cannot be combined with `configText`.";
example = lib.literalExpression ''
global = {
"debug log" = "syslog";
@@ -194,13 +194,15 @@ in
type = lib.types.attrsOf lib.types.path;
default = { };
description = ''
Complete netdata config directory except netdata.conf.
Complete netdata config directory except `netdata.conf`.
The default configuration is merged with changes
defined in this option.
Each top-level attribute denotes a path in the configuration
directory as in environment.etc.
directory as in `environment.etc`.
Its value is the absolute path and must be readable by netdata.
Cannot be combined with configText.
Cannot be combined with `configText`.
'';
example = lib.literalExpression ''
"health_alarm_notify.conf" = pkgs.writeText "health_alarm_notify.conf" '''

View File

@@ -93,7 +93,7 @@ let
upsdUsers = pkgs.writeText "upsd.users" (
let
# This looks like INI, but it's not quite because the
# 'upsmon' option lacks a '='. See: man upsd.users
# 'upsmon' option lacks a '='. See: man upsd.users(5)
userConfig =
name: user:
lib.concatStringsSep "\n " (
@@ -128,7 +128,7 @@ let
port = lib.mkOption {
type = lib.types.str;
description = ''
The serial port to which your UPS is connected. /dev/ttyS0 is
The serial port to which your UPS is connected. {file}`/dev/ttyS0` is
usually the first port on Linux boxes, for example.
'';
};
@@ -176,7 +176,7 @@ let
default = "";
type = lib.types.lines;
description = ''
Lines which would be added inside ups.conf for handling this UPS.
Lines which would be added inside {file}`ups.conf` for handling this UPS.
'';
};
@@ -203,7 +203,7 @@ let
type = lib.types.str;
description = ''
Address of the interface for `upsd` to listen on.
See `man upsd.conf` for details.
See {manpage}`upsd.conf(5)` for details.
'';
};
@@ -212,7 +212,7 @@ let
default = defaultPort;
description = ''
TCP port for `upsd` to listen on.
See `man upsd.conf` for details.
See {manpage}`upsd.conf(5)` for details.
'';
};
};
@@ -240,7 +240,7 @@ let
];
description = ''
Address of the interface for `upsd` to listen on.
See `man upsd` for details`.
See {manpage}`upsd(8)` for details`.
'';
};
@@ -248,7 +248,7 @@ let
type = lib.types.lines;
default = "";
description = ''
Additional lines to add to `upsd.conf`.
Additional lines to add to {file}`upsd.conf`.
'';
};
};
@@ -272,7 +272,7 @@ let
default = name;
description = ''
Identifier of the UPS to monitor, in this form: `<upsname>[@<hostname>[:<port>]]`
See `upsmon.conf` for details.
See {manpage}`upsmon.conf(5)` for details.
'';
};
@@ -281,7 +281,7 @@ let
default = 1;
description = ''
Number of power supplies that the UPS feeds on this system.
See `upsmon.conf` for details.
See {file}`upsmon.conf` for details.
'';
};
@@ -289,7 +289,7 @@ let
type = lib.types.str;
description = ''
Username from `upsd.users` for accessing this UPS.
See `upsmon.conf` for details.
See {manpage}`upsmon.conf(5)` for details.
'';
};
@@ -300,7 +300,7 @@ let
The full path to a file containing the password from
`upsd.users` for accessing this UPS. The password file
is read on service start.
See `upsmon.conf` for details.
See {manpage}`upsmon.conf(5)` for details.
'';
};
@@ -309,7 +309,7 @@ let
default = "master";
description = ''
The relationship with `upsd`.
See `upsmon.conf` for details.
See {manpage}`upsmon.conf(5)` for details.
'';
};
};
@@ -331,7 +331,7 @@ let
type = lib.types.str;
default = "nutmon";
description = ''
User to run `upsmon` as. `upsmon.conf` will have its owner set to this
User to run `upsmon` as. {file}`upsmon.conf` will have its owner set to this
user. If not specified, a default user will be created.
'';
};
@@ -348,7 +348,7 @@ let
type = with lib.types; attrsOf (submodule monitorOptions);
default = { };
description = ''
Set of UPS to monitor. See `man upsmon.conf` for details.
Set of UPS to monitor. See {manpage}`upsmon.conf(5)` for details.
'';
};
@@ -364,7 +364,7 @@ let
SHUTDOWNCMD = "''${config.systemd.package}/bin/shutdown now";
}
'';
description = "Additional settings to add to `upsmon.conf`.";
description = "Additional settings to add to {file}`upsmon.conf`.";
example = lib.literalMD ''
{
MINSUPPLIES = 2;
@@ -418,7 +418,7 @@ let
default = [ ];
description = ''
Allow the user to do certain things with upsd.
See `man upsd.users` for details.
See {manpage}`upsd.users(5)` for details.
'';
};
@@ -427,7 +427,7 @@ let
default = [ ];
description = ''
Let the user initiate specific instant commands. Use "ALL" to grant all commands automatically. For the full list of what your UPS supports, use "upscmd -l".
See `man upsd.users` for details.
See {manpage}`upsd.users(5)` for details.
'';
};
@@ -441,7 +441,7 @@ let
default = null;
description = ''
Add the necessary actions for a upsmon process to work.
See `man upsd.users` for details.
See {manpage}`upsd.users(5)` for details.
'';
};
};
@@ -524,7 +524,7 @@ in
upsmon = lib.mkOption {
default = { };
description = ''
Options for the `upsmon.conf` configuration file.
Options for the {file}`upsmon.conf` configuration file.
'';
type = lib.types.submodule upsmonOptions;
};
@@ -532,7 +532,7 @@ in
upsd = lib.mkOption {
default = { };
description = ''
Options for the `upsd.conf` configuration file.
Options for the {file}`upsd.conf` configuration file.
'';
type = lib.types.submodule upsdOptions;
};
@@ -551,7 +551,7 @@ in
users = lib.mkOption {
default = { };
description = ''
Users that can access upsd. See `man upsd.users`.
Users that can access upsd. See {manpage}`upsd.users(5)`.
'';
type = with lib.types; attrsOf (submodule userOptions);
};

View File

@@ -199,13 +199,15 @@ in
type = path;
default = "/etc/hosts.hfaxd";
description = ''
The {file}`hosts.hfaxd`
file entry in the spooling area
The {file}`hosts.hfaxd` file entry in the spooling area
will be symlinked to the location given here.
This file must exist and be
readable only by the `uucp` user.
This file must exist and be readable only by the `uucp` user.
See {manpage}`hosts.hfaxd(5)` for details.
This configuration permits access for all users:
The example shown below permits access for all users.
Note that host-based access can be controlled with
{option}`config.systemd.sockets.hylafax-hfaxd.listenStreams`;
by default, only `127.0.0.1` is permitted to connect.
```
environment.etc."hosts.hfaxd" = {
mode = "0600";
@@ -213,9 +215,6 @@ in
text = ".*";
};
```
Note that host-based access can be controlled with
{option}`config.systemd.sockets.hylafax-hfaxd.listenStreams`;
by default, only 127.0.0.1 is permitted to connect.
'';
};
@@ -306,7 +305,7 @@ in
default = null;
example = "daily";
description = ''
purging old files from the spooling area with
Purges old files from the spooling area with
{file}`faxcron` with the given frequency
(see {manpage}`systemd.time(7)`)
'';
@@ -346,7 +345,7 @@ in
default = null;
example = "daily";
description = ''
Purge old files from the spooling area with
Purges old files from the spooling area with
{file}`faxcron` with the given frequency
(see {manpage}`systemd.time(7)`).
'';

View File

@@ -19,9 +19,29 @@ in
services.opencloud = {
enable = lib.mkEnableOption "OpenCloud";
package = lib.mkPackageOption pkgs "opencloud" { };
webPackage = lib.mkPackageOption pkgs [ "opencloud" "web" ] { };
idpWebPackage = lib.mkPackageOption pkgs [ "opencloud" "idp-web" ] { };
package = lib.mkPackageOption pkgs "opencloud" {
default = null;
extraDescription = ''
OpenCloud has 2 release cycles, explained on https://docs.opencloud.eu/docs/admin/resources/lifecycle.
Use `pkgs.opencloud` package for the rolling release (every 3 weeks).
Use `pkgs.opencloud-production` package for the production release (about every 6 months).
OpenCloud does not support downgrading existing installations. Switching from `pkgs.opencloud` to `pkgs.opencloud-production` is considered a downgrade.
'';
};
webPackage = lib.mkOption {
type = lib.types.package;
default = config.services.opencloud.package.web;
defaultText = "config.services.opencloud.package.web";
description = "The web package to use.";
};
idpWebPackage = lib.mkOption {
type = lib.types.package;
default = config.services.opencloud.package.idp-web;
defaultText = "config.services.opencloud.package.idp-web";
description = "The idp-web package to use.";
};
user = lib.mkOption {
type = types.str;

View File

@@ -193,6 +193,7 @@ in
extra-python-packages = runTest ./nixos-test-driver/extra-python-packages.nix;
lib-extend = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./nixos-test-driver/lib-extend.nix { };
node-name = runTest ./nixos-test-driver/node-name.nix;
qmp-api-error = runTest ./nixos-test-driver/qmp-api-error.nix;
busybox = runTest ./nixos-test-driver/busybox.nix;
ssh-backdoor = runTestOn [ "x86_64-linux" ] ./nixos-test-driver/ssh-backdoor.nix;
console-log = runTest ./nixos-test-driver/console-log.nix;
@@ -595,6 +596,7 @@ in
ejabberd = runTest ./xmpp/ejabberd.nix;
elk = handleTestOn [ "x86_64-linux" ] ./elk.nix { };
elk-zone = runTest ./web-apps/elk.nix;
emacs = runTest ./emacs;
emacs-daemon = runTest ./emacs-daemon.nix;
endlessh = runTest ./endlessh.nix;
endlessh-go = runTest ./endlessh-go.nix;
@@ -785,6 +787,7 @@ in
gotify-server = runTest ./gotify-server.nix;
gotosocial = runTest ./web-apps/gotosocial.nix;
goupile = runTest ./web-apps/goupile;
gpauth-tls = runTest ./gpauth-tls.nix;
grafana = import ./grafana {
inherit runTest;
};
@@ -1395,7 +1398,16 @@ in
openarena = runTest ./openarena.nix;
openbao = runTest ./openbao.nix;
openbao-agent = runTest ./openbao-agent.nix;
opencloud = runTest ./opencloud.nix;
opencloud = runTest {
imports = [ ./opencloud.nix ];
_module.args.opencloudPackage = pkgs.opencloud;
_module.args.name = "opencloud";
};
opencloud-production = runTest {
imports = [ ./opencloud.nix ];
_module.args.opencloudPackage = pkgs.opencloud-production;
_module.args.name = "opencloud-production";
};
openldap = runTest ./openldap.nix;
openresty-lua = runTest ./openresty-lua.nix;
opensearch = discoverTests (import ./opensearch.nix);
@@ -1865,6 +1877,7 @@ in
systemd-no-tainted = runTest ./systemd-no-tainted.nix;
systemd-nspawn = runTest ./systemd-nspawn.nix;
systemd-nspawn-configfile = runTest ./systemd-nspawn-configfile.nix;
systemd-nsresourced-mountfsd = runTest ./systemd-nsresourced-mountfsd.nix;
systemd-oomd = runTest ./systemd-oomd.nix;
systemd-portabled = runTest ./systemd-portabled.nix;
systemd-pstore = runTest ./systemd-pstore.nix;

View File

@@ -26,7 +26,8 @@
machine.succeed("atuin --version")
# Check shell integration - verify the init scripts can be sourced without error
machine.succeed("bash -c 'eval \"$(atuin init bash)\"'")
# bash init only runs in interactive shells; skip bashrc, which already sources it
machine.succeed("bash --norc -ic 'eval \"$(atuin init bash)\"'")
machine.succeed("zsh -c 'eval \"$(atuin init zsh)\"'")
machine.succeed("fish -c 'atuin init fish | source'")
@@ -34,6 +35,8 @@
machine.succeed("grep -q 'auto_sync = false' /etc/atuin/config.toml")
# Verify daemon socket unit is enabled
machine.succeed("systemctl --user --machine=root@ is-enabled atuin-daemon.socket")
# needs a running user manager for root
machine.succeed("loginctl enable-linger root")
machine.wait_until_succeeds("systemctl --user --machine=root@ is-enabled atuin-daemon.socket")
'';
}

View File

@@ -0,0 +1,132 @@
{
lib,
nodes,
...
}:
{
name = "emacs";
meta.maintainers = lib.teams.emacs.members;
defaults =
{
lib,
pkgs,
config,
...
}:
{
options.tests.emacs = {
package = lib.mkPackageOption pkgs "Emacs" {
default = [ "emacs" ];
example = [ "emacs-nox" ];
};
wrappedPackage = lib.mkOption {
type = lib.types.package;
default = config.tests.emacs.package.pkgs.withPackages (epkgs: [
epkgs.project-nix-store
]);
defaultText = lib.literalExpression ''
package.pkgs.withPackages (epkgs: [ epkgs.project-nix-store ])
'';
readOnly = true;
description = "Emacs wrapped by withPackages.";
};
};
};
nodes.local =
{
pkgs,
config,
lib,
...
}:
let
cfg = config.tests.emacs;
mkEpkg = import ../../../pkgs/applications/editors/emacs/build-support/tests/mk-epkg.nix {
inherit lib;
};
in
{
environment.systemPackages = [
# Make sure closure of this machine contains both unwrapped and wrapped Emacs
# so that we can run them in the test script.
cfg.wrappedPackage
# Tests
(cfg.package.pkgs.callPackage (mkEpkg {
pname = "nixos";
src = ./nixos.el;
}) { })
]
++ [
cfg.package.pkgs.orderless
pkgs.cmatrix
];
users.users.root.packages = [
cfg.package.pkgs.dash
pkgs.hello
];
environment.etc.ssh-private-key = {
source = (import ../ssh-keys.nix pkgs).snakeOilEd25519PrivateKey;
mode = "0600";
};
programs.ssh.extraConfig = ''
StrictHostKeyChecking=no
IdentityFile=/etc/${config.environment.etc.ssh-private-key.target}
'';
systemd.targets.network-online.wantedBy = [ "multi-user.target" ];
systemd.services.wait-ssh-to-remote = {
description = "Wait for SSH to Remote";
documentation = [
"https://systemd.io/NETWORK_ONLINE/#modifying-the-meaning-of-network-onlinetarget"
"man:systemd.special(7)"
];
after = [ "nss-lookup.target" ];
before = [ "network-online.target" ];
wantedBy = [ "network-online.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
path = [ config.programs.ssh.package ];
script = ''
until ssh -o ConnectTimeout=1 ${nodes.remote.networking.hostName} true
do
sleep 1
done
'';
};
environment.sessionVariables = {
EMACS_TEST_VERBOSE = 1; # Make ERT output verbose
};
};
nodes.remote = { pkgs, ... }: {
environment.systemPackages = [
pkgs.sl
];
security.sudo.enable = true;
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keys = [
(import ../ssh-keys.nix pkgs).snakeOilEd25519PublicKey
];
};
testScript = ''
start_all()
for machine in (local, remote):
machine.wait_for_unit("default.target")
for emacs in (
"${lib.getExe nodes.local.tests.emacs.package}",
"${lib.getExe nodes.local.tests.emacs.wrappedPackage}",
):
local.succeed(f'{emacs} --batch --load=nixos --funcall=ert-run-tests-batch-and-exit')
'';
}

View File

@@ -0,0 +1,90 @@
;;; nixos.el --- Emacs tests related to Nix or NixOS -*- lexical-binding: t; -*-
;; Version: 0.1.0
;; Package-Requires: ((emacs "29.1"))
;; URL: https://example.com
;;; Commentary:
;; Emacs tests related to Nix or NixOS.
;;; Code:
(require 'ert)
(eval-when-compile (require 'cl-lib))
(require 'woman)
(require 'info)
;;;; Utils
(defun nixos--locate-eln-file (library)
"Locate the natively-compiled LIBRARY file."
(declare-function comp-el-to-eln-rel-filename "comp.c")
(locate-eln-file (comp-el-to-eln-rel-filename (find-library-name library))))
(defun nixos--ancestor-dir-of-file-p (dir file)
"Return t if DIR is an ancestor of FILE."
(locate-dominating-file file
(lambda (current-dir)
(string= current-dir (file-name-as-directory dir)))))
(defun nixos--in-nix-profiles-p (file)
"Return t if FILE is in nix profiles."
(declare-function nix--profile-paths "site-start")
(cl-loop for profile-dir in (nix--profile-paths)
thereis (nixos--ancestor-dir-of-file-p profile-dir file)))
;;;; Tests
(ert-deftest nixos-packages-in-nix-profiles-are-available ()
(ert-info ("nix system profile")
(should (package-installed-p 'orderless)))
(ert-info ("nix user profile")
(should (package-installed-p 'dash))))
(ert-deftest nixos-aot-native-comp-eln-files-of-packages-in-nix-profiles-are-available ()
(skip-unless (native-comp-available-p))
(ert-info ("nix system profile")
(should (nixos--in-nix-profiles-p (nixos--locate-eln-file "orderless"))))
(ert-info ("nix user profile")
(should (nixos--in-nix-profiles-p (nixos--locate-eln-file "dash")))))
(ert-deftest nixos-woman-can-find-manuals-in-nix-profiles ()
(ert-info ("nix system profile")
(should (woman-file-name "cmatrix")))
(ert-info ("nix user profile")
(should (woman-file-name "hello"))))
(ert-deftest nixos-info-manuals-of-packages-in-nix-profiles-are-available ()
"Test https://debbugs.gnu.org/cgi/bugreport.cgi?bug=81105."
(unless package--activated
(package-activate-all))
(ert-info ("nix system profile")
(should (Info-find-file "orderless" t)))
(ert-info ("nix user profile")
(should (Info-find-file "dash" t))))
(ert-deftest nixos-tramp-knows-nix-specific-path ()
;; Security wrappers are added to two PATH dirs:
;; /run/wrappers/bin/ and /run/current-system/sw/bin.
;; So, in addition to testing if the security wrapper can be found,
;; we also test if the found security wrapper is the right one.
(cl-loop
for (program program-dir) in '(("sl")
("sudo" "/run/wrappers/bin"))
do
(ert-info ((format "program %s is found remotely" program))
(let ((found-program (let ((default-directory "/ssh:remote:"))
(executable-find program t))))
(should found-program)
(when program-dir
(should (equal found-program
(expand-file-name program program-dir))))))))
(provide 'nixos)
;;; nixos.el ends here
;; Local Variables:
;; checkdoc-force-docstrings-flag: nil
;; End:

View File

@@ -0,0 +1,72 @@
{ config, ... }:
{
name = "gpauth-tls";
meta.maintainers = config.node.pkgs.gpauth.meta.maintainers;
nodes.machine =
{ pkgs, ... }:
let
httpsServer = pkgs.writeText "gpauth-test-server.py" ''
import ssl
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
body = b"<html><body>authenticated</body></html>"
self.send_response(200)
self.send_header("Content-Type", "text/html")
self.send_header("Content-Length", str(len(body)))
self.send_header("saml-auth-status", "1")
self.send_header("saml-username", "fixture-user")
self.send_header("prelogin-cookie", "fixture-cookie")
self.end_headers()
self.wfile.write(body)
def log_message(self, format, *args):
pass
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("cert.pem", "key.pem")
server = HTTPServer(("127.0.0.1", 4443), Handler)
server.socket = context.wrap_socket(server.socket, server_side=True)
server.serve_forever()
'';
in
{
imports = [ ./common/x11.nix ];
environment.systemPackages = [ pkgs.gpauth ];
systemd.services.gpauth-test-server = {
description = "gpauth test SAML endpoint";
wantedBy = [ "multi-user.target" ];
preStart = ''
${pkgs.openssl}/bin/openssl req -x509 -newkey rsa:2048 -noenc \
-subj /CN=localhost -keyout key.pem -out cert.pem
'';
serviceConfig = {
ExecStart = "${pkgs.python3}/bin/python ${httpsServer}";
RuntimeDirectory = "gpauth-test-server";
WorkingDirectory = "/run/gpauth-test-server";
};
};
};
testScript = ''
machine.wait_for_x()
machine.wait_for_unit("gpauth-test-server.service")
machine.wait_for_open_port(4443)
output = machine.succeed(
"DISPLAY=:0 timeout 30s gpauth localhost "
"--saml-request https://127.0.0.1:4443/ "
# self-signed cert is used
"--ignore-tls-errors"
)
assert "fixture-user" in output
assert "fixture-cookie" in output
'';
}

View File

@@ -0,0 +1,22 @@
{
name = "qmp-api-error";
nodes.machine = { };
testScript = ''
from test_driver.machine.qmp import QMPAPIError
machine.start()
assert machine.qmp_client is not None
try:
machine.qmp_client.send("this-command-does-not-exist")
except QMPAPIError as error:
t.assertEqual(error.class_name, "CommandNotFound")
t.assertTrue(error.description)
t.assertIsNone(error.transaction_id)
else:
raise AssertionError("expected QMPAPIError")
'';
}

View File

@@ -1,4 +1,10 @@
{ lib, pkgs, ... }:
{
lib,
pkgs,
name,
opencloudPackage,
...
}:
let
certs = import ./common/acme/server/snakeoil-certs.nix;
@@ -49,7 +55,7 @@ let
in
{
name = "opencloud";
inherit name;
meta.maintainers = with lib.maintainers; [
christoph-heiss
@@ -69,6 +75,7 @@ in
services.opencloud = {
enable = true;
package = opencloudPackage;
url = "https://${domain}:9200";
environment = {
ADMIN_PASSWORD = adminPassword;

View File

@@ -0,0 +1,68 @@
{
lib,
pkgs,
...
}:
{
name = "systemd-nsresourced-mountfsd";
meta.maintainers = with lib.maintainers; [ raitobezarius ];
nodes.machine = { config, ... }: {
# Currently, kernel BTF enabled systemd is not the default yet.
systemd.package = config.boot.kernelPackages.systemd;
systemd.additionalUpstreamSystemUnits = [
"systemd-nsresourced.socket"
"systemd-nsresourced.service"
"systemd-mountfsd.socket"
"systemd-mountfsd.service"
];
};
testScript = ''
machine.wait_for_unit("multi-user.target")
with subtest("BPF LSM is active"):
lsm = machine.succeed("cat /sys/kernel/security/lsm")
assert "bpf" in lsm, f"BPF LSM is not active: {lsm}"
with subtest("nsresourced and mountfsd sockets are available"):
machine.systemctl("start systemd-nsresourced.socket systemd-mountfsd.socket")
machine.wait_for_unit("systemd-nsresourced.socket")
machine.wait_for_unit("systemd-mountfsd.socket")
with subtest("nsresourced serves its varlink interface and delegates a user namespace"):
machine.succeed("varlinkctl introspect /run/systemd/userdb/io.systemd.NamespaceResource")
machine.succeed(
"unshare --user varlinkctl --exec call "
"--push-fd=/proc/self/ns/user "
"/run/systemd/userdb/io.systemd.NamespaceResource "
"io.systemd.NamespaceResource.AllocateUserRange "
"'{\"name\":\"nixos-test\",\"size\":65536,\"userNamespaceFileDescriptor\":0}' "
"-- cat /proc/self/uid_map"
)
with subtest("mountfsd serves its varlink interface"):
machine.succeed("varlinkctl introspect /run/systemd/io.systemd.MountFileSystem")
with subtest("mountfsd mounts a DDI on behalf of a client"):
machine.succeed("mkdir -p /tmp/ddi-defs")
machine.succeed("echo '[Partition]' > /tmp/ddi-defs/10-root.conf")
machine.succeed("echo 'Type=root' >> /tmp/ddi-defs/10-root.conf")
machine.succeed("echo 'Format=ext4' >> /tmp/ddi-defs/10-root.conf")
machine.succeed(
"PATH=${pkgs.e2fsprogs}/bin:$PATH "
"systemd-repart --empty=create --size=64M "
"--definitions=/tmp/ddi-defs --offline=yes /var/tmp/ddi.raw"
)
# SYSTEMD_USE_MOUNTFSD forces systemd-dissect to go through
# systemd-mountfsd (and systemd-nsresourced) instead of mounting the
# image locally.
# NOTE: image-policy should be restricted but I failed to do so.
machine.succeed(
"SYSTEMD_USE_MOUNTFSD=1 systemd-dissect "
"--image-policy='*' --mtree /var/tmp/ddi.raw"
)
'';
}

View File

@@ -64,7 +64,7 @@
setxkbmap,
lib,
stdenv,
systemd,
systemdLibs,
unzip,
usbutils,
which,
@@ -190,7 +190,7 @@ let
libpng
nspr
nss_latest
systemd
systemdLibs
# For GTKLookAndFeel
gtk3

View File

@@ -317,7 +317,7 @@ rec {
};
meta = {
homepage = "http://eclipsecolorthemes.org/";
homepage = "https://github.com/eclipse-color-theme/eclipse-color-theme";
description = "Plugin to switch color themes conveniently and without side effects";
sourceProvenance = with lib.sourceTypes; [ binaryBytecode ];
license = lib.licenses.epl10;

View File

@@ -38,12 +38,16 @@ lib.extendMkDerivation {
args.unpackCmd or ''
case "$curSrc" in
*.el)
# keep original source filename without the hash
local filename=$(basename "$curSrc")
filename="''${filename:33}"
cp $curSrc $filename
chmod +w $filename
sourceRoot="."
if [ -f "$curSrc" ]; then
# keep original source filename without the hash
local filename=$(basename "$curSrc")
filename="''${filename:33}"
cp $curSrc $filename
chmod +w $filename
sourceRoot="."
else
_defaultUnpack "$curSrc"
fi
;;
*)
_defaultUnpack "$curSrc"

View File

@@ -0,0 +1,61 @@
{
lib,
}:
{
pname,
version ? "0.1.0", # a dummy value
src ? lib.path.append ./. "${pname}.el",
doLint ? true,
}:
{
melpaBuild,
package-lint,
}:
melpaBuild {
inherit pname version src;
turnCompilationWarningToError = true;
packageRequires = lib.optional doLint package-lint;
doInstallCheck = doLint;
preInstallCheck = ''
lintEachFile() {
find $out/share/emacs \
-type f -name '*.el' \
-not -name "*-pkg.el" -not -name "*-autoloads.el" \
-print0 \
| xargs --verbose -0 -I {} -n 1 -P "$NIX_BUILD_CORES" "$@"
}
lintEachFile \
emacs --batch \
--funcall=package-activate-all \
--funcall=package-lint-batch-and-exit "{}"
lintEachFile \
emacs --batch \
"{}" \
--eval='(setopt checkdoc-arguments-in-order-flag t)' \
--funcall=checkdoc-batch
lintEachFile \
emacs --batch \
"{}" \
--eval='
(progn
;; load indentation settings, if any, see (info "(emacs) Lisp Indent")
(eval-buffer)
(indent-region (point-min) (point-max))
(with-current-buffer
(diff-no-select buffer-file-name (current-buffer) nil t)
(goto-char (point-min))
(condition-case nil
(let ((case-fold-search nil))
(search-forward "Diff finished (no differences)"))
(search-failed
(princ (buffer-string))
(error "%s" "File indentation is wrong")))))'
'';
}

View File

@@ -0,0 +1,33 @@
{
runCommand,
emacs,
writeShellApplication,
}:
let
run-test = writeShellApplication {
name = "run-test";
runtimeInputs = [
emacs
];
runtimeEnv = {
EMACS_TEST_VERBOSE = 1; # make ERT output verbose
};
text = ''
emacs --batch \
--load=${./with-packages.el} \
--eval="(ert-run-tests-batch-and-exit '(tag :shared-with-unwrapped))"
'';
};
in
runCommand "test-emacs-unwrapped"
{
nativeBuildInputs = [
run-test
];
}
''
run-test
touch $out
''

View File

@@ -1,9 +1,17 @@
;;; with-packages.el --- Utils and ERT tests for withPackages -*- lexical-binding: t; -*-
;; Version: 0.1.0
;; Package-Requires: ((emacs "29.1"))
;; URL: https://example.com
;;; Commentary:
;; Utils and ERT tests for emacs.pkgs.withPackages.
;;; Code:
(require 'ert)
(eval-when-compile (require 'cl-lib))
(require 'cl-lib)
(require 'server)
(require 'info)
@@ -26,33 +34,46 @@ which is generated by nix when building this elisp package."
(`(,store-dir) store-dir))
(error "@storeDir@"))))
(defun with-packages--nix-store-file-p (file)
"Return t if FILE is in nix store."
(defun with-packages--in-nix-store-p (file-or-dir)
"Return t if FILE-OR-DIR is in nix store."
(cl-loop
with store-dir = (with-packages--nix-store-dir)
for parent = (file-name-parent-directory file) then (file-name-parent-directory parent)
for parent = (file-name-parent-directory file-or-dir) then (file-name-parent-directory parent)
while parent
thereis (string= parent store-dir)))
(defun with-packages--locate-eln-file (library)
"Locate the natively-compiled LIBRARY file."
(declare-function comp-el-to-eln-rel-filename "comp.c")
(locate-eln-file (comp-el-to-eln-rel-filename (find-library-name library))))
(defun with-packages-unwrapped-site-start-is-loaded ()
(fboundp 'nix--profile-paths))
(defun with-packages-eval-in-sub-emacs (form)
"Evaluate FORM in a subprocess Emacs and return its result."
(cl-defun with-packages-eval-in-sub-emacs (form &optional (emacs-program "emacs"))
"Evaluate FORM in a subprocess Emacs and return its result.
EMACS-PROGRAM specifies the subprocess Emacs to start."
(pcase-exhaustive
(process-lines "emacs" "--batch"
(process-lines emacs-program "--batch"
"--eval" (format "(prin1 %S)" form))
(`(,result) (read result))))
(defvar with-packages-unwrapped-emacs-program nil
"Absoluate file of an unwrapped Emacs binary.
Set this variable before running related tests.")
;;;; Tests that can be run in a batch Emacs
(ert-deftest with-packages-requested-packages-are-available ()
(should (package-installed-p 'dash))
(should (package-installed-p 'flx-ido)))
(should (package-installed-p 'flx-ido))
;; Test 23d4bfb6661ca57a9e331a2cf4184232d38ac38b.
(ert-info ("unwrapped subprocess Emacs does not have requested packages installed")
(should (file-name-absolute-p with-packages-unwrapped-emacs-program))
(should-not (with-packages-eval-in-sub-emacs '(package-installed-p 'dash)
with-packages-unwrapped-emacs-program))
(should-not (with-packages-eval-in-sub-emacs '(package-installed-p 'flx-ido)
with-packages-unwrapped-emacs-program))))
(ert-deftest with-packages-deps-of-requested-packages-are-available ()
"Test https://github.com/NixOS/nixpkgs/issues/388829."
@@ -71,18 +92,41 @@ which is generated by nix when building this elisp package."
(ert-deftest with-packages-aot-native-comp-eln-files-are-available ()
(skip-unless (native-comp-available-p))
(ert-info ("search eln files of Emacs proper")
(should (with-packages--nix-store-file-p (with-packages--locate-eln-file "files"))))
(should (with-packages--in-nix-store-p (with-packages--locate-eln-file "files"))))
(ert-info ("search eln files of requested packages")
(should (with-packages--nix-store-file-p (with-packages--locate-eln-file "dash")))))
(should (with-packages--in-nix-store-p (with-packages--locate-eln-file "dash"))))
;; `load' does not try to find .eln files if it cannot find .elc or .el files.
;; Assuming unwrapped subprocess Emacs cannot find .elc or .el files of requested packages,
;; which is tested in `with-packages-requested-packages-are-available',
;; probably, the tested code in our site-start.el and this test are unnecessary.
;; In addition, what we really want to test is that unwrapped subprocess Emacs does not
;; see eln files of requested packages, which is not easy to test.
;; So we test an easier-to-test proxy, which unfortunately can be seen as
;; implementation detail of the wrapper.
(ert-info ("subprocess does not see wrapper-modified EMACSNATIVELOADPATH")
(let ((eln-dirs-added-by-wrapper
(cl-set-difference
(parse-colon-path (getenv-internal "EMACSNATIVELOADPATH" initial-environment))
(parse-colon-path (getenv "EMACSNATIVELOADPATH"))
:test #'string=)))
(should (equal (length eln-dirs-added-by-wrapper) 1))
(let ((eln-dir-added-by-wrapper (car eln-dirs-added-by-wrapper)))
(should (with-packages--in-nix-store-p eln-dir-added-by-wrapper))
(cl-flet ((ancestor-dir-of-file-p (dir file)
(locate-dominating-file file
(lambda (current-dir)
(string= current-dir dir)))))
(should (ancestor-dir-of-file-p eln-dir-added-by-wrapper
(with-packages--locate-eln-file "dash"))))))))
(ert-deftest with-packages-unwrapped-site-start-is-loaded ()
(should (with-packages-unwrapped-site-start-is-loaded)))
(ert-deftest with-packages-binaries-of-requested-packages-are-available ()
(ert-info ("find binary via PATH")
(should (equal (call-process-shell-command "cowsay") 0)))
(should (equal (call-process-shell-command "hello") 0)))
(ert-info ("find binary via exec-path")
(should (executable-find "cowsay")))
(should (executable-find "hello")))
(ert-info ("each item is unique")
(cl-flet ((item-should-be-unique (items)
(should (equal items
@@ -101,16 +145,44 @@ which is generated by nix when building this elisp package."
(skip-unless (treesit-available-p))
(should (treesit-language-available-p 'nix)))
(ert-deftest with-packages-invocation-name-and-directory-are-wrapped ()
"Test https://github.com/NixOS/nixpkgs/pull/361145."
;; Generally, to a build filename, `expand-file-name' is better than `concat',
;; because `expand-file-name' accepts a dir not ending with "/".
;; We use `concat' because we want to support existing `concat' usages, such as esup.el:
;; https://github.com/jschaf/esup/blob/4b49c8d599d4cc0fbf994e9e54a9c78e5ab62a5f/esup.el#L161
(ert-info ("wrapped Emacs has correct invocation-name and -directory")
(should (equal (file-truename (executable-find "emacs"))
(concat invocation-directory invocation-name))))
(ert-info ("unwrapped subprocess Emacs has correct invocation-name and -directory")
(should (file-name-absolute-p with-packages-unwrapped-emacs-program))
(should
(equal with-packages-unwrapped-emacs-program
(with-packages-eval-in-sub-emacs '(concat invocation-directory invocation-name)
with-packages-unwrapped-emacs-program)))))
(ert-deftest with-packages-c-source-is-available ()
:tags '(:shared-with-unwrapped)
(let ((function-to-find 'eval))
(ert-info ("this function is written in C")
(should (subr-primitive-p (symbol-function function-to-find))))
(ert-info ("C source code of this function can be found")
(should find-function-C-source-directory)
(should (cdr (find-function-noselect function-to-find))))))
;;;; Utils for non-batch tests
(defmacro define-with-packages-non-batch-test-via-bound-and-true-p (test-name)
"Define a function named TEST-NAME which tests symbol TEST-NAME."
(declare (indent 1) (debug (symbolp)))
(cl-check-type test-name symbol)
`(defun ,test-name ()
(list (bound-and-true-p ,test-name))))
(defmacro define-with-packages-non-batch-tests-via-bound-and-true-p (&rest test-names)
"See also `define-with-packages-non-batch-test-via-bound-and-true-p'."
"TEST-NAMES is a list of symbols.
Each of them is passed to
`define-with-packages-non-batch-test-via-bound-and-true-p'."
(declare (indent 0) (debug (&rest symbolp)))
`(progn
,@(cl-loop
@@ -137,11 +209,20 @@ Return test result, a list of values. Each is non-nil if the test passes."
;; Run the non-batch test and return test result.
(eval-in-non-batch-emacs `(,test-name)))))
(defmacro define-with-packages-non-batch-ert-test (test-name)
"See `with-packages--run-non-batch-test' for how the test is run."
(declare (indent 1) (debug (symbolp)))
(defmacro define-with-packages-non-batch-ert-test (test-name &rest ert-forms)
"Define an ERT test named TEST-NAME.
That test first asks a non-batch Emacs to run function TEST-NAME.
See `with-packages--run-non-batch-test' for how function TEST-NAME is run.
The test then retrieves the result of function TEST-NAME.
Depending on the result, the test passes or fails.
ERT-FORMS are placed at the start of the ERT test,
which can be used to add skip condition and :expected-result."
(declare (indent 1) (debug (symbolp &rest sexp)))
(cl-check-type test-name symbol)
`(ert-deftest ,test-name ()
,@ert-forms
(should (stringp with-packages-non-batch-emacs-socket))
(should (file-readable-p with-packages-non-batch-emacs-socket))
(let ((test-result (with-packages--run-non-batch-test (quote ,test-name))))
@@ -152,7 +233,8 @@ Return test result, a list of values. Each is non-nil if the test passes."
collect (or item t)))))))
(defmacro define-with-packages-non-batch-ert-tests (&rest test-names)
"See also `define-with-packages-non-batch-ert-test'."
"TEST-NAMES is a list of symbols.
Each of them is passed to `define-with-packages-non-batch-ert-test'."
(declare (indent 0) (debug (&rest symbolp)))
`(progn
,@(cl-loop for test-name in test-names
@@ -168,7 +250,7 @@ Return test result, a list of values. Each is non-nil if the test passes."
(defun with-packages-unwrapped-site-start-is-loaded-quietly ()
(list (with-packages-unwrapped-site-start-is-loaded)
(not (save-excursion
(with-current-buffer "*Messages*"
(with-current-buffer (messages-buffer)
(goto-char (point-min))
(save-match-data
(re-search-forward (rx line-start
@@ -181,28 +263,34 @@ Return test result, a list of values. Each is non-nil if the test passes."
(defun with-packages-no-jit-native-comp ()
"Test no JIT native-comp is triggered during non-batch tests.
This is a regression test for URL `https://github.com/NixOS/nixpkgs/pull/538964'."
(if (not (native-comp-available-p))
(list t)
;; Give Emacs some time to generate JIT native-comp results.
;; It is possible that this test passes even if there is JIT native-comp
;; because we use a hardcoded time span as the synchronization point.
;; Ideally, we should use a more robust synchronization point.
(sleep-for 2.5)
(list (not (cl-loop for buffer being each buffer
thereis (string= (buffer-name buffer)
"*Async-native-compile-log*")))
(let ((eln-dir (car native-comp-eln-load-path)))
(or (directory-empty-p eln-dir)
(and (not (file-exists-p eln-dir))
(file-exists-p (file-name-parent-directory eln-dir))))))))
;; Give Emacs some time to generate JIT native-comp results.
;; It is possible that this test passes even if there is JIT native-comp
;; because we use a hardcoded time span as the synchronization point.
;; Ideally, we should use a more robust synchronization point.
(sleep-for 2.5)
(defvar native-comp-eln-load-path)
(defvar comp-async-buffer-name)
(list (not (cl-loop for buffer being each buffer
thereis (string= (buffer-name buffer) comp-async-buffer-name)))
(let ((eln-dir (car native-comp-eln-load-path)))
(or (directory-empty-p eln-dir)
(and (not (file-exists-p eln-dir))
(file-exists-p (file-name-parent-directory eln-dir)))))))
(define-with-packages-non-batch-ert-tests
with-packages-early-default-is-loaded
with-packages-default-is-loaded
with-packages-early-default-is-loaded-before-default
with-packages-unwrapped-site-start-is-loaded-quietly
with-packages-no-jit-native-comp)
with-packages-unwrapped-site-start-is-loaded-quietly)
(define-with-packages-non-batch-ert-test
with-packages-no-jit-native-comp
(skip-unless (native-comp-available-p)))
(provide 'with-packages)
;;; with-packages.el ends here
;; Local Variables:
;; checkdoc-force-docstrings-flag: nil
;; End:

View File

@@ -0,0 +1,73 @@
{
runCommand,
emacs,
hello,
replaceVarsWith,
lib,
writeShellApplication,
}:
let
mkEpkg = import ./mk-epkg.nix { inherit lib; };
run-test = writeShellApplication {
name = "run-test";
runtimeInputs = [
(emacs.pkgs.withPackages (epkgs: [
epkgs.dash
epkgs.flx-ido
(epkgs.callPackage (mkEpkg {
pname = "with-packages";
src = replaceVarsWith {
src = ./with-packages.el;
replacements = { inherit (builtins) storeDir; };
# generate a file in a store path dir
# /nix/store/hash-with-packages.el/with-packages.el
# instead of a store path file, which checkdoc doesn't like
# /nix/store/hash-with-packages.el
dir = "/";
};
}) { })
(epkgs.callPackage (mkEpkg {
pname = "early-default";
doLint = false; # no need to lint this simple file
}) { })
(epkgs.callPackage (mkEpkg {
pname = "default";
doLint = false; # no need to lint this simple file
}) { })
hello
(epkgs.treesit-grammars.with-grammars (ps: [ ps.tree-sitter-nix ]))
]))
];
runtimeEnv = {
# emulate a default NixOS env where INFOPATH is set like this (not ending with a ":")
INFOPATH = "/fake-info-dir1:/fake-info-dir2";
EMACS_TEST_VERBOSE = 1; # make ERT output verbose
};
text = ''
# Give Emacs a HOME to emulate a real user environment.
HOME="$PWD"
nonBatchEmacsSocket="$PWD/non-batch-emacs-socket"
emacs --daemon="$nonBatchEmacsSocket"
emacs --batch --load=with-packages \
--eval="(setq with-packages-non-batch-emacs-socket \"$nonBatchEmacsSocket\")" \
--eval='(setq with-packages-unwrapped-emacs-program "${lib.getExe emacs}")' \
--funcall=ert-run-tests-batch-and-exit
'';
};
in
runCommand "test-emacs-withPackages-wrapper"
{
nativeBuildInputs = [
run-test
];
}
''
run-test
touch $out
''

View File

@@ -1,51 +0,0 @@
{
runCommand,
emacs,
writeText,
cowsay,
replaceVars,
}:
let
mkEpkg =
pname: src: melpaBuild:
melpaBuild {
inherit pname src;
version = "0.1.0"; # a dummy value
turnCompilationWarningToError = true;
};
in
runCommand "test-emacs-withPackages-wrapper"
{
nativeBuildInputs = [
(emacs.pkgs.withPackages (epkgs: [
epkgs.dash
epkgs.flx-ido
(mkEpkg "with-packages" (replaceVars ./with-packages.el {
inherit (builtins) storeDir;
}) epkgs.melpaBuild)
(mkEpkg "early-default" ./early-default.el epkgs.melpaBuild)
(mkEpkg "default" ./default.el epkgs.melpaBuild)
cowsay
(epkgs.treesit-grammars.with-grammars (ps: [ ps.tree-sitter-nix ]))
]))
];
env = {
# emulate a default NixOS env where INFOPATH is set like this (not ending with a ":")
INFOPATH = "/fake-info-dir1:/fake-info-dir2";
EMACS_TEST_VERBOSE = 1; # make ERT output verbose
};
}
''
# Give Emacs a HOME to emulate a real user environment.
HOME="$PWD"
nonBatchEmacsSocket="$PWD/non-batch-emacs-socket"
emacs --daemon="$nonBatchEmacsSocket"
emacs --batch --load=with-packages \
--eval="(setq with-packages-non-batch-emacs-socket \"$nonBatchEmacsSocket\")" \
--funcall=ert-run-tests-batch-and-exit
touch $out
''

View File

@@ -175,6 +175,37 @@ runCommand (lib.appendToName "with-packages" emacs).name
${lib.optionalString withTreeSitter ''
(add-to-list 'treesit-extra-load-path "$out/lib/")
''}
;; Remove wrapper-added dir from EMACSLOADPATH so it's not propagated
;; to any other Emacsen that might be started as subprocesses.
;; Also do it for EMACSNATIVELOADPATH, which probably unnecessary.
(let ((restore-load-path
(lambda (load-path-env-var wrapper-dir-env-var)
(when-let* ((wrapper-dir (getenv wrapper-dir-env-var)))
(setenv wrapper-dir-env-var nil)
(when-let* ((env-load-path (getenv load-path-env-var)))
(let* ((env-load-path-list (split-string env-load-path
path-separator))
(restored-env-load-path-list (remove wrapper-dir
env-load-path-list)))
(setenv load-path-env-var
(when restored-env-load-path-list
(string-join restored-env-load-path-list
path-separator)))))))))
(funcall restore-load-path
"EMACSLOADPATH" "emacsWithPackages_siteLisp")
(funcall restore-load-path
"EMACSNATIVELOADPATH" "emacsWithPackages_siteLispNative"))
(let ((set-from-env (lambda (symbol env-var &optional modify)
(when-let* ((value (getenv env-var)))
(set symbol (funcall (or modify #'identity) value))
(setenv env-var nil)))))
(funcall set-from-env
'invocation-directory "emacsWithPackages_invocationDirectory"
#'file-name-as-directory)
(funcall set-from-env
'invocation-name "emacsWithPackages_invocationName"))
EOF
# Generate a subdirs.el that statically adds all subdirectories to load-path.

View File

@@ -58,13 +58,13 @@ in
melpaBuild (finalAttrs: {
pname = "ghostel";
version = "0.56.0";
version = "0.57.0";
src = fetchFromGitHub {
owner = "dakra";
repo = "ghostel";
tag = "v${finalAttrs.version}";
hash = "sha256-NpfnlggAcThNw9uY7Uq4qFPEJ+md8aZ8i32CQSUKz+w=";
hash = "sha256-vPegePT5n11cI+eq9VWl0u068b2o50A4Wo8qcdYwJ34=";
};
# these can be put into mkModule, but we put them here to ease user overrideAttrs

View File

@@ -485,7 +485,15 @@ stdenv.mkDerivation (finalAttrs: {
pkgs = lib.recurseIntoAttrs (emacsPackagesFor finalAttrs.finalPackage);
tests = {
inherit (nixosTests) emacs-daemon;
withPackages = callPackage ./build-support/wrapper-test {
nixos = nixosTests.emacs.extendNixOS {
module = {
tests.emacs.package = finalAttrs.finalPackage;
};
};
withPackages = callPackage ./build-support/tests/with-packages.nix {
emacs = finalAttrs.finalPackage;
};
unwrapped = callPackage ./build-support/tests/unwrapped.nix {
emacs = finalAttrs.finalPackage;
};
};

View File

@@ -16,38 +16,10 @@ least specific (the system profile)"
(when (file-exists-p default-directory)
(setq load-path (cons default-directory load-path))
(normal-top-level-add-subdirs-to-load-path))))
;;; Remove wrapper site-lisp from EMACSLOADPATH so it's not propagated
;;; to any other Emacsen that might be started as subprocesses.
(let ((wrapper-site-lisp (getenv "emacsWithPackages_siteLisp"))
(env-load-path (getenv "EMACSLOADPATH")))
(when wrapper-site-lisp
(setenv "emacsWithPackages_siteLisp" nil))
(when (and wrapper-site-lisp env-load-path)
(let* ((env-list (split-string env-load-path ":"))
(new-env-list (delete wrapper-site-lisp env-list)))
(setenv "EMACSLOADPATH" (when new-env-list
(mapconcat 'identity new-env-list ":"))))))
(let ((wrapper-site-lisp (getenv "emacsWithPackages_siteLispNative"))
(env-load-path (getenv "EMACSNATIVELOADPATH")))
(when wrapper-site-lisp
(setenv "emacsWithPackages_siteLispNative" nil))
(when (and wrapper-site-lisp env-load-path)
(let* ((env-list (split-string env-load-path ":"))
(new-env-list (delete wrapper-site-lisp env-list)))
(setenv "EMACSNATIVELOADPATH" (when new-env-list
(mapconcat 'identity new-env-list ":"))))))
(let ((wrapper-invocation-directory (getenv "emacsWithPackages_invocationDirectory")))
(when wrapper-invocation-directory
(setq invocation-directory (file-name-as-directory wrapper-invocation-directory))
(setenv "emacsWithPackages_invocationDirectory" nil)))
(let ((wrapper-invocation-name (getenv "emacsWithPackages_invocationName")))
(when wrapper-invocation-name
(setq invocation-name wrapper-invocation-name)
(setenv "emacsWithPackages_invocationName" nil)))
;; The default/standard value of `package-directory-list' depends on `load-path'.
;; So we re-compute `package-directory-list' after modifying `load-path'.
;; See Emacs bug https://debbugs.gnu.org/cgi/bugreport.cgi?bug=81982.
(custom-reevaluate-setting 'package-directory-list)
;;; Set up native-comp load path.
(when (featurep 'native-compile)
@@ -86,9 +58,7 @@ least specific (the system profile)"
;; TODO: We should also add the other `NIX_PROFILES' to this path.
;; However, these are user-specific, so we would need to discover
;; them dynamically after connecting via `tramp'
'(progn
(add-to-list 'tramp-remote-path "/run/current-system/sw/bin")
(add-to-list 'tramp-remote-path "/run/wrappers/bin")))
'(add-to-list 'tramp-remote-path "/run/wrappers/bin"))
;;; C source directory
;;;

View File

@@ -122,20 +122,6 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
filemarks-nvim = buildVimPlugin {
pname = "filemarks.nvim";
version = "1.6.0";
src = fetchFromGitHub {
owner = "anoopkcn";
repo = "filemarks.nvim";
tag = "1.6.0";
hash = "sha256-qSHHsBb7MAceNV3QnZiTFN4d1i2zH8CItlzQWsYNjno=";
};
meta.homepage = "https://github.com/anoopkcn/filemarks.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
meta.hydraPlatforms = [ ];
};
FTerm-nvim = buildVimPlugin {
pname = "FTerm.nvim";
version = "0-unstable-2022-11-13";
@@ -6063,6 +6049,20 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
filemarks-nvim = buildVimPlugin {
pname = "filemarks.nvim";
version = "1.6.0";
src = fetchFromGitHub {
owner = "anoopkcn";
repo = "filemarks.nvim";
tag = "1.6.0";
hash = "sha256-qSHHsBb7MAceNV3QnZiTFN4d1i2zH8CItlzQWsYNjno=";
};
meta.homepage = "https://github.com/anoopkcn/filemarks.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
meta.hydraPlatforms = [ ];
};
filemention-nvim = buildVimPlugin {
pname = "filemention.nvim";
version = "0-unstable-2026-05-30";
@@ -18446,12 +18446,12 @@ final: prev: {
toggable-term-nvim = buildVimPlugin {
pname = "toggable-term-nvim";
version = "0-unstable-2026-10-05";
version = "0-unstable-2026-10-11";
src = fetchFromGitHub {
owner = "sergioia-dev";
repo = "toggable-term-nvim";
rev = "713633355ced060f5337e6ce5271db67367bbf16";
hash = "sha256-Bs3elJzzzi1WiqwP0TnXEkUdwjizO2OckaNBTX6iGRM=";
rev = "f16258898a1fe879ad69402edeb9915518cd691b";
hash = "sha256-Maco2xfRvwxCXHAZQ3bMdCbqhhOBHd+92tegEvgdrg0=";
};
meta.homepage = "https://github.com/sergioia-dev/toggable-term-nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@@ -20603,6 +20603,20 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
vim-dadbod-manager-ui = buildVimPlugin {
pname = "vim-dadbod-manager-ui";
version = "0-unstable-2026-10-11";
src = fetchFromGitHub {
owner = "sergioia-dev";
repo = "vim-dadbod-manager-ui";
rev = "3aba12f946f72e3d0797a26786851c9759260657";
hash = "sha256-pqLM7r4q7QYrc+OkOAH2gGPN3AJheabscYsbddqSe5g=";
};
meta.homepage = "https://github.com/sergioia-dev/vim-dadbod-manager-ui/";
meta.license = getLicenseFromSpdxId "MIT";
meta.hydraPlatforms = [ ];
};
vim-dadbod-ui = buildVimPlugin {
pname = "vim-dadbod-ui";
version = "0-unstable-2026-06-19";
@@ -24831,20 +24845,6 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
vim-textobj-xmlattr = buildVimPlugin {
pname = "vim-textobj-xmlattr";
version = "0.1.1";
src = fetchFromGitHub {
owner = "whatyouhide";
repo = "vim-textobj-xmlattr";
tag = "0.1.1";
hash = "sha256-EFn7Ql7SFWwcjR5WdQkl2/lJZY9qZN9ml6625lGtTzY=";
};
meta.homepage = "https://github.com/whatyouhide/vim-textobj-xmlattr/";
meta.license = getLicenseFromSpdxId "WTFPL";
meta.hydraPlatforms = [ ];
};
vim-textobj-variable-segment = buildVimPlugin {
pname = "vim-textobj-variable-segment";
version = "0-unstable-2024-09-06";
@@ -24859,6 +24859,20 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
vim-textobj-xmlattr = buildVimPlugin {
pname = "vim-textobj-xmlattr";
version = "0.1.1";
src = fetchFromGitHub {
owner = "whatyouhide";
repo = "vim-textobj-xmlattr";
tag = "0.1.1";
hash = "sha256-EFn7Ql7SFWwcjR5WdQkl2/lJZY9qZN9ml6625lGtTzY=";
};
meta.homepage = "https://github.com/whatyouhide/vim-textobj-xmlattr/";
meta.license = getLicenseFromSpdxId "WTFPL";
meta.hydraPlatforms = [ ];
};
vim-themis = buildVimPlugin {
pname = "vim-themis";
version = "1.7.0-unstable-2025-08-29";

View File

@@ -5118,6 +5118,16 @@ assertNoAdditions {
};
});
vim-dadbod-manager-ui = super.vim-dadbod-manager-ui.overrideAttrs {
# Only vim-dadbod: the drawer this plugin extends is vendored, and upstream
# states that a separate vim-dadbod-ui "must not be installed next to it",
# so it is deliberately not listed here.
dependencies = [ self.vim-dadbod ];
doInstallCheck = true;
vimCommandCheck = "DBManager";
};
vim-dadbod-ui = super.vim-dadbod-ui.overrideAttrs {
dependencies = [ self.vim-dadbod ];

View File

@@ -7,7 +7,6 @@ https://github.com/vim-scripts/Colour-Sampler-Pack/,,
https://github.com/CopilotC-Nvim/CopilotChat.nvim/,,
https://github.com/whonore/Coqtail/,,
https://github.com/vim-scripts/DoxygenToolkit.vim/,,
https://github.com/anoopkcn/filemarks.nvim/,,
https://github.com/numToStr/FTerm.nvim/,,
https://github.com/antoinemadec/FixCursorHold.nvim/,,
https://github.com/Aaronik/GPTModels.nvim/,,
@@ -431,6 +430,7 @@ https://github.com/micampe/fennel.vim/,,
https://github.com/wincent/ferret/,,
https://github.com/bogado/file-line/,,
https://github.com/lewis6991/fileline.nvim/,,
https://github.com/anoopkcn/filemarks.nvim/,,
https://github.com/not-manu/filemention.nvim/,,
https://github.com/VonHeikemen/fine-cmdline.nvim/,,
https://github.com/glacambre/firenvim/,,
@@ -1469,6 +1469,7 @@ https://github.com/itchyny/vim-cursorword/,,
https://github.com/ehamberg/vim-cute-python/,,
https://github.com/tpope/vim-dadbod/,,
https://github.com/kristijanhusak/vim-dadbod-completion/,,
https://github.com/sergioia-dev/vim-dadbod-manager-ui/,,
https://github.com/kristijanhusak/vim-dadbod-ui/,,
https://github.com/sunaku/vim-dasht/,,
https://github.com/ajmwagar/vim-deus/,,
@@ -1771,8 +1772,8 @@ https://github.com/kana/vim-textobj-line/,,
https://github.com/osyo-manga/vim-textobj-multiblock/,,
https://github.com/preservim/vim-textobj-quote/,,
https://github.com/kana/vim-textobj-user/,,
https://github.com/whatyouhide/vim-textobj-xmlattr/,,
https://github.com/Julian/vim-textobj-variable-segment/,,
https://github.com/whatyouhide/vim-textobj-xmlattr/,,
https://github.com/thinca/vim-themis/,,
https://github.com/tmux-plugins/vim-tmux/,,
https://github.com/roxma/vim-tmux-clipboard/,,

View File

@@ -151,9 +151,9 @@ rec {
unstable = fetchurl rec {
# NOTE: Don't forget to change the hash for staging as well.
version = "11.18";
version = "11.19";
url = "https://dl.winehq.org/wine/source/11.x/wine-${version}.tar.xz";
hash = "sha256-xigvbU2uzxHzq5+aK2xZj2e+fijDY7osroo8RLYR56Q=";
hash = "sha256-SCAGbtpo5VPTMCOf/GKBZKNI0cYj5J0FjgEcWnzalfE=";
patches = [
# Also look for root certificates at $NIX_SSL_CERT_FILE
@@ -163,7 +163,7 @@ rec {
# see https://gitlab.winehq.org/wine/wine-staging
staging = fetchFromGitLab {
inherit version;
hash = "sha256-KZCkra0y3XFNrbD2lZ+YUCLyq1POC30Sd4sGCJZuwgQ=";
hash = "sha256-Dnb/CjzxWDdMDXfJB/hiWHhQLjU49F6OyM6qqC0g/v0=";
domain = "gitlab.winehq.org";
owner = "wine";
repo = "wine-staging";

View File

@@ -82,6 +82,7 @@ stdenv.mkDerivation (finalAttrs: {
mainProgram = "winetricks";
license = lib.licenses.lgpl21;
homepage = "https://github.com/Winetricks/winetricks";
maintainers = with lib.maintainers; [ ferris-qq ];
platforms = with lib.platforms; linux ++ darwin;
};
})

View File

@@ -208,7 +208,7 @@ lib.makeScope pkgs.newScope (
meta = {
broken = gimp.apiVersion != "2.0";
description = "GIMP plug-in to do the fourier transform";
homepage = "https://people.via.ecp.fr/~remi/soft/gimp/gimp_plugin_en.php3#fourier";
homepage = "https://www.lprp.fr/gimp_plugin_en/";
license = lib.licenses.gpl3Plus;
};
};
@@ -359,7 +359,7 @@ lib.makeScope pkgs.newScope (
broken = gimp.apiVersion != "2.0";
description = "GIMP plugin to correct lens distortion using the lensfun library and database";
homepage = "http://lensfun.sebastiankraft.net/";
homepage = "https://seebk.github.io/GIMP-Lensfun/";
license = lib.licenses.gpl3Plus;
maintainers = [ ];

View File

@@ -45,11 +45,11 @@
"vendorHash": "sha256-HlX2EfTgDa7K7qkzmR/9Rsamyi/f4EXT3T7eaReGeK4="
},
"aliyun_alicloud": {
"hash": "sha256-u4u8p3+Gxwa+gCDgcqZqi1RXYG9c+O27uZoOlc+RoKc=",
"hash": "sha256-D2/3OuB+7MeMZhydRAYKS1trQjRyKkr1+ulDDfntWBo=",
"homepage": "https://registry.terraform.io/providers/aliyun/alicloud",
"owner": "aliyun",
"repo": "terraform-provider-alicloud",
"rev": "v1.293.0",
"rev": "v1.294.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-GIKSIlWD+TTm0EsUu9ga3emENwGLXMDYqp//BmjNwDA="
},
@@ -454,13 +454,13 @@
"vendorHash": "sha256-FcxAh8EOvnT8r1GHu0Oj2C5Jgbr2WPwD7/vY4/qIvTA="
},
"gitlabhq_gitlab": {
"hash": "sha256-t37l0B8fHIQNPJKV2ryKOy/2y7SogMdl36XdR3Emcj0=",
"hash": "sha256-ceM9uXqefS7kvGWmWWR3KjnuGoWEihliwkkfOTCZQWI=",
"homepage": "https://registry.terraform.io/providers/gitlabhq/gitlab",
"owner": "gitlabhq",
"repo": "terraform-provider-gitlab",
"rev": "v19.3.0",
"rev": "v19.4.1",
"spdx": "MPL-2.0",
"vendorHash": "sha256-w72kbVx+4J0BmOT0k3ZY892Tp7dvSA0QKH9u0I1D/tE="
"vendorHash": "sha256-14LfF5ryqFVLici3iOrbJfqRYMBnDM2D+jky+NUAL1w="
},
"go-gandi_gandi": {
"hash": "sha256-fsCtmwyxkXfOtiZG27VEb010jglK35yr4EynnUWlFog=",
@@ -914,11 +914,11 @@
"vendorHash": "sha256-8Zj4nrEJ38Tz0LOYtghlMnJZJnD2zJjsqawVMTEX0Wk="
},
"metio_migadu": {
"hash": "sha256-3RCE2KCWgS8j30Ggh0HfX0D9ZPpgiTtgIk7+YmzYSfc=",
"hash": "sha256-hcHx/pFGBzXfa0EoIUW5L8ZLrT+pUpHfx4r7NxEk5uw=",
"homepage": "https://registry.terraform.io/providers/metio/migadu",
"owner": "metio",
"repo": "terraform-provider-migadu",
"rev": "2026.9.24",
"rev": "2026.10.1",
"spdx": "0BSD",
"vendorHash": "sha256-b2YIkwpeYCGsENzXSAPD7nhvmZ1Phxfcm3S5xsiC2t0="
},
@@ -1148,11 +1148,11 @@
"vendorHash": "sha256-6M6jTrukO0VhyZRdYbbICm22upbGyOkUSuHqMLTPcEM="
},
"rootlyhq_rootly": {
"hash": "sha256-sWCG6mD7fYi2Yon5Wu/54+m+T8KcUYd38yDt8M3LS+E=",
"hash": "sha256-lkMgGYayDMrhqmbwLysqoQ8L7mUvXoT4xDZ9ltxnSy8=",
"homepage": "https://registry.terraform.io/providers/rootlyhq/rootly",
"owner": "rootlyhq",
"repo": "terraform-provider-rootly",
"rev": "v5.23.0",
"rev": "v5.23.3",
"spdx": "MPL-2.0",
"vendorHash": "sha256-Lusa+8VL8wQGIHYMiuiNTy4tqza4zO1A4ROpZ7X42KM="
},
@@ -1247,13 +1247,13 @@
"vendorHash": "sha256-skswuFKhN4FFpIunbom9rM/FVRJVOFb1WwHeAIaEjn8="
},
"spacelift-io_spacelift": {
"hash": "sha256-Kn43SQM/uxNd32g+nm40fmLStPXyHhuGUX48g16AvKw=",
"hash": "sha256-MTxohgv1eMkzixc66sICFa6CC+uBRGjYQ64lBwlxiRE=",
"homepage": "https://registry.terraform.io/providers/spacelift-io/spacelift",
"owner": "spacelift-io",
"repo": "terraform-provider-spacelift",
"rev": "v1.55.0",
"rev": "v1.57.0",
"spdx": "MIT",
"vendorHash": "sha256-XpXZqb6j6WdTFowdwNf3e8i9lg69tavzb2H65LyQJvE="
"vendorHash": "sha256-raw9hcAvzBKy8bLbUNM36JZTYYE//r7b3HdZ3qFLtPY="
},
"splunk-terraform_signalfx": {
"hash": "sha256-TjJQdzxB7X7RbiBJnaCvAGJTtDwfeOxc7lApl7jjrA8=",
@@ -1355,11 +1355,11 @@
"vendorHash": "sha256-SF11E60OQiRdf+Pf6XyJg60yGRnGOcSzhrYccrWaeYE="
},
"terraform-lxd_lxd": {
"hash": "sha256-U/x3CkUynyMvB9FWzlYgXIfC6/RWeNRV++4ceGW3Rnc=",
"hash": "sha256-9+3sVezHfhlbfytxt6h871ybdIaXDko16WLQNNzrNNQ=",
"homepage": "https://registry.terraform.io/providers/terraform-lxd/lxd",
"owner": "terraform-lxd",
"repo": "terraform-provider-lxd",
"rev": "v3.1.0",
"rev": "v3.1.1",
"spdx": "MPL-2.0",
"vendorHash": "sha256-OHCnxqn09NyqsdTCRUJseNAL1DMpvl6Icu3YEzjLgPM="
},

View File

@@ -1,6 +1,5 @@
{
callPackage,
lua52Packages,
perlPackages,
python3Packages,
}:
@@ -20,10 +19,6 @@
weechat-grep = callPackage ./weechat-grep { };
weechat-matrix-bridge = callPackage ./weechat-matrix-bridge {
inherit (lua52Packages) cjson luaffi;
};
weechat-matrix = python3Packages.callPackage ./weechat-matrix { };
weechat-notify-send = python3Packages.callPackage ./weechat-notify-send { };

View File

@@ -1,64 +0,0 @@
{
lib,
stdenv,
curl,
fetchFromGitHub,
cjson,
olm,
luaffi,
}:
stdenv.mkDerivation {
pname = "weechat-matrix-bridge";
version = "unstable-2018-11-19";
src = fetchFromGitHub {
owner = "torhve";
repo = "weechat-matrix-protocol-script";
rev = "8d32e90d864a8f3f09ecc2857cd5dd6e39a8c3f7";
sha256 = "0qqd6qmkrdc0r3rnl53c3yp93fbcz7d3mdw3vq5gmdqxyym4s9lj";
};
patches = [
./library-path.patch
];
buildInputs = [
curl
cjson
olm
luaffi
];
postPatch = ''
substituteInPlace matrix.lua \
--replace "/usr/bin/curl" "${curl}/bin/curl" \
--replace "__NIX_LIB_PATH__" "$out/lib/?.so" \
--replace "__NIX_OLM_PATH__" "$out/share/?.lua"
substituteInPlace olm.lua \
--replace "__NIX_LIB_PATH__" "$out/lib/?.so"
'';
passthru.scripts = [ "matrix.lua" ];
installPhase = ''
mkdir -p $out/{share,lib}
cp {matrix.lua,olm.lua} $out/share
cp ${cjson}/lib/lua/${cjson.lua.luaversion}/cjson.so $out/lib/cjson.so
cp ${olm}/lib/libolm.so $out/lib/libolm.so
cp ${luaffi}/lib/lua/${luaffi.lua.luaversion}/ffi.so $out/lib/ffi.so
'';
meta = {
description = "WeeChat script in Lua that implements the matrix.org chat protocol";
homepage = "https://github.com/torhve/weechat-matrix-protocol-script";
maintainers = [ ];
license = lib.licenses.mit; # see https://github.com/torhve/weechat-matrix-protocol-script/blob/0052e7275ae149dc5241226391c9b1889ecc3c6b/matrix.lua#L53
platforms = lib.platforms.unix;
# As of 2019-06-30, all of the dependencies are available on macOS but the
# package itself does not build.
broken = stdenv.hostPlatform.isDarwin;
};
}

View File

@@ -1,28 +0,0 @@
diff --git a/matrix.lua b/matrix.lua
index b79f500..32b37a2 100644
--- a/matrix.lua
+++ b/matrix.lua
@@ -43,6 +43,9 @@ This script maps this as follows:
]]
+package.cpath = package.cpath .. ";__NIX_LIB_PATH__"
+package.path = package.path .. ";__NIX_OLM_PATH__"
+
local json = require 'cjson' -- apt-get install lua-cjson
local olmstatus, olm = pcall(require, 'olm') -- LuaJIT olm FFI binding ln -s ~/olm/olm.lua /usr/local/share/lua/5.1
local w = weechat
diff --git a/olm.lua b/olm.lua
index 114649c..4828371 100644
--- a/olm.lua
+++ b/olm.lua
@@ -17,6 +17,9 @@
* limitations under the License.
*/
--]]
+
+package.cpath = package.cpath .. ";__NIX_LIB_PATH__"
+
local ffi = require'ffi'
ffi.cdef[[

View File

@@ -100,7 +100,12 @@ let
(lib.escapeShellArg ''
if ! ( test -n "$DBUS_SESSION_BUS_ADDRESS" ); then
dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"
if ! test -d "$dbus_tmp_dir" && test -d "/run"; then
# Sometimes /run exists but is not writeable, (like when running in
# a linux builder on darwin) giving
# `mkdir: cannot create directory '/run/user': Permission denied`
# instead of going to the next fallback. Ensure we test with `-w`
# and not `-d`.
if ! test -d "$dbus_tmp_dir" && test -w "/run"; then
mkdir -p "$dbus_tmp_dir"
fi
if ! test -d "$dbus_tmp_dir"; then

View File

@@ -52,7 +52,7 @@ stdenv.mkDerivation (finalAttrs: {
passthru.updateScript = gitUpdater { rev-prefix = "v"; };
meta = {
homepage = "https://fork1oom.sourcecraft.site/";
homepage = "https://sourcecraft.dev/fork1oom/1oom";
changelog = "https://sourcecraft.dev/fork1oom/1oom/releases/v${finalAttrs.version}";
description = "Master of Orion (1993) game engine recreation; a more updated fork";
license = lib.licenses.gpl2Only;

View File

@@ -7,13 +7,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "3proxy";
version = "1.0.0";
version = "1.0.1";
src = fetchFromGitHub {
owner = "3proxy";
repo = "3proxy";
tag = finalAttrs.version;
sha256 = "sha256-JRoSCmoTIXHsUWZt9OyDVp1Veuy2w1ZPFe0rUGdJv0k=";
sha256 = "sha256-hLxafFU6nJ3I3NT3R24LPD7PBmQ1IZEbrVqvfmMZHIM=";
};
# They use 'install -s', that calls the native strip instead of the cross.

View File

@@ -15,13 +15,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "abracadabra";
version = "4.2.1";
version = "4.3.0";
src = fetchFromGitHub {
owner = "KejPi";
repo = "AbracaDABra";
tag = "v${finalAttrs.version}";
hash = "sha256-35E2a3UXyxcDixN5OAsiqlV0X+wkhS2vI6myHlpA2GA=";
hash = "sha256-wc2DuBUnD5AWjDUez2ZlgnJ4Kh2kizoJyW0evV3Iics=";
};
nativeBuildInputs = [

View File

@@ -7,7 +7,7 @@
python3Packages.buildPythonApplication (finalAttrs: {
pname = "adscan";
version = "13.1.0";
version = "13.2.0";
pyproject = true;
__structuredAttrs = true;
@@ -16,7 +16,7 @@ python3Packages.buildPythonApplication (finalAttrs: {
owner = "ADScanPro";
repo = "adscan";
tag = "v${finalAttrs.version}";
hash = "sha256-BmzXsbgS4gE5osU5Vt2GZrSYKOgKRkiPPoK2gurAk0I=";
hash = "sha256-5sMoN+aH+u9Fp+AWorhrm4TlKaIWTwjVhuvO33SnMGg=";
};
pythonRelaxDeps = [ "credsweeper" ];

View File

@@ -31,7 +31,7 @@
lib,
libnotify,
libappindicator,
systemd,
systemdLibs,
pciutils,
}:
let
@@ -86,7 +86,7 @@ stdenv.mkDerivation (finalAttrs: {
buildInputs = deps;
runtimeDependencies = [
(lib.getLib systemd)
(lib.getLib systemdLibs)
libnotify
libappindicator
pulseaudio

View File

@@ -20,7 +20,7 @@
libxkbcommon,
libgbm,
openssl,
systemd,
systemdLibs,
libxcb-cursor,
libxcb-wm,
libxcb-render-util,
@@ -63,7 +63,7 @@ stdenv.mkDerivation (finalAttrs: {
libgbm
openssl
stdenv.cc.cc
systemd
systemdLibs
libxcb-cursor
libx11
libxcb-wm

View File

@@ -1,12 +1,12 @@
{
lib,
stdenv,
stdenvNoCC,
fetchFromGitHub,
gprbuild,
gnat,
}:
stdenv.mkDerivation (finalAttrs: {
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "alire";
version = "2.1.1";

View File

@@ -12,16 +12,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "alistral";
version = "0.6.9";
version = "0.6.10";
src = fetchFromGitHub {
owner = "RustyNova016";
repo = "Alistral";
tag = "v${finalAttrs.version}";
hash = "sha256-tujuv6+V7n8uthV+3yc2aqZydgMRJDlunWi1ITofl14=";
hash = "sha256-G/DC2JtdnElm1iQf2TLWroej8eNsRAb9ZoeDYrEMdJg=";
};
cargoHash = "sha256-kzrWhE2S6XXU6wLDfYp76kMRnk3juxXWX4EdL3NjgSo=";
cargoHash = "sha256-77NF6t1WMHi7wtbJf1NjyYoj4amXh69/AJvFT/aEsQY=";
buildNoDefaultFeatures = true;
# Would be cleaner with an "--all-features" option

View File

@@ -7,16 +7,16 @@
buildNpmPackage rec {
pname = "all-the-package-names";
version = "2.0.2578";
version = "2.0.2590";
src = fetchFromGitHub {
owner = "nice-registry";
repo = "all-the-package-names";
tag = "v${version}";
hash = "sha256-fFJuN1MPpnpYCotAiQoRU5qEsyC6HjOTrjxfnyWj/+o=";
hash = "sha256-j8x2SSo7TaPy37ET1NWYz6GU/zMjjOL9jzFP0mRCwZ8=";
};
npmDepsHash = "sha256-8xzyypPgtfxYxPcVIJYLNL0a6EE7L93eISanWqPFGM4=";
npmDepsHash = "sha256-sA4kiDo4Q8WPqhxuIYIvU6R9cGYTTzxNMR224U864Gk=";
passthru.updateScript = nix-update-script { };

View File

@@ -36,7 +36,7 @@
nss,
pango,
pipewire,
systemd,
systemdLibs,
unzip,
wrapGAppsHook3,
}:
@@ -113,7 +113,7 @@ stdenv.mkDerivation (finalAttrs: {
nspr
nss
pango
systemd
systemdLibs
];
# Loaded with dlopen() by the main binary, so autoPatchelfHook cannot discover them.

View File

@@ -52,7 +52,7 @@ stdenv.mkDerivation (finalAttrs: {
meta = {
description = "PDF Evolution Library";
homepage = "https://apfel.mi.infn.it/";
homepage = "https://github.com/scarrazza/apfel";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ veprbl ];
platforms = lib.platforms.unix;

View File

@@ -76,7 +76,7 @@ stdenv.mkDerivation (finalAttrs: {
Since the /nix/store is not writable, you can instead place the file
at {file}`$HOME/acli.properties` to achieve the same effect.
'';
homepage = "https://apps.appf.re/acli";
homepage = "https://support.appfire.com/space/ACLI/60555464/Appfire+Command+Line+Interface+(CLI)";
license = lib.licenses.unfreeRedistributable;
sourceProvenance = with lib.sourceTypes; [ binaryBytecode ];
maintainers = with lib.maintainers; [ twey ];

View File

@@ -37,7 +37,7 @@ buildGoModule (finalAttrs: {
mainProgram = "arduino-language-server";
homepage = "https://github.com/arduino/arduino-language-server";
changelog = "https://github.com/arduino/arduino-language-server/releases/tag/${finalAttrs.version}";
license = lib.licenses.asl20;
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ BattleCh1cken ];
};
})

View File

@@ -6,12 +6,12 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "asmc-linux";
version = "2.39.07";
version = "2.40";
src = fetchFromGitHub {
owner = "nidud";
repo = "asmc_linux";
tag = "v${finalAttrs.version}";
hash = "sha256-JtJsyaw4UqMf9epMLGH+iQA0FYYlE9k2NG1aPOu6pec=";
hash = "sha256-5fbfLYQEoeAJJqZJ4Rs8WcHm2hD05OZOirNVxY66SdM=";
};
enableParallelBuilding = true;

View File

@@ -7,16 +7,16 @@
buildGoModule (finalAttrs: {
pname = "atmos";
version = "1.230.0";
version = "1.231.0";
src = fetchFromGitHub {
owner = "cloudposse";
repo = "atmos";
tag = "v${finalAttrs.version}";
hash = "sha256-2iyRkQQ+NKER60jBiGrcq+QKBO8+pt3nfHm9Tn3e+iU=";
hash = "sha256-8jTwgmqoz4/W61JvCnoIq+l0eFTmU+Y5aaYqUivfDXo=";
};
vendorHash = "sha256-J5TNPXzEz4gaNi2mEqkQ+t1JzmocbRRLwUwzLgAZU40=";
vendorHash = "sha256-Mzi4xP9cDmdnOYaVWfKaWnZ/HM/rCbdgPb+gBBTrASE=";
env.CGO_ENABLED = 0; # Compiles a pure statically linked Go binary.

View File

@@ -1,7 +1,10 @@
{
lib,
bashInteractive,
fetchFromGitHub,
gitMinimal,
installShellFiles,
ncurses,
nix-update-script,
nixosTests,
openssl,
@@ -12,16 +15,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "atuin";
version = "18.21.0";
version = "18.23.0";
src = fetchFromGitHub {
owner = "atuinsh";
repo = "atuin";
tag = "v${finalAttrs.version}";
hash = "sha256-kz8qdgxg79jX3hfPi7EY9c9SmFqUK6lWnMTLb3TKDQQ=";
hash = "sha256-NBn7C9ssLSXYrHWv5qWM5dZ2E8URbRJZOOCvHaNgxW4=";
};
cargoHash = "sha256-chuGpLq8XAZrCCtx2L/tVQSXNLrTgG2rnBGcCEvDjFg=";
cargoHash = "sha256-rkDDs8gviBpoLR4mrrKRu2eTlmlpvjICVRFu22AeOaU=";
# atuin's default features include 'check-updates', which do not make sense
# for distribution builds. List all other default features.
@@ -45,6 +48,14 @@ rustPlatform.buildRustPackage (finalAttrs: {
openssl
];
# e2e_pty tests drive an interactive bash (needs readline), run `clear`,
# and create git repositories for workspace filtering
nativeCheckInputs = [
bashInteractive
gitMinimal
ncurses
];
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
installShellCompletion --cmd atuin \
--bash <($out/bin/atuin gen-completions -s bash) \

View File

@@ -24,7 +24,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
meta = {
description = "Aurulent Sans";
longDescription = "Aurulent Sans is a humanist sans serif intended to be used as an interface font";
homepage = "http://delubrum.org/";
homepage = "https://github.com/deepfire/hartke-aurulent-sans";
maintainers = with lib.maintainers; [ pancaek ];
license = lib.licenses.ofl;
platforms = lib.platforms.all;

View File

@@ -13,13 +13,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "aws-lc";
version = "5.10.0";
version = "5.11.0";
src = fetchFromGitHub {
owner = "aws";
repo = "aws-lc";
rev = "v${finalAttrs.version}";
hash = "sha256-fQl7rh9edy+ZtFZ1aB8FezP9ORJkqlRkR16y3Ke1vQQ=";
hash = "sha256-2gsjaMgP8NcJVSdW2g4hGFySVfTfKJuSkjSrG8KTKWI=";
};
outputs = [

View File

@@ -63,7 +63,7 @@ stdenv.mkDerivation (finalAttrs: {
meta = {
description = "Full color painting software for illustration drawing";
homepage = "http://azsky2.html.xdomain.jp/soft/azpainter.html";
homepage = "https://azelpg.gitlab.io/azsky2/";
license = lib.licenses.gpl3Plus;
maintainers = [ ];
platforms = with lib.platforms; linux ++ darwin;

View File

@@ -27,7 +27,7 @@
nss,
openssl,
pango,
systemd,
systemdLibs,
wrapGAppsHook3,
libxrandr,
libxfixes,
@@ -183,7 +183,7 @@ stdenv.mkDerivation rec {
libxkbfile
pango
stdenv.cc.cc
systemd
systemdLibs
])
targetPath
sqltoolsserviceRpath

View File

@@ -1,38 +1,68 @@
{
lib,
stdenv,
rustPlatform,
fetchFromGitHub,
installShellFiles,
versionCheckHook,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
rustPlatform.buildRustPackage (finalAttrs: {
pname = "base91";
version = "0.1.0";
version = "0.3.2";
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "douzebis";
repo = "base91";
rev = "v${finalAttrs.version}";
hash = "sha256-Lx569OtNU0z884763FSByH0yXIq6GzeXyp5NVvMejco="; # update as needed
tag = "v${finalAttrs.version}";
hash = "sha256-1v/kvv+IUoYmrs6MrBmnA4UYIRjN4KICW/Q0zaiiGq0=";
};
makeFlags = [
"CC=cc"
"-C"
"src"
"all"
];
installFlags = [
"-C"
"src"
"install"
"prefix=$(out)"
];
cargoRoot = "rust";
buildAndTestSubdir = "rust/base91-cli";
cargoHash = "sha256-5ubqTQQz0OBZoe3Ql/e1H5S1cL1EhYVabcZ9FkfQzao=";
nativeBuildInputs = [ installShellFiles ];
postInstall = ''
ln -s base91 $out/bin/b91enc
ln -s base91 $out/bin/b91dec
''
+ lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
$out/bin/base91 --man > base91.1
installManPage base91.1
ln -s base91.1 $out/share/man/man1/b91enc.1
ln -s base91.1 $out/share/man/man1/b91dec.1
installShellCompletion --cmd base91 \
--bash <($out/bin/base91 --completions bash) \
--zsh <($out/bin/base91 --completions zsh) \
--fish <($out/bin/base91 --completions fish)
'';
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
meta = {
description = "CLI tool for encoding binary data as ASCII characters";
description = "Binary-to-text encoder and decoder for the basE91 format";
longDescription = ''
base91 encodes binary data as printable ASCII with about 23% overhead
(base64: 33%). It reads and writes Joachim Henke's basE91 format, as
the original C tool does. It also offers a fixed-width variant of the
format (--simd), designed for SIMD instructions: with SSE4.1, AVX2 or
NEON, it encodes and decodes at several GiB/s. b91enc and b91dec are
the encoder and decoder under their traditional names.
'';
homepage = "https://github.com/douzebis/base91";
changelog = "https://github.com/douzebis/base91/blob/${finalAttrs.src.tag}/CHANGELOG.md";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ douzebis ];
mainProgram = "base91";
platforms = lib.platforms.unix;
};
})

View File

@@ -32,7 +32,7 @@
libxkbcommon,
libgbm,
vulkan-loader,
systemd,
systemdLibs,
libGL,
krb5,
unixodbc,
@@ -100,7 +100,7 @@ stdenv.mkDerivation (finalAttrs: {
unixodbc
];
runtimeDependencies = lib.optionals stdenv.hostPlatform.isLinux (lib.getLib systemd);
runtimeDependencies = lib.optionals stdenv.hostPlatform.isLinux (lib.getLib systemdLibs);
installPhase = ''
runHook preInstall

View File

@@ -14,23 +14,23 @@
}:
let
pname = "beeper";
version = "4.3.73";
version = "4.3.160";
inherit (stdenv.hostPlatform) system;
sources = {
x86_64-linux = fetchurl {
url = "https://beeper-desktop.download.beeper.com/builds/Beeper-${version}-x86_64.AppImage";
hash = "sha256-j6HTTqU7+z8AJ20hYgia6wOH0/n3gxrUocCpMPmgQvQ=";
hash = "sha256-by07u75l8YjMnuL8VZWkAUjTkGmP/qwJoopIMtJX7Tc=";
};
aarch64-linux = fetchurl {
url = "https://beeper-desktop.download.beeper.com/builds/Beeper-${version}-arm64.AppImage";
hash = "sha256-kWlKMZdicJ+DhGgYXCTqvSCYinI9QD0pJD4nb4yYdpI=";
hash = "sha256-4mUxNwPrHbJvYQmX4KdYZcEmfV2MuSOEXrQKgl7DIa0=";
};
aarch64-darwin = fetchurl {
# Zip unpacks cleanly with unzip; the download API redirects to a .dmg.
url = "https://beeper-desktop.download.beeper.com/builds/Beeper-${version}-arm64-mac.zip";
hash = "sha256-79T3pPLEt+tQQ2xoC3XBAI/xpxMdnY11qSmVA2VFiVw=";
hash = "sha256-XrFxN57uOXIbgL8va/tgWtAaFTDVp9IxDWGJU0Kskbs=";
};
};
@@ -97,16 +97,19 @@ let
linuxConfigFilename=$appRoot/build/main/linux-*.mjs
echo "export function registerLinuxConfig() {}" > $linuxConfigFilename
# Disable scheduled update checks.
autoUpdateConfigFilename=$(
grep -lF 'c=d??{},p=c.hw_acceleration??!0' $appRoot/build/main/index-*.mjs
)
substituteInPlace "$autoUpdateConfigFilename" \
--replace-fail 'c=d??{},p=c.hw_acceleration??!0' 'c={...(d??{}),auto_update_disabled:true},p=c.hw_acceleration??!0'
# Disable (no-op) updater setup and checks without removing the methods
updateEntryFilename=$appRoot/build/main/main-entry-*.mjs
for method in 'async checkForUpdates' 'async runCheck' scheduleNextAutomaticCheck; do
signature="$method\([^)]*\)\{"
[ "$(grep -oE "$signature" $updateEntryFilename | wc -l)" -eq 1 ] \
|| (echo "Expected one $method updater method" >&2; exit 1)
sed -i -E "s/$signature/&return;/" $updateEntryFilename
done
# Disable user-triggered update checks, which ignore auto_update_disabled.
substituteInPlace $appRoot/build/main/main-entry-*.mjs \
--replace-fail 'async checkForUpdates(r=!1){' 'async checkForUpdates(r=!1){return;'
signature='(register\([^)]*\)\{)([^{}]*\.on\("error",this\.onError\))'
[ "$(grep -oE "$signature" $updateEntryFilename | wc -l)" -eq 1 ] \
|| (echo "Expected one updater register method" >&2; exit 1)
sed -i -E "s/$signature/\1return;\2/" $updateEntryFilename
'';
};
in

View File

@@ -27,13 +27,13 @@ in
stdenv.mkDerivation (finalAttrs: {
pname = "pds";
version = "0.4.5034";
version = "0.4.5037";
src = fetchFromGitHub {
owner = "bluesky-social";
repo = "pds";
tag = "v${finalAttrs.version}";
hash = "sha256-fsbnD9y0wxXq3NmVe5vMhI613G4HlZyqsv7+DNKzZzY=";
hash = "sha256-4llWhrtPZ6ZsA2CIDquNdR7WAdl4aKeG6WP0Q1sTyjs=";
};
sourceRoot = "${finalAttrs.src.name}/service";
@@ -63,7 +63,7 @@ stdenv.mkDerivation (finalAttrs: {
;
inherit pnpm;
fetcherVersion = 4;
hash = "sha256-nnhtJNw/D6Tir3n6rrURjL/cw1EWocs4/r4K7Yq4Fdk=";
hash = "sha256-Tfhv/PWnkPK/CuPzQ/vxS3UIO/TBjWBsshFRatjbcX4=";
};
buildPhase = ''

View File

@@ -39,7 +39,10 @@ buildGoModule (finalAttrs: {
homepage = "https://bosh.io";
changelog = "https://github.com/cloudfoundry/bosh-cli/releases/tag/v${finalAttrs.version}";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ ris ];
maintainers = with lib.maintainers; [
ris
a-hassanin
];
mainProgram = "bosh";
};
})

View File

@@ -85,6 +85,19 @@ stdenv.mkDerivation (finalAttrs: {
(cmakeBool "BOX2D_BUILD_UNIT_TESTS" finalAttrs.finalPackage.doCheck)
];
doCheck =
stdenv.buildPlatform.canExecute stdenv.hostPlatform
# b2Hash calls get struct reinterpreted as byte array for input, results not stable across endiannesses
&& stdenv.hostPlatform.isLittleEndian;
checkPhase = ''
runHook preCheck
./bin/test
runHook postCheck
'';
passthru = {
updateScript = nix-update-script { };
};

View File

@@ -102,7 +102,7 @@ stdenv.mkDerivation (finalAttrs: {
'';
meta = {
homepage = "http://www.t2-project.org/packages/bsd-games.html";
homepage = "https://t2linux.com/packages/bsd-games.html";
description = "Ports of all the games from NetBSD-current that are free";
license = lib.licenses.free;
maintainers = with lib.maintainers; [ viric ];

View File

@@ -59,7 +59,7 @@ stdenv.mkDerivation (finalAttrs: {
Bullet 3D Game Multiphysics Library provides state of the art collision
detection, soft body and rigid body dynamics.
'';
homepage = "http://bulletphysics.org";
homepage = "https://github.com/bulletphysics/bullet3";
license = lib.licenses.zlib;
maintainers = with lib.maintainers; [ aforemny ];
platforms = lib.platforms.unix;

View File

@@ -10,13 +10,13 @@
}:
buildNpmPackage (finalAttrs: {
pname = "bulwark";
version = "1.12.0";
version = "1.13.0";
src = fetchFromGitHub {
owner = "bulwarkmail";
repo = "webmail";
tag = finalAttrs.version;
hash = "sha256-Lt25tZBtxhqMiSM8lYP3M3MIQEItRC3L360WOEYTL84=";
hash = "sha256-oEpJj5w4nb3bp5WDmukn0Xn/OCZL3Clz1K2F09kJYWY=";
leaveDotGit = true;
postFetch = ''
cd "$out"
@@ -24,7 +24,7 @@ buildNpmPackage (finalAttrs: {
find "$out" -name .git -print0 | xargs -0 rm -rf
'';
};
npmDepsHash = "sha256-9p9Dn20U//UpFrDV/dksjWkfTD8almHR07lHF5Vtm8g=";
npmDepsHash = "sha256-ufEJsieashae6hAvRDowEOG6yD178lCr+228KhZ41lk=";
strictDeps = true;

View File

@@ -1,9 +1,7 @@
{
lib,
fetchFromGitHub,
fetchpatch2,
rustPlatform,
cacert,
writableTmpDirAsHomeHook,
flac,
lame,
@@ -19,39 +17,25 @@ let
in
rustPlatform.buildRustPackage (finalAttrs: {
pname = "caesura";
version = "0.31.0";
version = "0.32.0";
src = fetchFromGitHub {
owner = "RogueOneEcho";
repo = "caesura";
tag = "v${finalAttrs.version}";
hash = "sha256-+REt+MKImO7fnYWJ32P6mKzulGJTnxc+9ednVF5aCJU=";
hash = "sha256-7PRYjKwnLiHLQ0+egzwf3YAmyu6+/2ysHfMmyv/VUZY=";
};
patches = [
(fetchpatch2 {
name = "normalize-sox-dependent-full-spectrogram-widths.patch";
url = "https://github.com/RogueOneEcho/caesura/commit/3af818ae35a3e18f444c889d9d3b88294f4f110f.patch?full_index=1";
hash = "sha256-znAbk6hFVj198BUUwwDo76SWei0cKINeXzlYEFvTwHA=";
})
];
cargoHash = "sha256-0+vZma8AC44XqVHzmJT/roV7sy8w6DYhujRK9N91J5c=";
nativeBuildInputs = [
makeBinaryWrapper
];
nativeCheckInputs = [
cacert
writableTmpDirAsHomeHook
]
++ runtimeDeps;
env = {
CAESURA_NIX = "1";
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
};
postPatch = ''
substituteInPlace Cargo.toml crates/*/Cargo.toml \
--replace-fail 'version = "0.0.0"' 'version = "${finalAttrs.version}"'
@@ -68,6 +52,11 @@ rustPlatform.buildRustPackage (finalAttrs: {
--prefix PATH : ${lib.makeBinPath finalAttrs.passthru.runtimeDeps}
'';
doInstallCheck = true;
installCheckPhase = ''
$out/bin/caesura version --offline
'';
passthru = {
inherit runtimeDeps;
};

View File

@@ -17,7 +17,7 @@
pixman,
pkg-config,
scdoc,
systemd,
systemdLibs,
wayland,
wayland-protocols,
wayland-scanner,
@@ -56,7 +56,7 @@ stdenv.mkDerivation (finalAttrs: {
libxcb-wm
pango
pixman
systemd
systemdLibs
wayland
wayland-protocols
wlroots_0_19

View File

@@ -37,6 +37,9 @@ stdenv.mkDerivation (finalAttrs: {
env = {
NIX_CFLAGS_COMPILE = toString [
"-Wno-error=incompatible-pointer-types"
# GCC 16 warns about set-but-unused variables/parameters in the vendored mbedtls
"-Wno-error=unused-but-set-variable"
"-Wno-error=unused-but-set-parameter"
(lib.optionalString stdenv.cc.isClang "-Wno-error=documentation")
];
};

View File

@@ -2,6 +2,7 @@
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
cmake,
gfortran,
flex,
@@ -87,6 +88,13 @@ stdenv.mkDerivation (finalAttrs: {
# leaving it empty, and remove hardcoded absolute cmake build paths from
# Cflags (which would embed /nix/store paths from the build environment).
./casacore-pkgconfig.patch
# Fix undefined Dysco encoder template symbols with GCC 16
(fetchpatch {
url = "https://github.com/casacore/casacore/commit/60923a924d6380de04ee32042290c7e7426e3509.patch";
includes = [ "tables/Dysco/*" ];
hash = "sha256-j/Ukc6hvfGpWTlw3YZDjgu/UihFxfOoHMatpPP9KcO8=";
})
];
enableParallelBuilding = true;

View File

@@ -29,7 +29,7 @@ stdenv.mkDerivation (finalAttrs: {
doInstallCheck = true;
installCheckPhase = ''
readelf -d $out/bin/catatonit | grep 'There is no dynamic section in this file.'
${stdenv.cc.targetPrefix}readelf -d $out/bin/catatonit | grep 'There is no dynamic section in this file.'
'';
passthru.tests = { inherit (nixosTests) podman; };

View File

@@ -0,0 +1,42 @@
{
lib,
stdenv,
fetchFromGitHub,
versionCheckHook,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "cbirds";
version = "1.6.0";
src = fetchFromGitHub {
owner = "clainstone";
repo = "cbirds";
tag = "v${finalAttrs.version}";
hash = "sha256-MMctTFtEUYt3xn7gFYWcMlRFLkFXW+wu6/hTtTkO6Og=";
};
strictDeps = true;
__structuredAttrs = true;
installFlags = [ "PREFIX=${placeholder "out"}" ];
doCheck = true;
checkTarget = "test";
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
meta = {
description = "Flock of birds (Craig Reynolds' boids) in your terminal";
homepage = "https://github.com/clainstone/cbirds";
changelog = "https://github.com/clainstone/cbirds/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ tbutter ];
mainProgram = "cbirds";
platforms = lib.platforms.unix;
};
})

View File

@@ -56,7 +56,7 @@ stdenv.mkDerivation {
meta = {
description = "Viewer and mounter for video streams";
homepage = "https://cctv-viewer.org";
homepage = "https://github.com/iEvgeny/cctv-viewer";
license = lib.licenses.gpl3Only;
maintainers = with lib.maintainers; [ teohz ];
platforms = lib.platforms.linux;

View File

@@ -46,7 +46,7 @@ stdenv.mkDerivation rec {
'';
meta = {
description = "Clustering and comparing protein or nucleotide sequences";
homepage = "http://weizhongli-lab.org/cd-hit/";
homepage = "https://github.com/weizhongli/cdhit";
license = lib.licenses.gpl2;
maintainers = [ lib.maintainers.bzizou ];
platforms = lib.platforms.unix;

View File

@@ -59,7 +59,7 @@ python3Packages.buildPythonApplication (finalAttrs: {
meta = {
description = "Minimalistic configuration management system";
homepage = "https://www.sdi.st";
homepage = "https://www.cdi.st";
changelog = "https://code.ungleich.ch/ungleich-public/cdist/src/tag/${finalAttrs.version}/docs/changelog";
# Mostly. There are still couple types that are gpl3-only.

View File

@@ -8,7 +8,7 @@
buildGoModule (finalAttrs: {
pname = "cdncheck";
version = "1.3.1";
version = "1.3.2";
__structuredAttrs = true;
@@ -16,7 +16,7 @@ buildGoModule (finalAttrs: {
owner = "projectdiscovery";
repo = "cdncheck";
tag = "v${finalAttrs.version}";
hash = "sha256-lM+sw5AhM5gkrvcLqOZXwcKEtS3UBQYMmM5pPSS4xxQ=";
hash = "sha256-QBggYJ8DOTi1mLJZCv2sQ9BeZHPQ1clj9zTb9Abu/Fw=";
};
vendorHash = "sha256-TYCYAKhytk249YJkRrgFrH8RWl0yrxr5z0dNONKBufU=";

View File

@@ -99,7 +99,7 @@ buildFHSEnv {
util-linux.lib
libselinux
nspr
systemd
systemdLibs
gtk3
pango
harfbuzz

View File

@@ -0,0 +1,67 @@
# Electron rewrites bundled plugin manifests, so they need a writable copy.
{
coreutils,
flock,
writeShellApplication,
}:
writeShellApplication {
name = "chatgpt-launcher";
runtimeInputs = [
coreutils
flock
];
text = ''
: "''${CHATGPT_EXECUTABLE:?}"
: "''${CHATGPT_RESOURCES_SOURCE:?}"
: "''${CHATGPT_RESOURCES_CACHE_KEY:?}"
cacheHome="''${XDG_CACHE_HOME:-''${HOME:?XDG_CACHE_HOME and HOME are unset}/.cache}"
cacheRoot="$cacheHome/chatgpt/bundled-plugins-v2"
resourcesPath="$cacheRoot/$CHATGPT_RESOURCES_CACHE_KEY"
mkdir -p "$cacheRoot"
exec {initLockFd}> "$cacheRoot.lock"
flock --exclusive "$initLockFd"
# tmpfiles may remove the directory before its lock is acquired.
while true; do
mkdir -p "$resourcesPath"
if exec {resourcesLockFd}< "$resourcesPath"; then
flock --shared "$resourcesLockFd"
[[ "$resourcesPath" -ef "/proc/self/fd/$resourcesLockFd" ]] && break
exec {resourcesLockFd}>&-
else
[[ ! -d "$resourcesPath" ]] || exit 1
fi
done
if [[ ! -f "$resourcesPath/.complete" ]]; then
ln -sfn -t "$resourcesPath" \
"$CHATGPT_RESOURCES_SOURCE"/{codex,codex-code-mode-host,cua_node,native,rg,tectonic}
mkdir -p "$resourcesPath/plugins"
chmod -R u+w "$resourcesPath/plugins"
cp -RT --preserve=mode "$CHATGPT_RESOURCES_SOURCE/plugins" "$resourcesPath/plugins"
chmod -R u+w "$resourcesPath/plugins"
sync --file-system "$resourcesPath"
touch "$resourcesPath/.complete"
sync --file-system "$resourcesPath"
fi
exec {initLockFd}>&-
export CODEX_ELECTRON_BUNDLED_PLUGINS_RESOURCES_PATH="$resourcesPath"
waylandFlags=()
if [[ -n "''${NIXOS_OZONE_WL:-}" && -n "''${WAYLAND_DISPLAY:-}" ]]; then
waylandFlags=(
--ozone-platform=wayland
--enable-features=WaylandWindowDecorations
--enable-wayland-ime=true
)
fi
exec "$CHATGPT_EXECUTABLE" "''${waylandFlags[@]}" "$@"
'';
}

View File

@@ -1,49 +1,278 @@
{
lib,
stdenvNoCC,
stdenv,
callPackage,
fetchurl,
# hooks
autoPatchelfHook,
makeWrapper,
versionCheckHook,
wrapGAppsHook3,
writableTmpDirAsHomeHook,
# native build inputs
asar,
dpkg,
patchelf,
unzip,
# build inputs
alsa-lib,
at-spi2-atk,
at-spi2-core,
atk,
cairo,
cups,
dbus,
dconf,
expat,
gdk-pixbuf,
glib,
gtk3,
libgbm,
libnotify,
libusb1,
libx11,
libxcb,
libxcomposite,
libxdamage,
libxext,
libxfixes,
libxkbcommon,
libxrandr,
nspr,
nss,
pango,
qt6,
systemdLibs,
# runtime deps
bubblewrap,
coreutils,
gitMinimal,
libGL,
libpulseaudio,
libsecret,
lsb-release,
nodejs-slim,
pipewire,
ripgrep,
tectonic-unwrapped,
vulkan-loader,
xdg-utils,
# override to null to use bundled codex
codex,
}:
let
source = import ./source.nix;
inherit (stdenv.hostPlatform) isLinux isDarwin system;
inherit (stdenv.hostPlatform.node) arch platform;
in
stdenvNoCC.mkDerivation {
stdenv.mkDerivation (finalAttrs: {
pname = "chatgpt";
inherit (source) version;
inherit (finalAttrs.passthru.source) version;
src = fetchurl source.src;
src = fetchurl finalAttrs.passthru.source.src;
strictDeps = true;
__structuredAttrs = true;
postPatch = lib.optionalString isLinux ''
# autoPatchelf moves PT_INTERP beyond detect-libc's 2 KiB limit.
# Its process.report fallback crashes Electron.
asar extract usr/lib/chatgpt/resources/app.asar app
substituteInPlace app/node_modules/@parcel/watcher/index.js \
--replace-fail 'const family = familySync();' "const family = '${stdenv.hostPlatform.libc}';"
# Don't pack packages that were originally unpacked
unpackedDirs="$(
# Only descend into @scope directories
find usr/lib/chatgpt/resources/app.asar.unpacked/node_modules \
-mindepth 1 -maxdepth 2 \
! -name '@*' -printf '%P\n' -prune |
paste -sd,
)"
asar pack app usr/lib/chatgpt/resources/app.asar \
--unpack-dir "node_modules/{$unpackedDirs}"
'';
nativeBuildInputs = [
makeWrapper
]
++ lib.optionals isDarwin [
unzip
patchelf
]
++ lib.optionals isLinux [
asar
autoPatchelfHook
dpkg
qt6.wrapQtAppsHook
wrapGAppsHook3
];
sourceRoot = ".";
buildInputs = lib.optionals isLinux [
alsa-lib
at-spi2-atk
at-spi2-core
atk
cairo
cups
dbus
dconf
expat
gdk-pixbuf
glib
gtk3
libgbm
libnotify
libusb1
libx11
libxcb
libxcomposite
libxdamage
libxext
libxfixes
libxkbcommon
libxrandr
nspr
nss
pango
qt6.qtbase
stdenv.cc.cc.lib
systemdLibs
];
runtimeDependencies = lib.optionals isLinux [
libGL
libnotify
libpulseaudio
libsecret
pipewire
vulkan-loader
];
dontWrapGApps = true;
dontWrapQtApps = true;
sourceRoot = if isLinux then "root" else ".";
installPhase = ''
runHook preInstall
''
+ (
if isDarwin then
''
mkdir -p "$out/Applications" "$out/bin"
cp -a ChatGPT.app "$out/Applications"
makeWrapper "$out/Applications/ChatGPT.app/Contents/MacOS/ChatGPT" "$out/bin/ChatGPT"
''
else
''
mkdir -p "$out"
cp -r usr/* "$out"
mkdir -p "$out/Applications"
mkdir -p "$out/bin"
cp -a ChatGPT.app "$out/Applications"
ln -s "$out/Applications/ChatGPT.app/Contents/MacOS/ChatGPT" "$out/bin/ChatGPT"
# Remove the unused Qt 5 fallback shim.
rm -f "$out/lib/chatgpt/libqt5_shim.so"
# Keep only the native prebuild for this platform and architecture.
resources="$out/lib/chatgpt/resources"
find "$resources" -type d -name prebuilds -print0 | while IFS= read -r -d "" prebuildsPath; do
find "$prebuildsPath" -mindepth 1 -maxdepth 1 \
! -name "*${platform}-${arch}" \
-exec rm -rf -- {} +
done
''
+ lib.optionalString stdenv.hostPlatform.isGnu ''
find "$resources" -type f -name '*.musl.node' -delete
''
+ ''
ln -sf ${lib.getExe tectonic-unwrapped} "$resources/tectonic/tectonic"
ln -sf ${lib.getExe ripgrep} "$resources/rg"
mkdir -p "$resources/cua_node/bin"
ln -sf ${lib.getExe nodejs-slim} "$resources/cua_node/bin/node"
install -Dm755 ${lib.getExe finalAttrs.passthru.launcher} "$out/bin/chatgpt"
install -Dm644 ${./tmpfiles.conf} "$out/share/user-tmpfiles.d/chatgpt.conf"
''
+ lib.optionalString (codex != null) ''
ln -sf ${lib.getExe codex} "$resources/codex"
ln -sf ${lib.getExe' codex "codex-code-mode-host"} "$resources/codex-code-mode-host"
''
+ ''
# The launcher assumes this bundled-plugin resource layout.
for resource in codex codex-code-mode-host cua_node native rg tectonic plugins; do
if [[ ! -e "$resources/$resource" ]]; then
echo "Missing ChatGPT bundled-plugin resource: $resources/$resource" >&2
exit 1
fi
done
''
)
+ ''
runHook postInstall
'';
passthru.updateScript = ./update.sh;
postFixup = lib.optionalString isLinux ''
wrapProgram "$out/bin/chatgpt" \
"''${gappsWrapperArgs[@]}" \
"''${qtWrapperArgs[@]}" \
--set CHATGPT_EXECUTABLE "$out/lib/chatgpt/ChatGPT" \
--set CHATGPT_RESOURCES_SOURCE "$out/lib/chatgpt/resources" \
--set CHATGPT_RESOURCES_CACHE_KEY "''${out##*/}" \
--prefix PATH : ${
lib.makeBinPath [
bubblewrap
coreutils
gitMinimal
lsb-release
nodejs-slim
nodejs-slim.npm
xdg-utils
]
} \
--set-default CODEX_BROWSER_USE_NODE_PATH ${lib.getExe nodejs-slim} \
--set-default NODE_REPL_NODE_PATH ${lib.getExe nodejs-slim} \
${lib.escapeShellArgs (
lib.optionals (codex != null) [
"--set-default"
"CODEX_CLI_PATH"
(lib.getExe codex)
]
)}
'';
dontStrip = isLinux;
dontPatchELF = isDarwin;
dontPatchShebangs = isDarwin;
doInstallCheck = true;
nativeInstallCheckInputs = [
versionCheckHook
writableTmpDirAsHomeHook
];
versionCheckKeepEnvironment = [ "HOME" ];
passthru = {
updateScript = ./update.sh;
sources = lib.importJSON ./source.json;
source = finalAttrs.passthru.sources.${system} or (throw "chatgpt is not supported on ${system}");
launcher = callPackage ./launcher.nix { };
};
meta = {
description = "Desktop application for ChatGPT";
homepage = "https://openai.com/chatgpt/desktop/";
changelog = "https://help.openai.com/en/articles/9703738-macos-app-release-notes";
homepage = "https://developers.openai.com/codex/app";
changelog = "https://learn.chatgpt.com/docs/changelog?type=codex-app";
license = lib.licenses.unfree;
maintainers = with lib.maintainers; [ wattmto ];
platforms = lib.platforms.darwin;
maintainers = with lib.maintainers; [
wattmto
moraxyc
mdaniels5757
];
broken = stdenv.hostPlatform.isMusl;
platforms = lib.attrNames finalAttrs.passthru.sources;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
mainProgram = "ChatGPT";
mainProgram = if isDarwin then "ChatGPT" else "chatgpt";
};
}
})

View File

@@ -0,0 +1,23 @@
{
"aarch64-darwin": {
"version": "26.1007.30912",
"src": {
"url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.1007.30912.zip",
"hash": "sha256-tpmowtWi8jysWdxnOI4lr0v1/C+2qzD/okOpaOT4FaM="
}
},
"aarch64-linux": {
"version": "26.1007.21434",
"src": {
"url": "https://persistent.oaistatic.com/codex-app-prod/linux/deb/pool/main/c/chatgpt/chatgpt_26.1007.21434_arm64.deb",
"hash": "sha256-Vfrh4/sdYGmpBiDp5wc33Pi/IlVgTRV+KCzGdIobr0k="
}
},
"x86_64-linux": {
"version": "26.1007.21434",
"src": {
"url": "https://persistent.oaistatic.com/codex-app-prod/linux/deb/pool/main/c/chatgpt/chatgpt_26.1007.21434_amd64.deb",
"hash": "sha256-J2tTQcPXSyYdOtUhBvf6ft3gaEHkdn/ipAy1QJmx8+0="
}
}
}

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