Merge d9507283e6 into haskell-updates

This commit is contained in:
nixpkgs-ci[bot]
2026-08-14 00:26:30 +00:00
committed by GitHub
686 changed files with 11111 additions and 5663 deletions

View File

@@ -349,24 +349,33 @@ rec {
```
*/
_normaliseTreeFilter =
path: tree:
if tree == "directory" || isAttrs tree then
let
entries = _directoryEntries path tree;
normalisedSubtrees = mapAttrs (name: _normaliseTreeFilter (path + "/${name}")) entries;
subtreeValues = attrValues normalisedSubtrees;
in
# This triggers either when all files in a directory are filtered out
# Or when the directory doesn't contain any files at all
if all isNull subtreeValues then
null
# Triggers when we have the same as a `readDir path`, so we can turn it back into an equivalent "directory".
else if all isString subtreeValues then
"directory"
else
normalisedSubtrees
else
tree;
let
# Recurses into a tree that's already known to be a directory (either a "directory" or an attrset).
#
# Only directories need to be recursed into:
# Files are either null (excluded) or a file type string (included), which are already normalised.
#
# Checking this in the caller instead of here also avoids the thunk allocation for the path concatenation below.
recurse =
path: tree:
let
normalisedSubtrees = mapAttrs (
name: subtree:
if subtree == "directory" || isAttrs subtree then recurse (path + "/${name}") subtree else subtree
) (_directoryEntries path tree);
subtreeValues = attrValues normalisedSubtrees;
in
# This triggers either when all files in a directory are filtered out
# Or when the directory doesn't contain any files at all
if all isNull subtreeValues then
null
# Triggers when we have the same as a `readDir path`, so we can turn it back into an equivalent "directory".
else if all isString subtreeValues then
"directory"
else
normalisedSubtrees;
in
path: tree: if tree == "directory" || isAttrs tree then recurse path tree else tree;
/**
A minimal normalisation of a filesetTree, intended for pretty-printing:
@@ -526,6 +535,9 @@ rec {
else
"/" + concatStringsSep "/" fileset._internalBaseComponents + "/";
getBaseStringPrefix = substring 0 baseLength;
removeBaseStringPrefix = substring baseLength (-1);
baseLength = stringLength baseString;
# Check whether a list of path components under the base path exists in the tree.
@@ -551,7 +563,12 @@ rec {
# or a string ("directory" or "regular", etc.) in which case it's included
localTree != null;
in
recurse 0 tree;
# Start by recursing into the first element. This is guaranteed to be
# safe. components will never be empty (builtins.split can't make an
# empty list). Tree can be something other than an attrset, but if so,
# the isAttrs check will fail when being passed `or tree`, and the index
# being ahead doesn't matter.
recurse 2 (tree.${head components} or tree);
# Filter suited when there's no files
empty = _: _: false;
@@ -569,25 +586,34 @@ rec {
pathSlash = path + "/";
in
(
# Same as `hasPrefix baseString pathSlash`, but more efficient.
# The path is either the base itself or underneath it,
# but only on the few paths above it, so its checked first.
# With base /foo/bar this matches /foo/bar and /foo/bar/baz
# hasPrefix "/foo/bar/" "/foo/bar/baz/"
if getBaseStringPrefix pathSlash == baseString then
if pathSlash == baseString then
# The path is the base directory itself, which is always included
true
else
# Same as `removePrefix baseString path`, but more efficient.
# From the above code we know that hasPrefix baseString pathSlash holds, so this is safe.
# We don't use pathSlash here because we only needed the trailing slash for the prefix matching.
# With base /foo and path /foo/bar/baz this gives
# inTree (split "/" (removePrefix "/foo/" "/foo/bar/baz"))
# == inTree (split "/" "bar/baz")
# == inTree [ "bar" "baz" ]
inTree (split "/" (removeBaseStringPrefix path))
# Same as `hasPrefix pathSlash baseString`, but more efficient.
# The path is a proper ancestor of the base, which needs to be included for the base to be reachable:
# With base /foo/bar we need to include /foo:
# hasPrefix "/foo/" "/foo/bar/"
if substring 0 (stringLength pathSlash) baseString == pathSlash then
else if substring 0 (stringLength pathSlash) baseString == pathSlash then
true
# Same as `! hasPrefix baseString pathSlash`, but more efficient.
# With base /foo/bar we need to exclude /baz
# ! hasPrefix "/baz/" "/foo/bar/"
else if substring 0 baseLength pathSlash != baseString then
false
else
# Same as `removePrefix baseString path`, but more efficient.
# From the above code we know that hasPrefix baseString pathSlash holds, so this is safe.
# We don't use pathSlash here because we only needed the trailing slash for the prefix matching.
# With base /foo and path /foo/bar/baz this gives
# inTree (split "/" (removePrefix "/foo/" "/foo/bar/baz"))
# == inTree (split "/" "bar/baz")
# == inTree [ "bar" "baz" ]
inTree (split "/" (substring baseLength (-1) path))
# The path is unrelated to the base, so nothing from it is included
# With base /foo/bar this matches e.g. /baz
false
)
# This is a way have an additional check in case the above is true without any significant performance cost
&& (
@@ -802,21 +828,34 @@ rec {
*/
_unionTrees =
trees:
let
stringIndex = findFirstIndex isString null trees;
withoutNull = filter (tree: tree != null) trees;
in
if stringIndex != null then
if length trees == 1 then
# The union of a single tree simply returns the first element
head trees
else
let
# Like lib.findFirstIndex but without indexing.
# This is a hot path so the indexing arithmetic adds up.
firstStr = foldl' (
found: tree:
if found != null then
found
else if isString tree then
tree
else
found # null
) null trees;
nonNulls = filter (tree: tree != null) trees;
in
# If there's a string, it's always a fully included tree (dir or file),
# no need to look at other elements
elemAt trees stringIndex
else if withoutNull == [ ] then
# If all trees are null, then the resulting tree is also null
null
else
# The non-null elements have to be attribute sets representing partial trees
# We need to recurse into those
zipAttrsWith (name: _unionTrees) withoutNull;
if firstStr != null then
firstStr
else if nonNulls == [ ] then
null
else
# The non-null elements have to be attribute sets representing partial trees
# We need to recurse into those
zipAttrsWith (name: _unionTrees) nonNulls;
/**
Computes the intersection of two filesets.

View File

@@ -151,7 +151,24 @@ let
);
# Derived meta-data
useLLVM = final.isFreeBSD || final.isOpenBSD;
useLLVM =
final.isFreeBSD
|| final.isOpenBSD
|| final.isUefi
|| final.isMsvc
||
# because GCC does not support this platform yet
(with final; isWindows && isAarch64);
# Use the split GCC package set (`gccNGPackages`) instead of the
# monolithic `gcc`. No platform selects it yet; it is opt-in, set
# explicitly on a platform spec, so that the split set can be exercised
# before anything depends on it.
#
# I (@Ericson2314) plan on making obscure low-tier platforms (e.g.
# NetBSD) use it soon, so we can dogfood GCC NG and thereby iron out its
# bugs.
useGccNG = false;
libc =
if final.isDarwin then
@@ -176,9 +193,7 @@ let
"uclibc"
else if final.isAndroid then
"bionic"
else if
final.isLinux # default
then
else if final.isLinux then
"glibc"
else if final.isFreeBSD then
"fblibc"
@@ -190,6 +205,8 @@ let
"avrlibc"
else if final.isGhcjs then
null
else if final.isUefi then
null
else if final.isNone then
"newlib"
# TODO(@Ericson2314) think more about other operating systems

View File

@@ -93,7 +93,6 @@ rec {
config = "aarch64-unknown-linux-android";
androidSdkVersion = "35";
androidNdkVersion = "27";
libc = "bionic";
useAndroidPrebuilt = false;
useLLVM = true;
};
@@ -169,22 +168,18 @@ rec {
riscv64-embedded = {
config = "riscv64-none-elf";
libc = "newlib";
};
riscv32-embedded = {
config = "riscv32-none-elf";
libc = "newlib";
};
mips64-embedded = {
config = "mips64-none-elf";
libc = "newlib";
};
mips-embedded = {
config = "mips-none-elf";
libc = "newlib";
};
# https://github.com/loongson/la-softdev-convention/blob/master/la-softdev-convention.adoc#10-operating-system-package-build-requirements
@@ -201,17 +196,17 @@ rec {
mmix = {
config = "mmix-unknown-mmixware";
# Not `isNone`: the OS here is `mmixware`, so the bare-metal default does
# not apply.
libc = "newlib";
};
rx-embedded = {
config = "rx-none-elf";
libc = "newlib";
};
msp430 = {
config = "msp430-elf";
libc = "newlib";
};
avr = {
@@ -220,12 +215,10 @@ rec {
vc4 = {
config = "vc4-elf";
libc = "newlib";
};
or1k = {
config = "or1k-elf";
libc = "newlib";
};
m68k = {
@@ -250,7 +243,6 @@ rec {
arm-embedded = {
config = "arm-none-eabi";
libc = "newlib";
};
arm-embedded-nano = {
config = "arm-none-eabi";
@@ -258,7 +250,6 @@ rec {
};
armhf-embedded = {
config = "arm-none-eabihf";
libc = "newlib";
# GCC8+ does not build without this
# (https://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg552339.html):
gcc = {
@@ -269,38 +260,31 @@ rec {
aarch64-embedded = {
config = "aarch64-none-elf";
libc = "newlib";
rust.rustcTarget = "aarch64-unknown-none";
};
aarch64be-embedded = {
config = "aarch64_be-none-elf";
libc = "newlib";
};
ppc-embedded = {
config = "powerpc-none-eabi";
libc = "newlib";
};
ppcle-embedded = {
config = "powerpcle-none-eabi";
libc = "newlib";
};
i686-embedded = {
config = "i686-elf";
libc = "newlib";
};
x86_64-embedded = {
config = "x86_64-elf";
libc = "newlib";
};
microblaze-embedded = {
config = "microblazeel-none-elf";
libc = "newlib";
};
#
@@ -338,16 +322,10 @@ rec {
x86_64-unknown-uefi = {
config = "x86_64-unknown-uefi";
libc = null;
useLLVM = true;
linker = "lld";
};
aarch64-unknown-uefi = {
config = "aarch64-unknown-uefi";
libc = null;
useLLVM = true;
linker = "lld";
};
#
@@ -382,12 +360,11 @@ rec {
};
# mingw-w64 with ucrt for Aarch64, default compiler (which is LLVM
# because GCC does not support this platform yet).
# see ./default.nix).
mingw-ucrt-aarch64 = {
config = "aarch64-w64-mingw32";
libc = "ucrt";
rust.rustcTarget = "aarch64-pc-windows-gnullvm";
useLLVM = true;
};
# mingw-64 back compat
@@ -400,12 +377,10 @@ rec {
# Target the MSVC ABI
x86_64-windows = {
config = "x86_64-pc-windows-msvc";
useLLVM = true;
};
aarch64-windows = {
config = "aarch64-pc-windows-msvc";
useLLVM = true;
};
x86_64-cygwin = {
@@ -416,12 +391,10 @@ rec {
aarch64-freebsd = {
config = "aarch64-unknown-freebsd";
useLLVM = true;
};
x86_64-freebsd = {
config = "x86_64-unknown-freebsd";
useLLVM = true;
};
x86_64-netbsd = {

View File

@@ -63,6 +63,12 @@
{
# keep-sorted start case=no numeric=no block=yes
"3mp3ri0r" = {
email = "christoforus@xendit.co";
github = "3mp3ri0r";
githubId = 3140815;
name = "Christoforus Surjoputro";
};
_0b11stan = {
name = "Tristan Auvinet Pinaudeau";
email = "tristan@tic.sh";
@@ -616,6 +622,11 @@
{ fingerprint = "CE85 54F7 B9BC AC0D D648 5661 AB5F C04C 3C94 443F"; }
];
};
ad-si = {
name = "Adrian Sieber";
github = "ad-si";
githubId = 36796532;
};
ad030 = {
name = "Alex Dam";
github = "ad030";
@@ -2325,6 +2336,12 @@
githubId = 8049011;
name = "Arik Grahl";
};
arison = {
email = "arison@duck.com";
github = "ArisoN-ext";
githubId = 181835726;
name = "ArisoN";
};
ariutta = {
email = "anders.riutta@gmail.com";
github = "ariutta";
@@ -7123,6 +7140,12 @@
githubId = 15774340;
name = "Thomas Depierre";
};
dibenzepin = {
name = "Fumnanya";
email = "fmowete@outlook.com";
github = "dibenzepin";
githubId = 87488715;
};
DictXiong = {
email = "me@beardic.cn";
github = "DictXiong";
@@ -11273,11 +11296,6 @@
githubId = 58676303;
name = "hhydraa";
};
hibiday = {
name = "Katsumi Takeuchi";
github = "hibiday";
githubId = 137286929;
};
higebu = {
name = "Yuya Kusakabe";
email = "yuya.kusakabe@gmail.com";
@@ -22807,12 +22825,6 @@
githubId = 4201956;
name = "pongo1231";
};
poopsicles = {
name = "Fumnanya";
email = "fmowete@outlook.com";
github = "dibenzepin";
githubId = 87488715;
};
PopeRigby = {
name = "PopeRigby";
github = "poperigby";
@@ -23872,6 +23884,12 @@
{ fingerprint = "01D7 5486 3A6D 64EA AC77 0D26 FBF1 9A98 2CCE 0048"; }
];
};
recutita = {
name = "Katsumi Takeuchi";
email = "contact@recutita.com";
github = "recutita";
githubId = 137286929;
};
redfish64 = {
email = "engler@gmail.com";
github = "redfish64";

View File

@@ -23,6 +23,7 @@ digestif,,,,,5.3,
dkjson,,,,,,
enet,,,,,,ulysseszhan
etlua,,,,,,ulysseszhan
fallo,,,,,,mrcjkb
fennel,,,,,,misterio77
fidget.nvim,,,,,5.1,mrcjkb
fifo,,,,,,
1 name rockspec ref server version luaversion maintainers
23 dkjson
24 enet ulysseszhan
25 etlua ulysseszhan
26 fallo mrcjkb
27 fennel misterio77
28 fidget.nvim 5.1 mrcjkb
29 fifo

View File

@@ -395,7 +395,7 @@ have a predefined type and string generator already declared under
`mkRaw pythonCode`
: Outputs the given string as raw Python code
: Outputs the given string as raw Python code. Note that the final result will be stripped of any comments.
`_imports`

View File

@@ -0,0 +1,57 @@
# State revision {#sec-state-revision}
NixOS includes a {option}`system.stateVersion` option, used by some modules for a
variety of reasons related to non-backward-compatible changes to software or
the module itself.
Module authors are discouraged from adding new uses of
{option}`system.stateVersion` to their module.
However, when the alternatives are impractical, modules that wish to consume
{option}`system.stateVersion` should instead define their own `stateRevision`
option using `utils.mkStateRevisionOption`.
There should be no uses of `config.system.stateVersion` directly in the module.
(Note the name difference: the {option}`system.stateVersion` option, with a V,
takes a value that looks like "YY.MM".
A `stateRevision` option, with an R, takes a non-negative integer value.)
Modules should also add the value of their `stateRevision` option to
`system.moduleStateRevisions."your.module.stateRevision"`, when the module is
enabled.
This is a purely informative option that exists to help describe the effects of
changing {option}`system.stateVersion`.
Example:
```nix
{
lib,
config,
utils,
...
}:
let
cfg = config.services.whatever;
in
{
options.services.whatever = {
enable = lib.mkEnableOption "whatever, a service that does whatever";
stateRevision = utils.mkStateRevisionOption {
descriptionName = "the whatever service";
migrations = {
"26.05" = "Rename `/var/lib/old_name` to `/var/lib/new_name`.";
};
};
};
config = lib.mkIf cfg.enable {
systemd.services.whatever = {
# ...
serviceConfig.StateDirectory = if cfg.stateRevision < 1 then "old_name" else "new_name";
};
# Important: this is inside the `lib.mkIf cfg.enable`
system.moduleStateRevisions."services.whatever.stateRevision" = cfg.stateRevision;
};
}
```

View File

@@ -220,4 +220,5 @@ importing-modules.section.md
replace-modules.section.md
freeform-modules.section.md
settings-options.section.md
state-revision.section.md
```

View File

@@ -253,6 +253,9 @@
"sec-override-nixos-test": [
"index.html#sec-override-nixos-test"
],
"sec-state-revision": [
"index.html#sec-state-revision"
],
"sec-wireless-declarative": [
"index.html#sec-wireless-declarative"
],

View File

@@ -28,6 +28,10 @@
firewall, is available through
[services.portmaster](#opt-services.portmaster.enable).
- [btrfs-heatmap](https://github.com/knorrie/btrfs-heatmap), setcap wrapper for `btrfs-heatmap` package, a visualizer of how a btrfs filesystem is using the underlying disk space of the block devices. Available as [programs.btrfs-heatmap](#opt-programs.btrfs-heatmap.enable)
- [compsize](https://github.com/kilobyte/compsize), setcap wrapper for `compsize` package, a cli utility to to inspect compression type/ratio on BTRFS filesystems. Available as [programs.compsize](#opt-programs.compsize.enable)
- [tranquil](https://tangled.org/tranquil.farm/tranquil-pds) is an ATProto PDS (personal data server) implementation in Rust. A featureful, spec conscious and community driven alternative to the Bluesky reference implementation PDS. Available as [services.tranquil-pds](#opt-services.tranquil-pds.enable).
- [Moonlight Qt](https://moonlight-stream.org/), a client for playing your PC games on almost any device. Available as [programs.moonlight-qt](#opt-programs.moonlight-qt.enable).
@@ -62,6 +66,8 @@
- [Zapret2](https://github.com/bol-van/zapret2), an extensible DPI bypass program. Available as [services.zapret2](#opt-services.zapret2.enable).
- [Solaar](https://github.com/pwr-Solaar/Solaar), a program to control logitech devices.
- [FlapAlerted](https://github.com/Kioubit/FlapAlerted), detects BGP flapping events and provides statistics based on BGP update messages. Available as [services.flap-alerted](#opt-services.flap-alerted.enable).
- [gocron](https://github.com/flohoss/gocron), a task scheduler with web interface. Available as [services.gocron](#opt-services.gocron.enable).
@@ -84,6 +90,8 @@
- [Entropy](https://github.com/ergohaven/entropy), a configurator for programmable keyboards and input devices running Vial-QMK/RMK firmware. Available as [programs.entropy](#opt-programs.entropy.enable).
- [Kvrocks](https://kvrocks.apache.org/), a distributed key value NoSQL database compatible with the Redis protocol. Available as [services.kvrocks](#opt-services.kvrocks.enable).
## Backward Incompatibilities {#sec-release-26.11-incompatibilities}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
@@ -118,6 +126,8 @@
- Rustical migrates from `settings.http.host` and `settings.http.port` to `settings.http.bind` to support UNIX domain sockets as well as TCP sockets in one setting.
- The `jetty_11` package has been removed as it reached end of life. Use `jetty_12` instead.
- The Mullvad VPN service now has a separate toggle to enable the Mullvad VPN graphical user interface. If you have previously used Mullvad on a desktop by setting `services.mullvad-vpn.package` to `pkgs.mullvad-vpn`, you should now **unset that option**, and enable `services.mullvad-vpn.gui.enable`. The VPN will not work if `services.mullvad-vpn.package` is set to `pkgs.mullvad-vpn`, as `pkgs.mullvad-vpn` no longer contains the Mullvad Daemon; please ensure that `services.mullvad-vpn.package` is set to `pkgs.mullvad`, regardless if you plan to enable the graphical user interface or not.
- A number of options for `services.llama-cpp` have been removed in favor of the structured [](#opt-services.llama-cpp.settings) option, attributes from which are used as arguments to `llama-server` executable, you can see all available options by running `llama-server --help`. Configuring model presets using Nix attribute set via `services.llama-cpp.modelsPreset` is no longer supported, please use `services.llama-cpp.settings.models-preset` with a path to an INI file containing desired options.
@@ -237,3 +247,5 @@
- `trilium-desktop` and `trilium-server` have been updated to 0.104.0. This release includes security hardening fixes that may break functionality. [See upstream release note for details](https://github.com/TriliumNext/Trilium/releases/tag/v0.104.0).
- `nix` now supports running in "daemonless" mode by setting `nix.daemon.enable = false`. Under this mode all store operations must go through the [local store type](https://nix.dev/manual/nix/latest/store/types/local-store), which typically requires root permissions.
- [Hister](https://github.com/asciimoo/hister), a web history service offering blazing fast, content-based search across visited websites. Available as [services.hister](#opt-services.hister.enable).

View File

@@ -60,7 +60,7 @@ buildPythonApplication {
util-linux
vde2
]
++ lib.optionals stdenv.isLinux [
++ lib.optionals stdenv.hostPlatform.isLinux [
vhost-device-vsock
]
++ lib.optionals enableNspawn [

View File

@@ -8,12 +8,12 @@ testModuleArgs@{
}:
let
inherit (lib) mkOption types;
inherit (types) either str functionTo;
inherit (types) either lines functionTo;
in
{
options = {
testScript = mkOption {
type = either str (functionTo str);
type = either lines (functionTo lines);
apply =
v:
if lib.isFunction v then
@@ -27,7 +27,7 @@ in
'';
};
testScriptString = mkOption {
type = str;
type = lines;
readOnly = true;
internal = true;
};

View File

@@ -6,8 +6,10 @@
let
inherit (lib)
all
any
attrNames
concatImapStringsSep
concatMapStringsSep
concatStringsSep
elem
@@ -27,8 +29,11 @@ let
isList
isPath
isString
length
listToAttrs
literalMD
mapAttrs
mkOption
nameValuePair
optionalString
removePrefix
@@ -36,8 +41,10 @@ let
splitString
stringToCharacters
types
versionOlder
;
inherit (lib.lists) findFirstIndex;
inherit (lib.strings) toJSON escapeC;
in
@@ -604,6 +611,122 @@ let
lib.listToAttrs
];
};
/**
Creates a per-module `stateRevision` option that takes an int value, with a
default that is derived from `system.stateVersion`.
# Inputs
`descriptionName`
: A human-friendly name for your module, used for the description of the
created option.
`migrations`
: Attribute set that maps from values of `system.stateVersion`
(representing the breakpoints at which the default value of this option
will change) to Markdown instructions to users for manually migrating
their data to this breakpoint. The migration instructions will be
included in the NixOS documentation for this option. (These instructions
must only contain Markdown inlines, because they will be rendered as
items in an ordered list. In particular, nested lists will not render
correctly.)
`migrations` will also be exposed as an attribute on the result.
# Examples
:::{.example}
## `lib.options.mkStateRevisionOption` usage example
```nix
exampleModule =
{ lib, config, utils, ... }:
{
options.services.whatever = {
stateRevision = utils.mkStateRevisionOption {
descriptionName = "the whatever service";
migrations = {
"26.05" = "Rename `/var/lib/old_name` to `/var/lib/new_name`.";
"26.11" = "Run the `upgrade_whatever` utility.";
};
};
};
};
}
(pkgs.nixos [
exampleModule
{ system.stateVersion = "25.11"; }
]).config.services.whatever.stateRevision # => 0
(pkgs.nixos [
exampleModule
{ system.stateVersion = "26.05"; }
]).config.services.whatever.stateRevision # => 1
(pkgs.nixos [
exampleModule
{ system.stateVersion = "27.05"; }
]).config.services.whatever.stateRevision # => 2
```
:::
Modules should use this function when they change how data managed by the
module is persisted on the system between NixOS releases.
The default value of the option will be the number of attributes in the
`migrations` parameter with name less than or equal to the value of
`system.stateVersion`.
When using this function, don't forget to add the option's value to
`system.moduleStateRevisions."your.module.stateRevision"` when your module is
enabled.
*/
mkStateRevisionOption =
{
descriptionName,
migrations,
}:
let
versions = attrNames migrations;
maxVal = length versions;
in
assert all (v: builtins.match "[0-9]{2}\\.[0-9]{2}" v != null) versions;
mkOption {
type = types.ints.between 0 maxVal;
description = ''
This option versions the format of state persisted by
${descriptionName}. Its default value depends on the value of
{option}`system.stateVersion`.
Users who wish to increment this option will need to take manual
migration steps to preserve their data. **If you perform these
migrations, rolling back to an older generation will require also
reversing the migrations to the state expected by that generation.**
The migrations needed to advance to each value of this option are as
follows (perform all instructions after the row for the current
`stateRevision`, up to and including the row for the new
`stateRevision`):
0. (none)
${concatImapStringsSep "\n" (
v: sv: "${toString v}. ${replaceStrings [ "\n" ] [ " " ] migrations.${sv}}"
) versions}
Note that you do **not** need to change {option}`system.stateVersion`
in order to update this option. {option}`system.stateVersion` only
determines the default value of this option. Most users should not
change {option}`system.stateVersion` at all.
'';
default = findFirstIndex (versionOlder config.system.stateVersion) maxVal versions;
defaultText = literalMD ''
If {option}`system.stateVersion` is:
${concatImapStringsSep "\n" (v: sv: "* &lt;${sv}: ${toString (v - 1)}") versions}
* otherwise: ${toString maxVal}
'';
}
// {
inherit migrations;
};
};
in
utils

View File

@@ -19,8 +19,8 @@ in
[ "hardware" "logitech" "wireless" "enable" ]
)
(lib.mkRenamedOptionModule
[ "hardware" "logitech" "enableGraphical" ]
[ "hardware" "logitech" "wireless" "enableGraphical" ]
[ "programs" "solaar" "enable" ]
)
];
@@ -56,20 +56,11 @@ in
wireless = {
enable = lib.mkEnableOption "support for Logitech Wireless Devices";
enableGraphical = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable graphical support applications.";
};
};
};
config = lib.mkIf (cfg.wireless.enable || cfg.lcd.enable) {
environment.systemPackages =
[ ]
++ lib.optional cfg.wireless.enable pkgs.ltunify
++ lib.optional cfg.wireless.enableGraphical pkgs.solaar;
environment.systemPackages = lib.optional cfg.wireless.enable pkgs.ltunify;
services.udev = {
# ltunifi and solaar both provide udev rules but the most up-to-date have been split

View File

@@ -482,7 +482,7 @@ in
combineIcdPkgs =
icd: pkgs:
pkgs.symlinkJoin {
name = "nvidia-egl-external-platforms${lib.optionalString pkgs.stdenv.is32bit "-x32"}";
name = "nvidia-egl-external-platforms${lib.optionalString pkgs.stdenv.hostPlatform.is32bit "-x32"}";
paths = lib.attrVals icd pkgs;
# Remediate reversed priorities in pre-595 drivers,
# https://github.com/NixOS/nixpkgs/pull/497342#issuecomment-4034876793

View File

@@ -254,6 +254,30 @@ in
'';
};
moduleStateRevisions = mkOption {
type =
let
baseType = types.attrsOf types.ints.unsigned;
isStateRevisionOption = x: lib.isOption x && x ? migrations;
in
types.addCheck baseType (
attrs:
builtins.all (
attrPath: isStateRevisionOption (lib.attrByPath (lib.splitString "." attrPath) null options)
) (builtins.attrNames attrs)
)
// {
description = "${baseType.description}, in which every attribute name is the path to an option created with mkStateRevisionOption";
};
default = { };
internal = true;
description = ''
NixOS modules should set attributes on this option. Users should leave
it alone. Future tooling may use it to determine the consequences of
updating {option}`system.stateVersion`.
'';
};
configurationRevision = mkOption {
type = types.nullOr types.str;
default = null;

View File

@@ -185,6 +185,7 @@
./programs/bcc.nix
./programs/benchexec.nix
./programs/browserpass.nix
./programs/btrfs-heatmap.nix
./programs/calls.nix
./programs/captive-browser.nix
./programs/ccache.nix
@@ -196,6 +197,7 @@
./programs/cnping.nix
./programs/comma.nix
./programs/command-not-found/command-not-found.nix
./programs/compsize.nix
./programs/coolercontrol.nix
./programs/corefreq.nix
./programs/cpu-energy-meter.nix
@@ -326,6 +328,7 @@
./programs/skim.nix
./programs/slock.nix
./programs/sniffnet.nix
./programs/solaar.nix
./programs/soundmodem.nix
./programs/ssh.nix
./programs/starship.nix
@@ -548,6 +551,7 @@
./services/databases/hbase-standalone.nix
./services/databases/influxdb2.nix
./services/databases/influxdb.nix
./services/databases/kvrocks.nix
./services/databases/lldap.nix
./services/databases/memcached.nix
./services/databases/monetdb.nix
@@ -1711,6 +1715,7 @@
./services/web-apps/haven.nix
./services/web-apps/healthchecks.nix
./services/web-apps/hedgedoc.nix
./services/web-apps/hister.nix
./services/web-apps/hledger-web.nix
./services/web-apps/homebox.nix
./services/web-apps/homer.nix

View File

@@ -0,0 +1,32 @@
{
config,
pkgs,
lib,
...
}:
{
meta.maintainers = with lib.maintainers; [ sandarukasa ];
options = {
programs.btrfs-heatmap = {
enable = lib.mkEnableOption "btrfs-heatmap + setcap wrapper";
package = lib.mkPackageOption pkgs "btrfs-heatmap" { };
};
};
config =
let
cfg = config.programs.btrfs-heatmap;
in
lib.mkIf cfg.enable {
# for the man page
environment.systemPackages = [ cfg.package ];
security.wrappers.btrfs-heatmap = {
owner = config.users.users.root.name;
group = config.users.users.root.group;
capabilities = "cap_sys_admin+p";
source = lib.getExe cfg.package;
};
};
}

View File

@@ -0,0 +1,32 @@
{
config,
pkgs,
lib,
...
}:
{
meta.maintainers = with lib.maintainers; [ sandarukasa ];
options = {
programs.compsize = {
enable = lib.mkEnableOption "compsize + setcap wrapper";
package = lib.mkPackageOption pkgs "compsize" { };
};
};
config =
let
cfg = config.programs.compsize;
in
lib.mkIf cfg.enable {
# for the man page
environment.systemPackages = [ cfg.package ];
security.wrappers.compsize = {
owner = config.users.users.root.name;
group = config.users.users.root.group;
capabilities = "cap_sys_admin+p";
source = lib.getExe cfg.package;
};
};
}

View File

@@ -0,0 +1,93 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.programs.solaar;
inherit (lib)
mkEnableOption
mkIf
mkOption
types
maintainers
mkPackageOption
;
in
{
options.programs.solaar = {
enable = mkEnableOption "Solaar, the open source driver for Logitech devices.";
package = mkPackageOption pkgs "solaar" { };
userService = {
enable = mkEnableOption "Enable the solaar systemd service for each user.";
window = mkOption {
type = types.enum [
"show"
"hide"
"only"
];
default = "hide";
description = ''
Start with window showing / hidden / only (no tray icon).
'';
};
batteryIcons = mkOption {
type = types.enum [
"regular"
"symbolic"
"solaar"
];
default = "regular";
description = ''
Prefer regular battery / symbolic battery / solaar icons.
'';
};
extraArgs = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "--restart-on-wake-up" ];
description = ''
Extra arguments to pass to Solaar.
'';
};
};
};
config = mkIf cfg.enable {
hardware.logitech.wireless.enable = lib.mkDefault true;
environment.systemPackages = [ cfg.package ];
systemd.user.services.solaar = mkIf cfg.userService.enable {
description = "Solaar, the open source driver for Logitech devices";
wantedBy = [ "graphical-session.target" ];
partOf = [ "graphical-session.target" ];
after = [ "dbus.service" ];
serviceConfig = {
Type = "simple";
ExecStart = lib.escapeShellArgs (
[
(lib.getExe cfg.package)
"--window"
cfg.userService.window
"--battery-icons"
cfg.userService.batteryIcons
]
++ cfg.userService.extraArgs
);
Restart = "on-failure";
RestartSec = "5";
};
};
};
meta = {
maintainers = [ maintainers.Svenum ];
};
}

View File

@@ -6,7 +6,7 @@
}:
let
inherit (lib.options) mkEnableOption mkPackageOption mkOption;
inherit (lib.modules) mkIf;
inherit (lib.modules) mkIf mkAfter;
inherit (lib.meta) getExe;
inherit (lib.types) listOf str;
inherit (lib.strings) concatStringsSep;
@@ -52,15 +52,15 @@ in
environment.systemPackages = [ cfg.package ];
programs = {
zsh.interactiveShellInit = mkIf cfg.enableZshIntegration ''
zsh.interactiveShellInit = mkIf cfg.enableZshIntegration (mkAfter ''
eval "$(${getExe cfg.package} init zsh ${cfgFlags} )"
'';
bash.interactiveShellInit = mkIf cfg.enableBashIntegration ''
'');
bash.interactiveShellInit = mkIf cfg.enableBashIntegration (mkAfter ''
eval "$(${getExe cfg.package} init bash ${cfgFlags} )"
'';
fish.interactiveShellInit = mkIf cfg.enableFishIntegration ''
'');
fish.interactiveShellInit = mkIf cfg.enableFishIntegration (mkAfter ''
${getExe cfg.package} init fish ${cfgFlags} | source
'';
'');
xonsh.config = ''
execx($(${getExe cfg.package} init xonsh ${cfgFlags}), 'exec', __xonsh__.ctx, filename='zoxide')
'';

View File

@@ -79,7 +79,7 @@ in
};
firstUid = mkOption {
type = types.numbers.between 1000 65533;
type = types.ints.between 1000 65533;
default = 60000;
description = ''
Start of block of UIDs reserved for sandboxes.
@@ -87,7 +87,7 @@ in
};
firstGid = mkOption {
type = types.numbers.between 1000 65533;
type = types.ints.between 1000 65533;
default = 60000;
description = ''
Start of block of GIDs reserved for sandboxes.
@@ -95,7 +95,7 @@ in
};
numBoxes = mkOption {
type = types.numbers.between 1000 65533;
type = types.ints.between 1000 65533;
default = 1000;
description = ''
Number of UIDs and GIDs to reserve, starting from

View File

@@ -0,0 +1,278 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.kvrocks;
format = pkgs.formats.keyValue {
# Emit list values as repeated keys (e.g. rename-command), matching MultiStringField.
listsAsDuplicateKeys = true;
mkKeyValue = lib.generators.mkKeyValueDefault {
mkValueString = v: if lib.isBool v then lib.boolToYesNo v else toString v;
} " ";
};
defaultDir = "/var/lib/kvrocks";
dataDir = cfg.settings.dir;
isDefaultDir = dataDir == defaultDir;
# Defaults match upstream Config field defaults (config.cc).
workers = cfg.settings.workers or 8;
maxBackgroundJobs = cfg.settings."rocksdb.max_background_jobs" or 4;
maxclients = cfg.settings.maxclients or 10240;
maxOpenFiles = cfg.settings."rocksdb.max_open_files" or 8096;
# Thread inventory from server.cc ("Kvrocks threads list") + Server::Start:
# always-on: main, workers, task-runner (1), server-cron, compact-check,
# rocksdb background (bounded by max_background_jobs)
# optional: master-repl (+ ≤4 parallel fetch via std::async on full sync),
# feed-slave per replica, slot-migrate (cluster)
alwaysOnThreads = 1 + workers + 1 + 1 + 1 + maxBackgroundJobs;
# 1 master-repl + 4 fetch + 1 slot-migrate + ~16 replicas + misc (jemalloc, …)
dynamicThreadMargin = 32;
# From Server::AdjustOpenFilesLimit:
# max_files = maxclients + rocksdb.max_open_files + min_reserved_fds
# min_reserved_fds = 128 (listen sockets, logs, persistence, misc)
openFilesReserved = 128;
hasUnixSocket = cfg.settings.unixsocket != "";
hasTcp = lib.length cfg.settings.bind > 0;
configFile = format.generate "kvrocks.conf" (
{
daemonize = "no";
supervised = "systemd";
}
// (builtins.removeAttrs cfg.settings [
"bind"
"unixsocket"
])
// lib.optionalAttrs (hasTcp && !cfg.socketActivation) {
bind = lib.concatStringsSep " " cfg.settings.bind;
}
// lib.optionalAttrs hasUnixSocket {
unixsocket = cfg.settings.unixsocket;
}
// lib.optionalAttrs cfg.socketActivation {
socket-fd = 3;
}
);
in
{
meta.maintainers = pkgs.kvrocks.meta.maintainers;
options = {
services.kvrocks = {
enable = lib.mkEnableOption "the Kvrocks server";
package = lib.mkPackageOption pkgs "kvrocks" { };
user = lib.mkOption {
type = lib.types.str;
default = "kvrocks";
description = "User account under which Kvrocks runs.";
};
group = lib.mkOption {
type = lib.types.str;
default = "kvrocks";
description = "Group under which Kvrocks runs.";
};
socketActivation = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Enable systemd socket activation for TCP.
Requires exactly one address in {option}`services.kvrocks.settings.bind`.
'';
};
settings = lib.mkOption {
type = lib.types.submodule {
freeformType = format.type;
options = {
bind = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
"127.0.0.1"
"::1"
];
description = "The addresses to bind to.";
};
port = lib.mkOption {
type = lib.types.port;
default = 6666;
description = "Accept connections on the specified port.";
};
unixsocket = lib.mkOption {
type = lib.types.str;
default = "";
example = "/run/kvrocks/kvrocks.sock";
description = "Unix socket path.";
};
dir = lib.mkOption {
type = lib.types.str;
default = defaultDir;
description = "Directory for database files.";
};
};
};
default = { };
example = {
workers = 8;
maxclients = 10000;
rename-command = [
"KEYS \"\""
"FLUSHDB \"\""
];
};
description = ''
Configuration for kvrocks.
See <https://github.com/apache/kvrocks/blob/unstable/kvrocks.conf> for supported options.
List values are emitted as repeated keys (for example `rename-command`),
except {option}`services.kvrocks.settings.bind` which is space-separated
on a single line.
'';
};
openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether to open the firewall for the kvrocks port.";
};
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = hasTcp || hasUnixSocket;
message = "services.kvrocks: set settings.bind and/or settings.unixsocket.";
}
{
assertion = cfg.socketActivation -> builtins.length cfg.settings.bind == 1;
message = "services.kvrocks.socketActivation requires exactly one settings.bind address.";
}
];
networking.firewall.allowedTCPPorts = lib.mkIf (cfg.openFirewall && hasTcp) [
cfg.settings.port
];
systemd.tmpfiles.settings."10-kvrocks" = lib.mkIf (!isDefaultDir) {
${dataDir}.d = {
user = cfg.user;
group = cfg.group;
mode = "0700";
};
};
systemd.sockets.kvrocks = lib.mkIf cfg.socketActivation {
description = "Kvrocks socket";
wantedBy = [ "sockets.target" ];
listenStreams =
let
addr = builtins.head cfg.settings.bind;
port = toString cfg.settings.port;
listenStream = if lib.hasInfix ":" addr then "[${addr}]:${port}" else "${addr}:${port}";
in
lib.singleton listenStream;
socketConfig = {
Accept = false;
SocketUser = cfg.user;
SocketGroup = cfg.group;
};
};
systemd.services.kvrocks = {
description = "Kvrocks - Distributed key value database";
documentation = [ "https://kvrocks.apache.org/" ];
wantedBy = lib.mkIf (!cfg.socketActivation) [ "multi-user.target" ];
after = [ "network.target" ] ++ lib.optionals cfg.socketActivation [ "kvrocks.socket" ];
requires = lib.optionals cfg.socketActivation [ "kvrocks.socket" ];
serviceConfig = {
Type = "notify";
ExecStart = "${lib.getExe cfg.package} -c ${configFile}";
Restart = "on-failure";
RestartSec = "10s";
User = cfg.user;
Group = cfg.group;
StateDirectory = lib.mkIf isDefaultDir "kvrocks";
StateDirectoryMode = "0700";
RuntimeDirectory = "kvrocks";
RuntimeDirectoryMode = "0755";
BindPaths = lib.mkIf (!isDefaultDir) [ dataDir ];
LimitNPROC = lib.mkDefault (alwaysOnThreads + dynamicThreadMargin);
# When rocksdb.max_open_files is -1 (unlimited), fall back to a high limit.
LimitNOFILE = lib.mkDefault (
if maxOpenFiles < 0 then 1048576 else maxclients + maxOpenFiles + openFilesReserved
);
TimeoutSec = 300;
NonBlocking = lib.mkIf cfg.socketActivation true;
# Capabilities
CapabilityBoundingSet = "";
# Security
NoNewPrivileges = true;
# Sandboxing
TemporaryFileSystem = [ "/:ro" ];
BindReadOnlyPaths = [
builtins.storeDir
"/etc"
];
ProtectSystem = "strict";
ProtectHome = true;
PrivateTmp = true;
PrivateDevices = true;
PrivateUsers = true;
ProtectClock = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectControlGroups = true;
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_UNIX"
];
RestrictNamespaces = true;
LockPersonality = true;
MemoryDenyWriteExecute = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
PrivateMounts = true;
SocketBindDeny = [ "any" ];
SocketBindAllow = lib.optionals (hasTcp && !cfg.socketActivation) [
"tcp:${toString cfg.settings.port}"
];
# System Call Filtering
SystemCallArchitectures = "native";
SystemCallFilter = "~@cpu-emulation @debug @keyring @memlock @mount @obsolete @privileged @resources @setuid";
};
};
users = {
users = lib.mkIf (cfg.user == "kvrocks") {
kvrocks = {
isSystemUser = true;
group = cfg.group;
description = "Kvrocks daemon user";
};
};
groups = lib.mkIf (cfg.group == "kvrocks") {
kvrocks = { };
};
};
};
}

View File

@@ -181,6 +181,9 @@ in
# ot-ctl can be used to query the router instance
environment.systemPackages = [ cfg.package ];
# Shared by the agent and web interface for the OpenThread control socket.
users.groups.otbr = { };
# Make sure we have ipv6 support, and that forwarding is enabled
networking.enableIPv6 = true;
networking.firewall.allowedTCPPorts =
@@ -217,6 +220,7 @@ in
THREAD_IF = cfg.interfaceName;
};
serviceConfig = {
Group = "otbr";
ExecStartPre = "${utils.escapeSystemdExecArg (lib.getExe' cfg.package "otbr-firewall")} start";
ExecStart = lib.concatStringsSep " " (
lib.concatLists [
@@ -269,7 +273,7 @@ in
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
UMask = "0077";
UMask = "0007";
CapabilityBoundingSet = [
"CAP_NET_ADMIN"
@@ -288,6 +292,7 @@ in
after = [ "otbr-agent.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Group = "otbr";
ExecStart = lib.concatStringsSep " " (
lib.concatLists [
[

View File

@@ -574,7 +574,7 @@ in
# and automatically migrates when needed (e.g. with v2 -> v3 swapping from Whoosh to Tantivy)
${lib.getExe cfg.package} document_index reindex --if-needed --no-progress-bar
if ${lib.boolToString (cfg.passwordFile != null)} || [[ -n $PAPERLESS_ADMIN_PASSWORD ]]; then
if ${lib.boolToString (cfg.passwordFile != null)} || [[ -n ''${PAPERLESS_ADMIN_PASSWORD-} ]]; then
export PAPERLESS_ADMIN_USER="''${PAPERLESS_ADMIN_USER:-admin}"
if [[ -e $CREDENTIALS_DIRECTORY/PAPERLESS_ADMIN_PASSWORD ]]; then
PAPERLESS_ADMIN_PASSWORD=$(cat "$CREDENTIALS_DIRECTORY/PAPERLESS_ADMIN_PASSWORD")

View File

@@ -137,6 +137,7 @@ in
services.${systemdName} = {
inherit description;
path = [ config.programs.ssh.package ];
serviceConfig = {
Type = "oneshot";

View File

@@ -2,13 +2,14 @@
config,
pkgs,
lib,
utils,
...
}:
let
cfg = config.services.seerr;
# 26.05 introduced a breaking change which is guarded behind stateVersion to avoid
# breaking users.
useNewConfigLocation = lib.versionAtLeast config.system.stateVersion "26.05";
# 26.05 introduced a breaking change which is guarded behind stateRevision to
# avoid breaking users.
useNewConfigLocation = cfg.stateRevision >= 1;
in
{
imports = [
@@ -39,8 +40,23 @@ in
configDir = lib.mkOption {
type = lib.types.path;
default = if useNewConfigLocation then "/var/lib/seerr/" else "/var/lib/jellyseerr/config";
defaultText = lib.literalMD "{file}`/var/lib/seerr` (or {file}`/var/lib/jellyseerr/config` if {option}`services.seerr.stateRevision` < 1)";
description = "Config data directory";
};
stateRevision = utils.mkStateRevisionOption {
descriptionName = "Seerr";
migrations = {
"26.05" = ''
Move {file}`/var/lib/private/jellyseerr/config` to
{file}`/var/lib/private/seerr`, if you have not set
{option}`services.seerr.configDir`. (If you have set
{option}`services.seerr.configDir`, you should also have forced
{option}`systemd.services.seerr.serviceConfig.StateDirectory`, and in
that case `stateRevision` does not affect your configuration.)
'';
};
};
};
config = lib.mkIf cfg.enable {
@@ -81,5 +97,7 @@ in
networking.firewall = lib.mkIf cfg.openFirewall {
allowedTCPPorts = [ cfg.port ];
};
system.moduleStateRevisions."services.seerr.stateRevision" = cfg.stateRevision;
};
}

View File

@@ -73,6 +73,7 @@ in
PrivateMounts = true;
PrivateTmp = true;
PrivateUsers = true;
ProcSubset = "pid";
ProtectClock = true;
ProtectControlGroups = "strict";
ProtectHome = true;

View File

@@ -53,6 +53,14 @@ in
The maximum log size.
'';
};
telemetry = lib.mkOption {
default = false;
type = lib.types.bool;
description = ''
Collects anonymous usage data and crash reports.
'';
};
};
};
@@ -71,8 +79,8 @@ in
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
Type = "forking";
ExecStart = "${pkgs.eternal-terminal}/bin/etserver --daemon --cfgfile=${pkgs.writeText "et.cfg" ''
Type = "exec";
ExecStart = "${pkgs.eternal-terminal}/bin/etserver --logtostdout --cfgfile=${pkgs.writeText "et.cfg" ''
; et.cfg : Config file for Eternal Terminal
;
@@ -83,15 +91,15 @@ in
verbose = ${toString cfg.verbosity}
silent = ${if cfg.silent then "1" else "0"}
logsize = ${toString cfg.logSize}
telemetry = ${lib.boolToString cfg.telemetry}
''}";
Restart = "on-failure";
KillMode = "process";
};
};
};
};
meta = {
maintainers = [ ];
maintainers = with lib.maintainers; [ tomasrivera ];
};
}

