mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-08-25 17:55:21 +00:00
Merge d9507283e6 into haskell-updates
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -23,6 +23,7 @@ digestif,,,,,5.3,
|
||||
dkjson,,,,,,
|
||||
enet,,,,,,ulysseszhan
|
||||
etlua,,,,,,ulysseszhan
|
||||
fallo,,,,,,mrcjkb
|
||||
fennel,,,,,,misterio77
|
||||
fidget.nvim,,,,,5.1,mrcjkb
|
||||
fifo,,,,,,
|
||||
|
||||
|
@@ -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`
|
||||
|
||||
|
||||
57
nixos/doc/manual/development/state-revision.section.md
Normal file
57
nixos/doc/manual/development/state-revision.section.md
Normal 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;
|
||||
};
|
||||
}
|
||||
```
|
||||
@@ -220,4 +220,5 @@ importing-modules.section.md
|
||||
replace-modules.section.md
|
||||
freeform-modules.section.md
|
||||
settings-options.section.md
|
||||
state-revision.section.md
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
],
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -60,7 +60,7 @@ buildPythonApplication {
|
||||
util-linux
|
||||
vde2
|
||||
]
|
||||
++ lib.optionals stdenv.isLinux [
|
||||
++ lib.optionals stdenv.hostPlatform.isLinux [
|
||||
vhost-device-vsock
|
||||
]
|
||||
++ lib.optionals enableNspawn [
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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: "* <${sv}: ${toString (v - 1)}") versions}
|
||||
* otherwise: ${toString maxVal}
|
||||
'';
|
||||
}
|
||||
// {
|
||||
inherit migrations;
|
||||
};
|
||||
};
|
||||
in
|
||||
utils
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
32
nixos/modules/programs/btrfs-heatmap.nix
Normal file
32
nixos/modules/programs/btrfs-heatmap.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
}
|
||||
32
nixos/modules/programs/compsize.nix
Normal file
32
nixos/modules/programs/compsize.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
}
|
||||
93
nixos/modules/programs/solaar.nix
Normal file
93
nixos/modules/programs/solaar.nix
Normal 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 ];
|
||||
};
|
||||
}
|
||||
@@ -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')
|
||||
'';
|
||||
|
||||
@@ -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
|
||||
|
||||
278
nixos/modules/services/databases/kvrocks.nix
Normal file
278
nixos/modules/services/databases/kvrocks.nix
Normal 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 = { };
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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 [
|
||||
[
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -137,6 +137,7 @@ in
|
||||
|
||||
services.${systemdName} = {
|
||||
inherit description;
|
||||
path = [ config.programs.ssh.package ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ in
|
||||
PrivateMounts = true;
|
||||
PrivateTmp = true;
|
||||
PrivateUsers = true;
|
||||
ProcSubset = "pid";
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = "strict";
|
||||
ProtectHome = true;
|
||||
|
||||
@@ -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 ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -132,6 +132,7 @@ in
|
||||
SystemCallFilter = [
|
||||
"@system-service"
|
||||
"~@privileged"
|
||||
"@chown"
|
||||
];
|
||||
# User and group
|
||||
DynamicUser = true;
|
||||
|
||||
224
nixos/modules/services/web-apps/hister.nix
Normal file
224
nixos/modules/services/web-apps/hister.nix
Normal 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 ];
|
||||
};
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
'';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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
146
nixos/tests/hister.nix
Normal 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
122
nixos/tests/kvrocks.nix
Normal 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")
|
||||
'';
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
25
nixos/tests/moduleStateRevisions.nix
Normal file
25
nixos/tests/moduleStateRevisions.nix
Normal 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
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
85
nixos/tests/nullmailer.nix
Normal file
85
nixos/tests/nullmailer.nix
Normal 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/*"))
|
||||
'';
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
{ runTest }:
|
||||
{
|
||||
callPackage,
|
||||
runTest,
|
||||
}:
|
||||
|
||||
{
|
||||
genJqSecretsReplacement = runTest ./genJqSecretsReplacement.nix;
|
||||
mkStateRevisionOption = callPackage ./mkStateRevisionOption.nix { };
|
||||
}
|
||||
|
||||
39
nixos/tests/utils/mkStateRevisionOption.nix
Normal file
39
nixos/tests/utils/mkStateRevisionOption.nix
Normal 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
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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="
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
buildKodiAddon rec {
|
||||
pname = "osmc-skin";
|
||||
namespace = "skin.osmc";
|
||||
version = "21.1.1";
|
||||
version = "21.2.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "osmc";
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
mkHyprlandPlugin (finalAttrs: {
|
||||
pluginName = "hypr-darkwindow";
|
||||
version = "0.56.1";
|
||||
version = "0.56.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "micha4w";
|
||||
|
||||
@@ -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
|
||||
''
|
||||
|
||||
##
|
||||
|
||||
@@ -254,5 +254,5 @@ rec {
|
||||
else
|
||||
gitignoreFilterSource (_: _: true) patterns;
|
||||
|
||||
gitignoreRecursiveSource = gitignoreFilterSourcePure (_: _: true);
|
||||
gitignoreRecursiveSource = gitignoreFilterRecursiveSource (_: _: true);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
166
pkgs/by-name/ac/actual-client/package.nix
Normal file
166
pkgs/by-name/ac/actual-client/package.nix
Normal 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
|
||||
];
|
||||
};
|
||||
})
|
||||
@@ -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;
|
||||
|
||||
@@ -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" ];
|
||||
|
||||
@@ -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" ];
|
||||
|
||||
|
||||
@@ -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=";
|
||||
};
|
||||
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
'';
|
||||
}
|
||||
@@ -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
|
||||
'';
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
)
|
||||
|
||||
108
pkgs/by-name/ap/aptakube/update.sh
Executable file
108
pkgs/by-name/ap/aptakube/update.sh
Executable 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}"
|
||||
@@ -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" ""
|
||||
'';
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -31,7 +31,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
|
||||
|
||||
cargoRoot = "./.";
|
||||
cargoDeps = rustPlatform.fetchCargoVendor {
|
||||
inherit (finalAttrs) src;
|
||||
inherit (finalAttrs) pname version src;
|
||||
hash = "sha256-68yQkgIVpqUo5tOcvxKh6NOkW565V94zHIZeI4q7nNA=";
|
||||
};
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
name = "awk-language-server";
|
||||
pname = "awk-language-server";
|
||||
version = "0.10.6";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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=";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 [
|
||||
|
||||
@@ -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 ];
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||
bzip2
|
||||
sqlite
|
||||
]
|
||||
++ lib.optionals stdenv.isDarwin [
|
||||
++ lib.optionals stdenv.hostPlatform.isDarwin [
|
||||
llvmPackages.openmp
|
||||
];
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
|
||||
license = lib.licenses.bsd3;
|
||||
maintainers = with lib.maintainers; [
|
||||
aiotter
|
||||
hibiday
|
||||
recutita
|
||||
matthiasbeyer
|
||||
];
|
||||
platforms = lib.platforms.unix;
|
||||
|
||||
@@ -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=";
|
||||
};
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user