Merge master into haskell-updates

This commit is contained in:
github-actions[bot] 2024-04-02 00:12:33 +00:00 committed by GitHub
commit a4b8f2e732
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
450 changed files with 25965 additions and 6386 deletions

1
.github/labeler.yml vendored
View file

@ -122,6 +122,7 @@
- any:
- changed-files:
- any-glob-to-any-file:
- pkgs/development/tools/misc/luarocks/*
- pkgs/development/interpreters/lua-5/**/*
- pkgs/development/interpreters/luajit/**/*
- pkgs/development/lua-modules/**/*

View file

@ -29,8 +29,8 @@
* [Discourse Forum](https://discourse.nixos.org/)
* [Matrix Chat](https://matrix.to/#/#community:nixos.org)
* [NixOS Weekly](https://weekly.nixos.org/)
* [Community-maintained wiki](https://nixos.wiki/)
* [Community-maintained list of ways to get in touch](https://nixos.wiki/wiki/Get_In_Touch#Chat) (Discord, Telegram, IRC, etc.)
* [Official wiki](https://wiki.nixos.org/)
* [Community-maintained list of ways to get in touch](https://wiki.nixos.org/wiki/Get_In_Touch#Chat) (Discord, Telegram, IRC, etc.)
# Other Project Repositories

View file

@ -17,6 +17,9 @@ The main package set contains aliases to these package sets, e.g.
`luaPackages` refers to `lua5_1.pkgs` and `lua52Packages` to
`lua5_2.pkgs`.
Note that nixpkgs patches the non-luajit interpreters to avoid referring to
`/usr` and have `;;` (a [placeholder](https://www.lua.org/manual/5.1/manual.html#pdf-package.path) replaced with the default LUA_PATH) work correctly.
### Installing Lua and packages {#installing-lua-and-packages}
#### Lua environment defined in separate `.nix` file {#lua-environment-defined-in-separate-.nix-file}

View file

@ -1784,6 +1784,13 @@
fingerprint = "C919 E69E A7C0 E147 9E0F C26E 1EDA D0C6 70BD 062D";
}];
};
assistant = {
email = "assistant.moetron@gmail.com";
github = "Assistant";
githubId = 2748721;
matrix = "@assistant:pygmalion.chat";
name = "Assistant Moetron";
};
astavie = {
email = "astavie@pm.me";
github = "astavie";
@ -15767,6 +15774,12 @@
githubId = 4201956;
name = "pongo1231";
};
poptart = {
email = "poptart@hosakacorp.net";
github = "terrorbyte";
githubId = 1601039;
name = "Cale Black";
};
portothree = {
name = "Gustavo Porto";
email = "gus@p8s.co";

View file

@ -1,83 +0,0 @@
#! /usr/bin/env nix-shell
#! nix-shell -I nixpkgs=. -i bash -p delta jq perl
set -euo pipefail
shopt -s inherit_errexit
cat <<'EOF'
This script attempts to automatically convert option descriptions from
DocBook syntax to markdown. Naturally this process is incomplete and
imperfect, so any changes generated by this script MUST be reviewed.
Possible problems include: incorrectly replaced tags, badly formatted
markdown, DocBook tags this script doesn't recognize remaining in the
output and crashing the docs build, incorrect escaping of markdown
metacharacters, incorrect unescaping of XML entities—and the list goes on.
Always review the generated changes!
Some known limitations:
- Does not transform literalDocBook items
- Replacements can occur in non-option code, such as string literals
EOF
build-options-json() {
nix-build --no-out-link --expr '
let
sys = import ./nixos/default.nix {
configuration = {};
};
in
[
sys.config.system.build.manual.optionsJSON
]
'
}
git diff --quiet || {
echo "Worktree is dirty. Please stash or commit first."
exit 1
}
echo "Building options.json ..."
old_options=$(build-options-json)
echo "Applying replacements ..."
perl -pi -e '
BEGIN {
undef $/;
}
s,<literal>([^`]*?)</literal>,`$1`,smg;
s,<replaceable>([]*?)</replaceable>,«$1»,smg;
s,<filename>([^`]*?)</filename>,{file}`$1`,smg;
s,<option>([^`]*?)</option>,{option}`$1`,smg;
s,<code>([^`]*?)</code>,`$1`,smg;
s,<command>([^`]*?)</command>,{command}`$1`,smg;
s,<link xlink:href="(.+?)" ?/>,<$1>,smg;
s,<link xlink:href="(.+?)">(.*?)</link>,[$2]($1),smg;
s,<package>([^`]*?)</package>,`$1`,smg;
s,<emphasis>([^*]*?)</emphasis>,*$1*,smg;
s,<citerefentry>\s*
<refentrytitle>\s*(.*?)\s*</refentrytitle>\s*
<manvolnum>\s*(.*?)\s*</manvolnum>\s*
</citerefentry>,{manpage}`$1($2)`,smgx;
s,^( +description =),\1 lib.mdDoc,smg;
' "$@"
echo "Building options.json again ..."
new_options=$(build-options-json)
! cmp -s {$old_options,$new_options}/share/doc/nixos/options.json && {
diff -U10 \
<(jq . <$old_options/share/doc/nixos/options.json) \
<(jq . <$new_options/share/doc/nixos/options.json) \
| delta
}

View file

@ -7,7 +7,7 @@ However, it is possible and not-uncommon to create [impermanent systems], whose
`rootfs` is either a `tmpfs` or reset during boot. While NixOS itself supports
this kind of configuration, special care needs to be taken.
[impermanent systems]: https://nixos.wiki/wiki/Impermanence
[impermanent systems]: https://wiki.nixos.org/wiki/Impermanence
```{=include=} sections

View file

@ -12,7 +12,7 @@ looks like this:
type = type specification;
default = default value;
example = example value;
description = lib.mdDoc "Description for use in the NixOS manual.";
description = "Description for use in the NixOS manual.";
};
};
}
@ -58,12 +58,9 @@ The function `mkOption` accepts the following arguments.
`description`
: A textual description of the option, in [Nixpkgs-flavored Markdown](
https://nixos.org/nixpkgs/manual/#sec-contributing-markup) format, that will be
included in the NixOS manual. During the migration process from DocBook
it is necessary to mark descriptions written in CommonMark with `lib.mdDoc`.
The description may still be written in DocBook (without any marker), but this
is discouraged and will be deprecated in the future.
: A textual description of the option in [Nixpkgs-flavored Markdown](
https://nixos.org/nixpkgs/manual/#sec-contributing-markup) format that will be
included in the NixOS manual.
## Utility functions for common option patterns {#sec-option-declarations-util}
@ -81,13 +78,13 @@ For example:
::: {#ex-options-declarations-util-mkEnableOption-magic .example}
### `mkEnableOption` usage
```nix
lib.mkEnableOption (lib.mdDoc "magic")
lib.mkEnableOption "magic"
# is like
lib.mkOption {
type = lib.types.bool;
default = false;
example = true;
description = lib.mdDoc "Whether to enable magic.";
description = "Whether to enable magic.";
}
```
:::
@ -135,7 +132,7 @@ lib.mkOption {
type = lib.types.package;
default = pkgs.hello;
defaultText = lib.literalExpression "pkgs.hello";
description = lib.mdDoc "The hello package to use.";
description = "The hello package to use.";
}
```
:::
@ -153,7 +150,7 @@ lib.mkOption {
default = pkgs.ghc;
defaultText = lib.literalExpression "pkgs.ghc";
example = lib.literalExpression "pkgs.haskell.packages.ghc92.ghc.withPackages (hkgs: [ hkgs.primes ])";
description = lib.mdDoc "The GHC package to use.";
description = "The GHC package to use.";
}
```
:::

View file

@ -63,6 +63,9 @@ Use `services.pipewire.extraConfig` or `services.pipewire.configPackages` for Pi
}
```
- lua interpreters default LUA_PATH and LUA_CPATH are not overriden by nixpkgs
anymore, we patch LUA_ROOT instead which is more respectful to upstream.
- Plasma 6 is now available and can be installed with `services.xserver.desktopManager.plasma6.enable = true;`. Plasma 5 will likely be deprecated in the next release (24.11). Note that Plasma 6 runs as Wayland by default, and the X11 session needs to be explicitly selected if necessary.
## New Services {#sec-release-24.05-new-services}
@ -138,8 +141,12 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
- [Scrutiny](https://github.com/AnalogJ/scrutiny), a S.M.A.R.T monitoring tool for hard disks with a web frontend.
- [davis](https://github.com/tchapi/davis), a simple CardDav and CalDav server inspired by Baïkal. Available as [services.davis]($opt-services-davis.enable).
- [systemd-lock-handler](https://git.sr.ht/~whynothugo/systemd-lock-handler/), a bridge between logind D-Bus events and systemd targets. Available as [services.systemd-lock-handler.enable](#opt-services.systemd-lock-handler.enable).
- [wastebin](https://github.com/matze/wastebin), a pastebin server written in rust. Available as [services.wastebin](#opt-services.wastebin.enable).
- [Mealie](https://nightly.mealie.io/), a self-hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in NuxtJS for a pleasant user experience for the whole family. Available as [services.mealie](#opt-services.mealie.enable)
- [Uni-Sync](https://github.com/EightB1ts/uni-sync), a synchronization tool for Lian Li Uni Controllers. Available as [hardware.uni-sync](#opt-hardware.uni-sync.enable)
@ -466,6 +473,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
- `services.zfs.zed.enableMail` now uses the global `sendmail` wrapper defined by an email module
(such as msmtp or Postfix). It no longer requires using a special ZFS build with email support.
- `castopod` has some migration actions to be taken in case of a S3 setup. Some new features may also need some manual migration actions. See [https://code.castopod.org/adaures/castopod/-/releases](https://code.castopod.org/adaures/castopod/-/releases) for more informations.
- `nextcloud-setup.service` no longer changes the group of each file & directory inside `/var/lib/nextcloud/{config,data,store-apps}` if one of these directories has the wrong owner group. This was part of transitioning the group used for `/var/lib/nextcloud`, but isn't necessary anymore.
- `services.kavita` now uses the freeform option `services.kavita.settings` for the application settings file.

View file

@ -117,9 +117,7 @@
# deprecated since 23.11.
# TODO remove in a while.
, allowDocBook ? false
# whether lib.mdDoc is required for descriptions to be read as markdown.
# deprecated since 23.11.
# TODO remove in a while.
# TODO remove in a while (see https://github.com/NixOS/nixpkgs/issues/300735)
, markdownByDefault ? true
}:

View file

@ -1,8 +1,47 @@
{ config, lib, pkgs }:
with lib;
let
inherit (lib)
all
attrByPath
attrNames
concatLists
concatMap
concatMapStrings
concatStrings
concatStringsSep
const
elem
filter
filterAttrs
flip
head
isInt
isList
length
makeBinPath
makeSearchPathOutput
mapAttrs
mapAttrsToList
mkAfter
mkIf
optional
optionalAttrs
optionalString
range
replaceStrings
reverseList
splitString
stringLength
stringToCharacters
tail
toIntBase10
trace
types
;
inherit (lib.strings) toJSON;
cfg = config.systemd;
lndir = "${pkgs.buildPackages.xorg.lndir}/bin/lndir";
systemd = cfg.package;
@ -10,7 +49,7 @@ in rec {
shellEscape = s: (replaceStrings [ "\\" ] [ "\\\\" ] s);
mkPathSafeName = lib.replaceStrings ["@" ":" "\\" "[" "]"] ["-" "-" "-" "" ""];
mkPathSafeName = replaceStrings ["@" ":" "\\" "[" "]"] ["-" "-" "-" "" ""];
# a type for options that take a unit name
unitNameType = types.strMatching "[a-zA-Z0-9@%:_.\\-]+[.](service|socket|device|mount|automount|swap|target|path|timer|scope|slice)";
@ -133,7 +172,7 @@ in rec {
)) attrs;
errors = concatMap (c: c group defs) checks;
in if errors == [] then true
else builtins.trace (concatStringsSep "\n" errors) false;
else trace (concatStringsSep "\n" errors) false;
toOption = x:
if x == true then "true"
@ -220,7 +259,7 @@ in rec {
# upstream unit.
for i in ${toString (mapAttrsToList
(n: v: v.unit)
(lib.filterAttrs (n: v: (attrByPath [ "overrideStrategy" ] "asDropinIfExists" v) == "asDropinIfExists") units))}; do
(filterAttrs (n: v: (attrByPath [ "overrideStrategy" ] "asDropinIfExists" v) == "asDropinIfExists") units))}; do
fn=$(basename $i/*)
if [ -e $out/$fn ]; then
if [ "$(readlink -f $i/$fn)" = /dev/null ]; then
@ -243,7 +282,7 @@ in rec {
# treated as drop-in file.
for i in ${toString (mapAttrsToList
(n: v: v.unit)
(lib.filterAttrs (n: v: v ? overrideStrategy && v.overrideStrategy == "asDropin") units))}; do
(filterAttrs (n: v: v ? overrideStrategy && v.overrideStrategy == "asDropin") units))}; do
fn=$(basename $i/*)
mkdir -p $out/$fn.d
ln -s $i/$fn $out/$fn.d/overrides.conf
@ -384,7 +423,7 @@ in rec {
commonUnitText = def: lines: ''
[Unit]
${attrsToSection def.unitConfig}
'' + lines + lib.optionalString (def.wantedBy != [ ]) ''
'' + lines + optionalString (def.wantedBy != [ ]) ''
[Install]
WantedBy=${concatStringsSep " " def.wantedBy}
@ -406,7 +445,7 @@ in rec {
'' + (let env = cfg.globalEnvironment // def.environment;
in concatMapStrings (n:
let s = optionalString (env.${n} != null)
"Environment=${builtins.toJSON "${n}=${env.${n}}"}\n";
"Environment=${toJSON "${n}=${env.${n}}"}\n";
# systemd max line length is now 1MiB
# https://github.com/systemd/systemd/commit/e6dde451a51dc5aaa7f4d98d39b8fe735f73d2af
in if stringLength s >= 1048576 then throw "The value of the environment variable ${n} in systemd service ${name}.service is too long." else s) (attrNames env))
@ -475,13 +514,13 @@ in rec {
# in that attrset are determined by the supplied format.
definitions = directoryName: format: definitionAttrs:
let
listOfDefinitions = lib.mapAttrsToList
listOfDefinitions = mapAttrsToList
(name: format.generate "${name}.conf")
definitionAttrs;
in
pkgs.runCommand directoryName { } ''
mkdir -p $out
${(lib.concatStringsSep "\n"
${(concatStringsSep "\n"
(map (pkg: "cp ${pkg} $out/${pkg.name}") listOfDefinitions)
)}
'';

View file

@ -1,8 +1,13 @@
{ lib, systemdUtils }:
with lib;
let
inherit (lib)
concatMapStrings
concatStringsSep
flip
optionalString
;
attrsToSection = systemdUtils.lib.attrsToSection;
commonMatchText = def:
optionalString (def.matchConfig != { }) ''

View file

@ -1,47 +1,90 @@
{ lib, systemdUtils, pkgs }:
with systemdUtils.lib;
with systemdUtils.unitOptions;
with lib;
let
inherit (systemdUtils.lib)
automountConfig
makeUnit
mountConfig
stage1ServiceConfig
stage2ServiceConfig
unitConfig
;
inherit (systemdUtils.unitOptions)
concreteUnitOptions
stage1AutomountOptions
stage1CommonUnitOptions
stage1MountOptions
stage1PathOptions
stage1ServiceOptions
stage1SliceOptions
stage1SocketOptions
stage1TimerOptions
stage2AutomountOptions
stage2CommonUnitOptions
stage2MountOptions
stage2PathOptions
stage2ServiceOptions
stage2SliceOptions
stage2SocketOptions
stage2TimerOptions
;
inherit (lib)
mkDefault
mkDerivedConfig
mkEnableOption
mkIf
mkOption
;
inherit (lib.types)
attrsOf
lines
listOf
nullOr
path
submodule
;
in
rec {
units = with types;
attrsOf (submodule ({ name, config, ... }: {
options = concreteUnitOptions;
config = { unit = mkDefault (systemdUtils.lib.makeUnit name config); };
}));
units = attrsOf (submodule ({ name, config, ... }: {
options = concreteUnitOptions;
config = { unit = mkDefault (makeUnit name config); };
}));
services = with types; attrsOf (submodule [ stage2ServiceOptions unitConfig stage2ServiceConfig ]);
initrdServices = with types; attrsOf (submodule [ stage1ServiceOptions unitConfig stage1ServiceConfig ]);
services = attrsOf (submodule [ stage2ServiceOptions unitConfig stage2ServiceConfig ]);
initrdServices = attrsOf (submodule [ stage1ServiceOptions unitConfig stage1ServiceConfig ]);
targets = with types; attrsOf (submodule [ stage2CommonUnitOptions unitConfig ]);
initrdTargets = with types; attrsOf (submodule [ stage1CommonUnitOptions unitConfig ]);
targets = attrsOf (submodule [ stage2CommonUnitOptions unitConfig ]);
initrdTargets = attrsOf (submodule [ stage1CommonUnitOptions unitConfig ]);
sockets = with types; attrsOf (submodule [ stage2SocketOptions unitConfig ]);
initrdSockets = with types; attrsOf (submodule [ stage1SocketOptions unitConfig ]);
sockets = attrsOf (submodule [ stage2SocketOptions unitConfig ]);
initrdSockets = attrsOf (submodule [ stage1SocketOptions unitConfig ]);
timers = with types; attrsOf (submodule [ stage2TimerOptions unitConfig ]);
initrdTimers = with types; attrsOf (submodule [ stage1TimerOptions unitConfig ]);
timers = attrsOf (submodule [ stage2TimerOptions unitConfig ]);
initrdTimers = attrsOf (submodule [ stage1TimerOptions unitConfig ]);
paths = with types; attrsOf (submodule [ stage2PathOptions unitConfig ]);
initrdPaths = with types; attrsOf (submodule [ stage1PathOptions unitConfig ]);
paths = attrsOf (submodule [ stage2PathOptions unitConfig ]);
initrdPaths = attrsOf (submodule [ stage1PathOptions unitConfig ]);
slices = with types; attrsOf (submodule [ stage2SliceOptions unitConfig ]);
initrdSlices = with types; attrsOf (submodule [ stage1SliceOptions unitConfig ]);
slices = attrsOf (submodule [ stage2SliceOptions unitConfig ]);
initrdSlices = attrsOf (submodule [ stage1SliceOptions unitConfig ]);
mounts = with types; listOf (submodule [ stage2MountOptions unitConfig mountConfig ]);
initrdMounts = with types; listOf (submodule [ stage1MountOptions unitConfig mountConfig ]);
mounts = listOf (submodule [ stage2MountOptions unitConfig mountConfig ]);
initrdMounts = listOf (submodule [ stage1MountOptions unitConfig mountConfig ]);
automounts = with types; listOf (submodule [ stage2AutomountOptions unitConfig automountConfig ]);
initrdAutomounts = with types; attrsOf (submodule [ stage1AutomountOptions unitConfig automountConfig ]);
automounts = listOf (submodule [ stage2AutomountOptions unitConfig automountConfig ]);
initrdAutomounts = attrsOf (submodule [ stage1AutomountOptions unitConfig automountConfig ]);
initrdContents = types.attrsOf (types.submodule ({ config, options, name, ... }: {
initrdContents = attrsOf (submodule ({ config, options, name, ... }: {
options = {
enable = mkEnableOption (lib.mdDoc "copying of this file and symlinking it") // { default = true; };
enable = (mkEnableOption "copying of this file and symlinking it") // { default = true; };
target = mkOption {
type = types.path;
description = lib.mdDoc ''
type = path;
description = ''
Path of the symlink.
'';
default = name;
@ -49,13 +92,13 @@ rec {
text = mkOption {
default = null;
type = types.nullOr types.lines;
description = lib.mdDoc "Text of the file.";
type = nullOr lines;
description = "Text of the file.";
};
source = mkOption {
type = types.path;
description = lib.mdDoc "Path of the source file.";
type = path;
description = "Path of the source file.";
};
};

View file

@ -1,9 +1,32 @@
{ lib, systemdUtils }:
with systemdUtils.lib;
with lib;
let
inherit (systemdUtils.lib)
assertValueOneOf
automountConfig
checkUnitConfig
makeJobScript
mountConfig
serviceConfig
unitConfig
unitNameType
;
inherit (lib)
any
concatMap
filterOverrides
isList
mergeEqualOption
mkIf
mkMerge
mkOption
mkOptionType
singleton
toList
types
;
checkService = checkUnitConfig "Service" [
(assertValueOneOf "Type" [
"exec" "simple" "forking" "oneshot" "dbus" "notify" "notify-reload" "idle"
@ -31,7 +54,7 @@ in rec {
enable = mkOption {
default = true;
type = types.bool;
description = lib.mdDoc ''
description = ''
If set to false, this unit will be a symlink to
/dev/null. This is primarily useful to prevent specific
template instances
@ -45,7 +68,7 @@ in rec {
overrideStrategy = mkOption {
default = "asDropinIfExists";
type = types.enum [ "asDropinIfExists" "asDropin" ];
description = lib.mdDoc ''
description = ''
Defines how unit configuration is provided for systemd:
`asDropinIfExists` creates a unit file when no unit file is provided by the package
@ -61,7 +84,7 @@ in rec {
requiredBy = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Units that require (i.e. depend on and need to go down with) this unit.
As discussed in the `wantedBy` option description this also creates
`.requires` symlinks automatically.
@ -71,7 +94,7 @@ in rec {
upheldBy = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Keep this unit running as long as the listed units are running. This is a continuously
enforced version of wantedBy.
'';
@ -80,7 +103,7 @@ in rec {
wantedBy = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Units that want (i.e. depend on) this unit. The default method for
starting a unit by default at boot time is to set this option to
`["multi-user.target"]` for system services. Likewise for user units
@ -98,7 +121,7 @@ in rec {
aliases = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc "Aliases of that unit.";
description = "Aliases of that unit.";
};
};
@ -108,12 +131,12 @@ in rec {
text = mkOption {
type = types.nullOr types.str;
default = null;
description = lib.mdDoc "Text of this systemd unit.";
description = "Text of this systemd unit.";
};
unit = mkOption {
internal = true;
description = lib.mdDoc "The generated unit.";
description = "The generated unit.";
};
};
@ -124,19 +147,19 @@ in rec {
description = mkOption {
default = "";
type = types.singleLineStr;
description = lib.mdDoc "Description of this unit used in systemd messages and progress indicators.";
description = "Description of this unit used in systemd messages and progress indicators.";
};
documentation = mkOption {
default = [];
type = types.listOf types.str;
description = lib.mdDoc "A list of URIs referencing documentation for this unit or its configuration.";
description = "A list of URIs referencing documentation for this unit or its configuration.";
};
requires = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Start the specified units when this unit is started, and stop
this unit when the specified units are stopped or fail.
'';
@ -145,7 +168,7 @@ in rec {
wants = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Start the specified units when this unit is started.
'';
};
@ -153,7 +176,7 @@ in rec {
upholds = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Keeps the specified running while this unit is running. A continuous version of `wants`.
'';
};
@ -161,7 +184,7 @@ in rec {
after = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
If the specified units are started at the same time as
this unit, delay this unit until they have started.
'';
@ -170,7 +193,7 @@ in rec {
before = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
If the specified units are started at the same time as
this unit, delay them until this unit has started.
'';
@ -179,7 +202,7 @@ in rec {
bindsTo = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Like requires, but in addition, if the specified units
unexpectedly disappear, this unit will be stopped as well.
'';
@ -188,7 +211,7 @@ in rec {
partOf = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
If the specified units are stopped or restarted, then this
unit is stopped or restarted as well.
'';
@ -197,7 +220,7 @@ in rec {
conflicts = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
If the specified units are started, then this unit is stopped
and vice versa.
'';
@ -206,7 +229,7 @@ in rec {
requisite = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
Similar to requires. However if the units listed are not started,
they will not be started and the transaction will fail.
'';
@ -216,7 +239,7 @@ in rec {
default = {};
example = { RequiresMountsFor = "/data"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Unit]` section of the unit. See
{manpage}`systemd.unit(5)` for details.
@ -226,7 +249,7 @@ in rec {
onFailure = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
A list of one or more units that are activated when
this unit enters the "failed" state.
'';
@ -235,7 +258,7 @@ in rec {
onSuccess = mkOption {
default = [];
type = types.listOf unitNameType;
description = lib.mdDoc ''
description = ''
A list of one or more units that are activated when
this unit enters the "inactive" state.
'';
@ -243,7 +266,7 @@ in rec {
startLimitBurst = mkOption {
type = types.int;
description = lib.mdDoc ''
description = ''
Configure unit start rate limiting. Units which are started
more than startLimitBurst times within an interval time
interval are not permitted to start any more.
@ -252,7 +275,7 @@ in rec {
startLimitIntervalSec = mkOption {
type = types.int;
description = lib.mdDoc ''
description = ''
Configure unit start rate limiting. Units which are started
more than startLimitBurst times within an interval time
interval are not permitted to start any more.
@ -271,7 +294,7 @@ in rec {
restartTriggers = mkOption {
default = [];
type = types.listOf types.unspecified;
description = lib.mdDoc ''
description = ''
An arbitrary list of items such as derivations. If any item
in the list changes between reconfigurations, the service will
be restarted.
@ -281,7 +304,7 @@ in rec {
reloadTriggers = mkOption {
default = [];
type = types.listOf unitOption;
description = lib.mdDoc ''
description = ''
An arbitrary list of items such as derivations. If any item
in the list changes between reconfigurations, the service will
be reloaded. If anything but a reload trigger changes in the
@ -299,13 +322,13 @@ in rec {
default = {};
type = with types; attrsOf (nullOr (oneOf [ str path package ]));
example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
description = lib.mdDoc "Environment variables passed to the service's processes.";
description = "Environment variables passed to the service's processes.";
};
path = mkOption {
default = [];
type = with types; listOf (oneOf [ package str ]);
description = lib.mdDoc ''
description = ''
Packages added to the service's {env}`PATH`
environment variable. Both the {file}`bin`
and {file}`sbin` subdirectories of each
@ -319,7 +342,7 @@ in rec {
{ RestartSec = 5;
};
type = types.addCheck (types.attrsOf unitOption) checkService;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Service]` section of the unit. See
{manpage}`systemd.service(5)` for details.
@ -329,14 +352,14 @@ in rec {
script = mkOption {
type = types.lines;
default = "";
description = lib.mdDoc "Shell commands executed as the service's main process.";
description = "Shell commands executed as the service's main process.";
};
scriptArgs = mkOption {
type = types.str;
default = "";
example = "%i";
description = lib.mdDoc ''
description = ''
Arguments passed to the main process script.
Can contain specifiers (`%` placeholders expanded by systemd, see {manpage}`systemd.unit(5)`).
'';
@ -345,7 +368,7 @@ in rec {
preStart = mkOption {
type = types.lines;
default = "";
description = lib.mdDoc ''
description = ''
Shell commands executed before the service's main process
is started.
'';
@ -354,7 +377,7 @@ in rec {
postStart = mkOption {
type = types.lines;
default = "";
description = lib.mdDoc ''
description = ''
Shell commands executed after the service's main process
is started.
'';
@ -363,7 +386,7 @@ in rec {
reload = mkOption {
type = types.lines;
default = "";
description = lib.mdDoc ''
description = ''
Shell commands executed when the service's main process
is reloaded.
'';
@ -372,7 +395,7 @@ in rec {
preStop = mkOption {
type = types.lines;
default = "";
description = lib.mdDoc ''
description = ''
Shell commands executed to stop the service.
'';
};
@ -380,7 +403,7 @@ in rec {
postStop = mkOption {
type = types.lines;
default = "";
description = lib.mdDoc ''
description = ''
Shell commands executed after the service's main process
has exited.
'';
@ -389,7 +412,7 @@ in rec {
jobScripts = mkOption {
type = with types; coercedTo path singleton (listOf path);
internal = true;
description = lib.mdDoc "A list of all job script derivations of this unit.";
description = "A list of all job script derivations of this unit.";
default = [];
};
@ -434,7 +457,7 @@ in rec {
restartIfChanged = mkOption {
type = types.bool;
default = true;
description = lib.mdDoc ''
description = ''
Whether the service should be restarted during a NixOS
configuration switch if its definition has changed.
'';
@ -443,7 +466,7 @@ in rec {
reloadIfChanged = mkOption {
type = types.bool;
default = false;
description = lib.mdDoc ''
description = ''
Whether the service should be reloaded during a NixOS
configuration switch if its definition has changed. If
enabled, the value of {option}`restartIfChanged` is
@ -459,7 +482,7 @@ in rec {
stopIfChanged = mkOption {
type = types.bool;
default = true;
description = lib.mdDoc ''
description = ''
If set, a changed unit is restarted by calling
{command}`systemctl stop` in the old configuration,
then {command}`systemctl start` in the new one.
@ -475,7 +498,7 @@ in rec {
type = with types; either str (listOf str);
default = [];
example = "Sun 14:00:00";
description = lib.mdDoc ''
description = ''
Automatically start this unit at the given date/time, which
must be in the format described in
{manpage}`systemd.time(7)`. This is equivalent
@ -502,7 +525,7 @@ in rec {
default = [];
type = types.listOf types.str;
example = [ "0.0.0.0:993" "/run/my-socket" ];
description = lib.mdDoc ''
description = ''
For each item in this list, a `ListenStream`
option in the `[Socket]` section will be created.
'';
@ -512,7 +535,7 @@ in rec {
default = [];
type = types.listOf types.str;
example = [ "0.0.0.0:993" "/run/my-socket" ];
description = lib.mdDoc ''
description = ''
For each item in this list, a `ListenDatagram`
option in the `[Socket]` section will be created.
'';
@ -522,7 +545,7 @@ in rec {
default = {};
example = { ListenStream = "/run/my-socket"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Socket]` section of the unit. See
{manpage}`systemd.socket(5)` for details.
@ -554,7 +577,7 @@ in rec {
default = {};
example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Timer]` section of the unit. See
{manpage}`systemd.timer(5)` and
@ -587,7 +610,7 @@ in rec {
default = {};
example = { PathChanged = "/some/path"; Unit = "changedpath.service"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Path]` section of the unit. See
{manpage}`systemd.path(5)` for details.
@ -618,13 +641,13 @@ in rec {
what = mkOption {
example = "/dev/sda1";
type = types.str;
description = lib.mdDoc "Absolute path of device node, file or other resource. (Mandatory)";
description = "Absolute path of device node, file or other resource. (Mandatory)";
};
where = mkOption {
example = "/mnt";
type = types.str;
description = lib.mdDoc ''
description = ''
Absolute path of a directory of the mount point.
Will be created if it doesn't exist. (Mandatory)
'';
@ -634,21 +657,21 @@ in rec {
default = "";
example = "ext4";
type = types.str;
description = lib.mdDoc "File system type.";
description = "File system type.";
};
options = mkOption {
default = "";
example = "noatime";
type = types.commas;
description = lib.mdDoc "Options used to mount the file system.";
description = "Options used to mount the file system.";
};
mountConfig = mkOption {
default = {};
example = { DirectoryMode = "0775"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Mount]` section of the unit. See
{manpage}`systemd.mount(5)` for details.
@ -678,7 +701,7 @@ in rec {
where = mkOption {
example = "/mnt";
type = types.str;
description = lib.mdDoc ''
description = ''
Absolute path of a directory of the mount point.
Will be created if it doesn't exist. (Mandatory)
'';
@ -688,7 +711,7 @@ in rec {
default = {};
example = { DirectoryMode = "0775"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Automount]` section of the unit. See
{manpage}`systemd.automount(5)` for details.
@ -719,7 +742,7 @@ in rec {
default = {};
example = { MemoryMax = "2G"; };
type = types.attrsOf unitOption;
description = lib.mdDoc ''
description = ''
Each attribute in this set specifies an option in the
`[Slice]` section of the unit. See
{manpage}`systemd.slice(5)` for details.

View file

@ -1,6 +1,6 @@
{ config, lib, hostPkgs, ... }:
let
inherit (lib) mkOption types literalMD mdDoc;
inherit (lib) mkOption types literalMD;
# Reifies and correctly wraps the python test driver for
# the respective qemu version and with or without ocr support
@ -104,13 +104,13 @@ in
options = {
driver = mkOption {
description = mdDoc "Package containing a script that runs the test.";
description = "Package containing a script that runs the test.";
type = types.package;
defaultText = literalMD "set by the test framework";
};
hostPkgs = mkOption {
description = mdDoc "Nixpkgs attrset used outside the nodes.";
description = "Nixpkgs attrset used outside the nodes.";
type = types.raw;
example = lib.literalExpression ''
import nixpkgs { inherit system config overlays; }
@ -118,14 +118,14 @@ in
};
qemu.package = mkOption {
description = mdDoc "Which qemu package to use for the virtualisation of [{option}`nodes`](#test-opt-nodes).";
description = "Which qemu package to use for the virtualisation of [{option}`nodes`](#test-opt-nodes).";
type = types.package;
default = hostPkgs.qemu_test;
defaultText = "hostPkgs.qemu_test";
};
globalTimeout = mkOption {
description = mdDoc ''
description = ''
A global timeout for the complete test, expressed in seconds.
Beyond that timeout, every resource will be killed and released and the test will fail.
@ -137,7 +137,7 @@ in
};
enableOCR = mkOption {
description = mdDoc ''
description = ''
Whether to enable Optical Character Recognition functionality for
testing graphical programs. See [Machine objects](`ssec-machine-objects`).
'';
@ -146,7 +146,7 @@ in
};
extraPythonPackages = mkOption {
description = mdDoc ''
description = ''
Python packages to add to the test driver.
The argument is a Python package set, similar to `pkgs.pythonPackages`.
@ -159,7 +159,7 @@ in
};
extraDriverArgs = mkOption {
description = mdDoc ''
description = ''
Extra arguments to pass to the test driver.
They become part of [{option}`driver`](#test-opt-driver) via `wrapProgram`.
@ -171,7 +171,7 @@ in
skipLint = mkOption {
type = types.bool;
default = false;
description = mdDoc ''
description = ''
Do not run the linters. This may speed up your iteration cycle, but it is not something you should commit.
'';
};
@ -179,7 +179,7 @@ in
skipTypeCheck = mkOption {
type = types.bool;
default = false;
description = mdDoc ''
description = ''
Disable type checking. This must not be enabled for new NixOS tests.
This may speed up your iteration cycle, unless you're working on the [{option}`testScript`](#test-opt-testScript).

View file

@ -1,11 +1,11 @@
{ config, lib, moduleType, hostPkgs, ... }:
let
inherit (lib) mkOption types mdDoc;
inherit (lib) mkOption types;
in
{
options = {
interactive = mkOption {
description = mdDoc ''
description = ''
Tests [can be run interactively](#sec-running-nixos-tests-interactively)
using the program in the test derivation's `.driverInteractive` attribute.

View file

@ -1,11 +1,11 @@
{ lib, ... }:
let
inherit (lib) types mkOption mdDoc;
inherit (lib) types mkOption;
in
{
options = {
meta = lib.mkOption {
description = mdDoc ''
description = ''
The [`meta`](https://nixos.org/manual/nixpkgs/stable/#chap-meta) attributes that will be set on the returned derivations.
Not all [`meta`](https://nixos.org/manual/nixpkgs/stable/#chap-meta) attributes are supported, but more can be added as desired.
@ -16,21 +16,21 @@ in
maintainers = lib.mkOption {
type = types.listOf types.raw;
default = [];
description = mdDoc ''
description = ''
The [list of maintainers](https://nixos.org/manual/nixpkgs/stable/#var-meta-maintainers) for this test.
'';
};
timeout = lib.mkOption {
type = types.nullOr types.int;
default = 3600; # 1 hour
description = mdDoc ''
description = ''
The [{option}`test`](#test-opt-test)'s [`meta.timeout`](https://nixos.org/manual/nixpkgs/stable/#var-meta-timeout) in seconds.
'';
};
broken = lib.mkOption {
type = types.bool;
default = false;
description = mdDoc ''
description = ''
Sets the [`meta.broken`](https://nixos.org/manual/nixpkgs/stable/#var-meta-broken) attribute on the [{option}`test`](#test-opt-test) derivation.
'';
};

View file

@ -1,10 +1,10 @@
{ lib, ... }:
let
inherit (lib) mkOption types mdDoc;
inherit (lib) mkOption types;
in
{
options.name = mkOption {
description = mdDoc ''
description = ''
The name of the test.
This is used in the derivation names of the [{option}`driver`](#test-opt-driver) and [{option}`test`](#test-opt-test) runner.

View file

@ -5,7 +5,6 @@ let
attrNames concatMap concatMapStrings flip forEach head
listToAttrs mkDefault mkOption nameValuePair optionalString
range toLower types zipListsWith zipLists
mdDoc
;
nodeNumbers =
@ -89,7 +88,7 @@ let
default = name;
# We need to force this in specilisations, otherwise it'd be
# readOnly = true;
description = mdDoc ''
description = ''
The `name` in `nodes.<name>`; stable across `specialisations`.
'';
};
@ -98,7 +97,7 @@ let
type = types.int;
readOnly = true;
default = nodeNumbers.${config.virtualisation.test.nodeName};
description = mdDoc ''
description = ''
A unique number assigned for each node in `nodes`.
'';
};

View file

@ -5,7 +5,6 @@ let
literalExpression
literalMD
mapAttrs
mdDoc
mkDefault
mkIf
mkOption mkForce
@ -76,7 +75,7 @@ in
nodes = mkOption {
type = types.lazyAttrsOf config.node.type;
visible = "shallow";
description = mdDoc ''
description = ''
An attribute set of NixOS configuration modules.
The configurations are augmented by the [`defaults`](#test-opt-defaults) option.
@ -88,7 +87,7 @@ in
};
defaults = mkOption {
description = mdDoc ''
description = ''
NixOS configuration that is applied to all [{option}`nodes`](#test-opt-nodes).
'';
type = types.deferredModule;
@ -96,7 +95,7 @@ in
};
extraBaseModules = mkOption {
description = mdDoc ''
description = ''
NixOS configuration that, like [{option}`defaults`](#test-opt-defaults), is applied to all [{option}`nodes`](#test-opt-nodes) and can not be undone with [`specialisation.<name>.inheritParentConfig`](https://search.nixos.org/options?show=specialisation.%3Cname%3E.inheritParentConfig&from=0&size=50&sort=relevance&type=packages&query=specialisation).
'';
type = types.deferredModule;
@ -104,7 +103,7 @@ in
};
node.pkgs = mkOption {
description = mdDoc ''
description = ''
The Nixpkgs to use for the nodes.
Setting this will make the `nixpkgs.*` options read-only, to avoid mistakenly testing with a Nixpkgs configuration that diverges from regular use.
@ -117,7 +116,7 @@ in
};
node.pkgsReadOnly = mkOption {
description = mdDoc ''
description = ''
Whether to make the `nixpkgs.*` options read-only. This is only relevant when [`node.pkgs`](#test-opt-node.pkgs) is set.
Set this to `false` when any of the [`nodes`](#test-opt-nodes) needs to configure any of the `nixpkgs.*` options. This will slow down evaluation of your test a bit.
@ -130,7 +129,7 @@ in
node.specialArgs = mkOption {
type = types.lazyAttrsOf types.raw;
default = { };
description = mdDoc ''
description = ''
An attribute set of arbitrary values that will be made available as module arguments during the resolution of module `imports`.
Note that it is not possible to override these from within the NixOS configurations. If you argument is not relevant to `imports`, consider setting {option}`defaults._module.args.<name>` instead.
@ -139,7 +138,7 @@ in
nodesCompat = mkOption {
internal = true;
description = mdDoc ''
description = ''
Basically `_module.args.nodes`, but with backcompat and warnings added.
This will go away.

View file

@ -1,12 +1,12 @@
{ config, hostPkgs, lib, ... }:
let
inherit (lib) types mkOption mdDoc;
inherit (lib) types mkOption;
in
{
options = {
passthru = mkOption {
type = types.lazyAttrsOf types.raw;
description = mdDoc ''
description = ''
Attributes to add to the returned derivations,
which are not necessarily part of the build.
@ -18,7 +18,7 @@ in
rawTestDerivation = mkOption {
type = types.package;
description = mdDoc ''
description = ''
Unfiltered version of `test`, for troubleshooting the test framework and `testBuildFailure` in the test framework's test suite.
This is not intended for general use. Use `test` instead.
'';
@ -28,7 +28,7 @@ in
test = mkOption {
type = types.package;
# TODO: can the interactive driver be configured to access the network?
description = mdDoc ''
description = ''
Derivation that runs the test as its "build" process.
This implies that NixOS tests run isolated from the network, making them

View file

@ -1,13 +1,13 @@
testModuleArgs@{ config, lib, hostPkgs, nodes, moduleType, ... }:
let
inherit (lib) mkOption types mdDoc;
inherit (lib) mkOption types;
inherit (types) either str functionTo;
in
{
options = {
testScript = mkOption {
type = either str (functionTo str);
description = mdDoc ''
description = ''
A series of python declarations and statements that you write to perform
the test.
'';
@ -25,7 +25,7 @@ in
};
withoutTestScriptReferences = mkOption {
type = moduleType;
description = mdDoc ''
description = ''
A parallel universe where the testScript is invalid and has no references.
'';
internal = true;

View file

@ -1,9 +1,44 @@
{ lib, config, pkgs }: with lib;
{ lib, config, pkgs }:
let
inherit (lib)
any
attrNames
concatMapStringsSep
concatStringsSep
elem
escapeShellArg
filter
flatten
getName
hasPrefix
hasSuffix
imap0
imap1
isAttrs
isDerivation
isFloat
isInt
isList
isPath
isString
listToAttrs
nameValuePair
optionalString
removePrefix
removeSuffix
replaceStrings
stringToCharacters
types
;
inherit (lib.strings) toJSON normalizePath escapeC;
in
rec {
# Copy configuration files to avoid having the entire sources in the system closure
copyFile = filePath: pkgs.runCommand (builtins.unsafeDiscardStringContext (builtins.baseNameOf filePath)) {} ''
copyFile = filePath: pkgs.runCommand (builtins.unsafeDiscardStringContext (baseNameOf filePath)) {} ''
cp ${filePath} $out
'';
@ -46,11 +81,11 @@ rec {
escapeSystemdPath = s: let
replacePrefix = p: r: s: (if (hasPrefix p s) then r + (removePrefix p s) else s);
trim = s: removeSuffix "/" (removePrefix "/" s);
normalizedPath = strings.normalizePath s;
normalizedPath = normalizePath s;
in
replaceStrings ["/"] ["-"]
(replacePrefix "." (strings.escapeC ["."] ".")
(strings.escapeC (stringToCharacters " !\"#$%&'()*+,;<=>=@[\\]^`{|}~-")
(replacePrefix "." (escapeC ["."] ".")
(escapeC (stringToCharacters " !\"#$%&'()*+,;<=>=@[\\]^`{|}~-")
(if normalizedPath == "/" then normalizedPath else trim normalizedPath)));
# Quotes an argument for use in Exec* service lines.
@ -62,12 +97,12 @@ rec {
# substitution for the directive.
escapeSystemdExecArg = arg:
let
s = if builtins.isPath arg then "${arg}"
else if builtins.isString arg then arg
else if builtins.isInt arg || builtins.isFloat arg || lib.isDerivation arg then toString arg
s = if isPath arg then "${arg}"
else if isString arg then arg
else if isInt arg || isFloat arg || isDerivation arg then toString arg
else throw "escapeSystemdExecArg only allows strings, paths, numbers and derivations";
in
replaceStrings [ "%" "$" ] [ "%%" "$$" ] (builtins.toJSON s);
replaceStrings [ "%" "$" ] [ "%%" "$$" ] (toJSON s);
# Quotes a list of arguments into a single string for use in a Exec*
# line.
@ -197,7 +232,7 @@ rec {
(attrNames secrets))
+ "\n"
+ "${pkgs.jq}/bin/jq >'${output}' "
+ lib.escapeShellArg (stringOrDefault
+ escapeShellArg (stringOrDefault
(concatStringsSep
" | "
(imap1 (index: name: ''${name} = $ENV.secret${toString index}'')
@ -205,7 +240,7 @@ rec {
".")
+ ''
<<'EOF'
${builtins.toJSON set}
${toJSON set}
EOF
(( ! $inherit_errexit_enabled )) && shopt -u inherit_errexit
'';
@ -222,9 +257,9 @@ rec {
*/
removePackagesByName = packages: packagesToRemove:
let
namesToRemove = map lib.getName packagesToRemove;
namesToRemove = map getName packagesToRemove;
in
lib.filter (x: !(builtins.elem (lib.getName x) namesToRemove)) packages;
filter (x: !(elem (getName x) namesToRemove)) packages;
systemdUtils = {
lib = import ./systemd-lib.nix { inherit lib config pkgs; };

View file

@ -342,7 +342,6 @@
./services/amqp/rabbitmq.nix
./services/audio/alsa.nix
./services/audio/botamusique.nix
./services/audio/castopod.nix
./services/audio/gmediarender.nix
./services/audio/gonic.nix
./services/audio/goxlr-utility.nix
@ -799,6 +798,7 @@
./services/misc/transfer-sh.nix
./services/misc/tzupdate.nix
./services/misc/uhub.nix
./services/misc/wastebin.nix
./services/misc/weechat.nix
./services/misc/workout-tracker.nix
./services/misc/xmr-stak.nix
@ -1302,12 +1302,14 @@
./services/web-apps/bookstack.nix
./services/web-apps/c2fmzq-server.nix
./services/web-apps/calibre-web.nix
./services/web-apps/castopod.nix
./services/web-apps/coder.nix
./services/web-apps/changedetection-io.nix
./services/web-apps/chatgpt-retrieval-plugin.nix
./services/web-apps/cloudlog.nix
./services/web-apps/code-server.nix
./services/web-apps/convos.nix
./services/web-apps/davis.nix
./services/web-apps/dex.nix
./services/web-apps/discourse.nix
./services/web-apps/documize.nix

View file

@ -118,7 +118,7 @@ are already created.
before = "service1.service";
after = "postgresql.service";
serviceConfig.User = "postgres";
environment.PSQL = "psql --port=${toString services.postgresql.port}";
environment.PSQL = "psql --port=${toString services.postgresql.settings.port}";
path = [ postgresql ];
script = ''
$PSQL service1 -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO "extraUser1"'
@ -139,7 +139,7 @@ are already created.
```nix
{
environment.PSQL = "psql --port=${toString services.postgresql.port}";
environment.PSQL = "psql --port=${toString services.postgresql.settings.port}";
path = [ postgresql ];
systemd.services."service1".preStart = ''
$PSQL -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO "extraUser1"'
@ -159,7 +159,7 @@ are already created.
before = "service1.service";
after = "postgresql.service";
serviceConfig.User = "service1";
environment.PSQL = "psql --port=${toString services.postgresql.port}";
environment.PSQL = "psql --port=${toString services.postgresql.settings.port}";
path = [ postgresql ];
script = ''
$PSQL -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO "extraUser1"'

View file

@ -27,7 +27,7 @@ let
else toString value;
# The main PostgreSQL configuration file.
configFile = pkgs.writeTextDir "postgresql.conf" (concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${toStr v}") cfg.settings));
configFile = pkgs.writeTextDir "postgresql.conf" (concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${toStr v}") (filterAttrs (const (x: x != null)) cfg.settings)));
configFileCheck = pkgs.runCommand "postgresql-configfile-check" {} ''
${cfg.package}/bin/postgres -D${configFile} -C config_file >/dev/null
@ -41,6 +41,9 @@ in
{
imports = [
(mkRemovedOptionModule [ "services" "postgresql" "extraConfig" ] "Use services.postgresql.settings instead.")
(mkRenamedOptionModule [ "services" "postgresql" "logLinePrefix" ] [ "services" "postgresql" "settings" "log_line_prefix" ])
(mkRenamedOptionModule [ "services" "postgresql" "port" ] [ "services" "postgresql" "settings" "port" ])
];
###### interface
@ -57,14 +60,6 @@ in
example = "postgresql_15";
};
port = mkOption {
type = types.port;
default = 5432;
description = lib.mdDoc ''
The port on which PostgreSQL listens.
'';
};
checkConfig = mkOption {
type = types.bool;
default = true;
@ -352,17 +347,6 @@ in
'';
};
logLinePrefix = mkOption {
type = types.str;
default = "[%p] ";
example = "%m [%p] ";
description = lib.mdDoc ''
A printf-style string that is output at the beginning of each log line.
Upstream default is `'%m [%p] '`, i.e. it includes the timestamp. We do
not include the timestamp, because journal has it anyway.
'';
};
extraPlugins = mkOption {
type = with types; coercedTo (listOf path) (path: _ignorePg: path) (functionTo (listOf path));
default = _: [];
@ -373,7 +357,38 @@ in
};
settings = mkOption {
type = with types; attrsOf (oneOf [ bool float int str ]);
type = with types; submodule {
freeformType = attrsOf (oneOf [ bool float int str ]);
options = {
shared_preload_libraries = mkOption {
type = nullOr (coercedTo (listOf str) (concatStringsSep ", ") str);
default = null;
example = literalExpression ''[ "auto_explain" "anon" ]'';
description = mdDoc ''
List of libraries to be preloaded.
'';
};
log_line_prefix = mkOption {
type = types.str;
default = "[%p] ";
example = "%m [%p] ";
description = lib.mdDoc ''
A printf-style string that is output at the beginning of each log line.
Upstream default is `'%m [%p] '`, i.e. it includes the timestamp. We do
not include the timestamp, because journal has it anyway.
'';
};
port = mkOption {
type = types.port;
default = 5432;
description = lib.mdDoc ''
The port on which PostgreSQL listens.
'';
};
};
};
default = {};
description = lib.mdDoc ''
PostgreSQL configuration. Refer to
@ -439,9 +454,7 @@ in
hba_file = "${pkgs.writeText "pg_hba.conf" cfg.authentication}";
ident_file = "${pkgs.writeText "pg_ident.conf" cfg.identMap}";
log_destination = "stderr";
log_line_prefix = cfg.logLinePrefix;
listen_addresses = if cfg.enableTCPIP then "*" else "localhost";
port = cfg.port;
jit = mkDefault (if cfg.enableJIT then "on" else "off");
};
@ -524,7 +537,7 @@ in
# Wait for PostgreSQL to be ready to accept connections.
postStart =
''
PSQL="psql --port=${toString cfg.port}"
PSQL="psql --port=${toString cfg.settings.port}"
while ! $PSQL -d postgres -c "" 2> /dev/null; do
if ! kill -0 "$MAINPID"; then exit 1; fi

View file

@ -114,11 +114,11 @@ in
port = mkOption {
type = types.port;
default = if !usePostgresql then 3306 else pg.port;
default = if usePostgresql then pg.settings.port else 3306;
defaultText = literalExpression ''
if config.${opt.database.type} != "postgresql"
then 3306
else config.${options.services.postgresql.port}
else 5432
'';
description = mdDoc "Database host port.";
};

View file

@ -100,11 +100,11 @@ in
port = mkOption {
type = types.port;
default = if !usePostgresql then 3306 else pg.port;
default = if usePostgresql then pg.settings.port else 3306;
defaultText = literalExpression ''
if config.${opt.database.type} != "postgresql"
then 3306
else config.${options.services.postgresql.port}
else 5432
'';
description = lib.mdDoc "Database host port.";
};

View file

@ -20,7 +20,7 @@ in {
extraFlags = lib.mkOption {
type = lib.types.listOf lib.types.str;
description = "Extra flags passed to llama-cpp-server.";
example = ["-c" "4096" "-ngl" "32" "--numa"];
example = ["-c" "4096" "-ngl" "32" "--numa" "numactl"];
default = [];
};

View file

@ -10,16 +10,22 @@ let
format = pkgs.formats.yaml {};
bundle = "${cfg.package}/share/redmine/bin/bundle";
databaseYml = pkgs.writeText "database.yml" ''
production:
adapter: ${cfg.database.type}
database: ${cfg.database.name}
host: ${if (cfg.database.type == "postgresql" && cfg.database.socket != null) then cfg.database.socket else cfg.database.host}
port: ${toString cfg.database.port}
username: ${cfg.database.user}
password: #dbpass#
${optionalString (cfg.database.type == "mysql2" && cfg.database.socket != null) "socket: ${cfg.database.socket}"}
'';
databaseSettings = {
production = {
adapter = cfg.database.type;
database = if cfg.database.type == "sqlite3" then "${cfg.stateDir}/database.sqlite3" else cfg.database.name;
} // optionalAttrs (cfg.database.type != "sqlite3") {
host = if (cfg.database.type == "postgresql" && cfg.database.socket != null) then cfg.database.socket else cfg.database.host;
port = cfg.database.port;
username = cfg.database.user;
} // optionalAttrs (cfg.database.type != "sqlite3" && cfg.database.passwordFile != null) {
password = "#dbpass#";
} // optionalAttrs (cfg.database.type == "mysql2" && cfg.database.socket != null) {
socket = cfg.database.socket;
};
};
databaseYml = format.generate "database.yml" databaseSettings;
configurationYml = format.generate "configuration.yml" cfg.settings;
additionalEnvironment = pkgs.writeText "additional_environment.rb" cfg.extraEnv;
@ -145,7 +151,7 @@ in
database = {
type = mkOption {
type = types.enum [ "mysql2" "postgresql" ];
type = types.enum [ "mysql2" "postgresql" "sqlite3" ];
example = "postgresql";
default = "mysql2";
description = lib.mdDoc "Database engine to use.";
@ -261,7 +267,7 @@ in
config = mkIf cfg.enable {
assertions = [
{ assertion = cfg.database.passwordFile != null || cfg.database.socket != null;
{ assertion = cfg.database.type != "sqlite3" -> cfg.database.passwordFile != null || cfg.database.socket != null;
message = "one of services.redmine.database.socket or services.redmine.database.passwordFile must be set";
}
{ assertion = cfg.database.createLocally -> cfg.database.user == cfg.user;
@ -270,7 +276,7 @@ in
{ assertion = pgsqlLocal -> cfg.database.user == cfg.database.name;
message = "services.redmine.database.user and services.redmine.database.name must be the same when using a local postgresql database";
}
{ assertion = cfg.database.createLocally -> cfg.database.socket != null;
{ assertion = cfg.database.createLocally -> cfg.database.type != "sqlite3" && cfg.database.socket != null;
message = "services.redmine.database.socket must be set if services.redmine.database.createLocally is set to true";
}
{ assertion = cfg.database.createLocally -> cfg.database.host == "localhost";
@ -395,9 +401,13 @@ in
# handle database.passwordFile & permissions
DBPASS=${optionalString (cfg.database.passwordFile != null) "$(head -n1 ${cfg.database.passwordFile})"}
cp -f ${databaseYml} "${cfg.stateDir}/config/database.yml"
sed -e "s,#dbpass#,$DBPASS,g" -i "${cfg.stateDir}/config/database.yml"
${optionalString ((cfg.database.type != "sqlite3") && (cfg.database.passwordFile != null)) ''
DBPASS="$(head -n1 ${cfg.database.passwordFile})"
sed -e "s,#dbpass#,$DBPASS,g" -i "${cfg.stateDir}/config/database.yml"
''}
chmod 440 "${cfg.stateDir}/config/database.yml"

View file

@ -0,0 +1,158 @@
{ config, lib, pkgs, ... }:
let
cfg = config.services.wastebin;
inherit (lib)
mkEnableOption mkPackageOption mkIf mkOption
types mapAttrs isBool getExe boolToString optionalAttrs;
in
{
options.services.wastebin = {
enable = mkEnableOption "Wastenbin pastebin service";
package = mkPackageOption pkgs "wastebin" { };
stateDir = mkOption {
type = types.path;
default = "/var/lib/wastebin";
description = "State directory of the daemon.";
};
secretFile = mkOption {
type = types.nullOr types.path;
default = null;
example = "/run/secrets/wastebin.env";
description = ''
Path to file containing sensitive environment variables.
Some variables that can be considered secrets are:
- WASTEBIN_PASSWORD_SALT:
salt used to hash user passwords used for encrypting pastes.
- WASTEBIN_SIGNING_KEY:
sets the key to sign cookies. If not set, a random key will be
generated which means cookies will become invalid after restarts and
paste creators will not be able to delete their pastes anymore.
'';
};
settings = mkOption {
description = ''
Additional configuration for wastebin, see
<https://github.com/matze/wastebin#usage> for supported values.
For secrets use secretFile option instead.
'';
type = types.submodule {
freeformType = with types; attrsOf (oneOf [ bool int str ]);
options = {
WASTEBIN_ADDRESS_PORT = mkOption {
type = types.str;
default = "0.0.0.0:8088";
description = "Address and port to bind to";
};
WASTEBIN_BASE_URL = mkOption {
default = "http://localhost";
example = "https://myhost.tld";
type = types.str;
description = ''
Base URL for the QR code display. If not set, the user agent's Host
header field is used as an approximation.
'';
};
WASTEBIN_CACHE_SIZE = mkOption {
default = 128;
type = types.int;
description = "Number of rendered syntax highlight items to cache. Can be disabled by setting to 0.";
};
WASTEBIN_DATABASE_PATH = mkOption {
default = "/var/lib/wastebin/sqlite3.db"; # TODO make this default to stateDir/sqlite3.db
type = types.str;
description = "Path to the sqlite3 database file. If not set, an in-memory database is used.";
};
WASTEBIN_HTTP_TIMEOUT = mkOption {
default = 5;
type = types.int;
description = "Maximum number of seconds a request can be processed until wastebin responds with 408";
};
WASTEBIN_MAX_BODY_SIZE = mkOption {
default = 1024;
type = types.int;
description = "Number of bytes to accept for POST requests";
};
WASTEBIN_TITLE = mkOption {
default = "wastebin";
type = types.str;
description = "Overrides the HTML page title";
};
RUST_LOG = mkOption {
default = "info";
type = types.str;
description =
''
Influences logging. Besides the typical trace, debug, info etc.
keys, you can also set the tower_http key to some log level to get
additional information request and response logs.
'';
};
};
};
default = { };
example = {
WASTEBIN_TITLE = "My awesome pastebin";
};
};
};
config = mkIf cfg.enable
{
systemd.services.wastebin = {
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
environment = mapAttrs (_: v: if isBool v then boolToString v else toString v) cfg.settings;
serviceConfig = {
CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
DevicePolicy = "closed";
DynamicUser = true;
ExecStart = "${getExe cfg.package}";
LockPersonality = true;
MemoryDenyWriteExecute = true;
PrivateDevices = true;
PrivateUsers = true;
ProtectClock = true;
ProtectControlGroups = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectProc = "invisible";
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
RestrictNamespaces = true;
RestrictRealtime = true;
SystemCallArchitectures = [ "native" ];
SystemCallFilter = [ "@system-service" ];
StateDirectory = baseNameOf cfg.stateDir;
ReadWritePaths = cfg.stateDir;
} // optionalAttrs (cfg.secretFile != null) {
EnvironmentFile = cfg.secretFile;
};
};
};
meta.maintainers = with lib.maintainers; [ pinpox ];
}

View file

@ -103,11 +103,11 @@ in
port = mkOption {
type = types.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.services.port;
defaultText = literalExpression ''
if config.${opt.database.type} == "mysql"
then config.${options.services.mysql.port}
else config.${options.services.postgresql.port}
else config.services.postgresql.settings.port
'';
description = lib.mdDoc "Database host port.";
};

View file

@ -95,11 +95,11 @@ in
port = mkOption {
type = types.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.settings.port;
defaultText = literalExpression ''
if config.${opt.database.type} == "mysql"
then config.${options.services.mysql.port}
else config.${options.services.postgresql.port}
else config.services.postgresql.settings.port
'';
description = lib.mdDoc "Database host port.";
};

View file

@ -113,25 +113,6 @@ in
config = mkIf cfg.enable {
services.nfs.extraConfig = ''
[nfsd]
threads=${toString cfg.nproc}
${optionalString (cfg.hostName != null) "host=${cfg.hostName}"}
${cfg.extraNfsdConfig}
[mountd]
${optionalString (cfg.mountdPort != null) "port=${toString cfg.mountdPort}"}
[statd]
${optionalString (cfg.statdPort != null) "port=${toString cfg.statdPort}"}
[lockd]
${optionalString (cfg.lockdPort != null) ''
port=${toString cfg.lockdPort}
udp-port=${toString cfg.lockdPort}
''}
'';
services.rpcbind.enable = true;
boot.supportedFilesystems = [ "nfs" ]; # needed for statd and idmapd

View file

@ -4,6 +4,7 @@ Castopod is an open-source hosting platform made for podcasters who want to enga
## Quickstart {#module-services-castopod-quickstart}
Configure ACME (https://nixos.org/manual/nixos/unstable/#module-security-acme).
Use the following configuration to start a public instance of Castopod on `castopod.example.com` domain:
```nix

View file

@ -4,7 +4,6 @@ let
fpm = config.services.phpfpm.pools.castopod;
user = "castopod";
stateDirectory = "/var/lib/castopod";
# https://docs.castopod.org/getting-started/install.html#requirements
phpPackage = pkgs.php.withExtensions ({ enabled, all }: with all; [
@ -29,6 +28,15 @@ in
defaultText = lib.literalMD "pkgs.castopod";
description = lib.mdDoc "Which Castopod package to use.";
};
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/castopod";
description = lib.mdDoc ''
The path where castopod stores all data. This path must be in sync
with the castopod package (where it is hardcoded during the build in
accordance with its own `dataDir` argument).
'';
};
database = {
createLocally = lib.mkOption {
type = lib.types.bool;
@ -59,6 +67,8 @@ in
description = lib.mdDoc ''
A file containing the password corresponding to
[](#opt-services.castopod.database.user).
This file is loaded using systemd LoadCredentials.
'';
};
};
@ -85,6 +95,8 @@ in
Environment file to inject e.g. secrets into the configuration.
See [](https://code.castopod.org/adaures/castopod/-/blob/main/.env.example)
for available environment variables.
This file is loaded using systemd LoadCredentials.
'';
};
configureNginx = lib.mkOption {
@ -111,6 +123,19 @@ in
Options for Castopod's PHP pool. See the documentation on `php-fpm.conf` for details on configuration directives.
'';
};
maxUploadSize = lib.mkOption {
type = lib.types.str;
default = "512M";
description = lib.mdDoc ''
Maximum supported size for a file upload in. Maximum HTTP body
size is set to this value for nginx and PHP (because castopod doesn't
support chunked uploads yet:
https://code.castopod.org/adaures/castopod/-/issues/330).
Note, that practical upload size limit is smaller. For example, with
512 MiB setting - around 500 MiB is possible.
'';
};
};
};
@ -120,13 +145,13 @@ in
sslEnabled = with config.services.nginx.virtualHosts.${cfg.localDomain}; addSSL || forceSSL || onlySSL || enableACME || useACMEHost != null;
baseURL = "http${lib.optionalString sslEnabled "s"}://${cfg.localDomain}";
in
lib.mapAttrs (name: lib.mkDefault) {
lib.mapAttrs (_: lib.mkDefault) {
"app.forceGlobalSecureRequests" = sslEnabled;
"app.baseURL" = baseURL;
"media.baseURL" = "/";
"media.baseURL" = baseURL;
"media.root" = "media";
"media.storage" = stateDirectory;
"media.storage" = cfg.dataDir;
"admin.gateway" = "admin";
"auth.gateway" = "auth";
@ -142,13 +167,13 @@ in
services.phpfpm.pools.castopod = {
inherit user;
group = config.services.nginx.group;
phpPackage = phpPackage;
inherit phpPackage;
phpOptions = ''
# https://code.castopod.org/adaures/castopod/-/blob/main/docker/production/app/uploads.ini
# https://code.castopod.org/adaures/castopod/-/blob/develop/docker/production/common/uploads.template.ini
file_uploads = On
memory_limit = 512M
upload_max_filesize = 500M
post_max_size = 512M
upload_max_filesize = ${cfg.maxUploadSize}
post_max_size = ${cfg.maxUploadSize}
max_execution_time = 300
max_input_time = 300
'';
@ -165,45 +190,50 @@ in
path = [ pkgs.openssl phpPackage ];
script =
let
envFile = "${stateDirectory}/.env";
envFile = "${cfg.dataDir}/.env";
media = "${cfg.settings."media.storage"}/${cfg.settings."media.root"}";
in
''
mkdir -p ${stateDirectory}/writable/{cache,logs,session,temp,uploads}
mkdir -p ${cfg.dataDir}/writable/{cache,logs,session,temp,uploads}
if [ ! -d ${lib.escapeShellArg media} ]; then
cp --no-preserve=mode,ownership -r ${cfg.package}/share/castopod/public/media ${lib.escapeShellArg media}
fi
if [ ! -f ${stateDirectory}/salt ]; then
openssl rand -base64 33 > ${stateDirectory}/salt
if [ ! -f ${cfg.dataDir}/salt ]; then
openssl rand -base64 33 > ${cfg.dataDir}/salt
fi
cat <<'EOF' > ${envFile}
${lib.generators.toKeyValue { } cfg.settings}
EOF
echo "analytics.salt=$(cat ${stateDirectory}/salt)" >> ${envFile}
echo "analytics.salt=$(cat ${cfg.dataDir}/salt)" >> ${envFile}
${if (cfg.database.passwordFile != null) then ''
echo "database.default.password=$(cat ${lib.escapeShellArg cfg.database.passwordFile})" >> ${envFile}
echo "database.default.password=$(cat "$CREDENTIALS_DIRECTORY/dbpasswordfile)" >> ${envFile}
'' else ''
echo "database.default.password=" >> ${envFile}
''}
${lib.optionalString (cfg.environmentFile != null) ''
cat ${lib.escapeShellArg cfg.environmentFile}) >> ${envFile}
cat "$CREDENTIALS_DIRECTORY/envfile" >> ${envFile}
''}
php spark castopod:database-update
php ${cfg.package}/share/castopod/spark castopod:database-update
'';
serviceConfig = {
StateDirectory = "castopod";
LoadCredential = lib.optional (cfg.environmentFile != null)
"envfile:${cfg.environmentFile}"
++ (lib.optional (cfg.database.passwordFile != null)
"dbpasswordfile:${cfg.database.passwordFile}");
WorkingDirectory = "${cfg.package}/share/castopod";
Type = "oneshot";
RemainAfterExit = true;
User = user;
Group = config.services.nginx.group;
ReadWritePaths = cfg.dataDir;
};
};
@ -212,9 +242,7 @@ in
wantedBy = [ "multi-user.target" ];
path = [ phpPackage ];
script = ''
php public/index.php scheduled-activities
php public/index.php scheduled-websub-publish
php public/index.php scheduled-video-clips
php ${cfg.package}/share/castopod/spark tasks:run
'';
serviceConfig = {
StateDirectory = "castopod";
@ -222,6 +250,8 @@ in
Type = "oneshot";
User = user;
Group = config.services.nginx.group;
ReadWritePaths = cfg.dataDir;
LogLevelMax = "notice"; # otherwise periodic tasks flood the journal
};
};
@ -251,6 +281,7 @@ in
extraConfig = ''
try_files $uri $uri/ /index.php?$args;
index index.php index.html;
client_max_body_size ${cfg.maxUploadSize};
'';
locations."^~ /${cfg.settings."media.root"}/" = {
@ -278,7 +309,7 @@ in
};
};
users.users.${user} = lib.mapAttrs (name: lib.mkDefault) {
users.users.${user} = lib.mapAttrs (_: lib.mkDefault) {
description = "Castopod user";
isSystemUser = true;
group = config.services.nginx.group;

View file

@ -0,0 +1,32 @@
# Davis {#module-services-davis}
[Davis](https://github.com/tchapi/davis/) is a caldav and carrddav server. It
has a simple, fully translatable admin interface for sabre/dav based on Symfony
5 and Bootstrap 5, initially inspired by Baïkal.
## Basic Usage {#module-services-davis-basic-usage}
At first, an application secret is needed, this can be generated with:
```ShellSession
$ cat /dev/urandom | tr -dc a-zA-Z0-9 | fold -w 48 | head -n 1
```
After that, `davis` can be deployed like this:
```
{
services.davis = {
enable = true;
hostname = "davis.example.com";
mail = {
dsn = "smtp://username@example.com:25";
inviteFromAddress = "davis@example.com";
};
adminLogin = "admin";
adminPasswordFile = "/run/secrets/davis-admin-password";
appSecretFile = "/run/secrets/davis-app-secret";
nginx = {};
};
}
```
This deploys Davis using a sqlite database running out of `/var/lib/davis`.

View file

@ -0,0 +1,554 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.davis;
db = cfg.database;
mail = cfg.mail;
mysqlLocal = db.createLocally && db.driver == "mysql";
pgsqlLocal = db.createLocally && db.driver == "postgresql";
user = cfg.user;
group = cfg.group;
isSecret = v: lib.isAttrs v && v ? _secret && (lib.isString v._secret || builtins.isPath v._secret);
davisEnvVars = lib.generators.toKeyValue {
mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" {
mkValueString =
v:
if builtins.isInt v then
toString v
else if lib.isString v then
"\"${v}\""
else if true == v then
"true"
else if false == v then
"false"
else if null == v then
""
else if isSecret v then
if (lib.isString v._secret) then
builtins.hashString "sha256" v._secret
else
builtins.hashString "sha256" (builtins.readFile v._secret)
else
throw "unsupported type ${builtins.typeOf v}: ${(lib.generators.toPretty { }) v}";
};
};
secretPaths = lib.mapAttrsToList (_: v: v._secret) (lib.filterAttrs (_: isSecret) cfg.config);
mkSecretReplacement = file: ''
replace-secret ${
lib.escapeShellArgs [
(
if (lib.isString file) then
builtins.hashString "sha256" file
else
builtins.hashString "sha256" (builtins.readFile file)
)
file
"${cfg.dataDir}/.env.local"
]
}
'';
secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths;
filteredConfig = lib.converge (lib.filterAttrsRecursive (
_: v:
!lib.elem v [
{ }
null
]
)) cfg.config;
davisEnv = pkgs.writeText "davis.env" (davisEnvVars filteredConfig);
in
{
options.services.davis = {
enable = lib.mkEnableOption (lib.mdDoc "Davis is a caldav and carddav server");
user = lib.mkOption {
default = "davis";
description = lib.mdDoc "User davis runs as.";
type = lib.types.str;
};
group = lib.mkOption {
default = "davis";
description = lib.mdDoc "Group davis runs as.";
type = lib.types.str;
};
package = lib.mkPackageOption pkgs "davis" { };
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/davis";
description = lib.mdDoc ''
Davis data directory.
'';
};
hostname = lib.mkOption {
type = lib.types.str;
example = "davis.yourdomain.org";
description = lib.mdDoc ''
Domain of the host to serve davis under. You may want to change it if you
run Davis on a different URL than davis.yourdomain.
'';
};
config = lib.mkOption {
type = lib.types.attrsOf (
lib.types.nullOr (
lib.types.either
(lib.types.oneOf [
lib.types.bool
lib.types.int
lib.types.port
lib.types.path
lib.types.str
])
(
lib.types.submodule {
options = {
_secret = lib.mkOption {
type = lib.types.nullOr (
lib.types.oneOf [
lib.types.str
lib.types.path
]
);
description = lib.mdDoc ''
The path to a file containing the value the
option should be set to in the final
configuration file.
'';
};
};
}
)
)
);
default = { };
example = '''';
description = lib.mdDoc '''';
};
adminLogin = lib.mkOption {
type = lib.types.str;
default = "root";
description = lib.mdDoc ''
Username for the admin account.
'';
};
adminPasswordFile = lib.mkOption {
type = lib.types.path;
description = lib.mdDoc ''
The full path to a file that contains the admin's password. Must be
readable by the user.
'';
example = "/run/secrets/davis-admin-pass";
};
appSecretFile = lib.mkOption {
type = lib.types.path;
description = lib.mdDoc ''
A file containing the Symfony APP_SECRET - Its value should be a series
of characters, numbers and symbols chosen randomly and the recommended
length is around 32 characters. Can be generated with <code>cat
/dev/urandom | tr -dc a-zA-Z0-9 | fold -w 48 | head -n 1</code>.
'';
example = "/run/secrets/davis-appsecret";
};
database = {
driver = lib.mkOption {
type = lib.types.enum [
"sqlite"
"postgresql"
"mysql"
];
default = "sqlite";
description = lib.mdDoc "Database type, required in all circumstances.";
};
urlFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/run/secrets/davis-db-url";
description = lib.mdDoc ''
A file containing the database connection url. If set then it
overrides all other database settings (except driver). This is
mandatory if you want to use an external database, that is when
`services.davis.database.createLocally` is `false`.
'';
};
name = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = "davis";
description = lib.mdDoc "Database name, only used when the databse is created locally.";
};
createLocally = lib.mkOption {
type = lib.types.bool;
default = true;
description = lib.mdDoc "Create the database and database user locally.";
};
};
mail = {
dsn = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = lib.mdDoc "Mail DSN for sending emails. Mutually exclusive with `services.davis.mail.dsnFile`.";
example = "smtp://username:password@example.com:25";
};
dsnFile = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
example = "/run/secrets/davis-mail-dsn";
description = lib.mdDoc "A file containing the mail DSN for sending emails. Mutually exclusive with `servies.davis.mail.dsn`.";
};
inviteFromAddress = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = lib.mdDoc "Email address to send invitations from.";
example = "no-reply@dav.example.com";
};
};
nginx = lib.mkOption {
type = lib.types.submodule (
lib.recursiveUpdate (import ../web-servers/nginx/vhost-options.nix { inherit config lib; }) { }
);
default = null;
example = ''
{
serverAliases = [
"dav.''${config.networking.domain}"
];
# To enable encryption and let let's encrypt take care of certificate
forceSSL = true;
enableACME = true;
}
'';
description = lib.mdDoc ''
With this option, you can customize the nginx virtualHost settings.
'';
};
poolConfig = lib.mkOption {
type = lib.types.attrsOf (
lib.types.oneOf [
lib.types.str
lib.types.int
lib.types.bool
]
);
default = {
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 4;
"pm.max_requests" = 500;
};
description = lib.mdDoc ''
Options for the davis PHP pool. See the documentation on <literal>php-fpm.conf</literal>
for details on configuration directives.
'';
};
};
config =
let
defaultServiceConfig = {
ReadWritePaths = "${cfg.dataDir}";
User = user;
UMask = 77;
DeviceAllow = "";
LockPersonality = true;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateTmp = true;
PrivateUsers = true;
ProcSubset = "pid";
ProtectClock = true;
ProtectControlGroups = true;
ProtectHome = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectProc = "invisible";
ProtectSystem = "strict";
RemoveIPC = true;
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
SystemCallFilter = [
"@system-service"
"~@resources"
"~@privileged"
];
WorkingDirectory = "${cfg.package}/";
};
in
lib.mkIf cfg.enable {
assertions = [
{
assertion = db.createLocally -> db.urlFile == null;
message = "services.davis.database.urlFile must be unset if services.davis.database.createLocally is set true.";
}
{
assertion = db.createLocally || db.urlFile != null;
message = "One of services.davis.database.urlFile or services.davis.database.createLocally must be set.";
}
{
assertion = (mail.dsn != null) != (mail.dsnFile != null);
message = "One of (and only one of) services.davis.mail.dsn or services.davis.mail.dsnFile must be set.";
}
];
services.davis.config =
{
APP_ENV = "prod";
CACHE_DIR = "${cfg.dataDir}/var/cache";
# note: we do not need the log dir (we log to stdout/journald), by davis/symfony will try to create it, and the default value is one in the nix-store
# so we set it to a path under dataDir to avoid something like: Unable to create the "logs" directory (/nix/store/5cfskz0ybbx37s1161gjn5klwb5si1zg-davis-4.4.1/var/log).
LOG_DIR = "${cfg.dataDir}/var/log";
LOG_FILE_PATH = "/dev/stdout";
DATABASE_DRIVER = db.driver;
INVITE_FROM_ADDRESS = mail.inviteFromAddress;
APP_SECRET._secret = cfg.appSecretFile;
ADMIN_LOGIN = cfg.adminLogin;
ADMIN_PASSWORD._secret = cfg.adminPasswordFile;
APP_TIMEZONE = config.time.timeZone;
WEBDAV_ENABLED = false;
CALDAV_ENABLED = true;
CARDDAV_ENABLED = true;
}
// (if mail.dsn != null then { MAILER_DSN = mail.dsn; } else { MAILER_DSN._secret = mail.dsnFile; })
// (
if db.createLocally then
{
DATABASE_URL =
if db.driver == "sqlite" then
"sqlite:///${cfg.dataDir}/davis.db" # note: sqlite needs 4 slashes for an absolute path
else if
pgsqlLocal
# note: davis expects a non-standard postgres uri (due to the underlying doctrine library)
# specifically the charset query parameter, and the dummy hostname which is overriden by the host query parameter
then
"postgres://${user}@localhost/${db.name}?host=/run/postgresql&charset=UTF-8"
else if mysqlLocal then
"mysql://${user}@localhost/${db.name}?socket=/run/mysqld/mysqld.sock"
else
null;
}
else
{ DATABASE_URL._secret = db.urlFile; }
);
users = {
users = lib.mkIf (user == "davis") {
davis = {
description = "Davis service user";
group = cfg.group;
isSystemUser = true;
home = cfg.dataDir;
};
};
groups = lib.mkIf (group == "davis") { davis = { }; };
};
systemd.tmpfiles.rules = [
"d ${cfg.dataDir} 0710 ${user} ${group} - -"
"d ${cfg.dataDir}/var 0700 ${user} ${group} - -"
"d ${cfg.dataDir}/var/log 0700 ${user} ${group} - -"
"d ${cfg.dataDir}/var/cache 0700 ${user} ${group} - -"
];
services.phpfpm.pools.davis = {
inherit user group;
phpOptions = ''
log_errors = on
'';
phpEnv = {
ENV_DIR = "${cfg.dataDir}";
CACHE_DIR = "${cfg.dataDir}/var/cache";
#LOG_DIR = "${cfg.dataDir}/var/log";
};
settings =
{
"listen.mode" = "0660";
"pm" = "dynamic";
"pm.max_children" = 256;
"pm.start_servers" = 10;
"pm.min_spare_servers" = 5;
"pm.max_spare_servers" = 20;
}
// (
if cfg.nginx != null then
{
"listen.owner" = config.services.nginx.user;
"listen.group" = config.services.nginx.group;
}
else
{ }
)
// cfg.poolConfig;
};
# Reading the user-provided secret files requires root access
systemd.services.davis-env-setup = {
description = "Setup davis environment";
before = [
"phpfpm-davis.service"
"davis-db-migrate.service"
];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
path = [ pkgs.replace-secret ];
restartTriggers = [
cfg.package
davisEnv
];
script = ''
# error handling
set -euo pipefail
# create .env file with the upstream values
install -T -m 0600 -o ${user} ${cfg.package}/env-upstream "${cfg.dataDir}/.env"
# create .env.local file with the user-provided values
install -T -m 0600 -o ${user} ${davisEnv} "${cfg.dataDir}/.env.local"
${secretReplacements}
'';
};
systemd.services.davis-db-migrate = {
description = "Migrate davis database";
before = [ "phpfpm-davis.service" ];
after =
lib.optional mysqlLocal "mysql.service"
++ lib.optional pgsqlLocal "postgresql.service"
++ [ "davis-env-setup.service" ];
requires =
lib.optional mysqlLocal "mysql.service"
++ lib.optional pgsqlLocal "postgresql.service"
++ [ "davis-env-setup.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = defaultServiceConfig // {
Type = "oneshot";
RemainAfterExit = true;
Environment = [
"ENV_DIR=${cfg.dataDir}"
"CACHE_DIR=${cfg.dataDir}/var/cache"
"LOG_DIR=${cfg.dataDir}/var/log"
];
EnvironmentFile = "${cfg.dataDir}/.env.local";
};
restartTriggers = [
cfg.package
davisEnv
];
script = ''
set -euo pipefail
${cfg.package}/bin/console cache:clear --no-debug
${cfg.package}/bin/console cache:warmup --no-debug
${cfg.package}/bin/console doctrine:migrations:migrate
'';
};
systemd.services.phpfpm-davis.after = [
"davis-env-setup.service"
"davis-db-migrate.service"
];
systemd.services.phpfpm-davis.requires = [
"davis-env-setup.service"
"davis-db-migrate.service"
] ++ lib.optional mysqlLocal "mysql.service" ++ lib.optional pgsqlLocal "postgresql.service";
systemd.services.phpfpm-davis.serviceConfig.ReadWritePaths = [ cfg.dataDir ];
services.nginx = lib.mkIf (cfg.nginx != null) {
enable = lib.mkDefault true;
virtualHosts = {
"${cfg.hostname}" = lib.mkMerge [
cfg.nginx
{
root = lib.mkForce "${cfg.package}/public";
extraConfig = ''
charset utf-8;
index index.php;
'';
locations = {
"/" = {
extraConfig = ''
try_files $uri $uri/ /index.php$is_args$args;
'';
};
"~* ^/.well-known/(caldav|carddav)$" = {
extraConfig = ''
return 302 $http_x_forwarded_proto://$host/dav/;
'';
};
"~ ^(.+\.php)(.*)$" = {
extraConfig = ''
try_files $fastcgi_script_name =404;
include ${config.services.nginx.package}/conf/fastcgi_params;
include ${config.services.nginx.package}/conf/fastcgi.conf;
fastcgi_pass unix:${config.services.phpfpm.pools.davis.socket};
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param X-Forwarded-Proto $http_x_forwarded_proto;
fastcgi_param X-Forwarded-Port $http_x_forwarded_port;
'';
};
"~ /(\\.ht)" = {
extraConfig = ''
deny all;
return 404;
'';
};
};
}
];
};
};
services.mysql = lib.mkIf mysqlLocal {
enable = true;
package = lib.mkDefault pkgs.mariadb;
ensureDatabases = [ db.name ];
ensureUsers = [
{
name = user;
ensurePermissions = {
"${db.name}.*" = "ALL PRIVILEGES";
};
}
];
};
services.postgresql = lib.mkIf pgsqlLocal {
enable = true;
ensureDatabases = [ db.name ];
ensureUsers = [
{
name = user;
ensureDBOwnership = true;
}
];
};
};
meta = {
doc = ./davis.md;
maintainers = pkgs.davis.meta.maintainers;
};
}

View file

@ -346,8 +346,8 @@ in
port = lib.mkOption {
type = types.port;
default = options.services.postgresql.port.default;
defaultText = lib.literalExpression "options.services.postgresql.port.default";
default = config.services.postgresql.settings.port;
defaultText = lib.literalExpression "config.services.postgresql.settings.port";
description = lib.mdDoc ''
The port of the database Invidious should use.

View file

@ -783,6 +783,8 @@ in
# This working directory is required to find stuff like the set of
# onboarding files:
WorkingDirectory = "${cfg.package}/share/outline";
# In case this directory is not in /var/lib/outline, it needs to be made writable explicitly
ReadWritePaths = [ cfg.storage.localRootDir ];
};
};
};

View file

@ -76,11 +76,11 @@ in
type = types.port;
default =
if cfg.database.type == "mysql" then config.services.mysql.port
else if cfg.database.type == "pgsql" then config.services.postgresql.port
else if cfg.database.type == "pgsql" then config.services.postgresql.settings.port
else 1521;
defaultText = literalExpression ''
if config.${opt.database.type} == "mysql" then config.${options.services.mysql.port}
else if config.${opt.database.type} == "pgsql" then config.${options.services.postgresql.port}
else if config.${opt.database.type} == "pgsql" then config.services.postgresql.settings.port
else 1521
'';
description = lib.mdDoc "Database host port.";

View file

@ -47,6 +47,9 @@ let
"rescue.target"
"rescue.service"
# systemd-debug-generator
"debug-shell.service"
# Udev.
"systemd-tmpfiles-setup-dev-early.service"
"systemd-udevd-control.socket"

View file

@ -18,10 +18,10 @@ let
cfg = config.boot.initrd.systemd;
# Copied from fedora
upstreamUnits = [
"basic.target"
"ctrl-alt-del.target"
"debug-shell.service"
"emergency.service"
"emergency.target"
"final.target"
@ -398,7 +398,8 @@ in {
++ lib.optional (config.boot.initrd.systemd.root == "gpt-auto") "rw";
boot.initrd.systemd = {
initrdBin = [pkgs.bash pkgs.coreutils cfg.package.kmod cfg.package];
# bashInteractive is easier to use and also required by debug-shell.service
initrdBin = [pkgs.bashInteractive pkgs.coreutils cfg.package.kmod cfg.package];
extraBin = {
less = "${pkgs.less}/bin/less";
mount = "${cfg.package.util-linux}/bin/mount";
@ -472,6 +473,9 @@ in {
"${cfg.package.util-linux}/bin/umount"
"${cfg.package.util-linux}/bin/sulogin"
# required for script services
"${pkgs.runtimeShell}"
# so NSS can look up usernames
"${pkgs.glibc}/lib/libnss_files.so.2"
] ++ optionals (cfg.package.withCryptsetup && cfg.enableTpm2) [

View file

@ -13,7 +13,46 @@ let
format = pkgs.formats.ini {};
idmapdConfFile = format.generate "idmapd.conf" cfg.idmapd.settings;
nfsConfFile = pkgs.writeText "nfs.conf" cfg.extraConfig;
# merge parameters from services.nfs.server
nfsConfSettings =
optionalAttrs (cfg.server.nproc != null) {
nfsd.threads = cfg.server.nproc;
} // optionalAttrs (cfg.server.hostName != null) {
nfsd.host= cfg.hostName;
} // optionalAttrs (cfg.server.mountdPort != null) {
mountd.port = cfg.server.mountdPort;
} // optionalAttrs (cfg.server.statdPort != null) {
statd.port = cfg.server.statdPort;
} // optionalAttrs (cfg.server.lockdPort != null) {
lockd.port = cfg.server.lockdPort;
lockd.udp-port = cfg.server.lockdPort;
};
nfsConfDeprecated = cfg.extraConfig + ''
[nfsd]
threads=${toString cfg.server.nproc}
${optionalString (cfg.server.hostName != null) "host=${cfg.server.hostName}"}
${cfg.server.extraNfsdConfig}
[mountd]
${optionalString (cfg.server.mountdPort != null) "port=${toString cfg.server.mountdPort}"}
[statd]
${optionalString (cfg.server.statdPort != null) "port=${toString cfg.server.statdPort}"}
[lockd]
${optionalString (cfg.server.lockdPort != null) ''
port=${toString cfg.server.lockdPort}
udp-port=${toString cfg.server.lockdPort}
''}
'';
nfsConfFile =
if cfg.settings != {}
then format.generate "nfs.conf" (recursiveUpdate nfsConfSettings cfg.settings)
else pkgs.writeText "nfs.conf" nfsConfDeprecated;
requestKeyConfFile = pkgs.writeText "request-key.conf" ''
create id_resolver * * ${pkgs.nfs-utils}/bin/nfsidmap -t 600 %k %d
'';
@ -46,6 +85,19 @@ in
}
'';
};
settings = mkOption {
type = format.type;
default = {};
description = lib.mdDoc ''
General configuration for NFS daemons and tools.
See nfs.conf(5) and related man pages for details.
'';
example = literalExpression ''
{
mountd.manage-gids = true;
}
'';
};
extraConfig = mkOption {
type = types.lines;
default = "";
@ -60,6 +112,17 @@ in
config = mkIf (config.boot.supportedFilesystems.nfs or config.boot.supportedFilesystems.nfs4 or false) {
warnings =
(optional (cfg.extraConfig != "") ''
`services.nfs.extraConfig` is deprecated. Use `services.nfs.settings` instead.
'') ++ (optional (cfg.server.extraNfsdConfig != "") ''
`services.nfs.server.extraNfsdConfig` is deprecated. Use `services.nfs.settings` instead.
'');
assertions = [{
assertion = cfg.settings != {} -> cfg.extraConfig == "" && cfg.server.extraNfsdConfig == "";
message = "`services.nfs.settings` cannot be used together with `services.nfs.extraConfig` and `services.nfs.server.extraNfsdConfig`.";
}];
services.rpcbind.enable = true;
services.nfs.idmapd.settings = {

View file

@ -233,6 +233,7 @@ in {
croc = handleTest ./croc.nix {};
darling = handleTest ./darling.nix {};
dae = handleTest ./dae.nix {};
davis = handleTest ./davis.nix {};
dconf = handleTest ./dconf.nix {};
deconz = handleTest ./deconz.nix {};
deepin = handleTest ./deepin.nix {};
@ -457,7 +458,7 @@ in {
kerberos = handleTest ./kerberos/default.nix {};
kernel-generic = handleTest ./kernel-generic.nix {};
kernel-latest-ath-user-regd = handleTest ./kernel-latest-ath-user-regd.nix {};
kernel-rust = handleTestOn ["x86_64-linux"] ./kernel-rust.nix {};
kernel-rust = handleTest ./kernel-rust.nix {};
keter = handleTest ./keter.nix {};
kexec = handleTest ./kexec.nix {};
keycloak = discoverTests (import ./keycloak.nix);
@ -985,6 +986,7 @@ in {
vsftpd = handleTest ./vsftpd.nix {};
warzone2100 = handleTest ./warzone2100.nix {};
wasabibackend = handleTest ./wasabibackend.nix {};
wastebin = handleTest ./wastebin.nix {};
watchdogd = handleTest ./watchdogd.nix {};
webhook = runTest ./webhook.nix;
wiki-js = handleTest ./wiki-js.nix {};

View file

@ -4,74 +4,218 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
meta = with lib.maintainers; {
maintainers = [ alexoundos misuzu ];
};
nodes.castopod = { nodes, ... }: {
# otherwise 500 MiB file upload fails!
virtualisation.diskSize = 512 + 3 * 512;
networking.firewall.allowedTCPPorts = [ 80 ];
networking.extraHosts = ''
127.0.0.1 castopod.example.com
'';
networking.extraHosts =
lib.strings.concatStringsSep "\n"
(lib.attrsets.mapAttrsToList
(name: _: "127.0.0.1 ${name}")
nodes.castopod.services.nginx.virtualHosts);
services.castopod = {
enable = true;
database.createLocally = true;
localDomain = "castopod.example.com";
maxUploadSize = "512M";
};
environment.systemPackages =
let
username = "admin";
email = "admin@castood.example.com";
password = "v82HmEp5";
testRunner = pkgs.writers.writePython3Bin "test-runner"
{
libraries = [ pkgs.python3Packages.selenium ];
flakeIgnore = [
"E501"
];
} ''
from selenium.webdriver.common.by import By
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
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)
try:
driver.implicitly_wait(20)
driver.get('http://castopod.example.com/cp-install')
wait = WebDriverWait(driver, 10)
wait.until(EC.title_contains("installer"))
driver.find_element(By.CSS_SELECTOR, '#username').send_keys(
'${username}'
)
driver.find_element(By.CSS_SELECTOR, '#email').send_keys(
'${email}'
)
driver.find_element(By.CSS_SELECTOR, '#password').send_keys(
'${password}'
)
driver.find_element(By.XPATH, "//button[contains(., 'Finish install')]").click()
wait.until(EC.title_contains("Auth"))
driver.find_element(By.CSS_SELECTOR, '#email').send_keys(
'${email}'
)
driver.find_element(By.CSS_SELECTOR, '#password').send_keys(
'${password}'
)
driver.find_element(By.XPATH, "//button[contains(., 'Login')]").click()
wait.until(EC.title_contains("Admin dashboard"))
finally:
driver.close()
driver.quit()
'';
in
[ pkgs.firefox-unwrapped pkgs.geckodriver testRunner ];
};
nodes.client = { nodes, pkgs, lib, ... }:
let
domain = nodes.castopod.services.castopod.localDomain;
getIP = node:
(builtins.head node.networking.interfaces.eth1.ipv4.addresses).address;
targetPodcastSize = 500 * 1024 * 1024;
lameMp3Bitrate = 348300;
lameMp3FileAdjust = -800;
targetPodcastDuration = toString
((targetPodcastSize + lameMp3FileAdjust) / (lameMp3Bitrate / 8));
bannerWidth = 3000;
banner = pkgs.runCommand "gen-castopod-cover.jpg" { } ''
${pkgs.imagemagick}/bin/magick `
`-background green -bordercolor white -gravity northwest xc:black `
`-duplicate 99 `
`-seed 1 -resize "%[fx:rand()*72+24]" `
`-seed 0 -rotate "%[fx:rand()*360]" -border 6x6 -splice 16x36 `
`-seed 0 -rotate "%[fx:floor(rand()*4)*90]" -resize "150x50!" `
`+append -crop 10x1@ +repage -roll "+%[fx:(t%2)*72]+0" -append `
`-resize ${toString bannerWidth} -quality 1 $out
'';
coverWidth = toString 3000;
cover = pkgs.runCommand "gen-castopod-banner.jpg" { } ''
${pkgs.imagemagick}/bin/magick `
`-background white -bordercolor white -gravity northwest xc:black `
`-duplicate 99 `
`-seed 1 -resize "%[fx:rand()*72+24]" `
`-seed 0 -rotate "%[fx:rand()*360]" -border 6x6 -splice 36x36 `
`-seed 0 -rotate "%[fx:floor(rand()*4)*90]" -resize "144x144!" `
`+append -crop 10x1@ +repage -roll "+%[fx:(t%2)*72]+0" -append `
`-resize ${coverWidth} -quality 1 $out
'';
in
{
networking.extraHosts =
lib.strings.concatStringsSep "\n"
(lib.attrsets.mapAttrsToList
(name: _: "${getIP nodes.castopod} ${name}")
nodes.castopod.services.nginx.virtualHosts);
environment.systemPackages =
let
username = "admin";
email = "admin@${domain}";
password = "Abcd1234";
podcastTitle = "Some Title";
episodeTitle = "Episode Title";
browser-test = pkgs.writers.writePython3Bin "browser-test"
{
libraries = [ pkgs.python3Packages.selenium ];
flakeIgnore = [ "E124" "E501" ];
} ''
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
from subprocess import STDOUT
import logging
selenium_logger = logging.getLogger("selenium")
selenium_logger.setLevel(logging.DEBUG)
selenium_logger.addHandler(logging.StreamHandler())
options = Options()
options.add_argument('--headless')
service = Service(log_output=STDOUT)
driver = Firefox(options=options, service=service)
driver = Firefox(options=options)
driver.implicitly_wait(30)
# install ##########################################################
driver.get('http://${domain}/cp-install')
wait = WebDriverWait(driver, 20)
wait.until(EC.title_contains("installer"))
driver.find_element(By.CSS_SELECTOR, '#username').send_keys(
'${username}'
)
driver.find_element(By.CSS_SELECTOR, '#email').send_keys(
'${email}'
)
driver.find_element(By.CSS_SELECTOR, '#password').send_keys(
'${password}'
)
driver.find_element(By.XPATH,
"//button[contains(., 'Finish install')]"
).click()
wait.until(EC.title_contains("Auth"))
driver.find_element(By.CSS_SELECTOR, '#email').send_keys(
'${email}'
)
driver.find_element(By.CSS_SELECTOR, '#password').send_keys(
'${password}'
)
driver.find_element(By.XPATH,
"//button[contains(., 'Login')]"
).click()
wait.until(EC.title_contains("Admin dashboard"))
# create podcast ###################################################
driver.get('http://${domain}/admin/podcasts/new')
wait.until(EC.title_contains("Create podcast"))
driver.find_element(By.CSS_SELECTOR, '#cover').send_keys(
'${cover}'
)
driver.find_element(By.CSS_SELECTOR, '#banner').send_keys(
'${banner}'
)
driver.find_element(By.CSS_SELECTOR, '#title').send_keys(
'${podcastTitle}'
)
driver.find_element(By.CSS_SELECTOR, '#handle').send_keys(
'some_handle'
)
driver.find_element(By.CSS_SELECTOR, '#description').send_keys(
'Some description'
)
driver.find_element(By.CSS_SELECTOR, '#owner_name').send_keys(
'Owner Name'
)
driver.find_element(By.CSS_SELECTOR, '#owner_email').send_keys(
'owner@email.xyz'
)
driver.find_element(By.XPATH,
"//button[contains(., 'Create podcast')]"
).click()
wait.until(EC.title_contains("${podcastTitle}"))
driver.find_element(By.XPATH,
"//span[contains(., 'Add an episode')]"
).click()
wait.until(EC.title_contains("Add an episode"))
# upload podcast ###################################################
driver.find_element(By.CSS_SELECTOR, '#audio_file').send_keys(
'/tmp/podcast.mp3'
)
driver.find_element(By.CSS_SELECTOR, '#cover').send_keys(
'${cover}'
)
driver.find_element(By.CSS_SELECTOR, '#description').send_keys(
'Episode description'
)
driver.find_element(By.CSS_SELECTOR, '#title').send_keys(
'${episodeTitle}'
)
driver.find_element(By.XPATH,
"//button[contains(., 'Create episode')]"
).click()
wait.until(EC.title_contains("${episodeTitle}"))
driver.close()
driver.quit()
'';
in
[
pkgs.firefox-unwrapped
pkgs.geckodriver
browser-test
(pkgs.writeShellApplication {
name = "build-mp3";
runtimeInputs = with pkgs; [ sox lame ];
text = ''
out=/tmp/podcast.mp3
sox -n -r 48000 -t wav - synth ${targetPodcastDuration} sine 440 `
`| lame --noreplaygain -cbr -q 9 -b 320 - $out
FILESIZE="$(stat -c%s $out)"
[ "$FILESIZE" -gt 0 ]
[ "$FILESIZE" -le "${toString targetPodcastSize}" ]
'';
})
];
};
testScript = ''
start_all()
castopod.wait_for_unit("castopod-setup.service")
@ -79,9 +223,11 @@ import ./make-test-python.nix ({ pkgs, lib, ... }:
castopod.wait_for_unit("nginx.service")
castopod.wait_for_open_port(80)
castopod.wait_until_succeeds("curl -sS -f http://castopod.example.com")
castopod.succeed("curl -s http://localhost/cp-install | grep 'Create your Super Admin account' > /dev/null")
with subtest("Create superadmin and log in"):
castopod.succeed("PYTHONUNBUFFERED=1 systemd-cat -t test-runner test-runner")
client.succeed("build-mp3")
with subtest("Create superadmin, log in, create and upload a podcast"):
client.succeed(\
"PYTHONUNBUFFERED=1 systemd-cat -t browser-test browser-test")
'';
})

59
nixos/tests/davis.nix Normal file
View file

@ -0,0 +1,59 @@
import ./make-test-python.nix (
{ lib, pkgs, ... }:
{
name = "davis";
meta.maintainers = pkgs.davis.meta.maintainers;
nodes.machine =
{ config, ... }:
{
virtualisation = {
memorySize = 512;
};
services.davis = {
enable = true;
hostname = "davis.example.com";
database = {
driver = "postgresql";
};
mail = {
dsnFile = "${pkgs.writeText "davisMailDns" "smtp://username:password@example.com:25"}";
inviteFromAddress = "dav@example.com";
};
adminLogin = "admin";
appSecretFile = "${pkgs.writeText "davisAppSecret" "52882ef142066e09ab99ce816ba72522e789505caba224"}";
adminPasswordFile = "${pkgs.writeText "davisAdminPass" "nixos"}";
nginx = { };
};
};
testScript = ''
start_all()
machine.wait_for_unit("postgresql.service")
machine.wait_for_unit("davis-env-setup.service")
machine.wait_for_unit("davis-db-migrate.service")
machine.wait_for_unit("nginx.service")
machine.wait_for_unit("phpfpm-davis.service")
with subtest("welcome screen loads"):
machine.succeed(
"curl -sSfL --resolve davis.example.com:80:127.0.0.1 http://davis.example.com/ | grep '<title>Davis</title>'"
)
with subtest("login works"):
csrf_token = machine.succeed(
"curl -c /tmp/cookies -sSfL --resolve davis.example.com:80:127.0.0.1 http://davis.example.com/login | grep '_csrf_token' | sed -E 's,.*value=\"(.*)\".*,\\1,g'"
)
r = machine.succeed(
f"curl -b /tmp/cookies --resolve davis.example.com:80:127.0.0.1 http://davis.example.com/login -X POST -F username=admin -F password=nixos -F _csrf_token={csrf_token.strip()} -D headers"
)
print(r)
machine.succeed(
"[[ $(grep -i 'location: ' headers | cut -d: -f2- | xargs echo) == /dashboard* ]]"
)
'';
}
)

View file

@ -18,7 +18,7 @@ import ./make-test-python.nix ({ pkgs, ... }: {
host invidious invidious samenet scram-sha-256
'';
};
networking.firewall.allowedTCPPorts = [ config.services.postgresql.port ];
networking.firewall.allowedTCPPorts = [ config.services.postgresql.settings.port ];
};
machine = { config, lib, pkgs, ... }: {
services.invidious = {

View file

@ -4,7 +4,7 @@
}:
let
inherit (pkgs.lib) const filterAttrs mapAttrs;
inherit (pkgs.lib) const filterAttrs mapAttrs meta;
kernelRustTest = kernelPackages: import ./make-test-python.nix ({ lib, ... }: {
name = "kernel-rust";
@ -38,6 +38,8 @@ let
inherit (builtins.tryEval (
x.rust-out-of-tree-module or null != null
)) success value;
in success && value))
available =
meta.availableOn pkgs.stdenv.hostPlatform x.rust-out-of-tree-module;
in success && value && available))
pkgs.linuxKernel.vanillaPackages;
in mapAttrs (const kernelRustTest) kernels

View file

@ -76,7 +76,7 @@ in
systemd.services.postgresql.postStart = lib.mkAfter ''
$PSQL -tAd miniflux -c 'CREATE EXTENSION hstore;'
'';
networking.firewall.allowedTCPPorts = [ config.services.postgresql.port ];
networking.firewall.allowedTCPPorts = [ config.services.postgresql.settings.port ];
};
externalDb = { ... }: {
security.apparmor.enable = true;

View file

@ -7,7 +7,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
services.postgresql = {
enable = true;
extraPlugins = ps: [ ps.anonymizer ];
settings.shared_preload_libraries = "anon";
settings.shared_preload_libraries = [ "anon" ];
};
};

View file

@ -21,7 +21,7 @@ in
pgmanage = {
enable = true;
connections = {
${conn} = "hostaddr=127.0.0.1 port=${toString config.services.postgresql.port} dbname=postgres";
${conn} = "hostaddr=127.0.0.1 port=${toString config.services.postgresql.settings.port} dbname=postgres";
};
};
};

19
nixos/tests/wastebin.nix Normal file
View file

@ -0,0 +1,19 @@
import ./make-test-python.nix ({ pkgs, lib, ... }: {
name = "wastebin";
meta = {
maintainers = with lib.maintainers; [ pinpox ];
};
nodes.machine = { pkgs, ... }: {
services.wastebin = {
enable = true;
};
};
testScript = ''
machine.wait_for_unit("wastebin.service")
machine.wait_for_open_port(8088)
machine.succeed("curl --fail http://localhost:8088/")
'';
})

View file

@ -33,7 +33,7 @@ in
extraHosts = hosts;
firewall.allowedTCPPorts = [
config.services.redis.servers.mastodon.port
config.services.postgresql.port
config.services.postgresql.settings.port
];
};

View file

@ -3,7 +3,7 @@
, ffmpeg-headless
, lib
, nixosTests
, stateDirectory ? "/var/lib/castopod"
, dataDir ? "/var/lib/castopod"
}:
stdenv.mkDerivation {
pname = "castopod";
@ -20,13 +20,16 @@ stdenv.mkDerivation {
postPatch = ''
# not configurable at runtime unfortunately:
substituteInPlace app/Config/Paths.php \
--replace "__DIR__ . '/../../writable'" "'${stateDirectory}/writable'"
--replace "__DIR__ . '/../../writable'" "'${dataDir}/writable'"
# configuration file must be writable, place it to ${stateDirectory}
substituteInPlace modules/Admin/Controllers/DashboardController.php \
--replace "disk_total_space('./')" "disk_total_space('${dataDir}')"
# configuration file must be writable, place it to ${dataDir}
substituteInPlace modules/Install/Controllers/InstallController.php \
--replace "ROOTPATH" "'${stateDirectory}/'"
--replace "ROOTPATH" "'${dataDir}/'"
substituteInPlace public/index.php spark \
--replace "DotEnv(ROOTPATH)" "DotEnv('${stateDirectory}')"
--replace "DotEnv(ROOTPATH)" "DotEnv('${dataDir}')"
# ffmpeg is required for Video Clips feature
substituteInPlace modules/MediaClipper/VideoClipper.php \

View file

@ -9,18 +9,18 @@
buildGoModule rec {
pname = "go-musicfox";
version = "4.3.1";
version = "4.3.3";
src = fetchFromGitHub {
owner = "go-musicfox";
repo = pname;
repo = "go-musicfox";
rev = "v${version}";
hash = "sha256-QZHuQAOnthSm7Kb82i3NUWTnKk+9OMHV5vzOU72inX0=";
hash = "sha256-J6R3T92cHFUkKwc+GKm612tVjglP2Tc/kDUmzUMhvio=";
};
deleteVendor = true;
vendorHash = "sha256-6DeoxpjVfykBI3fJAJpMZwJ4VTooIbxGpk5+SW198hU=";
vendorHash = "sha256-KSIdBEEvYaYcDIDmzfRO857I8FSN4Ajw6phAPQLYEqg=";
subPackages = [ "cmd/musicfox.go" ];

View file

@ -4,18 +4,18 @@ version = 3
[[package]]
name = "aho-corasick"
version = "1.0.3"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c"
checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"
dependencies = [
"memchr",
]
[[package]]
name = "anyhow"
version = "1.0.72"
version = "1.0.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854"
checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
[[package]]
name = "autocfg"
@ -25,11 +25,11 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bindgen"
version = "0.64.0"
version = "0.66.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4"
checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
dependencies = [
"bitflags 1.3.2",
"bitflags 2.4.0",
"cexpr",
"clang-sys",
"lazy_static",
@ -40,7 +40,7 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
"syn 1.0.109",
"syn 2.0.29",
]
[[package]]
@ -51,9 +51,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.3.3"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
[[package]]
name = "bitmaps"
@ -76,7 +76,7 @@ version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d859b656775a6b1dd078d3e5924884e6ea88aa649a7fdde03d5b2ec56ffcc10b"
dependencies = [
"bitflags 2.3.3",
"bitflags 2.4.0",
"cairo-sys-rs",
"glib",
"libc",
@ -137,6 +137,7 @@ checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]]
@ -226,7 +227,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.28",
"syn 2.0.29",
]
[[package]]
@ -287,9 +288,9 @@ dependencies = [
[[package]]
name = "gdk4"
version = "0.7.1"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8965ed5455cbfa1eb45c14a3b971cbacb43481913a3a5b9078b2ef0d9a01bd4b"
checksum = "6982d9815ed6ac95b0467b189e81f29dea26d08a732926ec113e65744ed3f96c"
dependencies = [
"cairo-rs",
"gdk-pixbuf",
@ -302,9 +303,9 @@ dependencies = [
[[package]]
name = "gdk4-sys"
version = "0.7.1"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aeffd4a7d68046c28666d817071bf025254aaed4df35099443f0c306ca6177f3"
checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@ -375,7 +376,7 @@ version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "331156127e8166dd815cf8d2db3a5beb492610c716c03ee6db4f2d07092af0a7"
dependencies = [
"bitflags 2.3.3",
"bitflags 2.4.0",
"futures-channel",
"futures-core",
"futures-executor",
@ -404,7 +405,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.28",
"syn 2.0.29",
]
[[package]]
@ -459,9 +460,9 @@ dependencies = [
[[package]]
name = "gsk4"
version = "0.7.1"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53b3b9e8090acb325d08cde84b30fc29b963a75fbac93160e9c5a30d2b335742"
checksum = "cc25855255120f294d874acd6eaf4fbed7ce1cdc550e2d8415ea57fafbe816d5"
dependencies = [
"cairo-rs",
"gdk4",
@ -474,9 +475,9 @@ dependencies = [
[[package]]
name = "gsk4-sys"
version = "0.7.0"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0770d1ede7189092748c4ef5b6921264eb945fd2318a58e8f59dc273000810f8"
checksum = "e1ecf3a63bf1223d68f80f72cc896c4d8c80482fbce1c9a12c66d3de7290ee46"
dependencies = [
"cairo-sys-rs",
"gdk4-sys",
@ -490,9 +491,9 @@ dependencies = [
[[package]]
name = "gtk4"
version = "0.7.1"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0973f9b9ade10fc22403810b7283d47b533033715f2aaa36288cd3bf90d63efc"
checksum = "a3b095b26f2a2df70be1805d3590eeb9d7a05ecb5be9649b82defc72dc56228c"
dependencies = [
"cairo-rs",
"field-offset",
@ -511,9 +512,9 @@ dependencies = [
[[package]]
name = "gtk4-macros"
version = "0.7.1"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae9f2c4530f3168fe506b0be7bc15f7a93ef38d020edb27d81a921a26cbca851"
checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f"
dependencies = [
"anyhow",
"proc-macro-crate",
@ -525,9 +526,9 @@ dependencies = [
[[package]]
name = "gtk4-sys"
version = "0.7.0"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19fde71ef2e78ac8fb18073c345b5f29609048d4045a345613645aa1163243c1"
checksum = "7b0bdde87c50317b4f355bcbb4a9c2c414ece1b7c824fb4ad4ba8f3bdb2c6603"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@ -629,11 +630,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
[[package]]
name = "libspa"
version = "0.6.0"
source = "git+https://gitlab.freedesktop.org/saivert/pipewire-rs?branch=misc_fixes#46bfbd8bdf0ad3ff1d25d02b2e36f97333c78e23"
name = "libloading"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
dependencies = [
"bitflags 2.3.3",
"cfg-if",
"winapi",
]
[[package]]
name = "libspa"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcdea6b6663acf456641a4dea1b87fa6970a3e881596237713192d8f5423b542"
dependencies = [
"bitflags 2.4.0",
"cc",
"convert_case",
"cookie-factory",
@ -646,8 +658,9 @@ dependencies = [
[[package]]
name = "libspa-sys"
version = "0.6.0"
source = "git+https://gitlab.freedesktop.org/saivert/pipewire-rs?branch=misc_fixes#46bfbd8bdf0ad3ff1d25d02b2e36f97333c78e23"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e63fc701d3375e6e255765d6a6172d9af06583115e78f3dfe2c8ff1dfd0b2dab"
dependencies = [
"bindgen",
"cc",
@ -669,9 +682,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.19"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
[[package]]
name = "malloc_buf"
@ -816,11 +829,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pipewire"
version = "0.6.0"
source = "git+https://gitlab.freedesktop.org/saivert/pipewire-rs?branch=misc_fixes#46bfbd8bdf0ad3ff1d25d02b2e36f97333c78e23"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "062c97c31818918b8bffdc66cfd93f3e4b4141f505c63234f9ff0a658fddedab"
dependencies = [
"anyhow",
"bitflags 2.3.3",
"bitflags 2.4.0",
"libc",
"libspa",
"libspa-sys",
@ -832,8 +846,9 @@ dependencies = [
[[package]]
name = "pipewire-sys"
version = "0.6.0"
source = "git+https://gitlab.freedesktop.org/saivert/pipewire-rs?branch=misc_fixes#46bfbd8bdf0ad3ff1d25d02b2e36f97333c78e23"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d558e2cffe5f97ac32c7e0b6cb6074b5271b8c2c628ac68633342ee08fdab308"
dependencies = [
"bindgen",
"libspa-sys",
@ -908,9 +923,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.32"
version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [
"proc-macro2",
]
@ -1045,9 +1060,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.28"
version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [
"proc-macro2",
"quote",
@ -1081,22 +1096,22 @@ checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab"
[[package]]
name = "thiserror"
version = "1.0.44"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90"
checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.44"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96"
checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.28",
"syn 2.0.29",
]
[[package]]
@ -1187,9 +1202,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "winnow"
version = "0.5.4"
version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acaaa1190073b2b101e15083c38ee8ec891b5e05cbee516521e94ec008f61e64"
checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97"
dependencies = [
"memchr",
]
@ -1197,9 +1212,9 @@ dependencies = [
[[package]]
name = "wireplumber"
version = "0.1.0"
source = "git+https://github.com/saivert/wireplumber.rs.git?branch=use_pipewire_from_git#8dbf383ce54dee7b8d578b87c13f3507a65291f8"
source = "git+https://github.com/arcnmx/wireplumber.rs.git?rev=341b0c4e8d177f5f21c109cf88cca4f2dc1f853a#341b0c4e8d177f5f21c109cf88cca4f2dc1f853a"
dependencies = [
"bitflags 1.3.2",
"bitflags 2.4.0",
"gio",
"glib",
"libc",
@ -1213,7 +1228,7 @@ dependencies = [
[[package]]
name = "wireplumber-sys"
version = "0.1.0"
source = "git+https://github.com/saivert/wireplumber.rs.git?branch=use_pipewire_from_git#8dbf383ce54dee7b8d578b87c13f3507a65291f8"
source = "git+https://github.com/arcnmx/wireplumber.rs.git?rev=341b0c4e8d177f5f21c109cf88cca4f2dc1f853a#341b0c4e8d177f5f21c109cf88cca4f2dc1f853a"
dependencies = [
"gio-sys",
"glib-sys",

View file

@ -1,6 +1,7 @@
{ lib
, stdenv
, fetchFromGitHub
, fetchFromGitLab
, cargo
, desktop-file-utils
, meson
@ -19,22 +20,33 @@
, wireplumber
}:
let
wireplumber_0_4 = wireplumber.overrideAttrs (attrs: rec {
version = "0.4.17";
src = fetchFromGitLab {
domain = "gitlab.freedesktop.org";
owner = "pipewire";
repo = "wireplumber";
rev = version;
hash = "sha256-vhpQT67+849WV1SFthQdUeFnYe/okudTQJoL3y+wXwI=";
};
});
in
stdenv.mkDerivation rec {
pname = "pwvucontrol";
version = "0.2";
version = "0.3.1";
src = fetchFromGitHub {
owner = "saivert";
repo = "pwvucontrol";
rev = version;
hash = "sha256-jBvMLewBZi4LyX//YUyJQjqPvxnKqlpuLZAm9zpDMrA=";
hash = "sha256-t4JUpKtuO1JgrdsNbl0M/SwPmoqu7WxsaD74vlJeVhY=";
};
cargoDeps = rustPlatform.importCargoLock {
lockFile = ./Cargo.lock;
outputHashes = {
"libspa-0.6.0" = "sha256-CVLQ9JXRMo78/kay1TpRgRuk5v/Z5puPVMzLA30JRk8=";
"wireplumber-0.1.0" = "sha256-wkku9vqIMdV+HTkWCPXKH2KM1Xzf0xApC5zrVmgxhsA=";
"wireplumber-0.1.0" = "sha256-+LZ8xKok2AOegW8WvfrfZGXuQB4xHrLNshcTOHab+xQ=";
};
};
@ -58,7 +70,7 @@ stdenv.mkDerivation rec {
libadwaita
pango
pipewire
wireplumber
wireplumber_0_4
];
meta = with lib; {

View file

@ -1,37 +0,0 @@
{ lib, fetchurl, appimageTools, }:
let
pname = "ytmdesktop";
version = "1.13.0";
name = "${pname}-${version}";
src = fetchurl {
url = "https://github.com/ytmdesktop/ytmdesktop/releases/download/v${version}/YouTube-Music-Desktop-App-${version}.AppImage";
sha256 = "0f5l7hra3m3q9zd0ngc9dj4mh1lk0rgicvh9idpd27wr808vy28v";
};
appimageContents = appimageTools.extract { inherit name src; };
in appimageTools.wrapType2 rec {
inherit name src;
extraInstallCommands = ''
mv $out/bin/{${name},${pname}}
install -m 444 \
-D ${appimageContents}/youtube-music-desktop-app.desktop \
-t $out/share/applications
substituteInPlace \
$out/share/applications/youtube-music-desktop-app.desktop \
--replace 'Exec=AppRun' 'Exec=${pname}'
cp -r ${appimageContents}/usr/share/icons $out/share
'';
meta = with lib; {
description = "A Desktop App for YouTube Music";
homepage = "https://ytmdesktop.app/";
license = licenses.cc0;
platforms = platforms.linux;
maintainers = [ maintainers.lgcl ];
mainProgram = "ytmdesktop";
};
}

View file

@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
pname = "ergo";
version = "5.0.20";
version = "5.0.21";
src = fetchurl {
url = "https://github.com/ergoplatform/ergo/releases/download/v${version}/ergo-${version}.jar";
sha256 = "sha256-wC3KnuKHsUw1jt7EXVAgPhB6Sk8630sVaM3yn6CGPqs=";
sha256 = "sha256-WtBsChSHnYbRBojxRUGdMnXlG+45hp4ZSd8GLx5n/88=";
};
nativeBuildInputs = [ makeWrapper ];

View file

@ -34,10 +34,10 @@
elpaBuild {
pname = "activities";
ename = "activities";
version = "0.5.1";
version = "0.7";
src = fetchurl {
url = "https://elpa.gnu.org/packages/activities-0.5.1.tar";
sha256 = "0ng9sgajcpal881s3kavkmz0fc38f2h207hpqj62cf14z7bsk0zk";
url = "https://elpa.gnu.org/packages/activities-0.7.tar";
sha256 = "17vwbblcwayf1lqfvc64s606cyv1pyh094i3d8fz0k5ivgfp6ybi";
};
packageRequires = [ emacs persist ];
meta = {
@ -261,6 +261,21 @@
license = lib.licenses.free;
};
}) {};
assess = callPackage ({ elpaBuild, emacs, fetchurl, lib, m-buffer }:
elpaBuild {
pname = "assess";
ename = "assess";
version = "0.7";
src = fetchurl {
url = "https://elpa.gnu.org/packages/assess-0.7.tar";
sha256 = "0ixs6ab5j12q69bn9h423a6c7mpc7r5spf6m039x3rl14yc04cy4";
};
packageRequires = [ emacs m-buffer ];
meta = {
homepage = "https://elpa.gnu.org/packages/assess.html";
license = lib.licenses.free;
};
}) {};
async = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "async";
@ -280,10 +295,10 @@
elpaBuild {
pname = "auctex";
ename = "auctex";
version = "14.0.3";
version = "14.0.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/auctex-14.0.3.tar";
sha256 = "1xk29nk3r7ilxk2vag3diacamqvlws7mbjk5a0iivz5y6fy7hmjc";
url = "https://elpa.gnu.org/packages/auctex-14.0.4.tar";
sha256 = "03w6qs4f0ksb8f54zsx189775w3wdyfaqg3dwn20a77y5cvisk52";
};
packageRequires = [ emacs ];
meta = {
@ -550,10 +565,10 @@
elpaBuild {
pname = "brief";
ename = "brief";
version = "5.88.22.2";
version = "5.90";
src = fetchurl {
url = "https://elpa.gnu.org/packages/brief-5.88.22.2.tar";
sha256 = "1i4sdm8kcrazzp22gb4hi1gd4lfq6hdh6pnldmi1zjjyhl1gbzn3";
url = "https://elpa.gnu.org/packages/brief-5.90.tar";
sha256 = "18v0qf3aj14sh6njrrjdahzaghsqy50hdjrwl3k1m7x2jqvzxd1z";
};
packageRequires = [ cl-lib nadvice ];
meta = {
@ -565,10 +580,10 @@
elpaBuild {
pname = "buffer-env";
ename = "buffer-env";
version = "0.5";
version = "0.6";
src = fetchurl {
url = "https://elpa.gnu.org/packages/buffer-env-0.5.tar";
sha256 = "17q0flxp0rp52ksyh5ijcamvvm003icbyzv28r6vknrw3qsphb3p";
url = "https://elpa.gnu.org/packages/buffer-env-0.6.tar";
sha256 = "08li070s2s64lifgzns0z6xjk1qyaik56d6sbdp3gsyghc1sx7rn";
};
packageRequires = [ compat emacs ];
meta = {
@ -659,10 +674,10 @@
elpaBuild {
pname = "cape";
ename = "cape";
version = "1.3";
version = "1.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/cape-1.3.tar";
sha256 = "1178f6js821zcmsc3zrlclnaf4sswgvzs2qazzi975dkcfqcn3vq";
url = "https://elpa.gnu.org/packages/cape-1.4.tar";
sha256 = "1y0b0lx6qb27x3d0yn3gxykfir07cw4w5jkkw3ff8x1ak6wrf4zv";
};
packageRequires = [ compat emacs ];
meta = {
@ -809,10 +824,10 @@
elpaBuild {
pname = "comint-mime";
ename = "comint-mime";
version = "0.3";
version = "0.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/comint-mime-0.3.tar";
sha256 = "0dlzwzmiwq9z8riq6h1gpq1g713x09kxgaz2m4anxkbmgb95r7hf";
url = "https://elpa.gnu.org/packages/comint-mime-0.4.tar";
sha256 = "1wgr1dq3qdnsvziylcqaiwhjafdqph4jrnq4cp0lcr1j796vp1dz";
};
packageRequires = [ emacs ];
meta = {
@ -907,10 +922,10 @@
elpaBuild {
pname = "compat";
ename = "compat";
version = "29.1.4.4";
version = "29.1.4.5";
src = fetchurl {
url = "https://elpa.gnu.org/packages/compat-29.1.4.4.tar";
sha256 = "0710g552b1nznnfx2774gmg6yizs27s0bakqm95nsjrp6kgznbfr";
url = "https://elpa.gnu.org/packages/compat-29.1.4.5.tar";
sha256 = "191cjzrw9xm5bvcf8s1yr9hdcn9i02789xfd8pz33lk65s0rq413";
};
packageRequires = [ emacs seq ];
meta = {
@ -922,10 +937,10 @@
elpaBuild {
pname = "consult";
ename = "consult";
version = "1.3";
version = "1.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/consult-1.3.tar";
sha256 = "1qyqvc4rp0287lidpzhvi669ygjnqmlw8wq0hc0nks2703p283c8";
url = "https://elpa.gnu.org/packages/consult-1.4.tar";
sha256 = "1vxc9i4jwnq4q8svgqjzn6nqqjzh3b6gp81iyfcr5n2122y0aq1y";
};
packageRequires = [ compat emacs ];
meta = {
@ -933,8 +948,7 @@
license = lib.licenses.free;
};
}) {};
consult-hoogle = callPackage ({ consult
, elpaBuild
consult-hoogle = callPackage ({ elpaBuild
, emacs
, fetchurl
, haskell-mode
@ -942,12 +956,12 @@
elpaBuild {
pname = "consult-hoogle";
ename = "consult-hoogle";
version = "0.1.1";
version = "0.2.0";
src = fetchurl {
url = "https://elpa.gnu.org/packages/consult-hoogle-0.1.1.tar";
sha256 = "1bcl7h5ykcgrsfj27wkv9l9jvbj2bbkh0w9d60663m1bkp0p3y2r";
url = "https://elpa.gnu.org/packages/consult-hoogle-0.2.0.tar";
sha256 = "1wzd7i7sfd1l8fkfgfaj5vyc9nx9aycfr4yp5yxg1mr6fz8m2rmz";
};
packageRequires = [ consult emacs haskell-mode ];
packageRequires = [ emacs haskell-mode ];
meta = {
homepage = "https://elpa.gnu.org/packages/consult-hoogle.html";
license = lib.licenses.free;
@ -1152,10 +1166,10 @@
elpaBuild {
pname = "dape";
ename = "dape";
version = "0.7.0";
version = "0.9.0";
src = fetchurl {
url = "https://elpa.gnu.org/packages/dape-0.7.0.tar";
sha256 = "0fbafwmrs9dlv875vcg1c9gh0hqs1zpnyqxgkdvbrazww7ffn60g";
url = "https://elpa.gnu.org/packages/dape-0.9.0.tar";
sha256 = "13xvl24l8lr64ndc8rk1dxdgsbvwxhn90844xkdzl7qs8i3hyw1l";
};
packageRequires = [ emacs jsonrpc ];
meta = {
@ -1242,10 +1256,10 @@
elpaBuild {
pname = "denote";
ename = "denote";
version = "2.2.4";
version = "2.3.0";
src = fetchurl {
url = "https://elpa.gnu.org/packages/denote-2.2.4.tar";
sha256 = "0a0f4s715nfb7kly82m1gb2ady69z089wlay5i53n9bxzi61x3j7";
url = "https://elpa.gnu.org/packages/denote-2.3.0.tar";
sha256 = "0h6pdn9w1ggyrmfniqvy307wnlf49n05asa2z5wqxvj6mnvjza1y";
};
packageRequires = [ emacs ];
meta = {
@ -1287,10 +1301,10 @@
elpaBuild {
pname = "devdocs";
ename = "devdocs";
version = "0.5";
version = "0.6";
src = fetchurl {
url = "https://elpa.gnu.org/packages/devdocs-0.5.tar";
sha256 = "0qyp8lhf76yv2ym7cryvygvf2m9jah5nsl1g79gqjrsin6vlhqka";
url = "https://elpa.gnu.org/packages/devdocs-0.6.tar";
sha256 = "17av2l61mr4y8la4cqiq1dnaznni4xirr5k3wdix1jzl3q1apypy";
};
packageRequires = [ emacs ];
meta = {
@ -1653,10 +1667,10 @@
elpaBuild {
pname = "eev";
ename = "eev";
version = "20240205";
version = "20240309";
src = fetchurl {
url = "https://elpa.gnu.org/packages/eev-20240205.tar";
sha256 = "06psmcf3yi7pincsbhjrcrml0wzwgmlv6xy2fbpg1sg8vlibbgi3";
url = "https://elpa.gnu.org/packages/eev-20240309.tar";
sha256 = "0j9hz5raxrk3d2ashbsp9yvi04d5ap0chb4lpljr4pbh2lnyjr4h";
};
packageRequires = [ emacs ];
meta = {
@ -1668,10 +1682,10 @@
elpaBuild {
pname = "ef-themes";
ename = "ef-themes";
version = "1.5.1";
version = "1.6.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/ef-themes-1.5.1.tar";
sha256 = "00qh5b7kx0dlms7drnzj95mvgwfzg5h5m9prkbr8qi4ssx939gdw";
url = "https://elpa.gnu.org/packages/ef-themes-1.6.1.tar";
sha256 = "1ms0rqivxdsbx7jv6d5h1khvm4ghml152ab831chg4z77apmq1ga";
};
packageRequires = [ emacs ];
meta = {
@ -1778,22 +1792,16 @@
license = lib.licenses.free;
};
}) {};
ellama = callPackage ({ dash
, elpaBuild
, emacs
, fetchurl
, lib
, llm
, spinner }:
ellama = callPackage ({ elpaBuild, emacs, fetchurl, lib, llm, spinner }:
elpaBuild {
pname = "ellama";
ename = "ellama";
version = "0.8.7";
version = "0.8.13";
src = fetchurl {
url = "https://elpa.gnu.org/packages/ellama-0.8.7.tar";
sha256 = "0qmd7zrh026rjic26bdp9zinb7vkppdm14inwpwaashqxa5brwi5";
url = "https://elpa.gnu.org/packages/ellama-0.8.13.tar";
sha256 = "012j3rnvwj8ajyjdlgdx6nrs773i71dyl5brs0jgx010jibzmafi";
};
packageRequires = [ dash emacs llm spinner ];
packageRequires = [ emacs llm spinner ];
meta = {
homepage = "https://elpa.gnu.org/packages/ellama.html";
license = lib.licenses.free;
@ -1893,10 +1901,10 @@
elpaBuild {
pname = "emms";
ename = "emms";
version = "18";
version = "19";
src = fetchurl {
url = "https://elpa.gnu.org/packages/emms-18.tar";
sha256 = "1jslk37kx7yzvwy4hq1a6b71kp4a3bgfzzp8bpplv7z6vcmwrmgq";
url = "https://elpa.gnu.org/packages/emms-19.tar";
sha256 = "13c884s92ddn52psgkaz3zvb94g23gq41dbidpx7x4gzdhd9qqxm";
};
packageRequires = [ cl-lib nadvice seq ];
meta = {
@ -2125,10 +2133,10 @@
elpaBuild {
pname = "filechooser";
ename = "filechooser";
version = "0.1.2";
version = "0.2.0";
src = fetchurl {
url = "https://elpa.gnu.org/packages/filechooser-0.1.2.tar";
sha256 = "0s0mdc851zd2hy8hfpbamiimbh7c788cyz8mxnwzkpmf6jlj6xdw";
url = "https://elpa.gnu.org/packages/filechooser-0.2.0.tar";
sha256 = "1pl6n6d6gymdm0gx0nz96hwps8v1s2zpqph41d0h5hdvsvxacx6w";
};
packageRequires = [ compat emacs ];
meta = {
@ -2554,10 +2562,10 @@
elpaBuild {
pname = "greader";
ename = "greader";
version = "0.9.7";
version = "0.9.19";
src = fetchurl {
url = "https://elpa.gnu.org/packages/greader-0.9.7.tar";
sha256 = "08q2qfcwyxrnmjbzblgk16xhshhn2314swjs0kr5jrdijdgpfghh";
url = "https://elpa.gnu.org/packages/greader-0.9.19.tar";
sha256 = "1d04d1shzb505qs2mf7387dvl56pwlwh4b349s5fq2prwqrq71l7";
};
packageRequires = [ emacs ];
meta = {
@ -2584,10 +2592,10 @@
elpaBuild {
pname = "gtags-mode";
ename = "gtags-mode";
version = "1.0";
version = "1.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/gtags-mode-1.0.tar";
sha256 = "0nyzsr3fnds931ihw2dp5xlgv151kzph7qv1n751r1cajimzlp7n";
url = "https://elpa.gnu.org/packages/gtags-mode-1.1.tar";
sha256 = "0fgs6iqrivmyxfkjl6hxxs3zfjkkdas61z34q08qfjgw0ixz188h";
};
packageRequires = [ emacs ];
meta = {
@ -2726,10 +2734,10 @@
elpaBuild {
pname = "hyperbole";
ename = "hyperbole";
version = "9.0.0";
version = "9.0.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/hyperbole-9.0.0.tar";
sha256 = "07kpyp3ggf4knakn18niy819l184apx4d9vbcwv57j8zyqgn4c3l";
url = "https://elpa.gnu.org/packages/hyperbole-9.0.1.tar";
sha256 = "0a7py2dvszh0rf2smbmm8msjrc8vbbvlqnsqw0m2l12v8vllmxnb";
};
packageRequires = [ emacs ];
meta = {
@ -2786,10 +2794,10 @@
elpaBuild {
pname = "isearch-mb";
ename = "isearch-mb";
version = "0.7";
version = "0.8";
src = fetchurl {
url = "https://elpa.gnu.org/packages/isearch-mb-0.7.tar";
sha256 = "1dfjh4ya9515vx0q2dv1brddw350gxd40h1g1vsa783ivvm0hm75";
url = "https://elpa.gnu.org/packages/isearch-mb-0.8.tar";
sha256 = "06241rwz01z4ysgmizczq12zl0cc6xvfyds48glzk1jp82zp4adp";
};
packageRequires = [ emacs ];
meta = {
@ -2956,10 +2964,10 @@
elpaBuild {
pname = "jinx";
ename = "jinx";
version = "1.3";
version = "1.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/jinx-1.3.tar";
sha256 = "0xlfw1sw92qf8bwpw9qnjhkz4ax6n7kcl72ypqm3swmj92jbgsg7";
url = "https://elpa.gnu.org/packages/jinx-1.4.tar";
sha256 = "1vv85pbhcpwjvd3iwnr8ksjpbydrsk7m3zm34hcbybg703yk2nl7";
};
packageRequires = [ compat emacs ];
meta = {
@ -2971,10 +2979,10 @@
elpaBuild {
pname = "jit-spell";
ename = "jit-spell";
version = "0.3";
version = "0.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/jit-spell-0.3.tar";
sha256 = "0q8wd9phd0zcjhc92j633vz82fr0ji8zc9vir7kcn1msrf6jspwz";
url = "https://elpa.gnu.org/packages/jit-spell-0.4.tar";
sha256 = "1p83spcq52l7k63p56y3w5r3kl49wbrs4abynwn25ikhkd4wl8x3";
};
packageRequires = [ compat emacs ];
meta = {
@ -3016,10 +3024,10 @@
elpaBuild {
pname = "jsonrpc";
ename = "jsonrpc";
version = "1.0.24";
version = "1.0.25";
src = fetchurl {
url = "https://elpa.gnu.org/packages/jsonrpc-1.0.24.tar";
sha256 = "05nwxfybczxx7pmflq762dq3wypm3pmcfljqs5kh81icxvdqvk8s";
url = "https://elpa.gnu.org/packages/jsonrpc-1.0.25.tar";
sha256 = "0hlc70xlm3a53il7k24s6s25dhnd09l2454r5qkpfnjdz9p5ih6f";
};
packageRequires = [ emacs ];
meta = {
@ -3137,6 +3145,40 @@
license = lib.licenses.free;
};
}) {};
lentic = callPackage ({ dash, elpaBuild, emacs, fetchurl, lib, m-buffer }:
elpaBuild {
pname = "lentic";
ename = "lentic";
version = "0.12";
src = fetchurl {
url = "https://elpa.gnu.org/packages/lentic-0.12.tar";
sha256 = "15sb126sq5aw3n09vqydmsl1l5svfar70iz42hnqi783cpw1lh0m";
};
packageRequires = [ dash emacs m-buffer ];
meta = {
homepage = "https://elpa.gnu.org/packages/lentic.html";
license = lib.licenses.free;
};
}) {};
lentic-server = callPackage ({ elpaBuild
, fetchurl
, lentic
, lib
, web-server }:
elpaBuild {
pname = "lentic-server";
ename = "lentic-server";
version = "0.2";
src = fetchurl {
url = "https://elpa.gnu.org/packages/lentic-server-0.2.tar";
sha256 = "1vifs91r4rm57rka8by50f8zg5pr2hjqwbdz28mbbxhkj3war6s5";
};
packageRequires = [ lentic web-server ];
meta = {
homepage = "https://elpa.gnu.org/packages/lentic-server.html";
license = lib.licenses.free;
};
}) {};
let-alist = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "let-alist";
@ -3182,14 +3224,36 @@
license = lib.licenses.free;
};
}) {};
listen = callPackage ({ elpaBuild
, emacs
, fetchurl
, lib
, persist
, taxy
, taxy-magit-section
, transient }:
elpaBuild {
pname = "listen";
ename = "listen";
version = "0.8";
src = fetchurl {
url = "https://elpa.gnu.org/packages/listen-0.8.tar";
sha256 = "1vj9fsyp5v1qh87asj23k625080x6c8mgkas4933lrz7l2g7h1y2";
};
packageRequires = [ emacs persist taxy taxy-magit-section transient ];
meta = {
homepage = "https://elpa.gnu.org/packages/listen.html";
license = lib.licenses.free;
};
}) {};
llm = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "llm";
ename = "llm";
version = "0.9.1";
version = "0.12.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/llm-0.9.1.tar";
sha256 = "0vib0zl41fsacc5d79f1l52j2vxnbqc37471b86cxw9rha0clr8m";
url = "https://elpa.gnu.org/packages/llm-0.12.1.tar";
sha256 = "11z56fqp0y13jmvm2611xyqsz41k01rsqdjvrzvbf33n56vsw713";
};
packageRequires = [ emacs ];
meta = {
@ -3317,6 +3381,21 @@
license = lib.licenses.free;
};
}) {};
m-buffer = callPackage ({ elpaBuild, fetchurl, lib, seq }:
elpaBuild {
pname = "m-buffer";
ename = "m-buffer";
version = "0.16";
src = fetchurl {
url = "https://elpa.gnu.org/packages/m-buffer-0.16.tar";
sha256 = "1mb03hrszxxsk61yvh70rnkn7iiwx1vx6n1br02clkpn2q2c0mq5";
};
packageRequires = [ seq ];
meta = {
homepage = "https://elpa.gnu.org/packages/m-buffer.html";
license = lib.licenses.free;
};
}) {};
map = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "map";
@ -3516,10 +3595,10 @@
elpaBuild {
pname = "modus-themes";
ename = "modus-themes";
version = "4.3.0";
version = "4.4.0";
src = fetchurl {
url = "https://elpa.gnu.org/packages/modus-themes-4.3.0.tar";
sha256 = "0zsglzqc36bw9r7fgvxjdcrdjar6xwad29kwyqd2k36bq3pivzq3";
url = "https://elpa.gnu.org/packages/modus-themes-4.4.0.tar";
sha256 = "1n6fmgj2kpdy2mmwg5hh6dic30zy0gd3ap6hlipl9qn08lawbbgq";
};
packageRequires = [ emacs ];
meta = {
@ -3527,6 +3606,21 @@
license = lib.licenses.free;
};
}) {};
mpdired = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "mpdired";
ename = "mpdired";
version = "1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/mpdired-1.tar";
sha256 = "1b7xsdgsrwy7qkshkk83bizz9r78g4pdfnavwl6riyb947gk6zkx";
};
packageRequires = [ emacs ];
meta = {
homepage = "https://elpa.gnu.org/packages/mpdired.html";
license = lib.licenses.free;
};
}) {};
multi-mode = callPackage ({ elpaBuild, fetchurl, lib }:
elpaBuild {
pname = "multi-mode";
@ -3900,10 +3994,10 @@
elpaBuild {
pname = "orderless";
ename = "orderless";
version = "1.0";
version = "1.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/orderless-1.0.tar";
sha256 = "0kslgrs857h3mm837hcb8v52ankbv0hm2pz0q136imckzj32m43s";
url = "https://elpa.gnu.org/packages/orderless-1.1.tar";
sha256 = "19iy0ps8h1qjh16mdybayd9i25bn27sa2slqsa6nslh251pxc0rk";
};
packageRequires = [ emacs ];
meta = {
@ -3915,10 +4009,10 @@
elpaBuild {
pname = "org";
ename = "org";
version = "9.6.19";
version = "9.6.23";
src = fetchurl {
url = "https://elpa.gnu.org/packages/org-9.6.19.tar";
sha256 = "0ibgw0i7nsn589k0ynifwdp1f3ia6p8369myhjqgmwy392cwrcxg";
url = "https://elpa.gnu.org/packages/org-9.6.23.tar";
sha256 = "0yqn3kag4anzm8ahfgjxrxjndzq6rbs6kayfq93gx4rn0qxa334q";
};
packageRequires = [ emacs ];
meta = {
@ -3975,10 +4069,10 @@
elpaBuild {
pname = "org-modern";
ename = "org-modern";
version = "1.1";
version = "1.2";
src = fetchurl {
url = "https://elpa.gnu.org/packages/org-modern-1.1.tar";
sha256 = "1aclips7y3dasjh6rjdcx1b6fkaripjam6120b7wm487qpjcrzc8";
url = "https://elpa.gnu.org/packages/org-modern-1.2.tar";
sha256 = "1kgvrsmbgadbr7wk48sgx1prlgpbp31nih9bl9div35d496njcnw";
};
packageRequires = [ compat emacs ];
meta = {
@ -4376,6 +4470,21 @@
license = lib.licenses.free;
};
}) {};
pq = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "pq";
ename = "pq";
version = "0.2";
src = fetchurl {
url = "https://elpa.gnu.org/packages/pq-0.2.tar";
sha256 = "0gy3i2l1fxwpav6l57yf3mml15lhwh9xp8sm40hlpgyn15nyz4c6";
};
packageRequires = [ emacs ];
meta = {
homepage = "https://elpa.gnu.org/packages/pq.html";
license = lib.licenses.free;
};
}) {};
project = callPackage ({ elpaBuild, emacs, fetchurl, lib, xref }:
elpaBuild {
pname = "project";
@ -4575,10 +4684,10 @@
elpaBuild {
pname = "rcirc-sqlite";
ename = "rcirc-sqlite";
version = "0.1.3";
version = "0.1.4";
src = fetchurl {
url = "https://elpa.gnu.org/packages/rcirc-sqlite-0.1.3.tar";
sha256 = "1pwxkw6dzwbg5g3rxilpp6iy3mzxgpn0mw59i3dcx25hdyizqhip";
url = "https://elpa.gnu.org/packages/rcirc-sqlite-0.1.4.tar";
sha256 = "0hz0nm35jq6fg9pr4j725r2awxbf1q23bzn85nhcbpafzb8mmajl";
};
packageRequires = [ emacs ];
meta = {
@ -4845,10 +4954,10 @@
elpaBuild {
pname = "rt-liberation";
ename = "rt-liberation";
version = "6";
version = "7";
src = fetchurl {
url = "https://elpa.gnu.org/packages/rt-liberation-6.tar";
sha256 = "1l87q2h1hqm5zpg1fz835gmbf5fgl9fvcqg42c17v6kim4has8zd";
url = "https://elpa.gnu.org/packages/rt-liberation-7.tar";
sha256 = "0gb1an3a68ib27jrc8x8grq5z3xya4b1gl8ii82a1clzf87n7k63";
};
packageRequires = [];
meta = {
@ -5215,10 +5324,10 @@
elpaBuild {
pname = "spacious-padding";
ename = "spacious-padding";
version = "0.3.0";
version = "0.4.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/spacious-padding-0.3.0.tar";
sha256 = "1iiaxgl18k8hkwwyz3qnargv6q8kwzyh39ai46k5xbpmyrsj4b16";
url = "https://elpa.gnu.org/packages/spacious-padding-0.4.1.tar";
sha256 = "02bc0r20b4mgnlzryq26q0jq45wfgpvv7y3zhvnaaqj11rw7779f";
};
packageRequires = [ emacs ];
meta = {
@ -5689,10 +5798,10 @@
elpaBuild {
pname = "tramp";
ename = "tramp";
version = "2.6.2.1";
version = "2.6.2.2";
src = fetchurl {
url = "https://elpa.gnu.org/packages/tramp-2.6.2.1.tar";
sha256 = "145riknpdvw7rvpz20m766yci3w012f241mw38pbbb9cb8pn2rbf";
url = "https://elpa.gnu.org/packages/tramp-2.6.2.2.tar";
sha256 = "0bbsff2qr71f70nxhdi19b3jzpv6bgfb7x7qkrccsygvsvgyrb2h";
};
packageRequires = [ emacs ];
meta = {
@ -5749,10 +5858,10 @@
elpaBuild {
pname = "transient";
ename = "transient";
version = "0.5.3";
version = "0.6.0";
src = fetchurl {
url = "https://elpa.gnu.org/packages/transient-0.5.3.tar";
sha256 = "12ak6rykg627rkwwiga5d9g9pzcrq2sliynqbr3lm8rvlwbdhkhx";
url = "https://elpa.gnu.org/packages/transient-0.6.0.tar";
sha256 = "1lsh8cvg1kspa8gl9fml0x7r61fbhjajmjqjf4r2s7qz102z66xb";
};
packageRequires = [ compat emacs seq ];
meta = {
@ -5899,10 +6008,10 @@
elpaBuild {
pname = "urgrep";
ename = "urgrep";
version = "0.4.0";
version = "0.4.1";
src = fetchurl {
url = "https://elpa.gnu.org/packages/urgrep-0.4.0.tar";
sha256 = "0l0gswml6hkna48gfljj3hajhcx3bbc1rqwb2v01hvqab05an7zs";
url = "https://elpa.gnu.org/packages/urgrep-0.4.1.tar";
sha256 = "1kwcb7xxk9lcby5s8gpd5dchya7qq063j217rxsjyn8vv9z91lfc";
};
packageRequires = [ compat emacs project ];
meta = {
@ -6106,10 +6215,10 @@
elpaBuild {
pname = "verilog-mode";
ename = "verilog-mode";
version = "2023.6.6.141322628";
version = "2024.3.1.121933719";
src = fetchurl {
url = "https://elpa.gnu.org/packages/verilog-mode-2023.6.6.141322628.tar";
sha256 = "14qls4v5yxrgyiimvvggimw5ddlx0ll387a1r6awm274rj4p3d19";
url = "https://elpa.gnu.org/packages/verilog-mode-2024.3.1.121933719.tar";
sha256 = "047kna2j1mbsibw1psxdp8qmg91dnjrdrskdzhys9pmaqggfl5ry";
};
packageRequires = [];
meta = {

View file

@ -64,10 +64,10 @@
elpaBuild {
pname = "annotate";
ename = "annotate";
version = "2.1.0";
version = "2.2.0";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/annotate-2.1.0.tar";
sha256 = "07q8s3qi3lm8g01ypvqqq0cn5jx5jrgyv74fbfam3mmz5l3mqp6q";
url = "https://elpa.nongnu.org/nongnu/annotate-2.2.0.tar";
sha256 = "1h1whavdrwfsc79kcvh2vbvjzqd7n01xzjb1acgyiy9wkyl79p7b";
};
packageRequires = [];
meta = {
@ -306,10 +306,10 @@
elpaBuild {
pname = "buttercup";
ename = "buttercup";
version = "1.33";
version = "1.34";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/buttercup-1.33.tar";
sha256 = "0245fq4iny1jnm440dzkq0fadw10ncnhkj28mayqs9iyyzj9g5h4";
url = "https://elpa.nongnu.org/nongnu/buttercup-1.34.tar";
sha256 = "0bdlky9d5fzc9x9wpjxyvrclz1rmzsnvc89lf0m5fhyp4r8jvxy4";
};
packageRequires = [ emacs ];
meta = {
@ -459,6 +459,26 @@
license = lib.licenses.free;
};
}) {};
consult-flycheck = callPackage ({ consult
, elpaBuild
, emacs
, fetchurl
, flycheck
, lib }:
elpaBuild {
pname = "consult-flycheck";
ename = "consult-flycheck";
version = "1.0";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/consult-flycheck-1.0.tar";
sha256 = "0901wliqdzj5dmam1kkbq0nxhywqf11182q7yxjxh98czy5w3xh8";
};
packageRequires = [ consult emacs flycheck ];
meta = {
homepage = "https://elpa.gnu.org/packages/consult-flycheck.html";
license = lib.licenses.free;
};
}) {};
corfu-terminal = callPackage ({ corfu
, elpaBuild
, emacs
@ -479,16 +499,16 @@
license = lib.licenses.free;
};
}) {};
crux = callPackage ({ elpaBuild, fetchurl, lib, seq }:
crux = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "crux";
ename = "crux";
version = "0.4.0";
version = "0.5.0";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/crux-0.4.0.tar";
sha256 = "01yg54s2l3zr4h7h3nw408bqzrr4yds9rfgc575b76006v5d3ciy";
url = "https://elpa.nongnu.org/nongnu/crux-0.5.0.tar";
sha256 = "0zdzfglzvhkzyvnkk2d217c6f8gnbcxlp8adimwrxgqh7c6gwihp";
};
packageRequires = [ seq ];
packageRequires = [ emacs ];
meta = {
homepage = "https://elpa.gnu.org/packages/crux.html";
license = lib.licenses.free;
@ -742,10 +762,10 @@
elpaBuild {
pname = "elpher";
ename = "elpher";
version = "3.5.1";
version = "3.6.0";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/elpher-3.5.1.tar";
sha256 = "0687npypihavghz9bjs8f6h10awjgjv5fdd11dmh43p1krhrga2w";
url = "https://elpa.nongnu.org/nongnu/elpher-3.6.0.tar";
sha256 = "0pa8y3zc768wdgp43546qvwr6ly2q9gznfrl6qmm90gkv5wrc5ln";
};
packageRequires = [ emacs ];
meta = {
@ -2682,10 +2702,10 @@
elpaBuild {
pname = "racket-mode";
ename = "racket-mode";
version = "1.0.20240219.135847";
version = "1.0.20240319.160226";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/racket-mode-1.0.20240219.135847.tar";
sha256 = "06g1ci7kq8fxjh65qwwnh530xvvh6pr9ha52f7xmbjf56iifn1da";
url = "https://elpa.nongnu.org/nongnu/racket-mode-1.0.20240319.160226.tar";
sha256 = "1alqiagpkbxqi8nyrn1qzfx23fagpn1ml9hqpyj897jwf5f03zsh";
};
packageRequires = [ emacs ];
meta = {
@ -3382,10 +3402,10 @@
elpaBuild {
pname = "visual-fill-column";
ename = "visual-fill-column";
version = "2.6.0";
version = "2.6.2";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/visual-fill-column-2.6.0.tar";
sha256 = "1gpjby6g9wq8p25q1a35hr56nfb4sbcdrf0bjxidh1diw5g5saw4";
url = "https://elpa.nongnu.org/nongnu/visual-fill-column-2.6.2.tar";
sha256 = "13z87xyzldllvga8iygb33qaqvrrc2qnc315zalvbmydw174cq1i";
};
packageRequires = [ emacs ];
meta = {
@ -3397,10 +3417,10 @@
elpaBuild {
pname = "web-mode";
ename = "web-mode";
version = "17.3.18";
version = "17.3.19";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/web-mode-17.3.18.tar";
sha256 = "18ylzq12gsayp3cmd8qjdqsnyiymjd95ffqs3xcyva6sl8d41hmy";
url = "https://elpa.nongnu.org/nongnu/web-mode-17.3.19.tar";
sha256 = "1z33y7p1dilwpwydb9q14n55q48n80mynm7fjr7ih91wvk8zz5di";
};
packageRequires = [ emacs ];
meta = {
@ -3560,10 +3580,10 @@
elpaBuild {
pname = "xah-fly-keys";
ename = "xah-fly-keys";
version = "24.21.20240220095736";
version = "24.24.20240324101507";
src = fetchurl {
url = "https://elpa.nongnu.org/nongnu/xah-fly-keys-24.21.20240220095736.tar";
sha256 = "04ra1m9mwhz3zh0776gbzfn4kn0yxgbfbh1hq78r2zxggvpjfikv";
url = "https://elpa.nongnu.org/nongnu/xah-fly-keys-24.24.20240324101507.tar";
sha256 = "1lqrrs5j523q33vvs85j3dlnd56bmnzglfkc8jilv6yq44dmv7v7";
};
packageRequires = [ emacs ];
meta = {

View file

@ -98,10 +98,10 @@ in
emacs29 = import ./make-emacs.nix (mkArgs {
pname = "emacs";
version = "29.2";
version = "29.3";
variant = "mainline";
rev = "29.2";
hash = "sha256-qSQmQzVyEGSr4GAI6rqnEwBvhl09D2D8MNasHqZQPL8=";
rev = "29.3";
hash = "sha256-4yN81djeKb9Hlr6MvaDdXqf4XOl0oolXEYGqkA+KUO0=";
});
emacs28-macport = import ./make-emacs.nix (mkArgs {

View file

@ -17081,5 +17081,17 @@ final: prev:
meta.homepage = "https://github.com/codethread/qmk.nvim/";
};
vim-godot = buildVimPlugin {
pname = "vim-godot";
version = "2024-02-18";
src = fetchFromGitHub {
owner = "habamax";
repo = "vim-godot";
rev = "f9c0b36b299efcc4aa4cb119a2be36a83fe10388";
sha256 = "sha256-HKp3CQwAOs+7TL8MjWZ2EHLHMZ3Ss7AckAZ5eOjTDEg=";
};
meta.homepage = "https://github.com/habamax/vim-godot/";
};
}

View file

@ -10,7 +10,7 @@ neovimRequireCheckHook () {
# editorconfig-checker-disable
export HOME="$TMPDIR"
@nvimBinary@ -es --headless -n -u NONE -i NONE --clean -V1 \
--cmd "set rtp+=$out" \
--cmd "set rtp+=$out,${dependencies/ /,}" \
--cmd "lua require('$nvimRequireCheck')"
fi
}

View file

@ -670,6 +670,9 @@
hardhat-nvim = super.hardhat-nvim.overrideAttrs {
dependencies = with self; [ overseer-nvim plenary-nvim ];
doInstallCheck = true;
nvimRequireCheck = "hardhat";
};
harpoon = super.harpoon.overrideAttrs {

View file

@ -1100,6 +1100,7 @@ https://github.com/junegunn/vim-github-dashboard/,,
https://github.com/tikhomirov/vim-glsl/,,
https://github.com/jamessan/vim-gnupg/,,
https://github.com/fatih/vim-go/,,
https://github.com/habamax/vim-godot/,HEAD,
https://github.com/rhysd/vim-grammarous/,,
https://github.com/jparise/vim-graphql/,,
https://github.com/mhinz/vim-grepper/,,

View file

@ -997,26 +997,26 @@ let
sources = {
"x86_64-linux" = {
arch = "linux-x64";
sha256 = "05kh6sf3jv3510q33chf8s5n1kfp9wcm7650va7mcrdkfr9g8ysq";
sha256 = "1y5g8ay9sfz7r21fhwb2wr28yng7w3f2l265ljnfkz8yv8qzqpgk";
};
"x86_64-darwin" = {
arch = "darwin-x64";
sha256 = "0242h9kq47qvs1xynr5x8dzxkc5pwgb6km0iqpyy9kydg8ng1vp3";
sha256 = "14v9p5k9c9s9hfb1ymmkp66kmm9pvnvvljzrrs9wmajss5mlglf5";
};
"aarch64-linux" = {
arch = "linux-arm64";
sha256 = "1qm3f2lh8mi3hnyp2bmx7j2lir6fmbbxkzh6b8zf579khhbapnaz";
sha256 = "1mngfy42crp8xs14s06rkyzv16ci12bq8y39miyy7wa3a343b0ii";
};
"aarch64-darwin" = {
arch = "darwin-arm64";
sha256 = "18w22z1c5qgkpw2zlwmi9gs9dx1pcm51f0r8my7ynnvgl6mp12sg";
sha256 = "1gd1kr91s52kc8ldzy78cbn6gix1b8cvd6jh4sfrhq7k8yyn7g1l";
};
};
in
{
name = "continue";
publisher = "Continue";
version = "0.8.12";
version = "0.8.22";
} // sources.${stdenv.system};
nativeBuildInputs = [
autoPatchelfHook

View file

@ -7,7 +7,7 @@
, isInsiders ? false
# sourceExecutableName is the name of the binary in the source archive over
# which we have no control and it is needed to run the insider version as
# documented in https://nixos.wiki/wiki/Visual_Studio_Code#Insiders_Build
# documented in https://wiki.nixos.org/wiki/Visual_Studio_Code#Insiders_Build
# On MacOS the insider binary is still called code instead of code-insiders as
# of 2023-08-06.
, sourceExecutableName ? "code" + lib.optionalString (isInsiders && stdenv.isLinux) "-insiders"

View file

@ -1,6 +1,7 @@
{ lib
, stdenv
, fetchFromGitHub
, fetchpatch
, cmake
, pkg-config
, wrapQtAppsHook
@ -71,6 +72,12 @@ stdenv.mkDerivation rec {
patches = [
# Remove when merged https://github.com/dolphin-emu/dolphin/pull/12070
./find-minizip-ng.patch
# fix buidl w/ glibc-2.39
(fetchpatch {
url = "https://github.com/dolphin-emu/dolphin/commit/3da2e15e6b95f02f66df461e87c8b896e450fdab.patch";
hash = "sha256-+8yGF412wQUYbyEuYWd41pgOgEbhCaezexxcI5CNehc=";
})
];
strictDeps = true;

View file

@ -11,7 +11,7 @@
stdenvNoCC.mkDerivation rec {
pname = "irpf";
version = "2023-1.5";
version = "2024-1.0";
# https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/download/pgd/dirpf
# Para outros sistemas operacionais -> Multi
@ -19,7 +19,7 @@ stdenvNoCC.mkDerivation rec {
year = lib.head (lib.splitVersion version);
in fetchzip {
url = "https://downloadirpf.receita.fazenda.gov.br/irpf/${year}/irpf/arquivos/IRPF${version}.zip";
hash = "sha256-L1X+xysQSJ43TO8NSdO+T4aalampd4REL+5Uv33kYUI=";
hash = "sha256-x47Ud/aSfPuZYMZSGhJLnNFtNE62I+WjaFFatJPMPYg=";
};
nativeBuildInputs = [ unzip makeWrapper copyDesktopItems ];

View file

@ -5,13 +5,13 @@
stdenv.mkDerivation {
pname = "hello-wayland";
version = "unstable-2023-10-26";
version = "0-unstable-2024-03-04";
src = fetchFromGitHub {
owner = "emersion";
repo = "hello-wayland";
rev = "b631afa4f6fd86560ccbdb8c7b6fe42851c06a57";
sha256 = "MaBzGZ05uCoeeiglFYHC40hQlPvtDw5sQhqXgtVDySc=";
rev = "5f3a35def81116f0a74fcaf5a421d66c6700482d";
hash = "sha256-gcLR8gosQlPPgFrxqmRQ6/59RjAfJNX6CcsYP+L+A58=";
};
separateDebugInfo = true;

View file

@ -74,6 +74,6 @@ stdenv.mkDerivation rec {
homepage = "https://gitlab.com/schmiddi-on-mobile/railway";
license = lib.licenses.gpl3Plus;
mainProgram = "diebahn";
maintainers = with lib.maintainers; [ dotlambda ];
maintainers = with lib.maintainers; [ dotlambda lilacious ];
};
}

View file

@ -1,18 +1,19 @@
GEM
remote: https://rubygems.org/
specs:
RedCloth (4.3.2)
asciidoctor (2.0.18)
RedCloth (4.3.4)
asciidoctor (2.0.22)
base64 (0.2.0)
builder (3.2.4)
concurrent-ruby (1.2.2)
concurrent-ruby (1.2.3)
crass (1.0.6)
creole (0.5.0)
execjs (2.8.1)
execjs (2.9.1)
expression_parser (0.9.0)
ffi (1.15.5)
ffi (1.16.3)
gemojione (4.3.3)
json
github-markup (4.0.1)
github-markup (4.0.2)
gollum (5.3.2)
gemojione (~> 4.1)
gollum-lib (>= 5.2.3, < 6.0)
@ -45,51 +46,51 @@ GEM
mime-types (~> 3.4)
rugged (~> 1.5)
htmlentities (4.3.4)
i18n (1.13.0)
i18n (1.14.4)
concurrent-ruby (~> 1.0)
json (2.6.3)
json (2.7.1)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
loofah (2.20.0)
loofah (2.22.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mime-types (3.4.1)
nokogiri (>= 1.12.0)
mime-types (3.5.2)
mime-types-data (~> 3.2015)
mime-types-data (3.2023.0218.1)
mini_portile2 (2.8.2)
mime-types-data (3.2024.0305)
mini_portile2 (2.8.5)
multi_json (1.15.0)
mustache (1.1.1)
mustache-sinatra (2.0.0)
mustache (~> 1.0)
mustermann (2.0.2)
ruby2_keywords (~> 0.0.1)
nokogiri (1.14.3)
mini_portile2 (~> 2.8.0)
nokogiri (1.16.3)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
octicons (12.1.0)
nokogiri (>= 1.6.3.1)
org-ruby (0.9.12)
rubypants (~> 0.2)
psych (5.1.0)
psych (5.1.2)
stringio
racc (1.6.2)
rack (2.2.7)
racc (1.7.3)
rack (2.2.9)
rack-protection (2.2.4)
rack
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rdoc (6.5.0)
rdoc (6.6.3.1)
psych (>= 4.0.0)
rexml (3.2.5)
rexml (3.2.6)
rouge (3.30.0)
rss (0.2.9)
rexml
ruby2_keywords (0.0.5)
rubypants (0.7.1)
rugged (1.6.3)
rugged (1.7.2)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
@ -106,23 +107,24 @@ GEM
rack-protection (= 2.2.4)
sinatra (= 2.2.4)
tilt (~> 2.0)
sprockets (3.7.2)
sprockets (3.7.3)
base64
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-helpers (1.4.0)
sprockets (>= 2.2)
stringio (3.0.6)
stringio (3.1.0)
therubyrhino (2.1.2)
therubyrhino_jar (>= 1.7.4, < 1.7.9)
therubyrhino_jar (1.7.8)
tilt (2.1.0)
tilt (2.3.0)
twitter-text (1.14.7)
unf (~> 0.1.0)
uglifier (4.2.0)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unf_ext (0.0.9.1)
useragent (0.16.10)
webrick (1.8.1)
wikicloth (0.8.3)
@ -144,4 +146,4 @@ DEPENDENCIES
wikicloth
BUNDLED WITH
2.4.12
2.5.6

View file

@ -4,10 +4,20 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "11z3vnd8vh3ny1vx69bjrbck5b2g8zsbj94npyadpn7fdp8y3ldv";
sha256 = "1mnan6dxw4aqii9kcmp1s3sc91jiwaqkdpsg6g01fdisb6xz3n56";
type = "gem";
};
version = "2.0.18";
version = "2.0.22";
};
base64 = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "01qml0yilb9basf7is2614skjp8384h2pycfx86cr8023arfj98g";
type = "gem";
};
version = "0.2.0";
};
builder = {
groups = ["default"];
@ -24,10 +34,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0krcwb6mn0iklajwngwsg850nk8k9b35dhmc2qkbdqvmifdi2y9q";
sha256 = "1qh1b14jwbbj242klkyz5fc7npd4j0mvndz62gajhvl1l3wd7zc2";
type = "gem";
};
version = "1.2.2";
version = "1.2.3";
};
crass = {
groups = ["default"];
@ -54,10 +64,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "121h6af4i6wr3wxvv84y53jcyw2sk71j5wsncm6wq6yqrwcrk4vd";
sha256 = "1yywajqlpjhrj1m43s3lfg3i4lkb6pxwccmwps7qw37ndmphdzg8";
type = "gem";
};
version = "2.8.1";
version = "2.9.1";
};
expression_parser = {
groups = ["default"];
@ -74,10 +84,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1862ydmclzy1a0cjbvm8dz7847d9rch495ib0zb64y84d3xd4bkg";
sha256 = "1yvii03hcgqj30maavddqamqy50h7y6xcn2wcyq72wn823zl4ckd";
type = "gem";
};
version = "1.15.5";
version = "1.16.3";
};
gemojione = {
dependencies = ["json"];
@ -95,10 +105,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0p40hbrrzq9gypkx0p8wqdqa2gfmmw2cd9a0sv2dw1nnk1qbcl8y";
sha256 = "0mv2l0h3v5g4cwqh2lgb3braafh8n3v2s84i573wi5m79f4qhw1z";
type = "gem";
};
version = "4.0.1";
version = "4.0.2";
};
gollum = {
dependencies = ["gemojione" "gollum-lib" "i18n" "kramdown" "kramdown-parser-gfm" "mustache-sinatra" "octicons" "rdoc" "rss" "sass" "sinatra" "sinatra-contrib" "sprockets" "sprockets-helpers" "therubyrhino" "uglifier" "useragent" "webrick"];
@ -149,20 +159,20 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1yk33slipi3i1kydzrrchbi7cgisaxym6pgwlzx7ir8vjk6wl90x";
sha256 = "0lbm33fpb3w06wd2231sg58dwlwgjsvym93m548ajvl6s3mfvpn7";
type = "gem";
};
version = "1.13.0";
version = "1.14.4";
};
json = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0nalhin1gda4v8ybk6lq8f407cgfrj6qzn234yra4ipkmlbfmal6";
sha256 = "0r9jmjhg2ly3l736flk7r2al47b5c8cayh0gqkq0yhjqzc9a6zhq";
type = "gem";
};
version = "2.6.3";
version = "2.7.1";
};
kramdown = {
dependencies = ["rexml"];
@ -192,10 +202,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1mi4ia13fisc97fzd8xcd9wkjdki7zfbmdn1xkdzplicir68gyp8";
sha256 = "1zkjqf37v2d7s11176cb35cl83wls5gm3adnfkn2zcc61h3nxmqh";
type = "gem";
};
version = "2.20.0";
version = "2.22.0";
};
mime-types = {
dependencies = ["mime-types-data"];
@ -203,30 +213,30 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0ipw892jbksbxxcrlx9g5ljq60qx47pm24ywgfbyjskbcl78pkvb";
sha256 = "1r64z0m5zrn4k37wabfnv43wa6yivgdfk6cf2rpmmirlz889yaf1";
type = "gem";
};
version = "3.4.1";
version = "3.5.2";
};
mime-types-data = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1pky3vzaxlgm9gw5wlqwwi7wsw3jrglrfflrppvvnsrlaiz043z9";
sha256 = "00x7w5xqsj9m33v3vkmy23wipkkysafksib53ypzn27p5g81w455";
type = "gem";
};
version = "3.2023.0218.1";
version = "3.2024.0305";
};
mini_portile2 = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0z7f38iq37h376n9xbl4gajdrnwzq284c9v1py4imw3gri2d5cj6";
sha256 = "1kl9c3kdchjabrihdqfmcplk3lq4cw1rr9f378y6q22qwy5dndvs";
type = "gem";
};
version = "2.8.2";
version = "2.8.5";
};
multi_json = {
groups = ["default"];
@ -276,10 +286,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0fnw0z8zl8b5k35g9m5hhc1g4s6ajzjinhyxnqjrx7l7p07fw71v";
sha256 = "0j72sg8n8834vbw2x8glcp46y5r2dls2pj64ll7rmf6mri9s52j9";
type = "gem";
};
version = "1.14.3";
version = "1.16.3";
};
octicons = {
dependencies = ["nokogiri"];
@ -309,30 +319,30 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1msambb54r3d1sg6smyj4k2pj9h9lz8jq4jamip7ivcyv32a85vz";
sha256 = "0s5383m6004q76xm3lb732bp4sjzb6mxb6rbgn129gy2izsj4wrk";
type = "gem";
};
version = "5.1.0";
version = "5.1.2";
};
racc = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "09jgz6r0f7v84a7jz9an85q8vvmp743dqcsdm3z9c8rqcqv6pljq";
sha256 = "01b9662zd2x9bp4rdjfid07h09zxj7kvn7f5fghbqhzc625ap1dp";
type = "gem";
};
version = "1.6.2";
version = "1.7.3";
};
rack = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "16w217k9z02c4hqizym8dkj6bqmmzx4qdvqpnskgzf174a5pwdxk";
sha256 = "0hj0rkw2z9r1lcg2wlrcld2n3phwrcgqcp7qd1g9a7hwgalh2qzx";
type = "gem";
};
version = "2.2.7";
version = "2.2.9";
};
rack-protection = {
dependencies = ["rack"];
@ -372,30 +382,30 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "05r2cxscapr9saqjw8dlp89as7jvc2mlz1h5kssrmkbz105qmfcm";
sha256 = "0ib3cnf4yllvw070gr4bz94sbmqx3haqc5f846fsvdcs494vgxrr";
type = "gem";
};
version = "6.5.0";
version = "6.6.3.1";
};
RedCloth = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0m9dv7ya9q93r8x1pg2gi15rxlbck8m178j1fz7r5v6wr1avrrqy";
sha256 = "15r2h7rfp4bi9i0bfmvgnmvmw0kl3byyac53rcakk4qsv7yv4caj";
type = "gem";
};
version = "4.3.2";
version = "4.3.4";
};
rexml = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
sha256 = "05i8518ay14kjbma550mv0jm8a6di8yp5phzrd8rj44z9qnrlrp0";
type = "gem";
};
version = "3.2.5";
version = "3.2.6";
};
rouge = {
groups = ["default"];
@ -443,10 +453,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "016bawsahkhxx7p8azxirpl7y2y7i8a027pj8910gwf6ipg329in";
sha256 = "1sccng15h8h3mcjxfgvxy85lfpswbj0nhmzwwsqdffbzqgsb2jch";
type = "gem";
};
version = "1.6.3";
version = "1.7.2";
};
sass = {
dependencies = ["sass-listen"];
@ -493,15 +503,15 @@
version = "2.2.4";
};
sprockets = {
dependencies = ["concurrent-ruby" "rack"];
dependencies = ["base64" "concurrent-ruby" "rack"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay";
sha256 = "0lyc6mx4yalsnxc9yp4a5xra4nz1nwwbk5634wlfncml0ll1bnnw";
type = "gem";
};
version = "3.7.2";
version = "3.7.3";
};
sprockets-helpers = {
dependencies = ["sprockets"];
@ -519,10 +529,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "10w46rlh844kax248l1m3pyrj94n1qpc9691j8r5v0rzdxibpy7v";
sha256 = "063psvsn1aq6digpznxfranhcpmi0sdv2jhra5g0459sw0x2dxn1";
type = "gem";
};
version = "3.0.6";
version = "3.1.0";
};
therubyrhino = {
dependencies = ["therubyrhino_jar"];
@ -550,10 +560,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1qmhi6d9przjzhsyk9g5pq2j75c656msh6xzprqd2mxgphf23jxs";
sha256 = "0p3l7v619hwfi781l3r7ypyv1l8hivp09r18kmkn6g11c4yr1pc2";
type = "gem";
};
version = "2.1.0";
version = "2.3.0";
};
twitter-text = {
dependencies = ["unf"];
@ -593,10 +603,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1yj2nz2l101vr1x9w2k83a0fag1xgnmjwp8w8rw4ik2rwcz65fch";
sha256 = "1sf6bxvf6x8gihv6j63iakixmdddgls58cpxpg32chckb2l18qcj";
type = "gem";
};
version = "0.0.8.2";
version = "0.0.9.1";
};
useragent = {
groups = ["default"];

View file

@ -14,12 +14,11 @@ GEM
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
base64 (0.2.0)
bigdecimal (3.1.6)
bigdecimal (3.1.7)
colorator (1.1.0)
concurrent-ruby (1.2.3)
connection_pool (2.4.1)
drb (2.2.0)
ruby2_keywords
drb (2.2.1)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
@ -27,12 +26,13 @@ GEM
ffi (1.16.3)
forwardable-extended (2.6.0)
gemoji (4.1.0)
google-protobuf (3.25.3)
google-protobuf (4.26.1)
rake (>= 13)
html-pipeline (2.14.3)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.8.0)
i18n (1.14.1)
i18n (1.14.4)
concurrent-ruby (~> 1.0)
jekyll (4.3.3)
addressable (~> 2.4)
@ -77,9 +77,9 @@ GEM
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
mini_portile2 (2.8.5)
minitest (5.22.2)
minitest (5.22.3)
mutex_m (0.2.0)
nokogiri (1.16.2)
nokogiri (1.16.3)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
pathutil (0.16.2)
@ -91,11 +91,10 @@ GEM
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.6)
rouge (4.2.0)
ruby2_keywords (0.0.5)
rouge (4.2.1)
safe_yaml (1.0.5)
sass-embedded (1.71.1)
google-protobuf (~> 3.25)
sass-embedded (1.72.0)
google-protobuf (>= 3.25, < 5.0)
rake (>= 13.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)

View file

@ -36,10 +36,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "00db5v09k1z3539g1zrk7vkjrln9967k08adh6qx33ng97a2gg5w";
sha256 = "0cq1c29zbkcxgdihqisirhcw76xc768z2zpd5vbccpq0l1lv76g7";
type = "gem";
};
version = "3.1.6";
version = "3.1.7";
};
colorator = {
groups = ["default"];
@ -72,15 +72,14 @@
version = "2.4.1";
};
drb = {
dependencies = ["ruby2_keywords"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "03ylflxbp9jrs1hx3d4wvx05yb9hdq4a0r706zz6qc6kvqfazr79";
sha256 = "0h5kbj9hvg5hb3c7l425zpds0vb42phvln2knab8nmazg2zp5m79";
type = "gem";
};
version = "2.2.0";
version = "2.2.1";
};
em-websocket = {
dependencies = ["eventmachine" "http_parser.rb"];
@ -134,14 +133,15 @@
version = "4.1.0";
};
google-protobuf = {
dependencies = ["rake"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1mnxzcq8kmyfb9bkzqnp019d1hx1vprip3yzdkkha6b3qz5rgg9r";
sha256 = "14s40yxj35vixx9pvpnbrkz9z7ga3m7vcy72yll1flnn3cirl1aj";
type = "gem";
};
version = "3.25.3";
version = "4.26.1";
};
html-pipeline = {
dependencies = ["activesupport" "nokogiri"];
@ -170,10 +170,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx";
sha256 = "0lbm33fpb3w06wd2231sg58dwlwgjsvym93m548ajvl6s3mfvpn7";
type = "gem";
};
version = "1.14.1";
version = "1.14.4";
};
jekyll = {
dependencies = ["addressable" "colorator" "em-websocket" "i18n" "jekyll-sass-converter" "jekyll-watch" "kramdown" "kramdown-parser-gfm" "liquid" "mercenary" "pathutil" "rouge" "safe_yaml" "terminal-table" "webrick"];
@ -331,10 +331,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0667vf0zglacry87nkcl3ns8421aydvz71vfa3g3yjhiq8zh19f5";
sha256 = "07lq26b86giy3ha3fhrywk9r1ajhc2pm2mzj657jnpnbj1i6g17a";
type = "gem";
};
version = "5.22.2";
version = "5.22.3";
};
mutex_m = {
groups = ["default"];
@ -352,10 +352,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "173zavvxlwyi48lfskk48wcrdbkvjlhjhvy4jpcrfx72rpjjx4k8";
sha256 = "0j72sg8n8834vbw2x8glcp46y5r2dls2pj64ll7rmf6mri9s52j9";
type = "gem";
};
version = "1.16.2";
version = "1.16.3";
};
pathutil = {
dependencies = ["forwardable-extended"];
@ -434,20 +434,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1fkfa0iq3r9b0zzrxpxha17avmyzci3kidzmfbf6fd1279mndpb0";
sha256 = "1zd1pdldi6h8x27dqim7cy8m69xr01aw5c8k1zhkz497n4np6wgk";
type = "gem";
};
version = "4.2.0";
};
ruby2_keywords = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
type = "gem";
};
version = "0.0.5";
version = "4.2.1";
};
safe_yaml = {
groups = ["default"];
@ -465,10 +455,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1ccqqkmicqs2nbawyknb17qfafwqq0k6jxibcm86vqd1jp185pxa";
sha256 = "0bixk8c02dhflvhi4s5hxzjg8akzgicvjxjvxx74nah2j8qfblq5";
type = "gem";
};
version = "1.71.1";
version = "1.72.0";
};
terminal-table = {
dependencies = ["unicode-display_width"];

View file

@ -14,7 +14,7 @@ GEM
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
base64 (0.2.0)
bigdecimal (3.1.6)
bigdecimal (3.1.7)
classifier-reborn (2.3.0)
fast-stemmer (~> 1.0)
matrix (~> 0.4)
@ -26,8 +26,7 @@ GEM
colorator (1.1.0)
concurrent-ruby (1.2.3)
connection_pool (2.4.1)
drb (2.2.0)
ruby2_keywords
drb (2.2.1)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
@ -41,12 +40,13 @@ GEM
ffi (1.16.3)
forwardable-extended (2.6.0)
gemoji (4.1.0)
google-protobuf (3.25.3)
google-protobuf (4.26.1)
rake (>= 13)
html-pipeline (2.14.3)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.8.0)
i18n (1.14.1)
i18n (1.14.4)
concurrent-ruby (~> 1.0)
jekyll (4.3.3)
addressable (~> 2.4)
@ -81,7 +81,7 @@ GEM
html-pipeline (~> 2.3)
jekyll (>= 3.7, < 5.0)
jekyll-paginate (1.1.0)
jekyll-polyglot (1.7.0)
jekyll-polyglot (1.8.0)
jekyll (>= 4.0, >= 3.0)
jekyll-redirect-from (0.16.0)
jekyll (>= 3.3, < 5.0)
@ -114,14 +114,14 @@ GEM
mercenary (0.4.0)
mime-types (3.5.2)
mime-types-data (~> 3.2015)
mime-types-data (3.2024.0206)
mime-types-data (3.2024.0305)
mini_magick (4.12.0)
mini_portile2 (2.8.5)
minitest (5.22.2)
minitest (5.22.3)
mutex_m (0.2.0)
net-http (0.4.1)
uri
nokogiri (1.16.2)
nokogiri (1.16.3)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
octokit (4.25.1)
@ -137,14 +137,13 @@ GEM
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rdoc (6.6.2)
rdoc (6.6.3.1)
psych (>= 4.0.0)
rexml (3.2.6)
rouge (4.2.0)
ruby2_keywords (0.0.5)
rouge (4.2.1)
safe_yaml (1.0.5)
sass-embedded (1.71.1)
google-protobuf (~> 3.25)
sass-embedded (1.72.0)
google-protobuf (>= 3.25, < 5.0)
rake (>= 13.0.0)
sawyer (0.9.2)
addressable (>= 2.3.5)

View file

@ -36,10 +36,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "00db5v09k1z3539g1zrk7vkjrln9967k08adh6qx33ng97a2gg5w";
sha256 = "0cq1c29zbkcxgdihqisirhcw76xc768z2zpd5vbccpq0l1lv76g7";
type = "gem";
};
version = "3.1.6";
version = "3.1.7";
};
classifier-reborn = {
dependencies = ["fast-stemmer" "matrix"];
@ -126,15 +126,14 @@
version = "2.4.1";
};
drb = {
dependencies = ["ruby2_keywords"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "03ylflxbp9jrs1hx3d4wvx05yb9hdq4a0r706zz6qc6kvqfazr79";
sha256 = "0h5kbj9hvg5hb3c7l425zpds0vb42phvln2knab8nmazg2zp5m79";
type = "gem";
};
version = "2.2.0";
version = "2.2.1";
};
em-websocket = {
dependencies = ["eventmachine" "http_parser.rb"];
@ -242,14 +241,15 @@
version = "4.1.0";
};
google-protobuf = {
dependencies = ["rake"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1mnxzcq8kmyfb9bkzqnp019d1hx1vprip3yzdkkha6b3qz5rgg9r";
sha256 = "14s40yxj35vixx9pvpnbrkz9z7ga3m7vcy72yll1flnn3cirl1aj";
type = "gem";
};
version = "3.25.3";
version = "4.26.1";
};
html-pipeline = {
dependencies = ["activesupport" "nokogiri"];
@ -278,10 +278,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx";
sha256 = "0lbm33fpb3w06wd2231sg58dwlwgjsvym93m548ajvl6s3mfvpn7";
type = "gem";
};
version = "1.14.1";
version = "1.14.4";
};
jekyll = {
dependencies = ["addressable" "colorator" "em-websocket" "i18n" "jekyll-sass-converter" "jekyll-watch" "kramdown" "kramdown-parser-gfm" "liquid" "mercenary" "pathutil" "rouge" "safe_yaml" "terminal-table" "webrick"];
@ -376,10 +376,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "189scj27hczbxp02s5v27r4civfqq2fr981jrp0xldwvcw5qfbll";
sha256 = "0xbmsm30jgpbamqvbjvjgfq2w9ihdpqsbay9jrd5pljrbhvy02di";
type = "gem";
};
version = "1.7.0";
version = "1.8.0";
};
jekyll-redirect-from = {
dependencies = ["jekyll"];
@ -584,10 +584,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0zpn5brxdf5akh7ij511bkrd30fxd7697shmxxszahqj9m62zvn5";
sha256 = "00x7w5xqsj9m33v3vkmy23wipkkysafksib53ypzn27p5g81w455";
type = "gem";
};
version = "3.2024.0206";
version = "3.2024.0305";
};
mini_magick = {
groups = ["default"];
@ -614,10 +614,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0667vf0zglacry87nkcl3ns8421aydvz71vfa3g3yjhiq8zh19f5";
sha256 = "07lq26b86giy3ha3fhrywk9r1ajhc2pm2mzj657jnpnbj1i6g17a";
type = "gem";
};
version = "5.22.2";
version = "5.22.3";
};
mutex_m = {
groups = ["default"];
@ -646,10 +646,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "173zavvxlwyi48lfskk48wcrdbkvjlhjhvy4jpcrfx72rpjjx4k8";
sha256 = "0j72sg8n8834vbw2x8glcp46y5r2dls2pj64ll7rmf6mri9s52j9";
type = "gem";
};
version = "1.16.2";
version = "1.16.3";
};
octokit = {
dependencies = ["faraday" "sawyer"];
@ -741,10 +741,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "14wnrpd1kl43ynk1wwwgv9avsw84d1lrvlfyrjy3d4h7h7ndnqzp";
sha256 = "0ib3cnf4yllvw070gr4bz94sbmqx3haqc5f846fsvdcs494vgxrr";
type = "gem";
};
version = "6.6.2";
version = "6.6.3.1";
};
rexml = {
groups = ["default"];
@ -761,20 +761,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1fkfa0iq3r9b0zzrxpxha17avmyzci3kidzmfbf6fd1279mndpb0";
sha256 = "1zd1pdldi6h8x27dqim7cy8m69xr01aw5c8k1zhkz497n4np6wgk";
type = "gem";
};
version = "4.2.0";
};
ruby2_keywords = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
type = "gem";
};
version = "0.0.5";
version = "4.2.1";
};
safe_yaml = {
groups = ["default"];
@ -792,10 +782,10 @@
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1ccqqkmicqs2nbawyknb17qfafwqq0k6jxibcm86vqd1jp185pxa";
sha256 = "0bixk8c02dhflvhi4s5hxzjg8akzgicvjxjvxx74nah2j8qfblq5";
type = "gem";
};
version = "1.71.1";
version = "1.72.0";
};
sawyer = {
dependencies = ["addressable" "faraday"];

View file

@ -6,13 +6,13 @@
stdenv.mkDerivation rec {
pname = "johnny-reborn-engine";
version = "0.30";
version = "0.34";
src = fetchFromGitHub {
owner = "xesf";
repo = "jc_reborn";
rev = "v${version}";
hash = "sha256-n3ELNFvjeDzbamyQIdM9mf/A1sstuhCGzrL9NuXf90Y=";
hash = "sha256-JXaYSHpow7Pzy+ATEinET9ffvPIkOmlylnerZJnMUjY=";
};
buildInputs = [ SDL2 ];

View file

@ -1,35 +1,31 @@
{ stdenv, lib, fetchFromGitea, qmake, qttools, qtbase, qtserialport
, qtconnectivity, qtcharts, wrapQtAppsHook }:
, qtconnectivity, qtcharts, wrapQtAppsHook, fetchpatch }:
stdenv.mkDerivation (finalAttrs: {
pname = "ubpm";
version = "1.7.3";
version = "1.10.0";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "LazyT";
repo = "ubpm";
rev = finalAttrs.version;
hash = "sha256-6lvDSU0ssfs71xrac6R6qlmE0QyVcAMTUf0xmJPVzhY=";
hash = "sha256-BUUn1WyLT7nm4I+2SpO1ZtIf8isGDy8Za15SiO7sXL8=";
};
postPatch = ''
substituteInPlace sources/mainapp/mainapp.pro \
--replace 'INSTALLDIR = /tmp/ubpm.AppDir' "INSTALLDIR = $out" \
--replace '/usr/bin' '/bin' \
--replace 'INSTALLS += target translations themes devices help lin' 'INSTALLS += target translations themes devices help'
'';
patches = [
# fixes qmake for nix
(fetchpatch {
url =
"https://codeberg.org/LazyT/ubpm/commit/f18841d6473cab9aa2a9d4c02392b8e103245ef6.diff";
hash = "sha256-lgXWu8PUUCt66btj6hVgOFXz3U1BJM3ataSo1MpHkfU=";
})
];
preConfigure = ''
cd ./sources/
'';
postInstall = ''
install -Dm644 ../package/lin/ubpm.desktop -t $out/share/applications/
install -Dm644 ../package/lin/de.lazyt.ubpm.appdata.xml -t $out/share/metainfo/
install -Dm644 ../sources/mainapp/res/ico/app.png $out/share/icons/hicolor/256x256/apps/ubpm.png
'';
postFixup = ''
wrapQtApp $out/bin/ubpm
'';
@ -47,5 +43,6 @@ stdenv.mkDerivation (finalAttrs: {
mainProgram = "ubpm";
license = licenses.gpl3Only;
maintainers = with maintainers; [ kurnevsky ];
broken = stdenv.isDarwin;
};
})

View file

@ -1,39 +1,49 @@
{ stdenv
, lib
{ lib
, stdenv
, fetchgit
, ninja
, pkg-config
, ed
, wrapGAppsHook
, webkitgtk
, libxml2
, glib
, glib-networking
, gettext
}:
stdenv.mkDerivation rec {
pname = "badwolf";
version = "1.2.2";
version = "1.3.0";
src = fetchgit {
url = "git://hacktivis.me/git/badwolf.git";
url = "https://hacktivis.me/git/badwolf.git";
rev = "v${version}";
hash = "sha256-HfAsq6z+1kqMAsNxJjWJx9nd2cbv0XN4KRS8cYuhOsQ=";
hash = "sha256-feWSxK9TJ5MWxUKutuTcdmMk5IbLjNseUAvfm20kQ1U=";
};
preConfigure = ''
export PREFIX=$out
'';
# configure script not accepting '--prefix'
prefixKey = "PREFIX=";
nativeBuildInputs = [ pkg-config wrapGAppsHook ];
nativeBuildInputs = [
ninja
pkg-config
ed
wrapGAppsHook
];
buildInputs = [ webkitgtk libxml2 gettext glib glib-networking ];
buildInputs = [
webkitgtk
libxml2
gettext
glib-networking
];
meta = with lib; {
description = "Minimalist and privacy-oriented WebKitGTK+ browser";
mainProgram = "badwolf";
homepage = "https://hacktivis.me/projects/badwolf";
license = licenses.bsd3;
license = with licenses; [ bsd3 cc-by-sa-40 ];
platforms = platforms.linux;
maintainers = with maintainers; [ laalsaas ];
maintainers = with maintainers; [ laalsaas aleksana ];
};
}

View file

@ -12,13 +12,13 @@
stdenv.mkDerivation {
pname = "litebrowser";
version = "unstable-2022-10-31";
version = "unstable-2024-02-25";
src = fetchFromGitHub {
owner = "litehtml";
repo = "litebrowser-linux";
rev = "4654f8fb2d5e2deba7ac6223b6639341bd3b7eba";
hash = "sha256-SvW1AOxLBLKqa+/2u2Zn+/t33ZzQHmqlcLRl6z0rK9U=";
rev = "8130cf50af90e07d201d43b934b5a57f7ed4e68d";
hash = "sha256-L/pd4VypDfjLKfh+HLpc4um+POWGzGa4OOttudwJxyk=";
fetchSubmodules = true; # litehtml submodule
};
@ -46,6 +46,7 @@ stdenv.mkDerivation {
'';
meta = with lib; {
broken = stdenv.cc.isClang; # https://github.com/litehtml/litebrowser-linux/issues/19
description = "A simple browser based on the litehtml engine";
mainProgram = "litebrowser";
homepage = "https://github.com/litehtml/litebrowser-linux";

View file

@ -2,13 +2,13 @@
buildGoModule rec {
pname = "cilium-cli";
version = "0.16.3";
version = "0.16.4";
src = fetchFromGitHub {
owner = "cilium";
repo = pname;
rev = "v${version}";
hash = "sha256-WD0CUPl9Qkalhog2IbefMkiLiVZFW59X21sYH4hUqZs=";
hash = "sha256-fhTjYhRCtJu18AGYF6hiTdRMEdlNO+DmDwh2hZBXzPk=";
};
vendorHash = null;
@ -37,11 +37,12 @@ buildGoModule rec {
--zsh <($out/bin/cilium completion zsh)
'';
meta = with lib; {
meta = {
changelog = "https://github.com/cilium/cilium-cli/releases/tag/v${version}";
description = "CLI to install, manage & troubleshoot Kubernetes clusters running Cilium";
license = licenses.asl20;
license = lib.licenses.asl20;
homepage = "https://www.cilium.io/";
maintainers = with maintainers; [ humancalico bryanasdev000 qjoly ];
maintainers = with lib.maintainers; [ bryanasdev000 humancalico qjoly superherointj ];
mainProgram = "cilium";
};
}

View file

@ -12,16 +12,16 @@
buildGoModule rec {
pname = "kubebuilder";
version = "3.14.0";
version = "3.14.1";
src = fetchFromGitHub {
owner = "kubernetes-sigs";
repo = "kubebuilder";
rev = "v${version}";
hash = "sha256-em+I2YICcqljaaNQ+zOAnOZ552elmV6Ywbfla8buwaY=";
hash = "sha256-TMKixwZonYGPXIqOtgnuilbH7BaIRyqJU6uKtp9ANKM=";
};
vendorHash = "sha256-iBwhpVs9u5AQAvmzb69SaewdYHmmaV19Bstd0Tux9CA=";
vendorHash = "sha256-Hl01dFSffYv59zensKTjXWLXxwfkQYAO5xadlc5iBJY=";
subPackages = ["cmd"];

View file

@ -2,13 +2,13 @@
buildGoModule rec {
pname = "kubedb-cli";
version = "0.42.1";
version = "0.44.0";
src = fetchFromGitHub {
owner = "kubedb";
repo = "cli";
rev = "v${version}";
sha256 = "sha256-i+0oQaEHMu3525mJTQyL+Me2DPFSpaIK1xGaPMR2M0s=";
sha256 = "sha256-ppsGSzgJvAHRGs6PGPNgE7nDbK8SPYBPNbAlGwocAZs=";
};
vendorHash = null;

View file

@ -1,16 +1,16 @@
{ buildGoModule, lib, fetchFromGitHub }:
buildGoModule rec {
pname = "tfswitch";
version = "0.13.1308";
version = "1.0.0";
src = fetchFromGitHub {
owner = "warrensbox";
repo = "terraform-switcher";
rev = version;
sha256 = "sha256-EyA7LwfL3vCNzd2wpyUbrUnvkM0/f7/cQp+jcAcGZsg=";
sha256 = "sha256-zUFnJCYh6XM0HiET45ZRa/ESS/n3XdYKkUJuLiDDRAg=";
};
vendorHash = "sha256-NX+vzI/Fa/n9ZQjpESes4fNVAmKlA1rqPwSKsL2GEUY=";
vendorHash = "sha256-DsC9djgt7Er2m2TacUldpJP43jC0IBklPnu41Saf4DY=";
# Disable tests since it requires network access and relies on the
# presence of release.hashicorp.com

View file

@ -10,16 +10,16 @@
buildGoModule rec {
pname = "werf";
version = "1.2.300";
version = "1.2.301";
src = fetchFromGitHub {
owner = "werf";
repo = "werf";
rev = "v${version}";
hash = "sha256-DWSjdgLjVJHlcXa6QV2KzASFQkCpUDSrtYpx/oa+Ff4=";
hash = "sha256-w7gHcHXvCWGzIiq4NvKjha/gs7W8fmNnZPe99lHstIg=";
};
vendorHash = "sha256-o/s3JZe/lO6smCXVs0ZzOTqGt7ikgTsC4Wo2O9fALe8=";
vendorHash = "sha256-pPWX9KtWDgJrQKt9PX1gb0v/DCop8lOxJyAjFZr3RpI=";
proxyVendor = true;

View file

@ -6,7 +6,7 @@
python3.pkgs.buildPythonApplication rec {
pname = "flexget";
version = "3.11.25";
version = "3.11.27";
pyproject = true;
# Fetch from GitHub in order to use `requirements.in`
@ -14,7 +14,7 @@ python3.pkgs.buildPythonApplication rec {
owner = "Flexget";
repo = "Flexget";
rev = "refs/tags/v${version}";
hash = "sha256-bvCogSBB990LIkk273EMTlqNN303JKr5WCI8g7hLU9Q=";
hash = "sha256-0ENBUOH+/pe4OsVQ6cu1xLTPPHtUMNARQGVyxOk60X0=";
};
postPatch = ''

View file

@ -1,9 +1,9 @@
{
"version" = "1.11.61";
"version" = "1.11.63";
"hashes" = {
"desktopSrcHash" = "sha256-1Pq26e2ngcji7wieHNOQAWPFBKGLoeTRAKQ3Aqnn1jw=";
"desktopYarnHash" = "16psxfai8dyckm4xwrg5czv6l4163x2nlqqcdgly6axabllgacj1";
"webSrcHash" = "sha256-RJhZgwTMDLMt+ha0lxPwqiP5sipXIcGZfdPVgCxePH4=";
"webYarnHash" = "1vj3f2bml8jyjz6djzvw1hbrv7148wk8y9hwp323zf8n6y4rnk28";
"desktopSrcHash" = "sha256-wQSFnF3HzERW4iS5leHP2LZKrJkTPW+LUgmj5b0/KZk=";
"desktopYarnHash" = "003d44psrw09dldvp9lfhsnipmcy1fwbicsvmd48mg7n3vnrg0zw";
"webSrcHash" = "sha256-FjYDwXa+7Lx/K0AERn64mPbjp0QFIoVoYMPx/mG4Zrs=";
"webYarnHash" = "0n7z9y3141rx0c5476zw3ccfck0f4b2jwsaxmq2ff7spwyw81zd2";
};
}

View file

@ -2,13 +2,13 @@
stdenv.mkDerivation rec {
pname = "signalbackup-tools";
version = "20240320";
version = "20240328-1";
src = fetchFromGitHub {
owner = "bepaald";
repo = pname;
rev = version;
hash = "sha256-2H+VGVPnSHdsx62hPygWc5uz5vH6DS7AfmYSlBZuB4A=";
hash = "sha256-oEwWbTs8Orpo+qRCKVvkeJYEob8O/qkKmv/iA5JUpfQ=";
};
postPatch = ''

View file

@ -45,14 +45,14 @@ let
pname = "slack";
x86_64-darwin-version = "4.36.140";
x86_64-darwin-sha256 = "0w1fxza3aglh7513znv190gsha12rk7k1ybdp4ml2pffwmm8diad";
x86_64-darwin-version = "4.37.94";
x86_64-darwin-sha256 = "01v7v977fq8mfsl0lipdc7ig55p2sknxzr1jmh8qxiq4f4y0rj5g";
x86_64-linux-version = "4.36.140";
x86_64-linux-sha256 = "0zahhhpcb1dxdhfmam32iqr5w3pspzbmcdv53ciqfnbkmwzkc3xr";
x86_64-linux-version = "4.37.94";
x86_64-linux-sha256 = "1f1spl767ldrarvpxrayry2d0nyr22b8xacxl4g1r8raryvnyz0x";
aarch64-darwin-version = "4.36.140";
aarch64-darwin-sha256 = "118mzkpk431dcm61gkbj5m4sdxkwnk6fvmxg9f96xiv6n22n7pnx";
aarch64-darwin-version = "4.37.94";
aarch64-darwin-sha256 = "0gh45gvlbjzxh0fn24z15glxqih5lggam8w6kpawsxgivkw6rjcc";
version = {
x86_64-darwin = x86_64-darwin-version;

View file

@ -1,8 +1,8 @@
{ stdenv, lib, writeScript, qt5, fetchurl, autoPatchelfHook, dpkg, glibc, cpio, xar, undmg, gtk3, pango, libxcb }:
let
pname = "synology-drive-client";
baseUrl = "https://global.download.synology.com/download/Utility/SynologyDriveClient";
version = "3.3.0-15082";
baseUrl = "https://global.synologydownload.com/download/Utility/SynologyDriveClient";
version = "3.4.0-15724";
buildNumber = with lib; last (splitString "-" version);
meta = with lib; {
description = "Desktop application to synchronize files and folders between the computer and the Synology Drive server.";
@ -29,8 +29,8 @@ let
inherit pname version meta passthru;
src = fetchurl {
url = "${baseUrl}/${version}/Ubuntu/Installer/x86_64/synology-drive-client-${buildNumber}.x86_64.deb";
sha256 = "sha256-ha3KRpEIT7w6pUVUwZV011W1F/v/hNq9f3ArfzU0ZGc=";
url = "${baseUrl}/${version}/Ubuntu/Installer/synology-drive-client-${buildNumber}.x86_64.deb";
sha256 = "sha256-Zf6JMghXy8ODbR4MhVSPmD4QDu003MTc7YNfbiRVRoY=";
};
nativeBuildInputs = [ autoPatchelfHook dpkg ];
@ -60,7 +60,7 @@ let
src = fetchurl {
url = "${baseUrl}/${version}/Mac/Installer/synology-drive-client-${buildNumber}.dmg";
sha256 = "sha256-dxmpB31ZjO1uAnAbY13OjVR81CCDLf9vJC20iZaPZJ4=";
sha256 = "sha256-65mZeRYHGl+n9TeTx7bxRrGPjcZiV9UlyfcCZ3GwOhE=";
};
nativeBuildInputs = [ cpio xar undmg ];

View file

@ -8,13 +8,13 @@
stdenv.mkDerivation rec {
pname = "rtl-sdr";
version = "0.8.0";
version = "0.9.0";
src = fetchFromGitHub {
owner = "librtlsdr";
repo = "librtlsdr";
rev = "v${version}";
hash = "sha256-s03h+3EfC5c7yRYBM6aCRWtmstwRJWuBywuyVt+k/bk=";
hash = "sha256-I1rbywQ0ZBw26wZdtMBkfpj7+kv09XKrrcoDuhIkRmw=";
};
postPatch = ''

View file

@ -1,7 +1,9 @@
{ mkDerivation, lib, fetchFromGitHub, cmake, boost179, ceres-solver, eigen,
freeimage, glog, libGLU, glew, qtbase,
autoAddDriverRunpath,
config,
cudaSupport ? config.cudaSupport, cudaPackages }:
cudaSupport ? config.cudaSupport, cudaPackages
}:
assert cudaSupport -> cudaPackages != { };
@ -37,7 +39,7 @@ mkDerivation rec {
nativeBuildInputs = [
cmake
] ++ lib.optionals cudaSupport [
cudaPackages.autoAddDriverRunpath
autoAddDriverRunpath
];
meta = with lib; {

View file

@ -16,11 +16,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "st";
version = "0.9";
version = "0.9.1";
src = fetchurl {
url = "https://dl.suckless.org/st/st-${finalAttrs.version}.tar.gz";
hash = "sha256-82NZeZc06ueFvss3QGPwvoM88i+ItPFpzSUbmTJOCOc=";
hash = "sha256-FvQ7lDOt6dcNYIXDH5/Znyg16q3jEiECDyIUMDXfwNI=";
};
outputs = [ "out" "terminfo" ];
@ -66,7 +66,7 @@ stdenv.mkDerivation (finalAttrs: {
homepage = "https://st.suckless.org/";
description = "Simple Terminal for X from Suckless.org Community";
license = licenses.mit;
maintainers = with maintainers; [ andsild ];
maintainers = with maintainers; [ andsild qusic ];
platforms = platforms.unix;
mainProgram = "st";
};

View file

@ -1,86 +0,0 @@
{ stdenv
, lib
, fetchurl
, autoPatchelfHook
, wrapGAppsHook
, makeWrapper
, gnome
, libsecret
, git
, curl
, nss
, nspr
, xorg
, libdrm
, alsa-lib
, cups
, mesa
, systemd
, openssl
}:
stdenv.mkDerivation (finalAttrs: {
pname = "github-desktop";
version = "3.3.6";
rcversion = "3";
arch = "amd64";
src = fetchurl {
url = "https://github.com/shiftkey/desktop/releases/download/release-${finalAttrs.version}-linux${finalAttrs.rcversion}/GitHubDesktop-linux-${finalAttrs.arch}-${finalAttrs.version}-linux${finalAttrs.rcversion}.deb";
hash = "sha256-900JhfHN78CuAXptPX2ToTvT9E+g+xRXqmlm34J9l6k=";
};
nativeBuildInputs = [
autoPatchelfHook
(wrapGAppsHook.override { inherit makeWrapper; })
];
buildInputs = [
gnome.gnome-keyring
xorg.libXdamage
xorg.libX11
libsecret
git
curl
nss
nspr
libdrm
alsa-lib
cups
mesa
openssl
];
unpackPhase = ''
mkdir -p $TMP/${finalAttrs.pname} $out/{opt,bin}
cp $src $TMP/${finalAttrs.pname}.deb
ar vx ${finalAttrs.pname}.deb
tar --no-overwrite-dir -xvf data.tar.xz -C $TMP/${finalAttrs.pname}/
'';
installPhase = ''
cp -R $TMP/${finalAttrs.pname}/usr/share $out/
cp -R $TMP/${finalAttrs.pname}/usr/lib/${finalAttrs.pname}/* $out/opt/
ln -sf $out/opt/${finalAttrs.pname} $out/bin/${finalAttrs.pname}
'';
preFixup = ''
gappsWrapperArgs+=(
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform=wayland}}"
)
'';
runtimeDependencies = [
(lib.getLib systemd)
];
meta = {
description = "GUI for managing Git and GitHub.";
homepage = "https://desktop.github.com/";
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ dan4ik605743 ];
platforms = lib.platforms.linux;
mainProgram = "github-desktop";
};
})

View file

@ -1,107 +0,0 @@
source 'https://rubygems.org'
ruby '>= 2.5.0', '< 3.2.0'
gem 'bundler', '>= 1.12.0'
gem 'rails', '6.1.7.6'
gem 'globalid', '~> 0.4.2' if Gem.ruby_version < Gem::Version.new('2.6.0')
gem 'rouge', '~> 3.28.0'
gem 'request_store', '~> 1.5.0'
gem 'mini_mime', '~> 1.1.0'
gem "actionpack-xml_parser"
gem 'roadie-rails', (Gem.ruby_version < Gem::Version.new('2.6.0') ? '~> 2.2.0' : '~> 3.0.0')
gem 'marcel'
gem "mail", "~> 2.7.1"
gem 'csv', '~> 3.2.0'
gem 'nokogiri', (if Gem.ruby_version < Gem::Version.new('2.6.0')
'~> 1.12.5'
elsif Gem.ruby_version < Gem::Version.new('2.7.0')
'~> 1.13.10'
else
'~> 1.15.2'
end)
gem "rexml", require: false if Gem.ruby_version >= Gem::Version.new('3.0')
gem 'i18n', '~> 1.10.0'
gem 'rbpdf', '~> 1.21.3'
gem 'addressable'
gem 'rubyzip', '~> 2.3.0'
gem 'net-smtp', '~> 0.3.0'
gem 'net-imap', '~> 0.2.2'
gem 'net-pop', '~> 0.1.1'
# Rails 6.1.6.1 does not work with Pysch 3.0.2, which is installed by default with Ruby 2.5. See https://github.com/rails/rails/issues/45590
gem 'psych', '>= 3.1.0' if Gem.ruby_version < Gem::Version.new('2.6.0')
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :x64_mingw, :mswin]
# TOTP-based 2-factor authentication
gem 'rotp', '>= 5.0.0'
gem 'rqrcode'
# Optional gem for LDAP authentication
group :ldap do
gem 'net-ldap', '~> 0.17.0'
end
# Optional gem for exporting the gantt to a PNG file
group :minimagick do
gem 'mini_magick', '~> 4.11.0'
end
# Optional Markdown support, not for JRuby
# ToDo: Remove common_mark group when common_mark is decoupled from markdown. See defect (#36892) for more details.
gem 'redcarpet', '~> 3.5.1', groups: [:markdown, :common_mark]
# Optional CommonMark support, not for JRuby
group :common_mark do
gem "html-pipeline", "~> 2.13.2"
gem "commonmarker", (Gem.ruby_version < Gem::Version.new('2.6.0') ? '0.21.0' : '~> 0.23.8')
gem "sanitize", "~> 6.0"
gem 'deckar01-task_list', '2.3.2'
end
# webrick
gem 'webrick'
# Include database gems for the database adapters NixOS supports
require 'erb'
require 'yaml'
gem "mysql2", "~> 0.5.0", :platforms => [:mri, :mingw, :x64_mingw]
gem "pg", "~> 1.4.2", :platforms => [:mri, :mingw, :x64_mingw]
group :development do
gem 'listen', '~> 3.3'
gem "yard"
end
group :test do
gem "rails-dom-testing"
gem 'mocha', '>= 2.0.1'
gem 'simplecov', '~> 0.21.2', :require => false
gem "ffi", platforms: [:mri, :mingw, :x64_mingw, :mswin]
# For running system tests
gem 'puma', (Gem.ruby_version < Gem::Version.new('2.7') ? '< 6.0.0' : '>= 0')
gem 'capybara', (if Gem.ruby_version < Gem::Version.new('2.6')
'~> 3.35.3'
elsif Gem.ruby_version < Gem::Version.new('2.7')
'~> 3.36.0'
else
'~> 3.38.0'
end)
gem "selenium-webdriver", "~> 3.142.7"
gem 'webdrivers', '4.6.1', require: false
# RuboCop
gem 'rubocop', '~> 1.26.0'
gem 'rubocop-performance', '~> 1.13.0'
gem 'rubocop-rails', '~> 2.14.0'
end
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
if File.exist?(local_gemfile)
eval_gemfile local_gemfile
end
# Load plugins' Gemfiles
Dir.glob File.expand_path("../plugins/*/{Gemfile,PluginGemfile}", __FILE__) do |file|
eval_gemfile file
end

View file

@ -10,11 +10,11 @@
}:
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "tart";
version = "2.6.0";
version = "2.7.2";
src = fetchurl {
url = "https://github.com/cirruslabs/tart/releases/download/${finalAttrs.version}/tart-arm64.tar.gz";
hash = "sha256-QtVqgmjYpLAhFibW1DIVWNYiOjHB1X/YY6zRVB+1soA=";
hash = "sha256-Z/LZ8g1/FYT7Jh943tFxN8L5HeNf0CVz1VEJj+2fCd8=";
};
sourceRoot = ".";

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