View File

@@ -29,10 +29,8 @@ in
};
description = ''
Configuration for GoDNS. Refer to the [configuration section](1) in the
Configuration for GoDNS. Refer to the [configuration section](https://github.com/TimothyYe/godns?tab=readme-ov-file#configuration) in the
GoDNS GitHub repository for details.
[1]: https://github.com/TimothyYe/godns?tab=readme-ov-file#configuration
'';
example = {

View File

@@ -132,6 +132,7 @@ in
SystemCallFilter = [
"@system-service"
"~@privileged"
"@chown"
];
# User and group
DynamicUser = true;

View File

@@ -0,0 +1,224 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.hister;
yamlFormat = pkgs.formats.yaml { };
dataDir = if cfg.dataDir != null then cfg.dataDir else "/var/lib/hister";
generatedConfig = yamlFormat.generate "hister-config.yml" cfg.settings;
hasConfig = cfg.configPath != null || cfg.settings != { };
runtimeConfigSource = if cfg.settings != { } then generatedConfig else cfg.configPath;
runtimeConfig = "/run/hister/config.yml";
histerEnv =
lib.optionalAttrs (cfg.port != null) {
HISTER_PORT = toString cfg.port;
}
// lib.optionalAttrs hasConfig {
HISTER_CONFIG = runtimeConfig;
}
// {
HISTER_DATA_DIR = dataDir;
};
privilegedPort = cfg.port != null && cfg.port < 1024;
in
{
meta.maintainers = with lib.maintainers; [ _4evy ];
options.services.hister = {
enable = lib.mkEnableOption "Hister, a web history service with content-based search";
package = lib.mkPackageOption pkgs "hister" { };
user = lib.mkOption {
type = lib.types.str;
default = "hister";
description = "User account under which Hister runs.";
};
group = lib.mkOption {
type = lib.types.str;
default = "hister";
description = "Group under which Hister runs.";
};
dataDir = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/var/lib/hister";
description = ''
Directory where Hister stores its data. When `null` (the default), the
service is isolated under `/var/lib/hister` via systemd's
`StateDirectory=`. When set to an explicit path, that path is created
with `systemd-tmpfiles` and granted via `ReadWritePaths=` instead.
'';
};
port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
example = 4433;
description = ''
Port on which Hister listens. When set, this overrides the port in
`server.address` from the configuration file via the `HISTER_PORT`
environment variable.
'';
};
openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Whether to open {option}`services.hister.port` in the firewall. Has no
effect if `port` is `null`.
'';
};
configPath = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/etc/hister/config.yml";
description = ''
Path to an existing Hister configuration file mounted read-only into
the service runtime directory and passed via `HISTER_CONFIG`. Mutually
exclusive with {option}`services.hister.settings`.
'';
};
environmentFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/run/secrets/hister.env";
description = ''
Path to an environment file (read at service start) used to inject
secrets such as `HISTER__APP__ACCESS_TOKEN` without placing them in the
world-readable Nix store.
'';
};
settings = lib.mkOption {
type = yamlFormat.type;
default = { };
description = ''
Hister configuration rendered to YAML and passed via `HISTER_CONFIG`.
Accepts any structure the server accepts: see the `app`, `server`,
`indexer`, `crawler`, `hotkeys`, `extractors`, `semantic_search`, and
`sensitive_content_patterns` blocks documented upstream.
'';
example = lib.literalExpression ''
{
app = {
search_url = "https://google.com/search?q={query}";
log_level = "info";
};
server = {
address = "127.0.0.1:4433";
database = "db.sqlite3";
};
hotkeys.web = {
"/" = "focus_search_input";
"enter" = "open_result";
};
}
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = !(cfg.configPath != null && cfg.settings != { });
message = "Only one of services.hister.configPath and services.hister.settings can be set";
}
];
environment.systemPackages = [ cfg.package ];
users.users = lib.mkIf (cfg.user == "hister") {
hister = {
description = "Hister web history service";
group = cfg.group;
isSystemUser = true;
};
};
users.groups = lib.mkIf (cfg.group == "hister") {
hister = { };
};
systemd.tmpfiles.settings."10-hister"."${dataDir}".d = lib.mkIf (cfg.dataDir != null) {
user = cfg.user;
group = cfg.group;
mode = "0750";
};
systemd.services.hister = {
description = "Hister web history service";
after = [
"network.target"
"systemd-tmpfiles-setup.service"
"systemd-tmpfiles-resetup.service"
];
wantedBy = [ "multi-user.target" ];
environment = histerEnv;
serviceConfig = {
ExecStart = "${lib.getExe cfg.package} listen";
Restart = "on-failure";
User = cfg.user;
Group = cfg.group;
RuntimeDirectory = lib.mkIf hasConfig "hister";
RuntimeDirectoryMode = lib.mkIf hasConfig "0750";
BindReadOnlyPaths = lib.mkIf hasConfig [ "${runtimeConfigSource}:${runtimeConfig}" ];
StateDirectory = lib.mkIf (cfg.dataDir == null) "hister";
StateDirectoryMode = lib.mkIf (cfg.dataDir == null) "0750";
ReadWritePaths = lib.mkIf (cfg.dataDir != null) [ cfg.dataDir ];
EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
AmbientCapabilities = lib.mkIf privilegedPort [ "CAP_NET_BIND_SERVICE" ];
CapabilityBoundingSet = if privilegedPort then [ "CAP_NET_BIND_SERVICE" ] else [ "" ];
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = true;
PrivateTmp = true;
PrivateDevices = true;
ProtectKernelTunables = true;
ProtectKernelModules = true;
ProtectKernelLogs = true;
ProtectControlGroups = true;
ProtectClock = true;
ProtectHostname = true;
ProtectProc = "invisible";
ProcSubset = "pid";
LockPersonality = true;
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
RemoveIPC = true;
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_UNIX"
];
SystemCallArchitectures = "native";
SystemCallFilter = [
"@system-service"
"~@privileged"
];
MemoryDenyWriteExecute = true;
UMask = "0077";
};
};
networking.firewall.allowedTCPPorts = lib.mkIf (cfg.openFirewall && cfg.port != null) [ cfg.port ];
};
}

View File

@@ -208,7 +208,13 @@ in
abi <abi/4.0>,
include <tunables/global>
profile ${cfg.package}/bin/miniflux {
# Flag `attach_disconnected` is necessary
# because the PostgreSQL socket path appears
# as a "disconnected" path: `run/postgresql/.s.PGSQL.XXXX`,
# without the trailing slash, which AppArmor can't resolve.
# The flag prepends a `/`, which isn't recommended,
# but there aren't any alternative currently.
profile ${cfg.package}/bin/miniflux flags=(attach_disconnected) {
include <abstractions/base>
include <abstractions/nameservice>
include <abstractions/ssl_certs>
@@ -216,6 +222,8 @@ in
include "${pkgs.apparmorRulesFromClosure { name = "miniflux"; } cfg.package}"
${cfg.package}/bin/miniflux r,
/run/miniflux/** rw,
/run/postgresql/.s.PGSQL.* rw,
/run/credentials/** r,
include if exists <local/bin.miniflux>
}
'';

View File

@@ -66,7 +66,9 @@ in
WorkingDirectory = "/var/lib/readeck";
EnvironmentFile = lib.optional (cfg.environmentFile != null) cfg.environmentFile;
DynamicUser = true;
ExecStart = "${lib.getExe cfg.package} serve -config ${configFile}";
# readeck opens config.toml as writable in case it needs to add a secret key...
ExecStartPre = "${lib.getExe' pkgs.coreutils "cp"} --no-preserve=all ${configFile} config.toml";
ExecStart = "${lib.getExe cfg.package} serve -config config.toml";
ProtectSystem = "full";
SystemCallArchitectures = "native";
MemoryDenyWriteExecute = true;

View File

@@ -90,6 +90,7 @@ let
"unixd"
"slotmem_shm"
"socache_shmcb"
"systemd"
"mpm_${cfg.mpm}"
]
++ (if cfg.mpm == "prefork" then [ "cgi" ] else [ "cgid" ])
@@ -992,12 +993,12 @@ in
'';
serviceConfig = {
ExecStart = "@${pkg}/bin/httpd httpd -f /etc/httpd/httpd.conf";
ExecStop = "${pkg}/bin/httpd -f /etc/httpd/httpd.conf -k graceful-stop";
ExecStart = "${pkg}/bin/httpd -D FOREGROUND -f /etc/httpd/httpd.conf";
ExecReload = "${pkg}/bin/httpd -f /etc/httpd/httpd.conf -k graceful";
KillMode = "mixed";
User = cfg.user;
Group = cfg.group;
Type = "forking";
Type = "notify";
PIDFile = "${runtimeDir}/httpd.pid";
Restart = "always";
RestartSec = "5s";

View File

@@ -166,7 +166,7 @@ in
++ lib.optional cfg.enableScreensaver xfce4-screensaver
) excludePackages;
programs.gnupg.agent.pinentryPackage = mkDefault pkgs.pinentry-gtk2;
programs.gnupg.agent.pinentryPackage = mkDefault pkgs.pinentry-gnome3;
programs.xfconf.enable = true;
programs.thunar.enable = true;
programs.labwc.enable = mkDefault (

View File

@@ -793,6 +793,7 @@ in
hibernate-systemd-stage-1 = handleTestOn [ "x86_64-linux" ] ./hibernate.nix {
systemdStage1 = true;
};
hister = runTest ./hister.nix;
hitch = handleTest ./hitch { };
hledger-web = runTest ./hledger-web.nix;
hockeypuck = runTest ./hockeypuck.nix;
@@ -918,6 +919,7 @@ in
inherit runTest;
inherit (pkgs) lib;
};
kvrocks = runTest ./kvrocks.nix;
labgrid = runTest ./labgrid.nix;
lact = runTest ./lact.nix;
ladybird = runTest ./ladybird.nix;
@@ -967,7 +969,9 @@ in
livekit = runTest ./networking/livekit.nix;
lix = runTest ./lix.nix;
lk-jwt-service = runTest ./matrix/lk-jwt-service.nix;
llama-swap = runTest ./web-servers/llama-swap.nix;
llama-swap = import ./web-servers/llama-swap.nix {
inherit pkgs runTest;
};
lldap = runTest ./lldap.nix;
local-content-share = runTest ./local-content-share.nix;
locale = runTest ./locale.nix;
@@ -1057,6 +1061,7 @@ in
modularService = pkgs.callPackage ../modules/system/service/systemd/test.nix {
inherit evalSystem;
};
moduleStateRevisions = pkgs.callPackage ./moduleStateRevisions.nix { };
molly-brown = runTest ./molly-brown.nix;
mollysocket = runTest ./mollysocket.nix;
monado = runTest ./monado.nix;
@@ -1232,6 +1237,7 @@ in
ntfy-sh-migration = handleTest ./ntfy-sh-migration.nix { };
ntpd = runTest ./ntpd.nix;
ntpd-rs = runTest ./ntpd-rs.nix;
nullmailer = runTest ./nullmailer.nix;
nushell = runTest ./nushell.nix;
nvidia-container-toolkit = runTest ./nvidia-container-toolkit.nix;
nvme-rs = runTest ./nvme-rs.nix;
@@ -1839,7 +1845,7 @@ in
userborn-mutable-users = runTest ./userborn-mutable-users.nix;
userborn-static = runTest ./userborn-static.nix;
ustreamer = runTest ./ustreamer.nix;
utils = import ./utils { inherit runTest; };
utils = pkgs.callPackage ./utils { inherit runTest; };
utmp = runTest ./utmp.nix;
uwsgi = runTest ./uwsgi.nix;
v2ray = runTest ./v2ray.nix;

146
nixos/tests/hister.nix Normal file
View File

@@ -0,0 +1,146 @@
{ lib, pkgs, ... }:
let
configPathConfig = pkgs.writeText "hister-config.yml" ''
app:
title: NixOS Hister Config Path
search_url: https://config.example.invalid/?q={query}
hotkeys:
web:
alt+c: open_query_in_search_engine
'';
in
{
name = "hister";
meta = {
maintainers = with lib.maintainers; [ _4evy ];
};
nodes.machine = {
environment.systemPackages = [ pkgs.jq ];
systemd.tmpfiles.settings."10-hister-env"."/run/hister.env"."f" = {
mode = "0600";
user = "root";
group = "root";
argument = "HISTER__APP__ACCESS_TOKEN=test-token";
};
specialisation = {
inline_settings.configuration.services.hister = {
enable = true;
port = 4433;
environmentFile = "/run/hister.env";
settings = {
app = {
log_level = "debug";
title = "NixOS Hister";
search_url = "https://search.example.invalid/?q={query}";
open_results_on_new_tab = true;
};
hotkeys.web."alt+n" = "open_query_in_search_engine";
};
};
config_file.configuration.services.hister = {
enable = true;
port = 4434;
configPath = configPathConfig;
};
custom_data_dir.configuration.services.hister = {
enable = true;
port = 4435;
dataDir = "/srv/hister-data";
settings.app.title = "NixOS Hister Custom Data";
};
};
};
testScript =
{ nodes, ... }:
let
switchTo =
name:
"${nodes.machine.system.build.toplevel}/specialisation/${name}/bin/switch-to-configuration test";
in
''
start_all()
with subtest("inline settings"):
machine.succeed("${switchTo "inline_settings"}")
machine.systemctl("restart hister.service")
machine.wait_for_unit("hister.service")
machine.wait_for_open_port(4433)
machine.succeed("curl -fsS http://localhost:4433/ | grep -F '<title>Hister</title>'")
machine.succeed("test $(stat -c %a /var/lib/hister) = 750")
machine.succeed("test $(stat -c %a /run/hister) = 750")
machine.succeed("test -s /run/hister/tui.yaml")
machine.succeed("test -s /var/lib/hister/db.sqlite3")
machine.succeed("test -s /var/lib/hister/.secret_key")
machine.succeed("test -s /var/lib/hister/rules.json")
machine.succeed(
"curl -fsS http://localhost:4433/api/config"
+ " | jq -e "
+ "'"
+ '.baseUrl == "http://127.0.0.1:4433"'
+ ' and .title == "NixOS Hister"'
+ ' and .searchUrl == "https://search.example.invalid/?q={query}"'
+ ' and .openResultsOnNewTab == true'
+ ' and .hotkeys."alt+n" == "open_query_in_search_engine"'
+ ' and .authMode == "token"'
+ "'"
)
machine.fail("journalctl -u hister.service | grep -F 'Failed to create tui.yaml'")
with subtest("configPath"):
machine.succeed("${switchTo "config_file"}")
machine.systemctl("restart hister.service")
machine.wait_for_unit("hister.service")
machine.wait_for_open_port(4434)
machine.succeed("curl -fsS http://localhost:4434/ >/dev/null")
machine.succeed("test $(stat -c %a /run/hister) = 750")
machine.succeed("test -s /run/hister/tui.yaml")
machine.succeed("test -s /var/lib/hister/db.sqlite3")
machine.succeed("test -s /var/lib/hister/.secret_key")
machine.succeed("test -s /var/lib/hister/rules.json")
machine.succeed(
"curl -fsS http://localhost:4434/api/config"
+ " | jq -e "
+ "'"
+ '.baseUrl == "http://127.0.0.1:4434"'
+ ' and .title == "NixOS Hister Config Path"'
+ ' and .searchUrl == "https://config.example.invalid/?q={query}"'
+ ' and .hotkeys."alt+c" == "open_query_in_search_engine"'
+ ' and .authMode == "none"'
+ "'"
)
machine.fail("journalctl -u hister.service | grep -F 'Failed to create tui.yaml'")
with subtest("custom dataDir"):
machine.systemctl("stop hister.service")
machine.succeed("rm -rf /var/lib/hister")
machine.succeed("${switchTo "custom_data_dir"}")
machine.systemctl("restart hister.service")
machine.wait_for_unit("hister.service")
machine.wait_for_open_port(4435)
machine.succeed("curl -fsS http://localhost:4435/ >/dev/null")
machine.succeed("test $(stat -c %U:%G:%a /srv/hister-data) = hister:hister:750")
machine.succeed("test $(stat -c %a /run/hister) = 750")
machine.succeed("test -s /run/hister/tui.yaml")
machine.succeed("test -s /srv/hister-data/db.sqlite3")
machine.succeed("test -s /srv/hister-data/.secret_key")
machine.succeed("test -s /srv/hister-data/rules.json")
machine.succeed("test ! -e /var/lib/hister")
machine.succeed(
"curl -fsS http://localhost:4435/api/config"
+ " | jq -e "
+ "'"
+ '.baseUrl == "http://127.0.0.1:4435"'
+ ' and .title == "NixOS Hister Custom Data"'
+ ' and .authMode == "none"'
+ "'"
)
machine.fail("journalctl -u hister.service | grep -F 'Failed to create tui.yaml'")
'';
}

122
nixos/tests/kvrocks.nix Normal file
View File

@@ -0,0 +1,122 @@
{ lib, pkgs, ... }:
{
name = "kvrocks";
meta.maintainers = with lib.maintainers; [ xyenon ];
nodes.machine = {
services.kvrocks = {
enable = true;
settings.log-level = "debug";
};
specialisation."nonDefaultDataDir".configuration = {
services.kvrocks.settings.dir = "/var/lib/kvrocks-custom";
};
specialisation."unixSocket".configuration = {
services.kvrocks.settings.bind = [ ];
services.kvrocks.settings.unixsocket = "/run/kvrocks/kvrocks.sock";
};
specialisation."tcpAndUnix".configuration = {
services.kvrocks.settings.unixsocket = "/run/kvrocks/kvrocks.sock";
};
specialisation."socketActivation".configuration = {
services.kvrocks = {
socketActivation = true;
settings.bind = [ "127.0.0.1" ];
};
};
specialisation."socketActivationAndUnix".configuration = {
services.kvrocks = {
socketActivation = true;
settings = {
bind = [ "127.0.0.1" ];
unixsocket = "/run/kvrocks/kvrocks.sock";
};
};
};
};
testScript =
{ nodes, ... }:
let
inherit (nodes.machine.services) kvrocks;
port = toString kvrocks.settings.port;
redisCliTcp = "${pkgs.redis}/bin/redis-cli -p ${port}";
unixsocket = "/run/kvrocks/kvrocks.sock";
redisCliUnix = "${pkgs.redis}/bin/redis-cli -s ${unixsocket}";
switchTo =
name:
"${nodes.machine.system.build.toplevel}/specialisation/${name}/bin/switch-to-configuration test";
in
''
start_all()
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.succeed("${redisCliTcp} ping | grep PONG")
with subtest("Test normal usage"):
machine.succeed("${redisCliTcp} set k1 v1 | grep OK")
machine.succeed("${redisCliTcp} get k1 | grep v1")
machine.systemctl("restart kvrocks")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.succeed("${redisCliTcp} get k1 | grep v1")
with subtest("Test usage with non-default data directory"):
machine.succeed("${switchTo "nonDefaultDataDir"}")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.succeed("test -d /var/lib/kvrocks-custom")
machine.succeed("${redisCliTcp} set k2 v2 | grep OK")
machine.succeed("${redisCliTcp} get k2 | grep v2")
machine.systemctl("restart kvrocks")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.succeed("${redisCliTcp} get k2 | grep v2")
with subtest("Test usage with unix socket only"):
machine.succeed("${switchTo "unixSocket"}")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_file("${unixsocket}")
machine.succeed("${redisCliUnix} set k3 v3 | grep OK")
machine.succeed("${redisCliUnix} get k3 | grep v3")
machine.systemctl("restart kvrocks")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_file("${unixsocket}")
machine.succeed("${redisCliUnix} get k3 | grep v3")
with subtest("Test usage with TCP and unix socket"):
machine.succeed("${switchTo "tcpAndUnix"}")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.wait_for_file("${unixsocket}")
machine.succeed("${redisCliTcp} set k4 v4 | grep OK")
machine.succeed("${redisCliTcp} get k4 | grep v4")
machine.succeed("${redisCliUnix} get k4 | grep v4")
with subtest("Test usage with socket activation"):
machine.succeed("${switchTo "socketActivation"}")
machine.wait_for_unit("kvrocks.socket")
machine.wait_until_succeeds("${redisCliTcp} ping | grep PONG")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.succeed("${redisCliTcp} set k5 v5 | grep OK")
machine.succeed("${redisCliTcp} get k5 | grep v5")
with subtest("Test usage with socket activation and unix socket"):
machine.succeed("${switchTo "socketActivationAndUnix"}")
machine.wait_for_unit("kvrocks.socket")
machine.wait_until_succeeds("${redisCliTcp} ping | grep PONG")
machine.wait_for_unit("kvrocks.service")
machine.wait_for_open_port(${port})
machine.wait_for_file("${unixsocket}")
machine.succeed("${redisCliTcp} set k6 v6 | grep OK")
machine.succeed("${redisCliTcp} get k6 | grep v6")
machine.succeed("${redisCliUnix} get k6 | grep v6")
'';
}

View File

@@ -29,6 +29,7 @@ in
default =
{ ... }:
{
security.apparmor.enable = true;
services.miniflux = {
enable = true;
inherit adminCredentialsFile;
@@ -38,6 +39,7 @@ in
withoutSudo =
{ ... }:
{
security.apparmor.enable = true;
services.miniflux = {
enable = true;
inherit adminCredentialsFile;
@@ -48,6 +50,7 @@ in
customized =
{ ... }:
{
security.apparmor.enable = true;
services.miniflux = {
enable = true;
config = {
@@ -82,6 +85,7 @@ in
externalDb =
{ ... }:
{
security.apparmor.enable = true;
services.miniflux = {
enable = true;
createDatabaseLocally = false;
@@ -105,6 +109,7 @@ in
machine.succeed(
f"curl 'http://localhost:{port}/v1/me' -u '{user}' -H Content-Type:application/json | grep '\"is_admin\":true'"
)
machine.fail('journalctl -b --no-pager --grep "^audit: .*apparmor=\\"DENIED\\""')
default.start()
withoutSudo.start()

View File

@@ -0,0 +1,25 @@
{
lib,
emptyFile,
nixos,
}:
let
evalModuleStateRevisions =
cfg:
(nixos [
{ system.stateVersion = lib.trivial.release; }
cfg
]).config.system.moduleStateRevisions;
# For modules that follow the <module>.enable, <module>.stateRevision pattern:
testModule =
path:
evalModuleStateRevisions (lib.setAttrByPath path { enable = true; })
? "${builtins.concatStringsSep "." path}.stateRevision";
in
assert evalModuleStateRevisions { } == { };
assert testModule [
"services"
"seerr"
];
emptyFile

View File

@@ -20,6 +20,7 @@ in
{
imports = [
(modulesPath + "/virtualisation/qemu-vm.nix")
(modulesPath + "/virtualisation/guest-networking-options.nix")
(modulesPath + "/testing/test-instrumentation.nix")
];
virtualisation.writableStore = true;

View File

@@ -116,6 +116,7 @@
{ lib, modulesPath, ... }: {
imports = [
(modulesPath + "/virtualisation/qemu-vm.nix")
(modulesPath + "/virtualisation/guest-networking-options.nix")
(modulesPath + "/testing/test-instrumentation.nix")
(modulesPath + "/../tests/common/user-account.nix")
(lib.modules.importJSON ./target-configuration.json)

View File

@@ -0,0 +1,85 @@
{ lib, ... }:
{
name = "nullmailer";
meta = {
maintainers = with lib.maintainers; [ h7x4 ];
};
nodes = {
mail =
{ config, ... }:
{
imports = [ ./common/user-account.nix ];
virtualisation.vlans = [ 1 ];
networking = {
useNetworkd = true;
useDHCP = false;
firewall.allowedTCPPorts = [ 25 ];
domain = "example.com";
hosts."10.0.0.2" = [ "machine.example.com" ];
};
systemd.network.networks."01-eth1" = {
name = "eth1";
networkConfig.Address = "10.0.0.1/24";
};
services.postfix = {
enable = true;
localRecipients = [ "alice" ];
settings = {
main = {
myhostname = config.networking.hostName;
mydomain = config.networking.domain;
mynetworks = [ "0.0.0.0/0" ];
mydestination = [ "$mydomain" ];
smtpd_recipient_restrictions = "permit_mynetworks, reject";
};
};
};
};
machine =
{ config, ... }:
{
virtualisation.vlans = [ 1 ];
networking = {
useNetworkd = true;
useDHCP = false;
domain = "example.com";
hosts."10.0.0.1" = [ "mail.example.com" ];
};
systemd.network.networks."01-eth1" = {
name = "eth1";
networkConfig.Address = "10.0.0.2/24";
};
services.nullmailer = {
enable = true;
config = {
me = "${config.networking.fqdn}";
remotes = "mail.example.com smtp --port=25";
};
};
};
};
testScript = ''
start_all()
machine.wait_for_open_port(25, "mail.example.com")
machine.wait_for_unit("nullmailer.service")
machine.succeed('printf "To: alice@example.com\r\n\r\nthis is the body of the email" | sendmail -t -i -f sender@example.com')
mail.wait_for_console_text("delivered to maildir")
print(mail.succeed("grep 'this is the body of the email' /var/spool/mail/alice/new/*"))
'';
}

View File

@@ -21,12 +21,14 @@ let
from selenium.webdriver.common.by import By
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument('--headless')
driver = Firefox(options=options)
service = Service(executable_path="${lib.getExe pkgs.geckodriver}")
driver = Firefox(options=options, service=service)
host = sys.argv[1]
user = sys.argv[2]
@@ -71,6 +73,7 @@ in
environment = {
ADMIN_PASSWORD = adminPassword;
IDM_CREATE_DEMO_USERS = "true";
IDM_LDAPS_ADDR = "127.0.0.1:9235";
IDM_LDAPS_CERT = "${certs.${domain}.cert}";
IDM_LDAPS_KEY = "${certs.${domain}.key}";
OC_INSECURE = "false";

View File

@@ -41,6 +41,7 @@ in
};
};
networking.useNetworkd = true;
networking.firewall.allowedUDPPorts = [ 9999 ];
systemd.network = {
@@ -72,6 +73,7 @@ in
server = {
imports = [ (shared server) ];
networking.useNetworkd = true;
networking.firewall.allowedUDPPorts = [ server.wg.listen ];
systemd.network.netdevs."10-${deviceName}" = {
@@ -118,7 +120,7 @@ in
testScript =
{ ... }:
''
from os import system
import subprocess
# Full path to rosenpass in the store, to avoid fiddling with `$PATH`.
rosenpass = "${pkgs.rosenpass}/bin/rosenpass"
@@ -137,7 +139,10 @@ in
for (name, machine, remote) in [("server", server, client), ("client", client, server)]:
pk, sk = f"{name}.pqpk", f"{name}.pqsk"
system(f"{rosenpass} gen-keys --force --secret-key {sk} --public-key {pk}")
subprocess.run(
[rosenpass, "gen-keys", "--force", "--secret-key", sk, "--public-key", pk],
check=True,
)
machine.copy_from_host(sk, f"{etc}/pqsk")
machine.copy_from_host(pk, f"{etc}/pqpk")
remote.copy_from_host(pk, f"{etc}/peers/{name}/pqpk")

View File

@@ -1,5 +1,9 @@
{ runTest }:
{
callPackage,
runTest,
}:
{
genJqSecretsReplacement = runTest ./genJqSecretsReplacement.nix;
mkStateRevisionOption = callPackage ./mkStateRevisionOption.nix { };
}

View File

@@ -0,0 +1,39 @@
{
emptyFile,
nixos,
}:
let
result = nixos (
{ utils, ... }:
{
options = {
stateRevision1 = utils.mkStateRevisionOption {
descriptionName = "...";
migrations = {
"27.05" = "...";
};
};
stateRevision2 = utils.mkStateRevisionOption {
descriptionName = "...";
migrations = {
"26.11" = "...";
};
};
stateRevision3 = utils.mkStateRevisionOption {
descriptionName = "...";
migrations = {
"24.05" = "...";
"27.05" = "...";
};
};
};
config.system.stateVersion = "26.11";
}
);
inherit (result) config options;
in
assert config.stateRevision1 == 0;
assert config.stateRevision2 == 1;
assert config.stateRevision3 == 1;
assert options.stateRevision1.migrations == { "27.05" = "..."; };
emptyFile

View File

@@ -1,261 +1,295 @@
{ pkgs, lib, ... }:
{
pkgs,
lib ? pkgs.lib,
runTest,
...
}:
let
wrapSrc = attrs: pkgs.runCommand "${attrs.pname}-${attrs.version}" attrs "ln -s $src $out";
makeLlamaSwapTest =
name:
{
withUI ? true,
# opt in for e2e test with a small LLM
withLLM ? false,
}:
(
let
wrapSrc = attrs: pkgs.runCommand "${attrs.pname}-${attrs.version}" attrs "ln -s $src $out";
smollm2-135m = wrapSrc rec {
pname = "smollm2-135m";
version = "9e6855bc4be717fca1ef21360a1db4b29d5c559a";
src = pkgs.fetchurl {
url = "https://huggingface.co/unsloth/SmolLM2-135M-Instruct-GGUF/resolve/${version}/SmolLM2-135M-Instruct-Q4_K_M.gguf";
hash = "sha256-7V+jDEh7KC7BVsKQYvEiLlwgh1qUSsmCidvSQulH90c=";
smollm2-135m = wrapSrc rec {
pname = "smollm2-135m";
version = "9e6855bc4be717fca1ef21360a1db4b29d5c559a";
src = pkgs.fetchurl {
url = "https://huggingface.co/unsloth/SmolLM2-135M-Instruct-GGUF/resolve/${version}/SmolLM2-135M-Instruct-Q4_K_M.gguf";
hash = "sha256-7V+jDEh7KC7BVsKQYvEiLlwgh1qUSsmCidvSQulH90c=";
};
meta.license = with lib.licenses; [
asl20 # actual license of the model weights
unfree # to force an opt-in - do not remove
];
};
# grab allowUnfreePredicate if it exists or default deny
allowUnfreePredicate =
if builtins.hasAttr "allowUnfreePredicate" pkgs.config then
pkgs.config.allowUnfreePredicate
else
(_: false);
# check if we can use smollm2-135m taking either globally allowUnfree or
# explicit allow with predicate
# or the test explicitly opts in
useSmollm2-135m = withLLM || pkgs.config.allowUnfree || allowUnfreePredicate smollm2-135m;
in
{
name = "llama-swap-${name}";
meta.maintainers = with lib.maintainers; [
jk
podium868909
];
nodes = {
machine =
{ pkgs, ... }:
{
# running models can be memory intensive but
# default `virtualisation.memorySize` is fine
services.llama-swap = {
enable = true;
settings =
# config for basic tests
if !useSmollm2-135m then
{ }
# config for extended tests using SmolLM2
else
let
llama-cpp = pkgs.llama-cpp;
llama-server = lib.getExe' llama-cpp "llama-server";
in
{
# more useful logging output
logLevel = "debug";
logToStdout = "both";
hooks.on_startup.preload = [
"smollm2"
];
# temperature and top-k important for SmolLM2 performance/accuracy
models = {
"smollm2" = {
ttl = 10;
cmd = "${llama-server} --port \${PORT} -m ${smollm2-135m} --alias smollm2 --no-webui --temp 0.2 --top-k 9";
};
"smollm2-group-1" = {
cmd = "${llama-server} --port \${PORT} -m ${smollm2-135m} --alias smollm2-group-1 --no-webui --temp 0.2 --top-k 9 -c 1024";
};
"smollm2-group-2" = {
proxy = "http://127.0.0.1:5802";
cmd = "${llama-server} --port 5802 -m ${smollm2-135m} --alias smollm2-group-2 --no-webui --temp 0.2 --top-k 9 -c 1024";
};
};
groups = {
"standalone" = {
swap = true;
exclusive = true;
members = [
"smollm2"
];
};
"group" = {
swap = false;
exclusive = true;
members = [
"smollm2-group-1"
"smollm2-group-2"
];
};
};
};
};
};
};
testScript =
{ nodes, ... }:
''
# core tests
import json
def get_json(route):
args = [
'-v',
'-s',
'--fail',
'-H "Content-Type: application/json"'
]
return json.loads(machine.succeed("curl {args} http://localhost:8080{route}".format(args=" ".join(args), route=route)))
def post_json(route, data):
args = [
'-v',
'-s',
'--fail',
'-H "Content-Type: application/json"',
"-d '{d}'".format(d=json.dumps(data))
]
return json.loads(machine.succeed('curl {args} http://localhost:8080{route}'.format(args=" ".join(args), route=route)))
machine.wait_for_unit('llama-swap')
machine.wait_for_open_port(8080)
''
+ lib.optionalString withUI ''
with subtest('check is serving ui'):
machine.succeed('curl --fail http:/localhost:8080/ui/')
''
+ ''
with subtest('check is healthy'):
response_healthy = machine.wait_until_succeeds('curl --silent --fail http://localhost:8080/health')
assert 'OK' in response_healthy, '/health was not OK'
''
+ lib.optionalString useSmollm2-135m ''
# extended tests using SmolLM2
with subtest('check `/running` for preloaded smollm2'):
machine.wait_until_succeeds('curl --silent --fail http://localhost:8080/running | grep "smollm2"')
running_response = get_json('/running')
assert len(running_response['running']) == 1, f'running doesn\'t have one entry as expected: {running_response}'
running_model = running_response['running'][0]
assert running_model['model'] == 'smollm2', f'running model is not smollm2: {running_response}'
assert running_model['state'] == 'ready', f'running smollm2 is not ready: {running_response}'
with subtest('runs smollm2'):
response = None
with subtest('send request to smollm2'):
data = {
'model': 'smollm2',
'messages': [
{
'role': 'user',
'content': 'Say hello'
}
]
}
response = post_json('/v1/chat/completions', data)
with subtest('response is from smollm2'):
assert response['model'] == 'smollm2', f'response was not from smollm2: {response['model']}'
with subtest('response contains at least one item in "choices"'):
assert len(response['choices']) >= 1, f'response had no choices: {response}'
assistant_choices = None
with subtest('response contains at least one "assistant" message'):
assistant_choices = [c for c in response['choices'] if c['message']['role'] == 'assistant']
assert len(assistant_choices) >= 1, f'response had no assistant message: {response}'
with subtest('first message (lowercase) starts with "hello"'):
assert assistant_choices[0]['message']['content'].lower()[:5] == 'hello', f'response didn\'t start with hello: {response}'
with subtest('check `/running` for just smollm2'):
running_response = get_json('/running')
assert len(running_response['running']) == 1, f'running doesn\'t have one entry as expected: {running_response}'
running_model = running_response['running'][0]
assert running_model['model'] == 'smollm2', f'running model is not smollm2: {running_response}'
assert running_model['state'] == 'ready', f'running smollm2 is not ready: {running_response}'
with subtest('check `/running` for smollm2 to timeout'):
machine.wait_until_succeeds('curl --silent --fail http://localhost:8080/running | grep -v "smollm2"', timeout=11)
running_response = get_json('/running')
assert len(running_response['running']) == 0, "smollm2 was still running after timeout"
with subtest('runs smollm2-group-1 and smollm2-group-2'):
response_1 = None
with subtest('send request to smollm2-group-1'):
data = {
'model': 'smollm2-group-1',
'messages': [
{
'role': 'user',
'content': 'Say hello'
}
]
}
response_1 = post_json('/v1/chat/completions', data)
with subtest('response 1 is from smollm2-group-1'):
assert response_1['model'] == 'smollm2-group-1', f'response was not from smollm2-group-1: {response_1['model']}'
with subtest('response 1 contains at least one item in "choices"'):
assert len(response_1['choices']) >= 1, f'response had no choices: {response_1}'
assistant_choices_1 = None
with subtest('response 1 contains at least one "assistant" message'):
assistant_choices_1 = [c for c in response_1['choices'] if c['message']['role'] == 'assistant']
assert len(assistant_choices_1) >= 1, f'response had no assistant message: {response_1}'
with subtest('first message (lowercase) in response 1 starts with "hello"'):
assert assistant_choices_1[0]['message']['content'].lower()[:5] == 'hello', f'response didn\'t start with hello: {response_1}'
with subtest('check `/running` for just smollm2-group-1'):
running_response = get_json('/running')
assert len(running_response['running']) == 1, f'running doesn\'t have one entry as expected: {running_response}'
running_model = running_response['running'][0]
assert running_model['model'] == 'smollm2-group-1', f'running model is not smollm2-group-1: {running_response}'
assert running_model['state'] == 'ready', f'running smollm2-group-1 is not ready: {running_response}'
response_2 = None
with subtest('send request to smollm2-group-2'):
data = {
'model': 'smollm2-group-2',
'messages': [
{
'role': 'user',
'content': 'Say hello'
}
]
}
response_2 = post_json('/v1/chat/completions', data)
with subtest('response 2 is from smollm2-group-2'):
assert response_2['model'] == 'smollm2-group-2', f'response was not from smollm2-group-2: {response_2['model']}'
with subtest('response 2 contains at least one item in "choices"'):
assert len(response_2['choices']) >= 1, f'response had no choices: {response_2}'
assistant_choices_2 = None
with subtest('response 2 contains at least one "assistant" message'):
assistant_choices_2 = [c for c in response_2['choices'] if c['message']['role'] == 'assistant']
assert len(assistant_choices_2) >= 1, f'response had no assistant message: {response_2}'
with subtest('first message (lowercase) in response 1 starts with "hello"'):
assert assistant_choices_2[0]['message']['content'].lower()[:5] == 'hello', f'response didn\'t start with hello: {response_2}'
with subtest('check `/running` for both smollm2-group-1 and smollm2-group-2'):
running_response = get_json('/running')['running']
assert len(running_response) == 2, 'expected both in smollm2 group to be running'
assert len([
rm for rm in running_response
if rm['state'] == 'ready' and rm['model'] == 'smollm2-group-1'
]) == 1, f'smollm2-group-1 not in running group and ready {running_response}'
assert len([
rm for rm in running_response
if rm['state'] == 'ready' and rm['model'] == 'smollm2-group-2'
]) == 1, f'smollm2-group-2 not in running group and ready {running_response}'
'';
}
);
in
lib.recurseIntoAttrs (
builtins.mapAttrs (k: v: runTest (makeLlamaSwapTest k v)) {
full = { };
minimal = {
withUI = false;
};
meta.license = with lib.licenses; [
asl20 # actual license of the model
unfree # to force an opt-in - do not remove
];
};
# grab allowUnfreePredicate if it exists or default deny
allowUnfreePredicate =
if builtins.hasAttr "allowUnfreePredicate" pkgs.config then
pkgs.config.allowUnfreePredicate
else
(_: false);
# check if we can use smollm2-135m taking either globally allowUnfree or
# explicit allow with predicate
useSmollm2-135m = pkgs.config.allowUnfree || allowUnfreePredicate smollm2-135m;
in
{
name = "llama-swap";
meta.maintainers = with lib.maintainers; [
jk
podium868909
];
nodes = {
machine =
{ pkgs, ... }:
{
# running models can be memory intensive but
# default `virtualisation.memorySize` is fine
services.llama-swap = {
enable = true;
settings =
# config for basic tests
if !useSmollm2-135m then
{ }
# config for extended tests using SmolLM2
else
let
llama-cpp = pkgs.llama-cpp;
llama-server = lib.getExe' llama-cpp "llama-server";
in
{
# more useful logging output
logLevel = "debug";
logToStdout = "both";
hooks.on_startup.preload = [
"smollm2"
];
# temperature and top-k important for SmolLM2 performance/accuracy
models = {
"smollm2" = {
ttl = 10;
cmd = "${llama-server} --port \${PORT} -m ${smollm2-135m} --alias smollm2 --no-webui --temp 0.2 --top-k 9";
};
"smollm2-group-1" = {
cmd = "${llama-server} --port \${PORT} -m ${smollm2-135m} --alias smollm2-group-1 --no-webui --temp 0.2 --top-k 9 -c 1024";
};
"smollm2-group-2" = {
proxy = "http://127.0.0.1:5802";
cmd = "${llama-server} --port 5802 -m ${smollm2-135m} --alias smollm2-group-2 --no-webui --temp 0.2 --top-k 9 -c 1024";
};
};
groups = {
"standalone" = {
swap = true;
exclusive = true;
members = [
"smollm2"
];
};
"group" = {
swap = false;
exclusive = true;
members = [
"smollm2-group-1"
"smollm2-group-2"
];
};
};
};
};
};
};
testScript =
{ nodes, ... }:
''
# core tests
import json
def get_json(route):
args = [
'-v',
'-s',
'--fail',
'-H "Content-Type: application/json"'
]
return json.loads(machine.succeed("curl {args} http://localhost:8080{route}".format(args=" ".join(args), route=route)))
def post_json(route, data):
args = [
'-v',
'-s',
'--fail',
'-H "Content-Type: application/json"',
"-d '{d}'".format(d=json.dumps(data))
]
return json.loads(machine.succeed('curl {args} http://localhost:8080{route}'.format(args=" ".join(args), route=route)))
machine.wait_for_unit('llama-swap')
machine.wait_for_open_port(8080)
with subtest('check is serving ui'):
machine.succeed('curl --fail http:/localhost:8080/ui/')
with subtest('check is healthy'):
response_healthy = machine.wait_until_succeeds('curl --silent --fail http://localhost:8080/health')
assert 'OK' in response_healthy, '/health was not OK'
''
+ lib.optionalString useSmollm2-135m ''
# extended tests using SmolLM2
with subtest('check `/running` for preloaded smollm2'):
machine.wait_until_succeeds('curl --silent --fail http://localhost:8080/running | grep "smollm2"')
running_response = get_json('/running')
assert len(running_response['running']) == 1, f'running doesn\'t have one entry as expected: {running_response}'
running_model = running_response['running'][0]
assert running_model['model'] == 'smollm2', f'running model is not smollm2: {running_response}'
assert running_model['state'] == 'ready', f'running smollm2 is not ready: {running_response}'
with subtest('runs smollm2'):
response = None
with subtest('send request to smollm2'):
data = {
'model': 'smollm2',
'messages': [
{
'role': 'user',
'content': 'Say hello'
}
]
}
response = post_json('/v1/chat/completions', data)
with subtest('response is from smollm2'):
assert response['model'] == 'smollm2', f'response was not from smollm2: {response['model']}'
with subtest('response contains at least one item in "choices"'):
assert len(response['choices']) >= 1, f'response had no choices: {response}'
assistant_choices = None
with subtest('response contains at least one "assistant" message'):
assistant_choices = [c for c in response['choices'] if c['message']['role'] == 'assistant']
assert len(assistant_choices) >= 1, f'response had no assistant message: {response}'
with subtest('first message (lowercase) starts with "hello"'):
assert assistant_choices[0]['message']['content'].lower()[:5] == 'hello', f'response didn\'t start with hello: {response}'
with subtest('check `/running` for just smollm2'):
running_response = get_json('/running')
assert len(running_response['running']) == 1, f'running doesn\'t have one entry as expected: {running_response}'
running_model = running_response['running'][0]
assert running_model['model'] == 'smollm2', f'running model is not smollm2: {running_response}'
assert running_model['state'] == 'ready', f'running smollm2 is not ready: {running_response}'
with subtest('check `/running` for smollm2 to timeout'):
machine.wait_until_succeeds('curl --silent --fail http://localhost:8080/running | grep -v "smollm2"', timeout=11)
running_response = get_json('/running')
assert len(running_response['running']) == 0, "smollm2 was still running after timeout"
with subtest('runs smollm2-group-1 and smollm2-group-2'):
response_1 = None
with subtest('send request to smollm2-group-1'):
data = {
'model': 'smollm2-group-1',
'messages': [
{
'role': 'user',
'content': 'Say hello'
}
]
}
response_1 = post_json('/v1/chat/completions', data)
with subtest('response 1 is from smollm2-group-1'):
assert response_1['model'] == 'smollm2-group-1', f'response was not from smollm2-group-1: {response_1['model']}'
with subtest('response 1 contains at least one item in "choices"'):
assert len(response_1['choices']) >= 1, f'response had no choices: {response_1}'
assistant_choices_1 = None
with subtest('response 1 contains at least one "assistant" message'):
assistant_choices_1 = [c for c in response_1['choices'] if c['message']['role'] == 'assistant']
assert len(assistant_choices_1) >= 1, f'response had no assistant message: {response_1}'
with subtest('first message (lowercase) in response 1 starts with "hello"'):
assert assistant_choices_1[0]['message']['content'].lower()[:5] == 'hello', f'response didn\'t start with hello: {response_1}'
with subtest('check `/running` for just smollm2-group-1'):
running_response = get_json('/running')
assert len(running_response['running']) == 1, f'running doesn\'t have one entry as expected: {running_response}'
running_model = running_response['running'][0]
assert running_model['model'] == 'smollm2-group-1', f'running model is not smollm2-group-1: {running_response}'
assert running_model['state'] == 'ready', f'running smollm2-group-1 is not ready: {running_response}'
response_2 = None
with subtest('send request to smollm2-group-2'):
data = {
'model': 'smollm2-group-2',
'messages': [
{
'role': 'user',
'content': 'Say hello'
}
]
}
response_2 = post_json('/v1/chat/completions', data)
with subtest('response 2 is from smollm2-group-2'):
assert response_2['model'] == 'smollm2-group-2', f'response was not from smollm2-group-2: {response_2['model']}'
with subtest('response 2 contains at least one item in "choices"'):
assert len(response_2['choices']) >= 1, f'response had no choices: {response_2}'
assistant_choices_2 = None
with subtest('response 2 contains at least one "assistant" message'):
assistant_choices_2 = [c for c in response_2['choices'] if c['message']['role'] == 'assistant']
assert len(assistant_choices_2) >= 1, f'response had no assistant message: {response_2}'
with subtest('first message (lowercase) in response 1 starts with "hello"'):
assert assistant_choices_2[0]['message']['content'].lower()[:5] == 'hello', f'response didn\'t start with hello: {response_2}'
with subtest('check `/running` for both smollm2-group-1 and smollm2-group-2'):
running_response = get_json('/running')['running']
assert len(running_response) == 2, 'expected both in smollm2 group to be running'
assert len([
rm for rm in running_response
if rm['state'] == 'ready' and rm['model'] == 'smollm2-group-1'
]) == 1, f'smollm2-group-1 not in running group and ready {running_response}'
assert len([
rm for rm in running_response
if rm['state'] == 'ready' and rm['model'] == 'smollm2-group-2'
]) == 1, f'smollm2-group-2 not in running group and ready {running_response}'
'';
}
# opt in to smollm2-135m
full-with-llm = {
withLLM = true;
};
}
)

View File

@@ -11,7 +11,7 @@
stdenv.mkDerivation {
pname = "deadbeef-musical-spectrum-plugin";
version = "unstable-2020-07-01";
version = "0-unstable-2020-07-01";
src = fetchFromGitHub {
owner = "cboxdoerfer";

View File

@@ -9,13 +9,13 @@
stdenv.mkDerivation {
pname = "deadbeef-playlist-manager-plugin";
version = "unstable-2021-05-02";
version = "1-unstable-2021-05-02";
src = fetchFromGitHub {
owner = "kpcee";
repo = "deadbeef-playlist-manager";
rev = "b1393022b2d9ea0a19b845420146e0fc56cd9c0a";
sha256 = "sha256-dsKthlQ0EuX4VhO8K9VTyX3zN8ytzDUbSi/xSMB4xRw=";
hash = "sha256-dsKthlQ0EuX4VhO8K9VTyX3zN8ytzDUbSi/xSMB4xRw=";
};
nativeBuildInputs = [

View File

@@ -26,9 +26,9 @@ let
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.3.6/android-studio-quail3-rc2-linux.tar.gz";
};
latestVersion = {
version = "2026.1.4.3"; # "Android Studio Quail 4 | 2026.1.4 Canary 3"
sha256Hash = "sha256-2rJp5PBxBrp6poIsBDPwGZ7BshBaBPkLaKfe6fACl2Q=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.4.3/android-studio-quail4-canary3-linux.tar.gz";
version = "2026.1.4.4"; # "Android Studio Quail 4 | 2026.1.4 Canary 4"
sha256Hash = "sha256-gcVlZzJ1/euSsKVrmYLXHt1Ym2kNghTzIk6crZXhGKQ=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.4.4/android-studio-quail4-canary4-linux.tar.gz";
};
in
{

View File

@@ -1190,8 +1190,8 @@ let
mktplcRef = {
publisher = "DanielSanMedium";
name = "dscodegpt";
version = "3.24.39";
hash = "sha256-r1XkER09s+38uCbUxK9MM5bHRNp3UnMj6VJCHUMZM1Q=";
version = "3.24.43";
hash = "sha256-Y3pCg0qauVu4K6qz610QGRizyodnRpDigGSSIn6m6gw=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/DanielSanMedium.dscodegpt/changelog";
@@ -1242,8 +1242,8 @@ let
mktplcRef = {
name = "databricks";
publisher = "databricks";
version = "2.12.4";
hash = "sha256-29xG0/AhBhidM8Hd7vHUWxESCDt8MwACIkBpmfvhD2Q=";
version = "2.13.0";
hash = "sha256-4Fa1UABo7JUO7+IECjsYEq9zyscHTGUlrUCa3aBdhoI=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/databricks.databricks/changelog";

View File

@@ -7,8 +7,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
name = "latex-workshop";
publisher = "James-Yu";
version = "10.16.1";
hash = "sha256-QhqBCQjWADmuPK9ryMCoQPWE1pyIeO9XfYvN40ipL0Y=";
version = "10.18.0";
hash = "sha256-nuBx5ujJPbKvXRvIbUaPaIgoUeeYp4XwHwOdAjCVqUY=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/James-Yu.latex-workshop/changelog";

View File

@@ -7,8 +7,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
name = "claude-dev";
publisher = "saoudrizwan";
version = "4.1.3";
hash = "sha256-z1TrY/GWPkB14LSbFBALotU/WY2qHW6aj92PxCn4Uhc=";
version = "4.1.8";
hash = "sha256-bhLnEsoifDQGHKCECTZ/BkAjuFQ9O9tODxzO2WMdybo=";
};
meta = {

View File

@@ -14,15 +14,15 @@ let
{
x86_64-linux = {
arch = "linux-x64";
hash = "sha256-jAQJh1JqomJDUFeb2N452ICo0azFelT8vHvEsBqXi8w=";
hash = "sha256-3FE2tZtkDZttZlD7foqt1qgcb1w37mT0/RC30HYEvNA=";
};
aarch64-linux = {
arch = "linux-arm64";
hash = "sha256-Z3cRojI4mCCS2t3aLojgImULQOobq5liDwoeHuzKEhY=";
hash = "sha256-xxniWRtMkh3NE9OWJkR9xUARJTBnQkoTRlXrQa95K/k=";
};
aarch64-darwin = {
arch = "darwin-arm64";
hash = "sha256-rHgMl71YCs9ea0nFnx+E2U8isL4zQzIvvE9tgxM7IiA=";
hash = "sha256-/pj6HPuqvAYXrBVX/FoOZRDYL5xvdnM+PPM27/5+hxw=";
};
}
.${system} or (throw "Unsupported system: ${system}");
@@ -34,7 +34,7 @@ vscode-utils.buildVscodeMarketplaceExtension (finalAttrs: {
# Please update the corresponding binary (typos-lsp)
# when updating this extension.
# See pkgs/by-name/ty/typos-lsp/package.nix
version = "0.1.51";
version = "0.1.55";
inherit (extInfo) hash arch;
};

View File

@@ -7,15 +7,15 @@
let
supported = {
x86_64-linux = {
hash = "sha256-LuES+anP3Kd1uOZrteb3yy5nsec5gAX0PYeslJ8orBg=";
hash = "sha256-Fy745lZuOz7lLPRp6XXmHGr9asLj2kynlJbaHe6kgCg=";
arch = "linux-x64";
};
aarch64-linux = {
hash = "sha256-vMLc5Yhtif8jN9V7DXER8BxFxYYv3sY7yKNMvse6CmQ=";
hash = "sha256-AULA4binavpDoxwpfpdBnl81HshNuChYiyOjte+aQw4=";
arch = "linux-arm64";
};
aarch64-darwin = {
hash = "sha256-0ktwL6NkSGrpIUzc0IARoql2hxcluxvK0CTZkX4UEUE=";
hash = "sha256-DKu+dUPCDNOCm1KlpNIeIPmIAFYbVQLD8w4Q3dy3pPI=";
arch = "darwin-arm64";
};
};
@@ -30,7 +30,7 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = base // {
name = "tombi";
publisher = "tombi-toml";
version = "1.2.5";
version = "1.2.8";
};
meta = {
description = "TOML Language Server";

View File

@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "mednafen-saturn";
version = "0-unstable-2026-07-30";
version = "0-unstable-2026-08-11";
src = fetchFromGitHub {
owner = "libretro";
repo = "beetle-saturn-libretro";
rev = "5231aa238ff2bf61b1ed88775711b71692c8e37c";
hash = "sha256-vVAnNXTyHpVImkwtCc8h0l/thxre08M7jyzZWk81pVY=";
rev = "ed549bdac0e1a830bb794fa720e45c225a45355c";
hash = "sha256-uRmkeRuOM2JN5OvuImAxyRyRPjXxCHeAl828304hF0o=";
};
makefile = "Makefile";

View File

@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "snes9x";
version = "0-unstable-2026-07-13";
version = "0-unstable-2026-08-09";
src = fetchFromGitHub {
owner = "snes9xgit";
repo = "snes9x";
rev = "b5cc7651f9fc02189cb51b5a43848877db5aec42";
hash = "sha256-htwL5m49J+ku7h79Eu4y74LKiHkbL3UE3+LAXE52ZY8=";
rev = "2ab06b3695bce429a074ced6f5193eb1c7acefaf";
hash = "sha256-L4j6wzYFiDQr+uKxLgPEEKecdeoPwED2U2TICZGvSuc=";
};
makefile = "Makefile";

View File

@@ -1,10 +1,10 @@
{
"chromium": {
"version": "151.0.7922.108",
"version": "151.0.7922.137",
"chromedriver": {
"version": "151.0.7922.109",
"hash_darwin": "sha256-VzMu90gOs02icI3PgvpNYXeE5c0QjCVB9CpM287roZo=",
"hash_darwin_aarch64": "sha256-5djEbPAayOVr8hr2VfXvlU4W6F+Kd/wiCt5NvQtgoOY="
"version": "151.0.7922.138",
"hash_darwin": "sha256-SW+gKW+GuPwVrJwFdFw6WmECOVXzfRT6tWCIRHoYrok=",
"hash_darwin_aarch64": "sha256-qUVhQo3JTPU5MP0RkVSAyk3iQTy/MWvE7Kab1BoI+Vg="
},
"deps": {
"depot_tools": {
@@ -21,8 +21,8 @@
"DEPS": {
"src": {
"url": "https://chromium.googlesource.com/chromium/src.git",
"rev": "4744b886309d987d292e43232776d2206cccb13d",
"hash": "sha256-1i2IAA5sXyMPBzh6xOIY3CllEDtIS9Buk8Z2Vm1JnYw=",
"rev": "8f5d36bc16f57115aeeff34baf4ad6aa964d509c",
"hash": "sha256-OSqLGAnfiGRVC4RRMnjXFx0JvKh2qY+9zlf2xJZT19Q=",
"recompress": true
},
"src/third_party/clang-format/script": {
@@ -657,8 +657,8 @@
},
"src/third_party/skia": {
"url": "https://skia.googlesource.com/skia.git",
"rev": "86bb2f25f46f4d620b4a26e738f59a9b6c22d2eb",
"hash": "sha256-tnUcFuwWtw0uGNIsU38M54V1MAYFs7/2yjP9Cs1fEHo="
"rev": "66cca05ab345fb894cc80ed412e2fa79f687f5d9",
"hash": "sha256-lDMn7ReDCdGKGmypIZszE29DWGFebJemFPluKZYeg7k="
},
"src/third_party/smhasher/src": {
"url": "https://chromium.googlesource.com/external/smhasher.git",
@@ -827,8 +827,8 @@
},
"src/v8": {
"url": "https://chromium.googlesource.com/v8/v8.git",
"rev": "20ad8d002c17ccc7ccfbefc6c4dcf1242fe80921",
"hash": "sha256-J2dblSPMoZTpotDpuPp6beRYv+KtCirqNxEGEQKpqcQ="
"rev": "00c2754b59cf5f79b323950c63b07cfb1a8377d4",
"hash": "sha256-dXWiFX049YVnrtNdEznEiwT8lDyGJn9BEehB2yhCxqI="
},
"src/agents/shared": {
"url": "https://chromium.googlesource.com/chromium/agents.git",
@@ -838,7 +838,7 @@
}
},
"ungoogled-chromium": {
"version": "151.0.7922.108",
"version": "151.0.7922.137",
"deps": {
"depot_tools": {
"rev": "94e89b10b92cc9d6e58fc8d1b6474b7d29e8a114",
@@ -850,16 +850,16 @@
"hash": "sha256-T2LdISIkp8fcUli5ZetTqrESBAc7coJhWdJv7I+o9kk="
},
"ungoogled-patches": {
"rev": "151.0.7922.108-1",
"hash": "sha256-EhnX4fkuKTTIF6wztKWitrjNzKUf36fAnr7lUkJqJtQ="
"rev": "151.0.7922.137-1",
"hash": "sha256-QIkhRquVqD22P1UBJ+Qv0LEI118v7PDt3hQCIl1ScQ4="
},
"npmHash": "sha256-pF0JtwFpPC4/fodbhSJnQKkczA9WlDg4VqEAy9aDVLg="
},
"DEPS": {
"src": {
"url": "https://chromium.googlesource.com/chromium/src.git",
"rev": "4744b886309d987d292e43232776d2206cccb13d",
"hash": "sha256-1i2IAA5sXyMPBzh6xOIY3CllEDtIS9Buk8Z2Vm1JnYw=",
"rev": "8f5d36bc16f57115aeeff34baf4ad6aa964d509c",
"hash": "sha256-OSqLGAnfiGRVC4RRMnjXFx0JvKh2qY+9zlf2xJZT19Q=",
"recompress": true
},
"src/third_party/clang-format/script": {
@@ -1494,8 +1494,8 @@
},
"src/third_party/skia": {
"url": "https://skia.googlesource.com/skia.git",
"rev": "86bb2f25f46f4d620b4a26e738f59a9b6c22d2eb",
"hash": "sha256-tnUcFuwWtw0uGNIsU38M54V1MAYFs7/2yjP9Cs1fEHo="
"rev": "66cca05ab345fb894cc80ed412e2fa79f687f5d9",
"hash": "sha256-lDMn7ReDCdGKGmypIZszE29DWGFebJemFPluKZYeg7k="
},
"src/third_party/smhasher/src": {
"url": "https://chromium.googlesource.com/external/smhasher.git",
@@ -1664,8 +1664,8 @@
},
"src/v8": {
"url": "https://chromium.googlesource.com/v8/v8.git",
"rev": "20ad8d002c17ccc7ccfbefc6c4dcf1242fe80921",
"hash": "sha256-J2dblSPMoZTpotDpuPp6beRYv+KtCirqNxEGEQKpqcQ="
"rev": "00c2754b59cf5f79b323950c63b07cfb1a8377d4",
"hash": "sha256-dXWiFX049YVnrtNdEznEiwT8lDyGJn9BEehB2yhCxqI="
},
"src/agents/shared": {
"url": "https://chromium.googlesource.com/chromium/agents.git",

View File

@@ -10,16 +10,16 @@
buildGoModule (finalAttrs: {
pname = "kubernetes-helm";
version = "4.2.3";
version = "4.2.4";
src = fetchFromGitHub {
owner = "helm";
repo = "helm";
rev = "v${finalAttrs.version}";
hash = "sha256-t7cdJjazG38T49y+x2B1akBNvZNXhN2ig3eNnHirV2g=";
hash = "sha256-Q9+0K65qwmebkXlsIByEX2zE4hSaZWYGTWGgwVkcJNs=";
};
vendorHash = "sha256-6TJWtGTdTtzOpPvWsk4rtJwxZxkIxIA6QSAemOnHcJ4=";
vendorHash = "sha256-AFiniy+SM1svofkNWjowIE0BPmYa6TUcK9LPQahP+S4=";
subPackages = [ "cmd/helm" ];
ldflags = [

View File

@@ -337,13 +337,13 @@
"vendorHash": "sha256-fP6brpY/wRI1Yjgapzi+FfOci65gxWeOZulXbGdilrE="
},
"dnsimple_dnsimple": {
"hash": "sha256-8ZanbgHaszFiorzY/ulpVvUesmyx7O3SKXmwOi5WUSU=",
"hash": "sha256-YkoBGPcNKBeAHWcsRldHSsZ/hvWngCiySjK5zzI9jNE=",
"homepage": "https://registry.terraform.io/providers/dnsimple/dnsimple",
"owner": "dnsimple",
"repo": "terraform-provider-dnsimple",
"rev": "v2.1.2",
"rev": "v2.2.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-1CpswocnTe6aj4TP7fMGy6mv0d/yX8FcYAKkAW5k7kk="
"vendorHash": "sha256-SuwDjQMgzcnNsBf/wXZvys6VINgnFeaWcV7jIMbNXo8="
},
"dnsmadeeasy_dme": {
"hash": "sha256-JH9YcM9Fvd1x0BJpLUZCm6a9hZZxySrkFVLP89FO3fU=",
@@ -409,13 +409,13 @@
"vendorHash": null
},
"fastly_fastly": {
"hash": "sha256-fblscW6k/iWGr3HTLASrfD11asYsssDuXkGUnzGoUFY=",
"hash": "sha256-n1C/sRIPaZJJ/0irMNhDbi+hzXaof0+Kgu7XgDkGS3o=",
"homepage": "https://registry.terraform.io/providers/fastly/fastly",
"owner": "fastly",
"repo": "terraform-provider-fastly",
"rev": "v9.4.0",
"rev": "v9.6.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-DhETt9f9GaAI5V/A53H3Bhph9uZyffUM1bsWDrW4CLE="
"vendorHash": "sha256-tDiNj7Xbda10gUBYJ1bwzlYsrwa2ZSK9ZxsbXziI2pU="
},
"flexibleenginecloud_flexibleengine": {
"hash": "sha256-yEZ9JiUSqFFbfqzOOD59ZBv4yFCeUBBKlp6aiUqDqiM=",
@@ -733,13 +733,13 @@
"vendorHash": null
},
"ibm-cloud_ibm": {
"hash": "sha256-hDLD3h+640IRIL5lDegn4W2tOuSef6Bi5JWdlLbtqoM=",
"hash": "sha256-r34ih6c5UVovef14tNMkZA/QjJxVDTpfreeJPLE3fP8=",
"homepage": "https://registry.terraform.io/providers/IBM-Cloud/ibm",
"owner": "IBM-Cloud",
"repo": "terraform-provider-ibm",
"rev": "v2.4.0",
"rev": "v2.5.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-/UNr2OiDlq0gX3D77mbruDj9WMnS/0AxkoEaBcWlFHU="
"vendorHash": "sha256-e58CRr7mqENnAoF3eQyaypbsFr1sflrWHkx8U/JxCNA="
},
"icinga_icinga2": {
"hash": "sha256-Y/Oq0aTzP+oSKPhHiHY9Leal4HJJm7TNDpcdqkUsCmk=",
@@ -1202,13 +1202,13 @@
"vendorHash": "sha256-MIO0VHofPtKPtynbvjvEukMNr5NXHgk7BqwIhbc9+u0="
},
"selectel_selectel": {
"hash": "sha256-Z5Z66WIZur68s0VkmIpbowZr26J2Ngy2l5269I6SxVA=",
"hash": "sha256-IewnjIw4MXAcMb3J1TxON8dz0lelClKgRgpJShWj6b8=",
"homepage": "https://registry.terraform.io/providers/selectel/selectel",
"owner": "selectel",
"repo": "terraform-provider-selectel",
"rev": "v8.2.4",
"rev": "v8.3.1",
"spdx": "MPL-2.0",
"vendorHash": "sha256-qDQXedSS41lpV1o+lfCYHs81m3AcqHhku6xlul7725E="
"vendorHash": "sha256-pYvj5toBm4XT5TTSECZiyd5tcPbTp+EREYaxyV0mLAM="
},
"siderolabs_talos": {
"hash": "sha256-/NACmEpodBNx+Q2M9y3JnKpw9a3Y1eFDdTQ+48MXAc8=",
@@ -1247,13 +1247,13 @@
"vendorHash": "sha256-gva4QLCNANCaDSjv84N2oFv9VlsU8oUZOUTx6nTRIcA="
},
"splunk-terraform_signalfx": {
"hash": "sha256-xdB2VAacBGFAeVd60Zy6MWSmx6BFJ7ciZKSTXYdRZY0=",
"hash": "sha256-KoPLEVzR/MtMTrufqvxrOuVsfjCUXQ9UMbqjosAy2oc=",
"homepage": "https://registry.terraform.io/providers/splunk-terraform/signalfx",
"owner": "splunk-terraform",
"repo": "terraform-provider-signalfx",
"rev": "v9.33.0",
"rev": "v9.34.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-m7Op/K3Xo9nKgVg9bTHmpmPiFpCB6Ek/kgj76P+ViGQ="
"vendorHash": "sha256-mNEzE2eACy63BGoFOamG52JD8mvC7okhSN9hMuesTlg="
},
"spotinst_spotinst": {
"hash": "sha256-pkYrrtsbIHSyy/TjoHBegrwwwIi6Vn6aT4Ic3C/QgyY=",
@@ -1283,11 +1283,11 @@
"vendorHash": "sha256-nbiLH+J051XxTx+z8xGrp/DPYB7g9S4clFSWcZUKnAg="
},
"sysdiglabs_sysdig": {
"hash": "sha256-VeIgHhCHyNgAcv2NIBAWCJIwGHE3nqYeCxGd4VSUymU=",
"hash": "sha256-MfwzmTzikzZAg0U7W5Dmjww6Oadnr4Oq+uIQSZaRHEo=",
"homepage": "https://registry.terraform.io/providers/sysdiglabs/sysdig",
"owner": "sysdiglabs",
"repo": "terraform-provider-sysdig",
"rev": "v3.9.0",
"rev": "v3.9.1",
"spdx": "MPL-2.0",
"vendorHash": "sha256-HjrB7C0KaLJz9NVLfZdq5EZbNbF9lJPxSkQwnWUF978="
},

View File

@@ -1,153 +1,153 @@
{
"linux-canary": {
"distro": {
"hash": "sha256-wVyW1GrvmMEM/btexjTf2uFkTt7GNG+dkI3C+dWnrJQ=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/full.distro"
"hash": "sha256-FUuG8LKZwvszmdrKjnEKu+iQT0Ly08aLFO91FGzdGO8=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/full.distro"
},
"kind": "distro",
"modules": {
"discord_arborium": {
"hash": "sha256-F5zZEtp67OAUM4gLtV0Uhsy4Gj1eqX7vBjIlOn/GzNI=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_arborium/1/full.distro",
"hash": "sha256-D+NJvpdGsE2IiPB4vl+CDHLNmga8zrHSu1Q9skD2E80=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_arborium/1/full.distro",
"version": 1
},
"discord_cloudsync": {
"hash": "sha256-Tic8LFWOoX4AyiGmMwYwCr6T807aXLYbamW72/bZwN4=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_cloudsync/1/full.distro",
"version": 1
"hash": "sha256-BopR1WtIPEgfx6b5bhHSSKYtMOSIVxJr34GE6E7rATk=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_cloudsync/2/full.distro",
"version": 2
},
"discord_desktop_core": {
"hash": "sha256-zSF6kyKXzCERAEx8LslGt/YYPtWXNgr2Kdpj0Yx05F0=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_desktop_core/1/full.distro",
"version": 1
"hash": "sha256-OWORDE77w5HBh7I5d7bnTjzdU8x7MxOCtzrWoQNX3Zs=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_desktop_core/2/full.distro",
"version": 2
},
"discord_dispatch": {
"hash": "sha256-8jJd14m9a3eias4cMCT1wRnu1aT8dzXUXCv5dAMLxN8=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_dispatch/1/full.distro",
"version": 1
"hash": "sha256-SGsUToeQaZ/bQtHy8RMIxHg0dHz8Zhvu5sVckyXUQ18=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_dispatch/2/full.distro",
"version": 2
},
"discord_erlpack": {
"hash": "sha256-uhrQCnQC4Dm/XkoYRqVzjUvweYabsJxQrA2LtUxQ7Ac=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_erlpack/1/full.distro",
"hash": "sha256-P40ZPbTL4FfeoWKjjwAuh+ysQRgtYUBX/a3Oj/2BX1U=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_erlpack/1/full.distro",
"version": 1
},
"discord_game_utils": {
"hash": "sha256-32OQHDin9330UsgJ6JYWkT2dv+ToyWzbBpxMKnjxEQY=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_game_utils/1/full.distro",
"version": 1
"hash": "sha256-sHzwAS6iQ7XiRw9RzIsOzgHyK/D0gMwmlwez29EGGMA=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_game_utils/2/full.distro",
"version": 2
},
"discord_krisp": {
"hash": "sha256-2SfBfbzwcl2yhKikIiaw95qqixa/hm8apwhVnks/3cM=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_krisp/1/full.distro",
"version": 1
"hash": "sha256-JY+82GDMUzdL7yQ+55F1r2+kU86wHnfW1HSRGA+gs44=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_krisp/2/full.distro",
"version": 2
},
"discord_modules": {
"hash": "sha256-PmTRUml1bZY45GNEfZqMWDl3eNHdGrkM2f/kASSoFEQ=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_modules/1/full.distro",
"version": 1
"hash": "sha256-NodXtAgXZZl3EOO4Rak1gCYpkxmJbJ9P4HHS3W/AW5A=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_modules/2/full.distro",
"version": 2
},
"discord_rpc": {
"hash": "sha256-n4WUN1e2mYwyd4TEa5AEOFv9OhXlimkTCNe6cWucH3s=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_rpc/1/full.distro",
"version": 1
"hash": "sha256-USuVJtYZG+V3mZahEmcn0r+Pc45xCYqBk8gxKZB+4ZY=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_rpc/2/full.distro",
"version": 2
},
"discord_spellcheck": {
"hash": "sha256-koi/kVLiq9lSGlhiCXl2Cbw0O812+PPkgC2aBH0kKwU=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_spellcheck/1/full.distro",
"hash": "sha256-BL7UkZR2O5562UUmkadrxOVifL2d/vqRqzaW9k+lUks=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_spellcheck/1/full.distro",
"version": 1
},
"discord_utils": {
"hash": "sha256-c9HSxlOz9RMvwSie5nEjHsI51cLyC+mInQrSwFbuHAo=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_utils/1/full.distro",
"version": 1
"hash": "sha256-IS7WwTqJwx/+OYgO2ZP3TxsVTXscLQOn5bEWLOBGOzY=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_utils/2/full.distro",
"version": 2
},
"discord_voice": {
"hash": "sha256-KBesDj1E++Ty2JO3CXKr81RR4DOfL+26sYi1F6oZJfo=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_voice/1/full.distro",
"version": 1
"hash": "sha256-g2oiDEFwq0qbbeVlMM0xHKAGFjVTwSl4reDaDQGcZUU=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_voice/2/full.distro",
"version": 2
},
"discord_zstd": {
"hash": "sha256-Q5KpWnY3TaE9R9qXw/1E1m5wu1UXegFlfWY7rh2iQ3g=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1635/discord_zstd/1/full.distro",
"version": 1
"hash": "sha256-hqysSEE+kDmW2VWt6PyVUW4lUMZfu6OH2KtmchMil8E=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/linux/x64/1.0.1656/discord_zstd/2/full.distro",
"version": 2
}
},
"version": "1.0.1635"
"version": "1.0.1656"
},
"linux-development": {
"distro": {
"hash": "sha256-yrpyHVaPpM5uPbB+iCApdeQmkyyGaqN1LrT6ZYHbhbY=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/full.distro"
"hash": "sha256-tmjpT2oZ+1BefLhh4Bxipi0xLTO3JjOzzGLdVcmyuvE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/full.distro"
},
"kind": "distro",
"modules": {
"discord_arborium": {
"hash": "sha256-ONuhQI6g6BmU+TpWAPlijXyqn3nIvaPkT0sydfxvZao=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_arborium/1/full.distro",
"hash": "sha256-yEK2W6Fp0pcF6FSCZYgopcKMTC7ofswVq1G3SK/TOWY=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_arborium/1/full.distro",
"version": 1
},
"discord_cloudsync": {
"hash": "sha256-KOOtLoQpgQN+ZB6jJ/dHVX6GsdY+Rwbs6Lg7XAaIMs8=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_cloudsync/1/full.distro",
"hash": "sha256-hNSSWkwjEaqaKYqFBBh3v8PBEHB0YEa2bZJd6Lt0xbc=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_cloudsync/1/full.distro",
"version": 1
},
"discord_desktop_core": {
"hash": "sha256-OFRRyIG92N+w0uH5i4oKrQjfaSMFLn1+XdCQlx2MLhQ=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_desktop_core/1/full.distro",
"hash": "sha256-TYzmzahlesOKI6sUNGNq2fr6++sJpRycLWZRUAhtfhc=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_desktop_core/1/full.distro",
"version": 1
},
"discord_dispatch": {
"hash": "sha256-LPnrtss4ahqkSsJLbi7oNv4w6fGtRYEbwwJAkM6lXDs=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_dispatch/1/full.distro",
"hash": "sha256-xZ2d7lTbZunbHcQJKPm9Z0NQE7Oq3qH4uR2zq71IdOs=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_dispatch/1/full.distro",
"version": 1
},
"discord_erlpack": {
"hash": "sha256-W8qd42fl2vbwC0QR4QrJjPC+mgT/a7aZ0C9IRNOOlI8=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_erlpack/1/full.distro",
"hash": "sha256-LC1cBf23zXmSfpW6I7UxuLi30y6m0l+2NwqJsSCt4Cw=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_erlpack/1/full.distro",
"version": 1
},
"discord_game_utils": {
"hash": "sha256-IMqtXTj2vZKhRpS/WstkhLDjltFFXlGEOqbaz6ex+5I=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_game_utils/1/full.distro",
"hash": "sha256-zrxP8s1Npfs6GSHW5q8MuWkhFeINzXwi9A+S93o9vD8=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_game_utils/1/full.distro",
"version": 1
},
"discord_krisp": {
"hash": "sha256-AoKbpqRFOZDNDOFSJegmvRbTKnQeLWmLYXA5XNZz3qE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_krisp/1/full.distro",
"hash": "sha256-ulpY2VnZwBFbEBcwXXO8cNhGgWEqkoBVEbMn/ictKQg=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_krisp/1/full.distro",
"version": 1
},
"discord_modules": {
"hash": "sha256-itja8snUwlNzic87xWv9LM3ppB63QlzZalOyCdNELsE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_modules/1/full.distro",
"hash": "sha256-BCrN7APbCd0bw55cL51umhfpYBUpkEIBxHF8IZaEpRM=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_modules/1/full.distro",
"version": 1
},
"discord_rpc": {
"hash": "sha256-Lj+Cwc8M1nyIlMwQryv8tmw9Doyq/tYBqG9KFCW1Zh4=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_rpc/1/full.distro",
"hash": "sha256-RsWNLlNSyuIhnFqpSG374vlmLqfFEZRAL8XcmiI3JPE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_rpc/1/full.distro",
"version": 1
},
"discord_spellcheck": {
"hash": "sha256-QU4mP0bNQHh/+Y18vI8jsTDSmTlRGbnDjU41gjSfYTg=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_spellcheck/1/full.distro",
"hash": "sha256-KyeC+llmxpjjbjJGf7F4RYXnIQxnhDnvgixHeubM27Y=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_spellcheck/1/full.distro",
"version": 1
},
"discord_utils": {
"hash": "sha256-Eua48+eBqqsFXJZnfM6mup3PstbdOt/1IxL/THhM+l0=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_utils/1/full.distro",
"hash": "sha256-iKsHKmIlzSTbmsbtNTUwhClJLNf/dF55A/S0ZHuwLUg=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_utils/1/full.distro",
"version": 1
},
"discord_voice": {
"hash": "sha256-QNYGjzAsete+b2i4izZxGGiqBj70IX33SLdFYNQHR1g=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_voice/1/full.distro",
"hash": "sha256-tWiXPoJUXHGmZE7d+oS5hD5LfuqK6NQOKVPILFmvGLY=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_voice/1/full.distro",
"version": 1
},
"discord_zstd": {
"hash": "sha256-3z2OmC0r9JpkzcDOPWwNlK+qrgyaQjKn7rkB+Jb/XGY=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1008/discord_zstd/1/full.distro",
"hash": "sha256-s4fndo1YnagUsY1Nb9CLb/goaxID8+cPJKOzf0NAXh0=",
"url": "https://development.dl2.discordapp.net/distro/app/development/linux/x64/1.0.1009/discord_zstd/1/full.distro",
"version": 1
}
},
"version": "1.0.1008"
"version": "1.0.1009"
},
"linux-ptb": {
"distro": {
@@ -226,258 +226,258 @@
},
"linux-stable": {
"distro": {
"hash": "sha256-3P0AC0nzWyxUCZZfqeeZj8p57E8bD6dfAnC7rYCUch4=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/full.distro"
"hash": "sha256-AzcQ2f6fsLAOvamgJMxMVJbhVh3JSkHeeLRsCwNqsnw=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/full.distro"
},
"kind": "distro",
"modules": {
"discord_arborium": {
"hash": "sha256-EctcvW6AClcKnx+WMc1Az6XBD3Gr12H20sJrwJggjkU=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_arborium/1/full.distro",
"hash": "sha256-wOodeJufXbDUDSsSyrG8+OJ/OxBPFfg3r7utbI7slms=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_arborium/1/full.distro",
"version": 1
},
"discord_cloudsync": {
"hash": "sha256-b7WtS7VLHO7wUIXRbUqD5e4Kg22bAa8z71n0akkjSs8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_cloudsync/1/full.distro",
"hash": "sha256-Z9AHOO66v3eo/l9dMNE6FPduXwk7itn/ux+IBHKyUNw=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_cloudsync/1/full.distro",
"version": 1
},
"discord_desktop_core": {
"hash": "sha256-YNJiO7xyeAMEYioARzVTTYcnBQtqqeQLi/y6eOpZ7oc=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_desktop_core/2/full.distro",
"version": 2
"hash": "sha256-Zis/QM7anwCebhJVXeO+kYQ+82JVxE/l/9DSFvbE0M8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_desktop_core/1/full.distro",
"version": 1
},
"discord_dispatch": {
"hash": "sha256-A+1g70FYSe+CY9/a/S7BSIGy5OMfFbOrbnoJTPVAUyU=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_dispatch/1/full.distro",
"hash": "sha256-rpF8mVEsRC9sR+OiihCV9EhJF1c0JwuEFlKxaeREhYY=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_dispatch/1/full.distro",
"version": 1
},
"discord_erlpack": {
"hash": "sha256-Uz8QoOc8c6fMUXEHyLZ80nOKDMb26IxdHGw7Pw8ZEp8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_erlpack/1/full.distro",
"hash": "sha256-MMcPGHruTeb/Fu9syNn5/XTxUR0JTNqAesGTLbAi20s=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_erlpack/1/full.distro",
"version": 1
},
"discord_game_utils": {
"hash": "sha256-HdWOJQy25w1l8Rmt4EwlJh06w5LxLVpfcLHhV8FZaRI=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_game_utils/1/full.distro",
"hash": "sha256-UkZ7f/Ckc2oDKSI1tdZU/2YBukkVV1eugtOCQ5ShVgk=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_game_utils/1/full.distro",
"version": 1
},
"discord_krisp": {
"hash": "sha256-wcLDDaaNbyjBZGiN+OwIGsKPob5nHYVY2Qy1vAY11ss=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_krisp/1/full.distro",
"hash": "sha256-rFGeGhR5d7Y7Jo1R3netJNz0aAkHd8uBfRtbcK3mZFg=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_krisp/1/full.distro",
"version": 1
},
"discord_modules": {
"hash": "sha256-Ih6vth/F4DTkNs15nhtvLmb5cUCQRRERaVUBAuqc3F8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_modules/1/full.distro",
"hash": "sha256-9/KdLuTux8f5mWoQBSpqNkcU/PvodaMVmAuGRkHW72c=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_modules/1/full.distro",
"version": 1
},
"discord_rpc": {
"hash": "sha256-3YCXPhC1WoakCT5nYBrrilwh8Pzn34lz2mT1aRYOReQ=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_rpc/1/full.distro",
"hash": "sha256-8AgyHPFu3ixeCi71M1W4hjcZHvacWZK2vPNhqRMFqZs=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_rpc/1/full.distro",
"version": 1
},
"discord_spellcheck": {
"hash": "sha256-LHGbGj/Tg3Xqt9VSvVZ12SNE+rgEwX8EcSsMGBqdA5I=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_spellcheck/1/full.distro",
"hash": "sha256-lZZitgtDkVaznkda2t7/5krxfOh3hF2R6ID9oHfaNos=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_spellcheck/1/full.distro",
"version": 1
},
"discord_utils": {
"hash": "sha256-To64PXhcM77MPEgvs5iHCGi/lxnTykLUR45wZ9fYA/M=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_utils/1/full.distro",
"hash": "sha256-bi74t/4DTAL4X8LIiRvx95UlvPy1b1ORgVo49S5iGrA=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_utils/1/full.distro",
"version": 1
},
"discord_voice": {
"hash": "sha256-i5oAPf1e/FMD0E6nIXaxXWxC/VWBBOREMQxWaMUkvxs=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_voice/1/full.distro",
"hash": "sha256-o8dEAGCZbwy7MNGX3XlEb1/2cfSwW6t9NUS5S4ePd5o=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_voice/1/full.distro",
"version": 1
},
"discord_zstd": {
"hash": "sha256-vxFw1kpEiPAyt9oFCnGKrnXo9JsqQEwlv2OnRW4mWC8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.152/discord_zstd/1/full.distro",
"hash": "sha256-wPVbgwlzi7qvim3+VeXvk1oXBYVniNi7tilH1R3/Xm4=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.153/discord_zstd/1/full.distro",
"version": 1
}
},
"version": "1.0.152"
"version": "1.0.153"
},
"osx-canary": {
"distro": {
"hash": "sha256-6zmHOjqyBufB6xXawxcSJKoQm1pWdYkIp5ISAeHjfe0=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/full.distro"
"hash": "sha256-oMoOhtB5M0BbSKhHbomjp5vCyNYCAh8UtEpINCi4wlc=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/full.distro"
},
"kind": "distro",
"modules": {
"discord_arborium": {
"hash": "sha256-jy9RTaxyDXIpZbdC+5bx9uju0PeDxQaNTKgxFzVIZpM=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_arborium/1/full.distro",
"hash": "sha256-6NYHxQfprHHdZGknYMxEl0lo29pt0ryrR9sDvYHO05s=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_arborium/1/full.distro",
"version": 1
},
"discord_cloudsync": {
"hash": "sha256-TV5AuV66V9CI7K9leE3sO569mGYLXnloaUz621Wg1Ow=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_cloudsync/1/full.distro",
"hash": "sha256-+PHB1wpTO5+R3zA9dufE3xLy0syuQYSS+a0jsCNGNjs=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_cloudsync/1/full.distro",
"version": 1
},
"discord_desktop_core": {
"hash": "sha256-DNiXFsfr0KZbeoZbMNdZr8rEu1kqosTVlMBw8N7UvzI=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_desktop_core/1/full.distro",
"version": 1
"hash": "sha256-bxAGSMxQr9Bp5/N8VVMIg3ro7Z/lHtlEmaIm56qgg+k=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_desktop_core/2/full.distro",
"version": 2
},
"discord_dispatch": {
"hash": "sha256-908gzkHlwxHhoipBf2KveaKEQQTg+KMCID0smEM4SWw=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_dispatch/1/full.distro",
"hash": "sha256-2DKqLoaZtxY5LhYOPPejnsVq43mv5spxuMXAhCiq/NM=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_dispatch/1/full.distro",
"version": 1
},
"discord_erlpack": {
"hash": "sha256-k29XwPhAnWFK9Y2KkXHI5LoRZuUAmF464OMQvSD8kzw=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_erlpack/1/full.distro",
"hash": "sha256-nBObSAmMDKQKGYvgnsV8j/D1Z6z/zVHK7yIt7JnD/Zs=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_erlpack/1/full.distro",
"version": 1
},
"discord_game_utils": {
"hash": "sha256-vsPbERMnUxRFaQi/4K6ncqpvUshKN1q8boE2RUne0j0=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_game_utils/1/full.distro",
"hash": "sha256-7KQ38od6K27ycVkvOnaH7SLv/Jx6hPYOE84nzFH1dXI=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_game_utils/1/full.distro",
"version": 1
},
"discord_intents": {
"hash": "sha256-QG63psMwtqLpVxUhL5Qw89kyyAafzRIFC2u8pMmzyS0=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_intents/1/full.distro",
"hash": "sha256-APCh8BArgt5RevI2QJOVLAssgYS/cjdFpIHs8JPTTAg=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_intents/1/full.distro",
"version": 1
},
"discord_krisp": {
"hash": "sha256-t6GDZyGfX5YLvSBaNRFzaMOsdYHEX3XoX2yXQr1STKs=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_krisp/1/full.distro",
"hash": "sha256-fLU6kopr2sQUkXG4A+atBY+AVxjHSxfYAR6TGBdZLvY=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_krisp/1/full.distro",
"version": 1
},
"discord_modules": {
"hash": "sha256-lvD9cYkx4qV2dPC880HEYmyE3cR3kQOCnLzHFin+nec=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_modules/1/full.distro",
"hash": "sha256-rC8XQ2jm17GBY9FCZXjVILpEIqW20wGs7jauzX7f87A=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_modules/1/full.distro",
"version": 1
},
"discord_notifications": {
"hash": "sha256-zCpbLLX6VSkTbltrJTViCRmnR3dBxeU8rcPhOCxl2LQ=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_notifications/1/full.distro",
"hash": "sha256-RUDniZB+PdGPlDcVRYlsJYeHvaYokmZ2BZNRO3KOJH4=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_notifications/1/full.distro",
"version": 1
},
"discord_rpc": {
"hash": "sha256-urpWdkMSqKioIOxpdjNT3JJZcikDvs0dSsVUkUG4PY0=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_rpc/1/full.distro",
"hash": "sha256-ruTPBYzfG71eKxnglHyC6OkhZQryh1ftqFNMWOJ/3CU=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_rpc/1/full.distro",
"version": 1
},
"discord_spellcheck": {
"hash": "sha256-/50/mm6byljJ8MC6SalU+lRggcF1CKy9cwclpbMsrAk=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_spellcheck/1/full.distro",
"hash": "sha256-DQryV7MY/Xz2XL8agjM3iJY2wY4LYsjQ5ImYfEnUvnQ=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_spellcheck/1/full.distro",
"version": 1
},
"discord_utils": {
"hash": "sha256-zXams2ljKyMGgco9hvSQHC3HD42TQCVKfMyG/PF9ubw=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_utils/5/full.distro",
"version": 5
"hash": "sha256-zbCFs+lEaT4s4cBw+UeOaxtWM9cIf4Sh/YnFX1DdUkA=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_utils/9/full.distro",
"version": 9
},
"discord_voice": {
"hash": "sha256-waDSMuxHPQLNzTdIzoELL0erZjFJej4KWOIYzSDVNvU=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_voice/2/full.distro",
"version": 2
"hash": "sha256-Ud+AaFDH01n1ArYaMSyvx7JKv/CFqXahe5+49rPi3Rk=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_voice/4/full.distro",
"version": 4
},
"discord_webauthn": {
"hash": "sha256-YhBNYnuXHlr17VqnOpMlH0p4TyDMZmr63Y0v/1efwJk=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_webauthn/1/full.distro",
"hash": "sha256-4iSifUx00540kHxVmTRUELc7CTdeQlrzumL6PoZ5UYc=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_webauthn/1/full.distro",
"version": 1
},
"discord_zstd": {
"hash": "sha256-xN5RNiSGDbpt7qrJkhhf4cn3XA/Z2P/Ro1xdkBulzB4=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1259/discord_zstd/1/full.distro",
"hash": "sha256-IAfkqNAHP1nGZ1mavrRYVnkNwyfTchb70XLuFAiTB+I=",
"url": "https://canary.dl2.discordapp.net/distro/app/canary/osx/universal/0.0.1263/discord_zstd/1/full.distro",
"version": 1
}
},
"version": "0.0.1259"
"version": "0.0.1263"
},
"osx-development": {
"distro": {
"hash": "sha256-5kbK9PeDcx16e8R1cdvy5UTPfurhJw9G6M4N09XDczU=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/full.distro"
"hash": "sha256-h+90ma3vDxyFepJafVMPt+xnnwhlHp8xyWiEy4e8BtE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/full.distro"
},
"kind": "distro",
"modules": {
"discord_arborium": {
"hash": "sha256-SePXBJQn09OPdGk8C1kkNSWz35GXi18PJn6Uj9xzR0w=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_arborium/1/full.distro",
"hash": "sha256-0CSXXOysVTXkOIX+PGiLxhO5TF52RbnAeAdaUt8gIsA=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_arborium/1/full.distro",
"version": 1
},
"discord_cloudsync": {
"hash": "sha256-oTarTEo+9DXqiA4vFObY7Db/TXvOGQs0iVi1LLNmalQ=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_cloudsync/1/full.distro",
"hash": "sha256-OTFs1oZxifyZQCSawl15uwmUGEtdMmfn3IirfqNM7Dg=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_cloudsync/1/full.distro",
"version": 1
},
"discord_desktop_core": {
"hash": "sha256-EsGnAbLFwGZxvVu2vQdOLqwHDFRt2tItlsaSdQ835NA=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_desktop_core/1/full.distro",
"hash": "sha256-ZdfclWKmnf4LDp3bZuHa8yOLoH/nQJg1HXY97yz2+Zs=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_desktop_core/1/full.distro",
"version": 1
},
"discord_dispatch": {
"hash": "sha256-X9Fln640uCRnnpg09U5o32uDiCDwoizjck7VNcwY1W0=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_dispatch/1/full.distro",
"hash": "sha256-TdKvrQD5QEdU91Iuk6Bj0zahMHzebLp/+9iJ6YVcQos=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_dispatch/1/full.distro",
"version": 1
},
"discord_erlpack": {
"hash": "sha256-v1uDvFN/lwwgDsIpVfQyNiuaSBsgsCrkQhT1uwSzBXY=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_erlpack/1/full.distro",
"hash": "sha256-8mo1PxrdfoACT0ue1Vnn+9V66iYWYo0sAKpbPV/Z9AA=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_erlpack/1/full.distro",
"version": 1
},
"discord_game_utils": {
"hash": "sha256-hLFkB034tOioo8QqSESbExeKvYQWO4lFK83gyNqfODk=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_game_utils/1/full.distro",
"hash": "sha256-q6iYGIUMgn6ONBiP+uYB+NOoqtAIWf8kAJGHBOSPHCY=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_game_utils/1/full.distro",
"version": 1
},
"discord_intents": {
"hash": "sha256-l8XAfLol1w9UdPz0sYbZF5DBjEAalM7+pugIwZdIiKE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_intents/1/full.distro",
"hash": "sha256-cSWAEnxpiN2L3OqYo+WXW/CGgUs+fK0c5WqgwC+/PV0=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_intents/1/full.distro",
"version": 1
},
"discord_krisp": {
"hash": "sha256-EUKEYMfWE7BF2ttIvhyJFnJQ2dhXqXphTT1QQjQz/iQ=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_krisp/1/full.distro",
"hash": "sha256-S7oaSuskr7Tlb//L6+oU9UTEnvME63h/UQ6WClPjr4U=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_krisp/1/full.distro",
"version": 1
},
"discord_modules": {
"hash": "sha256-YdUOQ+JcpHDBc7HQsm8iQ60a8Afa4M000AcerwhHqT0=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_modules/1/full.distro",
"hash": "sha256-WvuQBFrzhJXvUWpeD44VTEWT9fx9SJShfBSvkI1G32M=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_modules/1/full.distro",
"version": 1
},
"discord_notifications": {
"hash": "sha256-ku7VBMlahg0WHlv6FoLgyqPMKJwcJU5HzaigW+8qL0g=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_notifications/1/full.distro",
"hash": "sha256-56laGA0e4UDYLDvympNDYhzYN/xpdXxZwOI7tQ5wQFM=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_notifications/1/full.distro",
"version": 1
},
"discord_rpc": {
"hash": "sha256-YiZ/PJyP0qHpRxHjguS3XWtwYlnl9Wf19IoToEIyFOA=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_rpc/1/full.distro",
"hash": "sha256-Hxkf9GgMO3oHZXAgrzVp14xunA+QPcq+esKiVaAhvJU=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_rpc/1/full.distro",
"version": 1
},
"discord_spellcheck": {
"hash": "sha256-6adzIekyegQdXwBkd8jgmhJIl8RwmQs4kxQe1iuTbJ4=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_spellcheck/1/full.distro",
"hash": "sha256-VFwm5bLjYbbc7g4VDKHuO51/Hu9JQbvEGnm4SBAnf3U=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_spellcheck/1/full.distro",
"version": 1
},
"discord_utils": {
"hash": "sha256-y/sDjwW2VHJmLfhFORQwzR/fyV65RmyDI1AsWGJdX8w=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_utils/1/full.distro",
"hash": "sha256-7MIIqJEPA3Fw13kQS1mCoQNeKoOa9X8RlpwIjf1ug38=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_utils/1/full.distro",
"version": 1
},
"discord_voice": {
"hash": "sha256-prXIjXQAR5IvOMf+eezdBltr9rKN+EOKjEM6sEpNgO0=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_voice/1/full.distro",
"hash": "sha256-X7Ao2wuOSbYEjbVqLxHzWDq19QpVuKseo1lAUCSn4YQ=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_voice/1/full.distro",
"version": 1
},
"discord_webauthn": {
"hash": "sha256-5ngUr7GKUW372bvByaP0Dy3EEsSHJS2DPwcITOIFjfA=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_webauthn/1/full.distro",
"hash": "sha256-UoXmSxoU0lrk8KYHTlOY2pGYdNEp/E5dxINq/b3J5HQ=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_webauthn/1/full.distro",
"version": 1
},
"discord_zstd": {
"hash": "sha256-V6lNy0S9ECxQBSVa8Ly1gqdV5pBXpwvqKlnStxp57cE=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1015/discord_zstd/1/full.distro",
"hash": "sha256-cUu9IJje2A7eqGAOTYdCADN81zE2hZSH3hnWUsUynEA=",
"url": "https://development.dl2.discordapp.net/distro/app/development/osx/universal/1.0.1017/discord_zstd/1/full.distro",
"version": 1
}
},
"version": "1.0.1015"
"version": "1.0.1017"
},
"osx-ptb": {
"distro": {
@@ -571,92 +571,92 @@
},
"osx-stable": {
"distro": {
"hash": "sha256-Xs01Ui0u96n2Fpc/T5qObZWjqmbNuU4WTa9Z8OOtNk0=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/full.distro"
"hash": "sha256-v1xV1DYVKfwelYbYMVhL3BDKAfsXe9Npny4kqpX6qDs=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/full.distro"
},
"kind": "distro",
"modules": {
"discord_arborium": {
"hash": "sha256-15EkIwQbVXPCnv65FpUc05Y+W/LfiIcFD8BJ0DehqEg=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_arborium/1/full.distro",
"hash": "sha256-4PVxJjyYtSGI9StNjMKeaUSbYIifEYWTz7kktr5cPOk=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_arborium/1/full.distro",
"version": 1
},
"discord_cloudsync": {
"hash": "sha256-z8yUwMAWanKhcs1dEIB2Xn05KPjPqDInE56pbbHis+c=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_cloudsync/1/full.distro",
"hash": "sha256-ffvvOuTkACsGgnBmubB6XDibYpeihr2i/lmlOGOa7VE=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_cloudsync/1/full.distro",
"version": 1
},
"discord_desktop_core": {
"hash": "sha256-jtzoHhXgMlPRkyd6FO52IyMyTjVzonJslADK1G4toiU=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_desktop_core/2/full.distro",
"version": 2
"hash": "sha256-y46vUEzpmwRnRCs/KGzD/pRRSLA0/5l11VKJsEoridQ=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_desktop_core/1/full.distro",
"version": 1
},
"discord_dispatch": {
"hash": "sha256-FteG3F0mMpOiLburBCySJ/DacqT01T2jfx4m5UW1UF8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_dispatch/1/full.distro",
"hash": "sha256-LEm7zYYCVLB9l5JdlsIhJ6zVR3eCiyJfhvsMKvK6yTI=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_dispatch/1/full.distro",
"version": 1
},
"discord_erlpack": {
"hash": "sha256-p83ovML/oSDeEsdjuP9RH27ehXzbLLjVwAS1a58ItZ8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_erlpack/1/full.distro",
"hash": "sha256-ClyKJPwYhHXW2p2nCVsa1Kf5Faeuxur4H0CI7xpnBdA=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_erlpack/1/full.distro",
"version": 1
},
"discord_game_utils": {
"hash": "sha256-o+zjv5zskYrhoFtHq2UnvKkPkg66JSCnhV1h210Bt+w=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_game_utils/1/full.distro",
"hash": "sha256-aUVuPOS5zxnzVXUs+pstMWt9rkJsecvrBSruTNjHKyY=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_game_utils/1/full.distro",
"version": 1
},
"discord_intents": {
"hash": "sha256-6aIKC5/mFx1Xy2hvckMGEZOJaZjbosbiccPVfvncZUg=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_intents/1/full.distro",
"hash": "sha256-qWgjn5WOjl78GVTAO/J/RA8ljlFrmYynfpEAXqYbGAo=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_intents/1/full.distro",
"version": 1
},
"discord_krisp": {
"hash": "sha256-AnVRy1f8PyTnHZ0xYtickRJFWcbvpQl5PKoCg3WlUxU=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_krisp/1/full.distro",
"hash": "sha256-RtQS0+jCoeBt0V2CGRkwjuTEar9+JxOv1V864e64cHk=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_krisp/1/full.distro",
"version": 1
},
"discord_modules": {
"hash": "sha256-VKN53f0QD8mavsVN1iJASDyBEbQWbrKzGMKCtZzoCFA=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_modules/1/full.distro",
"hash": "sha256-De6mRVFdakXVDk5IMLTdCTXVnVkNfmvcLLPRvtj3XAY=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_modules/1/full.distro",
"version": 1
},
"discord_notifications": {
"hash": "sha256-kwzPD9lHU+IIoq44dF8rKs3fRqh5UI0N4uz2LC8UrGQ=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_notifications/1/full.distro",
"hash": "sha256-AzLpxosut9r3acJPPBVw1pumW/le24+hMVlYDSu2u48=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_notifications/1/full.distro",
"version": 1
},
"discord_rpc": {
"hash": "sha256-YgeTVunMN9Rk5uodwkJclD43ApqzO/6dGad02XZtsgo=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_rpc/1/full.distro",
"hash": "sha256-bPvnC2DfmRETFYJFDQviXdFF2YI8gWRz5FcgZr8CX8A=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_rpc/1/full.distro",
"version": 1
},
"discord_spellcheck": {
"hash": "sha256-Wk9cUfZspD2PtcbyO7pmT/351SvNa7z+5bwP5kKlEuA=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_spellcheck/1/full.distro",
"hash": "sha256-K6JoXsJNim/VOAVjqHU5Izaj1n4HZiDKTDU8HRFDQaU=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_spellcheck/1/full.distro",
"version": 1
},
"discord_utils": {
"hash": "sha256-G0WtNX4hbO4iB9Xz8rY43ZEmeSUFU0m3XlLrlOhAzZE=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_utils/1/full.distro",
"hash": "sha256-GkcdoGruyIOzokHgd/jeCPkPsGtHAry1c3WrOaRuHYI=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_utils/1/full.distro",
"version": 1
},
"discord_voice": {
"hash": "sha256-EzRy0SjuEzkMvFlH7w6GyVDEh22hSeikw7hD5s7lsw8=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_voice/1/full.distro",
"hash": "sha256-9B1pjqlvOM5Pit1JImYrVOzIAURyJN4pwIS+NBLaqvI=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_voice/1/full.distro",
"version": 1
},
"discord_webauthn": {
"hash": "sha256-fivCWaJhxbouKbhWPRgrXqv/7FKL+RpS8Qn9lIHngnc=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_webauthn/1/full.distro",
"hash": "sha256-tqxA5qhMdUjKUWSRChBUnE5ul4obLxodxZPuSUE6+Sw=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_webauthn/1/full.distro",
"version": 1
},
"discord_zstd": {
"hash": "sha256-IEHHrGPCcxWjKTPY7hYEQzk6Zh5UsC6rTCANgF77mjI=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.406/discord_zstd/1/full.distro",
"hash": "sha256-QJ46FR7YP7eAmbs844t3ueQtcKNK9PJm3jNEPKCx0Vw=",
"url": "https://stable.dl2.discordapp.net/distro/app/stable/osx/universal/0.0.407/discord_zstd/1/full.distro",
"version": 1
}
},
"version": "0.0.406"
"version": "0.0.407"
}
}

View File

@@ -6,7 +6,7 @@
buildKodiAddon rec {
pname = "osmc-skin";
namespace = "skin.osmc";
version = "21.1.1";
version = "21.2.1";
src = fetchFromGitHub {
owner = "osmc";

View File

@@ -7,7 +7,7 @@
mkHyprlandPlugin (finalAttrs: {
pluginName = "hypr-darkwindow";
version = "0.56.1";
version = "0.56.2";
src = fetchFromGitHub {
owner = "micha4w";

View File

@@ -804,9 +804,15 @@ stdenvNoCC.mkDerivation {
include -cxx-isystem "${getDev libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags
echo "-stdlib=libc++" >> $out/nix-support/libcxx-ldflags
''
# GCC NG friendly libc++
# This is the GCC NG case, libstdc++ is being built as a separate package.
#
# Point at `include-cxx`, not `include`. `libcxx` is also a propagated
# target-target dep, so the generic setup hook puts its `include` on the *C*
# include path -- and libstdc++ ships headers named after C headers
# (`math.h`, `stdlib.h`, `stdckdint.h`, ...) that are only meant to shadow
# the C ones in C++. A sibling directory the setup hook ignores is enough.
+ optionalString (libcxx != null && libcxx.isGNU or false) ''
include -isystem "${getDev libcxx}/include" >> $out/nix-support/libcxx-cxxflags
include -isystem "${getDev libcxx}/include-cxx" >> $out/nix-support/libcxx-cxxflags
''
##

View File

@@ -254,5 +254,5 @@ rec {
else
gitignoreFilterSource (_: _: true) patterns;
gitignoreRecursiveSource = gitignoreFilterSourcePure (_: _: true);
gitignoreRecursiveSource = gitignoreFilterRecursiveSource (_: _: true);
}

View File

@@ -24,13 +24,13 @@ let
if extension == "zip" then fetchzip args else fetchurl args;
pname = "1password-cli";
version = "2.34.1";
version = "2.38.1";
sources = {
aarch64-linux = fetch "linux_arm64" "sha256-uEukRq71eeayvNguD9XepvP1Br5AkE2Ag/Chv2idf4A=" "zip";
i686-linux = fetch "linux_386" "sha256-p/F3YZLJnlimrVE2qxTHvIB4m47kuwhoCWTC40VIvMs=" "zip";
x86_64-linux = fetch "linux_amd64" "sha256-oAABMlwwv5X91TT6FK2aPpg+e2CvmHT1rqIVRTjQNCQ=" "zip";
aarch64-linux = fetch "linux_arm64" "sha256-RmpJkrrLrKwbmbw50+sTg0aFa0+M2EFPZ6+QSc3aV5M=" "zip";
i686-linux = fetch "linux_386" "sha256-hnpVsbNgofmfw/XobVZ2MnbGIcAjxH1MvVJNc5T1kuk=" "zip";
x86_64-linux = fetch "linux_amd64" "sha256-k268YiTC/2MJZhVqMI/e9bsrf4Sr4Wj8M/h/hbmmcqY=" "zip";
aarch64-darwin =
fetch "apple_universal" "sha256-vp1Y1M6DUanx1CAVhLrqgBovwws6Y/5jOgnwTZE8Hhc="
fetch "apple_universal" "sha256-pLlEsqCL5j9QCuLkQxK/Mmz647lKbCYhOUiPch2MMuE="
"pkg";
};
platforms = builtins.attrNames sources;

View File

@@ -27,7 +27,7 @@ replace_sha() {
sed -i "s|\"$1\" \"sha256-.\{44\}\"|\"$1\" \"$2\"|" "$NIX_DRV"
}
CLI_VERSION="$(curl -Ls https://app-updates.agilebits.com/product_history/CLI2 | xq -q 'h3' | head -n1)"
CLI_VERSION="$(curl -Ls https://app-updates.agilebits.com/product_history/CLI2 | xq -q 'article:not(.beta) h3' | head -n1)"
CLI_LINUX_AARCH64_SHA256=$(fetch_linux "$CLI_VERSION" "linux_arm64")
CLI_LINUX_I686_SHA256=$(fetch_linux "$CLI_VERSION" "linux_386")

View File

@@ -1,28 +1,28 @@
{
"stable": {
"linux": {
"version": "8.12.30",
"version": "8.12.32",
"sources": {
"x86_64": {
"url": "https://downloads.1password.com/linux/tar/stable/x86_64/1password-8.12.30.x64.tar.gz",
"hash": "sha256-jZuPdQo5KPvbYqN5YXFq3lAEqJccWhi6ROFOSvjiWuU="
"url": "https://downloads.1password.com/linux/tar/stable/x86_64/1password-8.12.32.x64.tar.gz",
"hash": "sha256-dg42SQNMS77+393sDP66weZ33VVIKjOQEZwaK82ifZc="
},
"aarch64": {
"url": "https://downloads.1password.com/linux/tar/stable/aarch64/1password-8.12.30.arm64.tar.gz",
"hash": "sha256-s4wmVQ7JXV0cakDhueawkQWTjicxOVzdrHQll6zNwvI="
"url": "https://downloads.1password.com/linux/tar/stable/aarch64/1password-8.12.32.arm64.tar.gz",
"hash": "sha256-pjSX6FWMZh1PN/lNMEbPQ2+hZs47tiNC0ptHJGZL3rQ="
}
}
},
"darwin": {
"version": "8.12.30",
"version": "8.12.33",
"sources": {
"x86_64": {
"url": "https://downloads.1password.com/mac/1Password-8.12.30-x86_64.zip",
"hash": "sha256-LuRoGXVGG5r6Bpg9PC39zICVc4pEgvAh7yY/nlQgnVI="
"url": "https://downloads.1password.com/mac/1Password-8.12.33-x86_64.zip",
"hash": "sha256-jIvE1S4oP5/nVnmxQyrzW14kwnAI5zB9eKjms29XikI="
},
"aarch64": {
"url": "https://downloads.1password.com/mac/1Password-8.12.30-aarch64.zip",
"hash": "sha256-7qX2UjUaEfJA2Cn8RwcjEkDX6RR4S487B8zYYUKp+mw="
"url": "https://downloads.1password.com/mac/1Password-8.12.33-aarch64.zip",
"hash": "sha256-CT+3Sn9AyyxHyTRXhajCwsO9n9eqxou3kD1RJ2RZUpk="
}
}
}

View File

@@ -12,6 +12,9 @@ stdenv.mkDerivation (finalAttrs: {
pname = "4ti2";
version = "1.6.15";
__structuredAttrs = true;
strictDeps = true;
src = fetchFromGitHub {
owner = "4ti2";
repo = "4ti2";
@@ -34,6 +37,8 @@ stdenv.mkDerivation (finalAttrs: {
gmp
];
enableParallelBuilding = true;
installFlags = [ "install-exec" ];
meta = {

View File

@@ -0,0 +1,166 @@
{
lib,
actual-server,
copyDesktopItems,
electron_41,
imagemagick,
jq,
makeDesktopItem,
makeWrapper,
removeReferencesTo,
stdenv,
}:
let
electron = electron_41;
in
stdenv.mkDerivation (finalAttrs: {
pname = "actual-client";
inherit (actual-server)
srcs
version
sourceRoot
offlineCache
env
patches
;
inherit (actual-server.offlineCache) missingHashes;
__structuredAttrs = true;
strictDeps = true;
postPatch =
actual-server.postPatch
+
# bash
''
cat <<< $(${lib.getExe jq} 'del(.build.beforePack, .build.electronFuses)' packages/desktop-electron/package.json) > packages/desktop-electron/package.json
'';
nativeBuildInputs = actual-server.nativeBuildInputs ++ [
copyDesktopItems
makeWrapper
];
buildPhase = ''
runHook preBuild
# verify electron version
upstreamElectronMajor=$(${lib.getExe jq} -r '.devDependencies.electron | match("[0-9]+").string' packages/desktop-electron/package.json)
if [[ "$upstreamElectronMajor" != "${lib.versions.major electron.version}" ]]; then
echo "Electron major version mismatch: Actual expects $upstreamElectronMajor, nixpkgs provides ${electron.version}" >&2
exit 1
fi
export HOME=$(mktemp -d)
# lage hashes source files via `git ls-tree HEAD`, so it needs a repo with
# at least one commit.
git -c init.defaultBranch=main init -q
git add -A
git -c user.email=nix@localhost -c user.name=nix commit -q --allow-empty -m "snapshot"
# rebuild better-sqlite3; copied from splayer package
# we need to use headers from electron to avoid ABI mismatches.
pushd node_modules/better-sqlite3
npm run build-release --offline --nodedir="${electron.headers}"
rm -rf build/Release/{.deps,obj,obj.target,test_extension.node}
find build -type f -exec \
${lib.getExe removeReferencesTo} \
-t "${electron.headers}" {} \;
popd
./bin/package-electron --skip-translations --skip-exe-build
pushd packages/desktop-electron/
yarn run electron-builder \
--dir \
-c.electronDist=${electron.dist} \
-c.electronVersion=${electron.version} \
-c.mac.identity=null
popd
runHook postBuild
'';
installPhase = ''
runHook preInstall
# The shared electron package will be used so only install the application resources produced by electron-builder
mkdir -p "$out/share/lib/actual/resources"
cp -Pr --no-preserve=ownership \
packages/desktop-electron/dist/*-unpacked/resources/{app.asar,app.asar.unpacked,extra-resources} \
"$out/share/lib/actual/resources/"
mkdir icons
declare -a icon_sizes=(16x16 32x32 48x48 64x64 128x128 256x256 512x512)
for size in "''${icon_sizes[@]}"; do
${lib.getExe imagemagick} \
-background none \
packages/desktop-electron/icons/icon.png \
-resize "!$size" \
"icons/$size.png"
install -D "icons/$size.png" \
"$out/share/icons/hicolor/$size/apps/com.actualbudget.actual.png"
done
# We set ELECTRON_FORCE_IS_PACKAGED because Usually electron apps have
# a different executable name. Since we use the nixpkgs electron, it thinks
# it has no app packaged into it even though we do add the resources for
# Actual.
makeShellWrapper ${lib.getExe electron} "$out/bin/actual" \
--add-flags "$out/share/lib/actual/resources/app.asar" \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true --wayland-text-input-version=3}}" \
--set-default ELECTRON_IS_DEV 0 \
--set-default ELECTRON_FORCE_IS_PACKAGED 1 \
--inherit-argv0
runHook postInstall
'';
desktopItems = [
(makeDesktopItem {
name = "com.actualbudget.actual";
desktopName = "Actual";
exec = "actual %U";
terminal = false;
type = "Application";
icon = "com.actualbudget.actual";
startupWMClass = "Actual";
comment = "Super fast privacy-focused app for managing your finances";
categories = [
"Office"
"Finance"
];
keywords = [
"Budget"
"Finance"
"Money"
"Expenses"
"Savings"
];
})
];
passthru = {
inherit (finalAttrs) offlineCache;
};
meta = {
changelog = "https://actualbudget.org/docs/releases";
description = "Super fast privacy-focused app for managing your finances";
homepage = "https://actualbudget.org/";
mainProgram = "actual";
license = lib.licenses.mit;
# I don't have a GUI Mac, so I am not confident in my ability to support darwin
platforms = [
"x86_64-linux"
"aarch64-linux"
];
maintainers = [
lib.maintainers.PerchunPak
];
};
})

View File

@@ -74,7 +74,7 @@ stdenv.mkDerivation (finalAttrs: {
# Patch all references to `git` to a no-op `true`. This neuter automatic
# translation update.
substituteInPlace bin/package-browser \
substituteInPlace bin/package-browser bin/package-electron \
--replace-fail "git" "true"
# Allow `remove-untranslated-languages` to do its job.
@@ -147,7 +147,7 @@ stdenv.mkDerivation (finalAttrs: {
'';
passthru = {
inherit (finalAttrs) offlineCache;
inherit (finalAttrs) offlineCache env;
inherit translations;
tests = nixosTests.actual;
updateScript = ./update.sh;

View File

@@ -7,7 +7,7 @@
python3Packages.buildPythonApplication (finalAttrs: {
pname = "adscan";
version = "11.0.0";
version = "11.1.0";
pyproject = true;
__structuredAttrs = true;
@@ -16,7 +16,7 @@ python3Packages.buildPythonApplication (finalAttrs: {
owner = "ADScanPro";
repo = "adscan";
tag = "v${finalAttrs.version}";
hash = "sha256-CuBbppx3lTj1mCJiXO3559AJPuPUesSSdfvymm9EGW0=";
hash = "sha256-GMvuCdr9gA3cs5L31PHHls5uHos7VdjS9XblM6F1Z3I=";
};
pythonRelaxDeps = [ "credsweeper" ];

View File

@@ -11,16 +11,16 @@
buildGoModule (finalAttrs: {
pname = "aks-mcp-server";
version = "0.0.19";
version = "0.0.20";
src = fetchFromGitHub {
owner = "Azure";
repo = "aks-mcp";
rev = "v${finalAttrs.version}";
hash = "sha256-Zu/caWrTuyzS4ejJ5LTOCyLTsmJOFrkX0kUGM0zDfFs=";
hash = "sha256-K0BVDH0HT4kQBGMpVDtLihDCPlpcVpdGEF7f5DY8SvQ=";
};
vendorHash = "sha256-eipcHVKKHBOey2fUGB4lf2pE/wdwGgsbYvCrvDG1JK8=";
vendorHash = "sha256-EdDiLibw3OXtTmAaD6PIi6xiW7+x8TUeAezdjpu8IjY=";
subPackages = [ "cmd/aks-mcp" ];

View File

@@ -35,8 +35,7 @@ stdenv.mkDerivation (finalAttrs: {
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit (finalAttrs) src;
name = "amberol-${finalAttrs.version}";
inherit (finalAttrs) pname version src;
hash = "sha256-OFZd9nKRqXJMHSIIP8tlSNtFAQzk/f/6SBeEvbdPVK0=";
};

View File

@@ -15,11 +15,11 @@
}:
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "angular-language-server";
version = "22.0.1";
version = "22.1.0";
src = fetchurl {
name = "angular-language-server-${finalAttrs.version}.zip";
url = "https://github.com/angular/angular/releases/download/vsix-${finalAttrs.version}/ng-template-${finalAttrs.version}.vsix";
hash = "sha256-IaaqFb0YLJcVqoV5QT9fZmYd5GbfQCUlK68SF76Y/dY=";
hash = "sha256-/PftUvaE9EjsKRc0TnF0lftOgp5fzKmR+KGhocXEMrk=";
};
nativeBuildInputs = [

View File

@@ -6,8 +6,8 @@
versionCheckHook,
}:
let
version = "1.1.11";
buildId = "6181354723999744";
version = "1.1.13";
buildId = "6068529322131456";
wholeVersion = "${version}-${buildId}";
throwSystem = throw "Unsupported system: ${stdenvNoCC.hostPlatform.system}";
@@ -15,15 +15,15 @@ let
sourceData = {
x86_64-linux = fetchurl {
url = "https://storage.googleapis.com/antigravity-public/antigravity-cli/${wholeVersion}/linux-x64/cli_linux_x64.tar.gz";
hash = "sha256-8kOw7R3wtXxw1n5FA76FjmppB8oLFmu8h9Rh5sJaLK0=";
hash = "sha256-6X92AldCzlcWQ4ON2t2jEFNsqwIX4YAbpUh6cRz8/uY=";
};
aarch64-linux = fetchurl {
url = "https://storage.googleapis.com/antigravity-public/antigravity-cli/${wholeVersion}/linux-arm/cli_linux_arm64.tar.gz";
hash = "sha256-m6mj3gLwDPFTcQF22hofNpC06doHEzcSLl/QYlXoPew=";
hash = "sha256-CcNHggD96vwkVl8s09HPlMIv3ayzWVEFK1YwVv7EFR4=";
};
aarch64-darwin = fetchurl {
url = "https://storage.googleapis.com/antigravity-public/antigravity-cli/${wholeVersion}/darwin-arm/cli_mac_arm64.tar.gz";
hash = "sha256-SK+7wgNOVGjmyt60Kj6XY1kSU85u5Y42WQ8bi7w4vX0=";
hash = "sha256-ZkgCqzy6zU1XaxDJvdYPEs6JKDBeNFFHw22Rhbugkps=";
};
};
in

View File

@@ -1,36 +0,0 @@
{
stdenvNoCC,
fetchurl,
undmg,
pname,
version,
meta,
}:
stdenvNoCC.mkDerivation {
inherit
pname
version
meta
;
src = fetchurl {
url = "https://github.com/aptakube/aptakube/releases/download/${version}/Aptakube_${version}_universal.dmg";
sha256 = "89828e1ac030f9532ba24afdd91d357280b32fcc475830b6667d5066e7a576ac";
};
nativeBuildInputs = [ undmg ];
unpackPhase = ''
runHook preUnpack
undmg $src
runHook postUnpack
'';
installPhase = ''
runHook preInstall
mkdir -p $out/Applications
cp -r Aptakube.app $out/Applications/Aptakube.app
runHook postInstall
'';
}

View File

@@ -1,43 +0,0 @@
{
stdenvNoCC,
fetchurl,
dpkg,
autoPatchelfHook,
webkitgtk_4_1,
pname,
version,
meta,
}:
stdenvNoCC.mkDerivation {
inherit
pname
version
meta
;
src = fetchurl {
url = "https://github.com/aptakube/aptakube/releases/download/${version}/aptakube_${version}_amd64.deb";
sha256 = "9660c87da400dad1451f685defff774c6f5af9b3f713ad1cbd48284e965457dd";
};
nativeBuildInputs = [
autoPatchelfHook
dpkg
];
buildInputs = [ webkitgtk_4_1 ];
unpackPhase = ''
runHook preUnpack
dpkg -X $src .
runHook postUnpack
'';
installPhase = ''
runHook preInstall
mkdir -p $out
cp -r usr/share usr/bin $out
runHook postInstall
'';
}

View File

@@ -1,33 +1,137 @@
{
lib,
stdenv,
callPackage,
stdenvNoCC,
fetchurl,
autoPatchelfHook,
dpkg,
makeBinaryWrapper,
undmg,
wrapGAppsHook3,
glib-networking,
webkitgtk_4_1,
kubectl,
kubernetes-helm,
extraPath ? [ ],
}:
let
pname = "aptakube";
version = "1.13.0";
meta = {
homepage = "https://aptakube.com/";
description = "Modern, lightweight and multi-cluster Kubernetes GUI";
license = lib.licenses.unfree;
maintainers = [ lib.maintainers.juliamertz ];
platforms = lib.platforms.darwin ++ [ "x86_64-linux" ];
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
};
in
if stdenv.hostPlatform.isDarwin then
callPackage ./darwin.nix {
inherit
pname
version
meta
;
}
else
callPackage ./linux.nix {
inherit
pname
version
meta
;
stdenvNoCC.mkDerivation (
finalAttrs:
let
sources = {
aarch64-darwin = {
name = "Aptakube_${finalAttrs.version}_universal.dmg";
hash = "sha256-JWDwsvqZnEQc6Ne+aC2WbdMaEO20f8AEK7SlC3lEzUk=";
};
x86_64-linux = {
name = "aptakube_${finalAttrs.version}_amd64.deb";
hash = "sha256-JooC/fwy1zaIU2UAmDooejEbBmCChVrJ2rTsn0M8WaI=";
};
};
source =
sources.${stdenvNoCC.hostPlatform.system}
or (throw "aptakube: unsupported system ${stdenvNoCC.hostPlatform.system}");
runtimePath = extraPath ++ [
kubectl
kubernetes-helm
];
in
{
pname = "aptakube";
version = "1.18.8";
__structuredAttrs = true;
strictDeps = true;
src = fetchurl {
url = "https://github.com/aptakube/aptakube/releases/download/${finalAttrs.version}/${source.name}";
inherit (source) hash;
};
sourceRoot = if stdenvNoCC.hostPlatform.isDarwin then "." else "root";
nativeBuildInputs =
lib.optionals stdenvNoCC.hostPlatform.isLinux [
autoPatchelfHook
dpkg
wrapGAppsHook3
]
++ lib.optionals stdenvNoCC.hostPlatform.isDarwin [
makeBinaryWrapper
undmg
];
buildInputs = lib.optionals stdenvNoCC.hostPlatform.isLinux [
glib-networking
webkitgtk_4_1
];
dontConfigure = true;
dontBuild = true;
installPhase =
if stdenvNoCC.hostPlatform.isLinux then
''
runHook preInstall
mkdir -p $out
mv usr/bin usr/share $out/
substituteInPlace $out/share/applications/aptakube.desktop \
--replace-fail 'Name=aptakube' 'Name=Aptakube'
runHook postInstall
''
else
''
runHook preInstall
mkdir -p $out/Applications $out/bin
cp -R Aptakube.app $out/Applications/
makeWrapper $out/Applications/Aptakube.app/Contents/MacOS/Aptakube \
$out/bin/aptakube \
--suffix PATH : ${lib.makeBinPath runtimePath}
runHook postInstall
'';
preFixup = lib.optionalString stdenvNoCC.hostPlatform.isLinux ''
gappsWrapperArgs+=(--suffix PATH : ${lib.makeBinPath runtimePath})
'';
passthru = {
inherit sources;
updateScript = ./update.sh;
};
meta = {
description = "Multi-cluster Kubernetes UI";
longDescription = ''
Aptakube is proprietary software with a 15-day free trial.
Some operations use `kubectl` or Helm from `PATH`. If they are not in
`PATH`, packaged binaries will be used.
Any kubeconfig exec-auth helpers are loaded from `PATH`. Use `extraPath`
to modify `PATH` specifically for this package.
'';
homepage = "https://aptakube.com/";
downloadPage = "https://github.com/aptakube/aptakube/releases";
changelog = "https://github.com/aptakube/aptakube/releases/tag/${finalAttrs.version}";
license = lib.licenses.unfree;
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
mainProgram = "aptakube";
maintainers = with lib.maintainers; [
juliamertz
maximsmol
];
platforms = builtins.attrNames sources;
};
}
)

View File

@@ -0,0 +1,108 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p common-updater-scripts curl jq nix
# shellcheck shell=bash
set \
-o errexit \
-o pipefail \
-o nounset \
-o errtrace
shopt -s \
inherit_errexit \
shift_verbose
curl_args=(
--fail
--location
--silent
--show-error
)
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
curl_args+=(--user ":${GITHUB_TOKEN}")
fi
release="$(
curl \
"${curl_args[@]}" \
https://api.github.com/repos/aptakube/aptakube/releases/latest
)"
version="$(
jq \
--exit-status \
--raw-output \
'.tag_name | select(type == "string")' \
<<<"${release}"
)"
get_hash() {
local name="$1"
local digest
digest="$(
jq \
--arg name "${name}" \
--exit-status \
--raw-output \
'.assets[] | select(.name == $name) | .digest | select(type == "string" and startswith("sha256:"))' \
<<<"${release}"
)"
nix hash convert \
--hash-algo sha256 \
--to sri \
"${digest#sha256:}"
}
get_url() {
local system="$1"
nix-instantiate \
--argstr system "${system}" \
--argstr version "${version}" \
--eval \
--expr '
{ system, version }:
let
package = (import ./. { inherit system; }).aptakube.overrideAttrs (_: {
inherit version;
__intentionallyOverridingVersion = true;
});
in
package.src.url
' \
--raw
}
cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../../.."
printf 'Updating aptakube to %s\n' "${version}"
platforms="$(
nix-instantiate \
--eval \
--json \
--strict \
--attr aptakube.meta.platforms
)"
systems="$(
jq \
--exit-status \
--raw-output \
'.[] | select(type == "string")' \
<<<"${platforms}"
)"
while IFS= read -r system; do
url="$(get_url "${system}")"
name="${url##*/}"
hash="$(get_hash "${name}")"
update-source-version \
aptakube \
"${version}" \
"${hash}" \
--ignore-same-hash \
--ignore-same-version \
--system="${system}"
done <<<"${systems}"

View File

@@ -57,7 +57,7 @@ stdenv.mkDerivation {
php
];
postPatch = lib.optionalString stdenv.isAarch64 ''
postPatch = lib.optionalString stdenv.hostPlatform.isAarch64 ''
substituteInPlace support/xhpast/Makefile \
--replace "-minline-all-stringops" ""
'';

View File

@@ -9,7 +9,7 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "arity";
version = "0.13.0";
version = "0.18.0";
__structuredAttrs = true;
@@ -17,10 +17,10 @@ rustPlatform.buildRustPackage (finalAttrs: {
owner = "jolars";
repo = "arity";
tag = "v${finalAttrs.version}";
hash = "sha256-PveNcJisds0obKzUDzZ409kinWvhFO8qpvwCzhfdla8=";
hash = "sha256-ZB/1SgJFom4U5KztBAfMztXsG0/T5tETQZxsRt6N8jY=";
};
cargoHash = "sha256-7Mvw9reJFmBPs8Ksn/mbSbeizdT8GhwvXT06NMlCXxc=";
cargoHash = "sha256-uwQlfK6YXqXNRyZaYTnoEzXn21l01k1Fuw903Gn/7AU=";
nativeBuildInputs = [
installShellFiles

View File

@@ -34,21 +34,21 @@
clangStdenv.mkDerivation (finalAttrs: {
pname = "aseprite";
version = "1.3.18.1";
version = "1.3.18.2";
src = fetchFromGitHub {
owner = "aseprite";
repo = "aseprite";
tag = "v${finalAttrs.version}";
fetchSubmodules = true;
hash = "sha256-uItjmYg21Ph2QIYFKm0N6kVwJtedH0aVKm8hSbQcJIM=";
hash = "sha256-Blv/OXnQSofbwzjng24HwLjEViXx13EqkAZvBSjnB3Y=";
};
asepriteStrings = fetchFromGitHub {
owner = "aseprite";
repo = "strings";
rev = "417074f649f359f98511fc87a707c276d87f5739";
hash = "sha256-5bB7yK4eJHhkUwGYtIFYdFXpRrBt69VBbTh7EmPFI08=";
rev = "b43be33343efa40c1c4bda00f985b8cd83bddf2a";
hash = "sha256-JxNEtWnP3RtntXM3CmJLXyByW6dri98COp2O0A6ZwBA=";
};
# Translation files are copied without overwriting existing ones to preserve
@@ -104,6 +104,10 @@ clangStdenv.mkDerivation (finalAttrs: {
substituteInPlace src/ver/CMakeLists.txt \
--replace-fail '"1.x-dev"' '"${finalAttrs.version}"'
# fmt 12.2 no longer exposes fmt::format through fmt/core.h.
substituteInPlace src/app/i18n/strings.h \
--replace-fail '"fmt/core.h"' '"fmt/format.h"'
# Fix build on Darwin with `-Werror=format-security`
# (NSLog requires a string-literal format)
substituteInPlace laf/os/osx/logger.mm \

View File

@@ -31,7 +31,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoRoot = "./.";
cargoDeps = rustPlatform.fetchCargoVendor {
inherit (finalAttrs) src;
inherit (finalAttrs) pname version src;
hash = "sha256-68yQkgIVpqUo5tOcvxKh6NOkW565V94zHIZeI4q7nNA=";
};

View File

@@ -12,7 +12,7 @@
}:
stdenv.mkDerivation (finalAttrs: {
name = "awk-language-server";
pname = "awk-language-server";
version = "0.10.6";
src = fetchFromGitHub {

View File

@@ -15,13 +15,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "beammp-launcher";
version = "2.8.0";
version = "2.8.1";
src = fetchFromGitHub {
owner = "BeamMP";
repo = "BeamMP-Launcher";
tag = "v${finalAttrs.version}";
hash = "sha256-xg6lHsfIYRC9OxrI+A7MXYCxGbZrGHb/9gR7Dno6Pwk=";
hash = "sha256-9zfagbDUyhUBLtZ18QNztaf1A5GMqqSa7fLAGih4y8k=";
};
strictDeps = true;

View File

@@ -40,7 +40,7 @@
stdenv.mkDerivation (finalAttrs: {
pname = "beekeeper-studio";
version = "5.9.3";
version = "6.0.0";
src =
let
@@ -54,9 +54,9 @@ stdenv.mkDerivation (finalAttrs: {
fetchurl {
url = "https://github.com/beekeeper-studio/beekeeper-studio/releases/download/v${finalAttrs.version}/${asset}";
hash = selectSystem {
x86_64-linux = "sha256-ngVE7hjtr/a6CBASwZA3gmvk7+WR2okQy+ywXbEUQpk=";
aarch64-linux = "sha256-aAoputvhCHqekT+pdaZEmps4aa48gz9DDCgomJvWQSw=";
aarch64-darwin = "sha256-SCttC+P3ZSAlU8mBWfPpT4wAVtwcvpgePhJp+sbsvU8=";
x86_64-linux = "sha256-mTS5elz54AbbYF6AtPaeZvbR7ysB6a6iu+lbaTrwv5k=";
aarch64-linux = "sha256-KSz60oSR5UcVM5p8swRqBCZknGob7/MEMtAI2UmN2Q0=";
aarch64-darwin = "sha256-71xe4uWRb83WgvZvwqv52tubZ+8CKKuU1/zQnV0aSGw=";
};
};

View File

@@ -19,13 +19,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "bella";
version = "0.1.10";
version = "0.1.11";
src = fetchFromGitHub {
owner = "josephmawa";
repo = "Bella";
tag = "v${finalAttrs.version}";
hash = "sha256-DlhDaeZxNi9uXfST18eap0CWenSj+PzbKflJmITQ//M=";
hash = "sha256-FIk0U3z9+h3erGQP8Rc6dUAJjTf5HagH7Bzu9piHvgQ=";
};
strictDeps = true;

View File

@@ -66,6 +66,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
The Nix derivation does not compile the proprietary features.
'';
homepage = "https://bencher.dev";
changelog = "https://github.com/bencherdev/bencher/releases/tag/v${finalAttrs.version}";
license =
if finalAttrs.buildNoDefaultFeatures then
lib.licenses.OR [

View File

@@ -11,16 +11,16 @@
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "biome";
version = "2.5.6";
version = "2.5.8";
src = fetchFromGitHub {
owner = "biomejs";
repo = "biome";
rev = "@biomejs/biome@${finalAttrs.version}";
hash = "sha256-jutNefPBi39eM/Db04IHA6RId+Un7xLBv/L7tMaC3iI=";
hash = "sha256-ZEOaJGrVnZRZBDuVqQgmCD07ZUvBa8COgsj0XvfKRZM=";
};
cargoHash = "sha256-pPX9sbVYfN9k3LeTBY1SMXU1xOFlYmQCkvSg8U9dL+w=";
cargoHash = "sha256-mMQM7koZlKfgTPDXWan0qi2LGk2gksM2ZDC0m2/X+1M=";
nativeBuildInputs = [ pkg-config ];

View File

@@ -105,7 +105,7 @@ stdenv.mkDerivation (finalAttrs: {
bzip2
sqlite
]
++ lib.optionals stdenv.isDarwin [
++ lib.optionals stdenv.hostPlatform.isDarwin [
llvmPackages.openmp
];

View File

@@ -88,7 +88,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [
aiotter
hibiday
recutita
matthiasbeyer
];
platforms = lib.platforms.unix;

View File

@@ -10,10 +10,10 @@ let
in
stdenvNoCC.mkDerivation {
pname = "blobs.gg";
version = "unstable-2019-07-24";
version = "0-unstable-2019-07-24";
src = fetchurl {
url = "https://git.pleroma.social/pleroma/emoji-index/-/raw/${rev}/packs/blobs_gg.zip";
url = "https://git.pleroma.social/pleroma/emoji-index/raw/commit/${rev}/packs/blobs_gg.zip";
hash = "sha256-OhLzoYFnjVs1hKYglUEbDWCjNRGBNZENh5kg+K3lpX8=";
};

View File

@@ -7,17 +7,18 @@
nix-update-script,
versionCheckHook,
writableTmpDirAsHomeHook,
coreutils,
}:
buildGoModule (finalAttrs: {
pname = "bootdev-cli";
version = "1.29.6";
version = "1.31.1";
src = fetchFromGitHub {
owner = "bootdotdev";
repo = "bootdev";
tag = "v${finalAttrs.version}";
hash = "sha256-uoFnhcJvvY+lb8VLv0kPI8hp4H8XfQOY5R83Rj17gfw=";
hash = "sha256-0koZYMQxCHPtB44OYhiD9+nYAyHWXbyQd2xhdqnOqEw=";
};
vendorHash = "sha256-ZDioEU5uPCkd+kC83cLlpgzyOsnpj2S7N+lQgsQb8uY=";
@@ -32,6 +33,14 @@ buildGoModule (finalAttrs: {
writableTmpDirAsHomeHook
];
# TestGetLatestVersionHasOverallTimeout writes a fake go helper that runs
# /bin/sleep; that path is missing in the Nix sandbox, and the test also
# resets PATH so a bare "sleep" would not help. Point at store sleep.
postPatch = ''
substituteInPlace version/version_test.go \
--replace-fail 'exec /bin/sleep 5' 'exec ${lib.getExe' coreutils "sleep"} 5'
'';
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
for shell in bash fish zsh; do
installShellCompletion --cmd bootdev --"$shell" <($out/bin/bootdev completion "$shell")
@@ -42,6 +51,9 @@ buildGoModule (finalAttrs: {
versionCheckProgram = "${placeholder "out"}/bin/bootdev";
doInstallCheck = true;
# checks tests use httptest.NewServer (bind localhost)
__darwinAllowLocalNetworking = true;
passthru.updateScript = nix-update-script { };
meta = {

View File

@@ -32,6 +32,7 @@
obs-studio-plugins,
nix-update-script,
removeWarningPopup ? false,
withObsVkCapture ? false,
}:
python3Packages.buildPythonApplication (finalAttrs: {
@@ -114,13 +115,13 @@ python3Packages.buildPythonApplication (finalAttrs: {
mangohud
vmtouch
fvs2
obs-studio-plugins.obs-vkcapture
# Undocumented (subprocess.Popen())
lsb-release
pciutils
procps
];
]
++ lib.optional withObsVkCapture obs-studio-plugins.obs-vkcapture;
pyproject = false;
dontWrapGApps = true; # prevent double wrapping

View File

@@ -5,6 +5,7 @@
extraPkgs ? pkgs: [ ],
extraLibraries ? pkgs: [ ],
removeWarningPopup ? false,
withObsVkCapture ? false,
}:
let
@@ -17,7 +18,7 @@ let
pkgs:
with pkgs;
[
(bottles-unwrapped.override { inherit removeWarningPopup; })
(bottles-unwrapped.override { inherit removeWarningPopup withObsVkCapture; })
# This only allows to enable the toggle, vkBasalt won't work if not installed with environment.systemPackages (or nix-env)
# See https://github.com/bottlesdevs/Bottles/issues/2401
vkbasalt

View File

@@ -1,11 +1,11 @@
{
version = "3.12.0";
version = "3.12.1";
x86_64-linux = {
url = "https://download.breitbandmessung.de/bbm/Breitbandmessung-3.12.0-linux.deb";
sha256 = "sha256-3wQVUNTjFgoFBpy0Gl1r/FEdgqRrdjM3SFqPpl6z6O4=";
url = "https://download.breitbandmessung.de/bbm/Breitbandmessung-3.12.1-linux.deb";
sha256 = "sha256-uUgzGk6N8Py91vus5Yh3DmK0xh5+J5xqD3nvWB3ggPE=";
};
aarch64-darwin = {
url = "https://download.breitbandmessung.de/bbm/Breitbandmessung-3.12.0-mac.dmg";
sha256 = "sha256-QuJaNTyBAVQb3SCHNjnhd5klxTrH/9/J56Mxl6l/sKs=";
url = "https://download.breitbandmessung.de/bbm/Breitbandmessung-3.12.1-mac.dmg";
sha256 = "sha256-8zzsQ86udXf4NeTYrxgrb28N5wwRaYrAAtZ5H/1T5w4=";
};
}

View File

@@ -23,13 +23,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "buildbox";
version = "1.4.15";
version = "1.4.17";
src = fetchFromGitLab {
owner = "BuildGrid";
repo = "buildbox/buildbox";
tag = finalAttrs.version;
hash = "sha256-V/dKo/ynKL37NNCY36D5NvepeIbE470qg3qPKH1jLoY=";
hash = "sha256-AnvwnBcc6LlJ9TlepLFNhvyinK0NYwjBPFQLqUZSdCk=";
};
nativeBuildInputs = [

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