Merge master into staging-next

This commit is contained in:
nixpkgs-ci[bot]
2025-05-17 12:06:18 +00:00
committed by GitHub
87 changed files with 1282 additions and 7016 deletions
+1 -1
View File
@@ -533,7 +533,7 @@ Names of files and directories should be in lowercase, with dashes between words
### Formatting
CI [enforces](./.github/workflows/check-nix-format.yml) all Nix files to be
CI [enforces](./.github/workflows/check-format.yml) all Nix files to be
formatted using the [official Nix formatter](https://github.com/NixOS/nixfmt).
You can ensure this locally using either of these commands:
+8 -9
View File
@@ -30,8 +30,8 @@ rustPlatform.buildRustPackage (finalAttrs: {
# Assuming our app's frontend uses `npm` as a package manager
npmDeps = fetchNpmDeps {
name = "${finalAttrs.pname}-npm-deps-${finalAttrs.version}";
inherit src;
name = "${finalAttrs.pname}-${finalAttrs.version}-npm-deps";
inherit (finalAttrs) src;
hash = "...";
};
@@ -51,17 +51,16 @@ rustPlatform.buildRustPackage (finalAttrs: {
wrapGAppsHook4
];
buildInputs =
[ openssl ]
++ lib.optionals stdenv.hostPlatform.isLinux [
glib-networking # Most Tauri apps need networking
webkitgtk_4_1
];
buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
glib-networking # Most Tauri apps need networking
openssl
webkitgtk_4_1
];
# Set our Tauri source directory
cargoRoot = "src-tauri";
# And make sure we build there too
buildAndTestSubdir = cargoRoot;
buildAndTestSubdir = finalAttrs.cargoRoot;
# ...
})
+6
View File
@@ -11132,6 +11132,7 @@
name = "Jappie Klooster";
};
jappie3 = {
email = "jappie3+git@jappie.dev";
name = "Jappie3";
matrix = "@jappie:jappie.dev";
github = "Jappie3";
@@ -25640,6 +25641,11 @@
github = "deviant";
githubId = 68829907;
};
vaavaav = {
name = "Pedro Peixoto";
github = "vaavaav";
githubId = 56087034;
};
vaci = {
email = "vaci@vaci.org";
github = "vaci";
@@ -638,6 +638,8 @@
They are still expected to be working until future version 5.0.0, but will generate warnings in logs.
Read the [release notes](https://www.authelia.com/blog/4.39-release-notes/) for human readable summaries of the changes.
- `security.acme` now supports renewal using CSRs (Certificate Signing Request) through the options `security.acme.*.csr` and `security.acme.*.csrKey`.
- `programs.fzf.keybindings` now supports the fish shell.
- `gerbera` now has wavpack support.
+47 -13
View File
@@ -236,13 +236,16 @@ let
# Create hashes for cert data directories based on configuration
# Flags are separated to avoid collisions
hashData = with builtins; ''
${lib.concatStringsSep " " data.extraLegoFlags} -
${lib.concatStringsSep " " data.extraLegoRunFlags} -
${lib.concatStringsSep " " data.extraLegoRenewFlags} -
${toString acmeServer} ${toString data.dnsProvider}
${toString data.ocspMustStaple} ${data.keyType}
'';
hashData =
with builtins;
''
${lib.concatStringsSep " " data.extraLegoFlags} -
${lib.concatStringsSep " " data.extraLegoRunFlags} -
${lib.concatStringsSep " " data.extraLegoRenewFlags} -
${toString acmeServer} ${toString data.dnsProvider}
${toString data.ocspMustStaple} ${data.keyType}
''
+ (lib.optionalString (data.csr != null) (" - " + data.csr));
certDir = mkHash hashData;
# TODO remove domainHash usage entirely. Waiting on go-acme/lego#1532
domainHash = mkHash "${lib.concatStringsSep " " extraDomains} ${data.domain}";
@@ -286,18 +289,24 @@ let
"--accept-tos" # Checking the option is covered by the assertions
"--path"
"."
"-d"
data.domain
"--email"
data.email
"--key-type"
data.keyType
]
++ protocolOpts
++ lib.optionals (acmeServer != null) [
"--server"
acmeServer
]
++ lib.optionals (data.csr != null) [
"--csr"
data.csr
]
++ lib.optionals (data.csr == null) [
"--key-type"
data.keyType
"-d"
data.domain
]
++ lib.concatMap (name: [
"-d"
name
@@ -327,6 +336,8 @@ let
webroots = lib.remove null (
lib.unique (builtins.map (certAttrs: certAttrs.webroot) (lib.attrValues config.security.acme.certs))
);
certificateKey = if data.csrKey != null then "${data.csrKey}" else "certificates/${keyName}.key";
in
{
inherit accountHash cert selfsignedDeps;
@@ -529,7 +540,7 @@ let
# Check if we can renew.
# We can only renew if the list of domains has not changed.
# We also need an account key. Avoids #190493
if cmp -s domainhash.txt certificates/domainhash.txt && [ -e 'certificates/${keyName}.key' ] && [ -e 'certificates/${keyName}.crt' ] && [ -n "$(find accounts -name '${data.email}.key')" ]; then
if cmp -s domainhash.txt certificates/domainhash.txt && [ -e '${certificateKey}' ] && [ -e 'certificates/${keyName}.crt' ] && [ -n "$(find accounts -name '${data.email}.key')" ]; then
# Even if a cert is not expired, it may be revoked by the CA.
# Try to renew, and silently fail if the cert is not expired.
@@ -564,7 +575,7 @@ let
touch out/renewed
echo Installing new certificate
cp -vp 'certificates/${keyName}.crt' out/fullchain.pem
cp -vp 'certificates/${keyName}.key' out/key.pem
cp -vp '${certificateKey}' out/key.pem
cp -vp 'certificates/${keyName}.issuer.crt' out/chain.pem
ln -sf fullchain.pem out/cert.pem
cat out/key.pem out/fullchain.pem > out/full.pem
@@ -845,6 +856,18 @@ let
description = "Domain to fetch certificate for (defaults to the entry name).";
};
csr = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Path to a certificate signing request to apply when fetching the certificate.";
};
csrKey = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Path to the private key to the matching certificate signing request.";
};
extraDomainNames = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
@@ -1113,6 +1136,17 @@ in
used for variables suffixed by "_FILE".
'';
}
{
assertion = lib.all (
certOpts:
(certOpts.csr == null && certOpts.csrKey == null)
|| (certOpts.csr != null && certOpts.csrKey != null)
) certs;
message = ''
When passing a certificate signing request both `security.acme.certs.${cert}.csr` and `security.acme.certs.${cert}.csrKey` need to be set.
'';
}
]) cfg.certs
));
+44
View File
@@ -99,6 +99,45 @@ in
"builtin-3.${domain}".listenHTTP = ":80";
};
};
csr.configuration =
let
conf = pkgs.writeText "openssl.csr.conf" ''
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = ${config.networking.fqdn}
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = ${config.networking.fqdn}
'';
csrData =
pkgs.runCommandNoCC "csr-and-key"
{
buildInputs = [ pkgs.openssl ];
}
''
mkdir -p $out
openssl req -new -newkey rsa:2048 -nodes \
-keyout $out/key.pem \
-out $out/request.csr \
-config ${conf}
'';
in
{
security.acme.certs."${config.networking.fqdn}" = {
csr = "${csrData}/request.csr";
csrKey = "${csrData}/key.pem";
};
};
};
};
};
@@ -211,5 +250,10 @@ in
with subtest("Validate permissions (self-signed)"):
check_permissions(builtin, cert, "acme")
with subtest("Can renew using a CSR"):
builtin.succeed(f"systemctl clean acme-{cert}.service --what=state")
switch_to(builtin, "csr")
check_issuer(builtin, cert, "pebble")
'';
}
-112
View File
@@ -1,112 +0,0 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
pkg-config,
wrapQtAppsHook,
bluez,
libnotify,
libXdmcp,
libXtst,
opencv,
qtbase,
qtmultimedia,
qtscript,
qttools,
qtx11extras,
qtxmlpatterns,
# Running with TTS support causes the program to freeze for a few seconds every time at startup,
# so it is disabled by default
textToSpeechSupport ? false,
qtspeech,
}:
let
# For some reason qtscript wants to use the same version of qtbase as itself
# This override makes it think that they are the same version
qtscript' = qtscript.overrideAttrs (oldAttrs: {
inherit (qtbase) version;
postPatch = ''
substituteInPlace .qmake.conf \
--replace-fail ${oldAttrs.version} ${qtbase.version}
'';
});
in
stdenv.mkDerivation (finalAttrs: {
pname = "actiona";
version = "3.10.2";
src = fetchFromGitHub {
owner = "Jmgr";
repo = "actiona";
rev = "v${finalAttrs.version}";
hash = "sha256-4RKCNEniBBx0kDwdHVZOqXYeGCsH8g6SfVc8JdDV0hI=";
fetchSubmodules = true;
};
patches =
[
# Sets the proper search location for the `.so` files and the translations
./fix-paths.patch
]
++ lib.optionals (!textToSpeechSupport) [
# Removes TTS support
./disable-tts.patch
];
postPatch = ''
substituteInPlace gui/src/mainwindow.cpp executer/src/executer.cpp tools/src/languages.cpp \
--subst-var out
'';
nativeBuildInputs = [
cmake
pkg-config
wrapQtAppsHook
];
buildInputs = [
bluez
libnotify
libXdmcp
libXtst
opencv
qtbase
qtmultimedia
qtscript'
qttools
qtx11extras
qtxmlpatterns
] ++ lib.optionals textToSpeechSupport [ qtspeech ];
# RPATH of binary /nix/store/.../bin/... contains a forbidden reference to /build/
cmakeFlags = [ (lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true) ];
# udev is used by the system-actionpack
env.NIX_LDFLAGS = "-ludev";
installPhase = ''
runHook preInstall
install -Dm755 {execution,actiontools,tools}/*.so -t $out/lib
install -Dm755 actions/actionpack*.so -t $out/lib/actions
install -Dm755 actiona actexec -t $out/bin
install -Dm644 translations/*.qm -t $out/share/actiona/translations
install -Dm644 $src/actiona.desktop -t $out/share/applications
install -Dm644 $src/gui/icons/actiona.png -t $out/share/icons/hicolor/48x48/apps
runHook postInstall
'';
meta = {
description = "Cross-platform automation tool";
homepage = "https://github.com/Jmgr/actiona";
license = lib.licenses.gpl3Only;
mainProgram = "actiona";
maintainers = with lib.maintainers; [ tomasajt ];
platforms = lib.platforms.linux;
};
})
@@ -1,54 +0,0 @@
diff --git a/actions/system/CMakeLists.txt b/actions/system/CMakeLists.txt
index ca861145..3e3d3d3b 100644
--- a/actions/system/CMakeLists.txt
+++ b/actions/system/CMakeLists.txt
@@ -66,8 +66,6 @@ set(HEADERS
${HEADERS_PREFIX}/actions/playsoundinstance.hpp
${HEADERS_PREFIX}/actions/systemdefinition.hpp
${HEADERS_PREFIX}/actions/systeminstance.hpp
- ${HEADERS_PREFIX}/actions/texttospeechdefinition.hpp
- ${HEADERS_PREFIX}/actions/texttospeechinstance.hpp
${HEADERS_PREFIX}/code/mediaplaylist.hpp
${HEADERS_PREFIX}/code/notify.hpp
${HEADERS_PREFIX}/code/process.hpp
@@ -131,7 +129,6 @@ find_package(Qt5 ${ACT_MINIMUM_QT_VERSION} COMPONENTS
DBus
Multimedia
MultimediaWidgets
- TextToSpeech
REQUIRED)
target_include_directories(${PROJECT}
@@ -153,7 +150,6 @@ target_link_libraries(${PROJECT}
Qt5::DBus
Qt5::Multimedia
Qt5::MultimediaWidgets
- Qt5::TextToSpeech
${LIBNOTIFY_LIBRARIES}
${BLUEZ_LIBRARIES}
${UDEV_LIBRARIES}
diff --git a/actions/system/src/actionpacksystem.hpp b/actions/system/src/actionpacksystem.hpp
index c5768415..27a899d6 100644
--- a/actions/system/src/actionpacksystem.hpp
+++ b/actions/system/src/actionpacksystem.hpp
@@ -31,10 +31,6 @@
#include "actions/playsounddefinition.hpp"
#include "actions/findimagedefinition.hpp"
-#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
-#include "actions/texttospeechdefinition.hpp"
-#endif
-
#include "code/system.hpp"
#include "code/mediaplaylist.hpp"
#include "code/notify.hpp"
@@ -67,9 +63,6 @@ public:
addActionDefinition(new Actions::DetachedCommandDefinition(this));
addActionDefinition(new Actions::PlaySoundDefinition(this));
addActionDefinition(new Actions::FindImageDefinition(this));
-#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
- addActionDefinition(new Actions::TextToSpeechDefinition(this));
-#endif
}
QString id() const override { return QStringLiteral("system"); }
@@ -1,39 +0,0 @@
diff --git a/executer/src/executer.cpp b/executer/src/executer.cpp
index da848dad..5bd7e986 100644
--- a/executer/src/executer.cpp
+++ b/executer/src/executer.cpp
@@ -45,7 +45,7 @@ bool Executer::start(QIODevice *device, const QString &filename)
QSettings settings;
QString locale = settings.value(QStringLiteral("gui/locale"), QLocale::system().name()).toString();
- mActionFactory->loadActionPacks(QApplication::applicationDirPath() + QStringLiteral("/actions"), locale);
+ mActionFactory->loadActionPacks(QStringLiteral("@out@/lib/actions"), locale);
#ifndef Q_OS_WIN
if(mActionFactory->actionPackCount() == 0)
mActionFactory->loadActionPacks(QStringLiteral("actiona/actions/"), locale);
diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp
index 6052648e..3c802d93 100644
--- a/gui/src/mainwindow.cpp
+++ b/gui/src/mainwindow.cpp
@@ -322,7 +322,7 @@ void MainWindow::postInit()
if(mSplashScreen)
mSplashScreen->showMessage(tr("Loading actions..."));
- mActionFactory->loadActionPacks(QApplication::applicationDirPath() + QStringLiteral("/actions"), mUsedLocale);
+ mActionFactory->loadActionPacks(QStringLiteral("@out@/lib/actions"), mUsedLocale);
#ifndef Q_OS_WIN
if(mActionFactory->actionPackCount() == 0)
mActionFactory->loadActionPacks(QStringLiteral("actiona/actions/"), mUsedLocale);
diff --git a/tools/src/languages.cpp b/tools/src/languages.cpp
index 4926936e..18e9aabb 100644
--- a/tools/src/languages.cpp
+++ b/tools/src/languages.cpp
@@ -79,7 +79,7 @@ namespace Tools
void Languages::installTranslator(const QString &componentName, const QString &locale)
{
auto translator = new QTranslator(QCoreApplication::instance());
- if(!translator->load(QStringLiteral("%1/translations/%2_%3").arg(QCoreApplication::applicationDirPath()).arg(componentName).arg(locale)))
+ if(!translator->load(QStringLiteral("@out@/share/actiona/translations/%1_%2").arg(componentName).arg(locale)))
{
auto path = QStringLiteral("%1/translations/%2_%3").arg(QDir::currentPath()).arg(componentName).arg(locale);
if(!translator->load(path))
@@ -1,19 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
chronic (0.10.2)
sequel (5.30.0)
sqlite3 (1.4.2)
timetrap (1.15.2)
chronic (~> 0.10.2)
sequel (~> 5.30.0)
sqlite3 (~> 1.4.2)
PLATFORMS
ruby
DEPENDENCIES
timetrap
BUNDLED WITH
2.1.4
@@ -1,47 +0,0 @@
{
chronic = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
type = "gem";
};
version = "0.10.2";
};
sequel = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0gqqnqrfayhwhkp0vy3frv68sgc7klyd6mfisx1j3djjvlyc7hmr";
type = "gem";
};
version = "5.30.0";
};
sqlite3 = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0lja01cp9xd5m6vmx99zwn4r7s97r1w5cb76gqd8xhbm1wxyzf78";
type = "gem";
};
version = "1.4.2";
};
timetrap = {
dependencies = [
"chronic"
"sequel"
"sqlite3"
];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0pfg5c3kmh1jfaaszw253bi93ixa6cznqmsafrcpccrdg9r8j2k8";
type = "gem";
};
version = "1.15.2";
};
}
@@ -3,23 +3,23 @@
{
"kicad" = {
kicadVersion = {
version = "9.0.1";
version = "9.0.2";
src = {
rev = "eb0a9f7b5b8f26024310bd02367f8414d6c80734";
sha256 = "14g4ns2fxigzz1z4chcnaz2b8f4jkdmd56mnlpdq8nld8q84hywk";
rev = "bf9b9242aea7832d140dc25ff897fe01e2f36e41";
sha256 = "1v3nvp5ifa36hx3iw3whlp3j7hiy91fzihc0jc1daw0hnps7qy24";
};
};
libVersion = {
version = "9.0.1";
version = "9.0.2";
libSources = {
symbols.rev = "f8789bb729b5ed7ddc6a45b68563157e3a070944";
symbols.sha256 = "1q8vq4dwnhryizidx0s3x8p4yjhj3hbjhd40zy1pynkf1p174d7n";
templates.rev = "793b29a36c6b11a11d3bb417cf508a48b8c6ebb8";
symbols.rev = "9eab1c9c90a8aa84b0f7eec73076329d91764583";
symbols.sha256 = "134x4d5w89aahl4k9zai6vwcazibz17gsgzy04l9xn4zcf6v11qp";
templates.rev = "f93acff0f8c8c8e215ea125db060c86bf4b1f5d3";
templates.sha256 = "0zs29zn8qjgxv0w1vyr8yxmj02m8752zagn4vcraqgik46dwg2id";
footprints.rev = "b5974927427a886128e5ba7a8adc285a751261d1";
footprints.sha256 = "0xqjnvbf032l191spfdh6g579jfhlpyr7pg53pkqdhzz053j3rlz";
packages3d.rev = "b1fd04f841f0d88b025be7357482cf7f48de4dae";
packages3d.sha256 = "1xgwd9srp93pj4pnskk3cnkbx57n6kvmlk7qwi3fl6wim3kxfcj2";
footprints.rev = "855079c1514bbdf38565fedcacee7fb05ffad5aa";
footprints.sha256 = "0w44b7dzx6d3xw2vbw37k34zxy25bq46rsnv21x10227313vr2wm";
packages3d.rev = "26e8886b3049a07e8b2b0bed82634ff755783352";
packages3d.sha256 = "18cxlp5grvv5m63c3sb6m9l9cmijqqcjmxrkdzg63d5jp7w73smn";
};
};
};
@@ -27,7 +27,7 @@ stdenvNoCC.mkDerivation {
dontConfigure = true;
dontBuild = true;
checkPhase = ''
find "$src" -type f -print0 | xargs -0 shellcheck
find "$src" -type f -print0 | xargs -0 shellcheck --source-path="$src"
'';
installPhase = ''
touch "$out"
+96
View File
@@ -0,0 +1,96 @@
diff --git a/actexec/CMakeLists.txt b/actexec/CMakeLists.txt
index 49d8128..e8bfa16 100644
--- a/actexec/CMakeLists.txt
+++ b/actexec/CMakeLists.txt
@@ -40,7 +40,7 @@ endif()
setup_target(${PROJECT})
-find_package(Qt6 ${ACT_MINIMUM_QT_VERSION} COMPONENTS Qml Network Widgets Core5Compat Multimedia TextToSpeech REQUIRED)
+find_package(Qt6 ${ACT_MINIMUM_QT_VERSION} COMPONENTS Qml Network Widgets Core5Compat Multimedia REQUIRED)
target_link_directories(${PROJECT}
PRIVATE
@@ -75,7 +75,6 @@ target_link_libraries(
Qt6::Widgets
Qt6::Core5Compat
Qt6::Multimedia
- Qt6::TextToSpeech
${LIBNOTIFY_LIBRARIES}
)
diff --git a/actiona/CMakeLists.txt b/actiona/CMakeLists.txt
index d03d650..222b2f9 100644
--- a/actiona/CMakeLists.txt
+++ b/actiona/CMakeLists.txt
@@ -125,7 +125,7 @@ endif()
setup_target(${PROJECT})
-find_package(Qt6 ${ACT_MINIMUM_QT_VERSION} COMPONENTS Qml Network Widgets Core5Compat Multimedia TextToSpeech REQUIRED)
+find_package(Qt6 ${ACT_MINIMUM_QT_VERSION} COMPONENTS Qml Network Widgets Core5Compat Multimedia REQUIRED)
target_link_directories(${PROJECT}
PRIVATE
@@ -162,7 +162,6 @@ target_link_libraries(
Qt6::Widgets
Qt6::Core5Compat
Qt6::Multimedia
- Qt6::TextToSpeech
${LIBNOTIFY_LIBRARIES}
${LIBX11_LIBRARIES}
$<$<PLATFORM_ID:Windows>:shlwapi>
diff --git a/actions/system/CMakeLists.txt b/actions/system/CMakeLists.txt
index a3019b1..6d9430c 100644
--- a/actions/system/CMakeLists.txt
+++ b/actions/system/CMakeLists.txt
@@ -67,8 +67,6 @@ set(HEADERS
${HEADERS_PREFIX}/actions/playsoundinstance.hpp
${HEADERS_PREFIX}/actions/systemdefinition.hpp
${HEADERS_PREFIX}/actions/systeminstance.hpp
- ${HEADERS_PREFIX}/actions/texttospeechdefinition.hpp
- ${HEADERS_PREFIX}/actions/texttospeechinstance.hpp
${HEADERS_PREFIX}/code/mediaplaylist.hpp
${HEADERS_PREFIX}/code/notify.hpp
${HEADERS_PREFIX}/code/process.hpp
@@ -140,7 +138,6 @@ find_package(Qt6 ${ACT_MINIMUM_QT_VERSION} COMPONENTS
DBus
Multimedia
MultimediaWidgets
- TextToSpeech
REQUIRED)
target_link_directories(${PROJECT}
@@ -167,7 +164,6 @@ target_link_libraries(${PROJECT}
Qt6::DBus
Qt6::Multimedia
Qt6::MultimediaWidgets
- Qt6::TextToSpeech
${LIBNOTIFY_LIBRARIES}
${BLUEZ_LIBRARIES}
$<$<PLATFORM_ID:Windows>:Bthprops>
diff --git a/actions/system/src/actionpacksystem.hpp b/actions/system/src/actionpacksystem.hpp
index ea045e3..a5af35a 100644
--- a/actions/system/src/actionpacksystem.hpp
+++ b/actions/system/src/actionpacksystem.hpp
@@ -32,10 +32,6 @@
#include "actions/playsounddefinition.hpp"
#include "actions/findimagedefinition.hpp"
-#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
-#include "actions/texttospeechdefinition.hpp"
-#endif
-
#include "code/system.hpp"
#include "code/mediaplaylist.hpp"
#include "code/notify.hpp"
@@ -64,9 +60,6 @@ public:
addActionDefinition(new Actions::DetachedCommandDefinition(this));
addActionDefinition(new Actions::PlaySoundDefinition(this));
addActionDefinition(new Actions::FindImageDefinition(this));
-#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
- addActionDefinition(new Actions::TextToSpeechDefinition(this));
-#endif
}
QString id() const override { return QStringLiteral("system"); }
+62
View File
@@ -0,0 +1,62 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
pkg-config,
bluez,
libnotify,
opencv,
qt6,
# Running with TTS support causes the program to freeze for a few seconds every time at startup,
# so it is disabled by default
textToSpeechSupport ? false,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "actiona";
version = "3.11.1";
src = fetchFromGitHub {
owner = "Jmgr";
repo = "actiona";
rev = "v${finalAttrs.version}";
hash = "sha256-sJlzrrpmo2CbzChCtiyxqDtjoN58BN4Ptjm4sH83zAw=";
fetchSubmodules = true;
};
patches = lib.optionals (!textToSpeechSupport) [
# Removes TTS support
./disable-tts.patch
];
strictDeps = true;
nativeBuildInputs = [
cmake
pkg-config
qt6.wrapQtAppsHook
];
buildInputs = [
bluez
libnotify
opencv
qt6.qtbase
qt6.qtmultimedia
qt6.qttools
qt6.qt5compat
] ++ lib.optionals textToSpeechSupport [ qt6.qtspeech ];
meta = {
description = "Cross-platform automation tool";
homepage = "https://github.com/Jmgr/actiona";
license = lib.licenses.gpl3Only;
mainProgram = "actiona";
maintainers = with lib.maintainers; [ tomasajt ];
platforms = lib.platforms.linux;
};
})
+11 -21
View File
@@ -5,39 +5,29 @@
fetchPypi,
}:
let
tzdata = python3.pkgs.tzdata.overrideAttrs rec {
version = "2023.4";
src = fetchPypi {
pname = "tzdata";
inherit version;
hash = "sha256-3VTJTylHZVIsdzmWSbT+/ZVSJHmmZKDOyH9BvrxhSMk=";
};
};
in
python3.pkgs.buildPythonApplication rec {
pname = "annextimelog";
version = "0.14.0";
version = "0.15.0";
format = "pyproject";
src = fetchFromGitLab {
owner = "nobodyinperson";
repo = "annextimelog";
rev = "v${version}";
hash = "sha256-+3PkG33qKckagSVvVdqkypulO7uu5AMOv8fQiP8IUbs=";
hash = "sha256-RfqBtbfArFva3TVJGF4STx0QTio62qxXaM23lsLYLUg=";
};
pythonRelaxDeps = [ "rich" ];
nativeBuildInputs =
with python3.pkgs;
[
setuptools
wheel
poetry-core
]
++ [ tzdata ];
nativeBuildInputs = with python3.pkgs; [
unittestCheckHook
setuptools
wheel
poetry-core
tzdata
];
unittestFlags = [ "-vb" ];
propagatedBuildInputs = with python3.pkgs; [
rich
+2 -2
View File
@@ -13,14 +13,14 @@
python3Packages.buildPythonApplication rec {
pname = "ascii-draw";
version = "1.0.0";
version = "1.1.0";
pyproject = false;
src = fetchFromGitHub {
owner = "Nokse22";
repo = "ascii-draw";
tag = "v${version}";
hash = "sha256-+K9th1LbESVzAiJqIplWpj2QHt7zDidENs7jHOuJ2S0=";
hash = "sha256-ed8RSS9anU5gstWTrJc2APx7PLmTzVVWXg8Sif8tySM=";
};
nativeBuildInputs = [
@@ -31,13 +31,13 @@
python3Packages.buildPythonApplication rec {
pname = "bottles-unwrapped";
version = "51.17";
version = "51.21";
src = fetchFromGitHub {
owner = "bottlesdevs";
repo = "bottles";
tag = version;
hash = "sha256-m4ATWpAZxIBp1X0cNeyNGmt6aIBo/cHH+DpOMkLia0E=";
hash = "sha256-rUS2LRr7NqTvNd706AC/U/QUDcF8tzwkHDuS3R0O1KY=";
};
patches =
@@ -45,7 +45,6 @@ python3Packages.buildPythonApplication rec {
./vulkan_icd.patch
./redirect-bugtracker.patch
./remove-flatpak-check.patch
./remove-core-tab.patch
]
++ (
if removeWarningPopup then
@@ -132,6 +131,7 @@ python3Packages.buildPythonApplication rec {
psydvl
shamilton
Gliczy
XBagon
];
platforms = lib.platforms.linux;
mainProgram = "bottles";
@@ -1,76 +0,0 @@
diff --git a/bottles/frontend/ui/preferences.blp b/bottles/frontend/ui/preferences.blp
index 9dd12a16..c1fcf649 100644
--- a/bottles/frontend/ui/preferences.blp
+++ b/bottles/frontend/ui/preferences.blp
@@ -284,20 +284,6 @@ template $PreferencesWindow: Adw.PreferencesWindow {
}
}
- Adw.PreferencesPage pref_core {
- icon-name: "application-x-addon-symbolic";
- title: _("Core");
- visible: false;
-
- Adw.PreferencesGroup list_runtimes {
- title: _("Runtime");
- }
-
- Adw.PreferencesGroup list_winebridge {
- title: _("WineBridge");
- }
- }
-
Adw.PreferencesPage {
icon-name: "applications-science-symbolic";
title: _("Experiments");
diff --git a/bottles/frontend/views/preferences.py b/bottles/frontend/views/preferences.py
index ce7ec958..f46c6e5b 100644
--- a/bottles/frontend/views/preferences.py
+++ b/bottles/frontend/views/preferences.py
@@ -53,8 +53,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
switch_steam_programs = Gtk.Template.Child()
switch_epic_games = Gtk.Template.Child()
switch_ubisoft_connect = Gtk.Template.Child()
- list_winebridge = Gtk.Template.Child()
- list_runtimes = Gtk.Template.Child()
list_runners = Gtk.Template.Child()
list_dxvk = Gtk.Template.Child()
list_vkd3d = Gtk.Template.Child()
@@ -66,7 +64,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
btn_bottles_path_reset = Gtk.Template.Child()
label_bottles_path = Gtk.Template.Child()
btn_steam_proton_doc = Gtk.Template.Child()
- pref_core = Gtk.Template.Child()
# endregion
@@ -170,10 +167,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
self.installers_stack.set_visible_child_name("installers_offline")
self.dlls_stack.set_visible_child_name("dlls_offline")
- # populate components lists
- self.populate_runtimes_list()
- self.populate_winebridge_list()
-
RunAsync(self.ui_update)
# connect signals
@@ -319,18 +312,6 @@ class PreferencesWindow(Adw.PreferencesWindow):
list_component.add(_entry)
self.__registry.append(_entry)
- def populate_runtimes_list(self):
- for runtime in self.manager.supported_runtimes.items():
- self.list_runtimes.add(
- ComponentEntry(self.window, runtime, "runtime", is_upgradable=True)
- )
-
- def populate_winebridge_list(self):
- for bridge in self.manager.supported_winebridge.items():
- self.list_winebridge.add(
- ComponentEntry(self.window, bridge, "winebridge", is_upgradable=True)
- )
-
def populate_dxvk_list(self):
self.__populate_component_list(
"dxvk", self.manager.supported_dxvk, self.list_dxvk
@@ -15,3 +15,80 @@ index 6ff7c011..c26ea0b9 100644
bottles_sources = [
'__init__.py',
'main.py',
diff --git a/bottles/frontend/views/bottle_details.py b/bottles/frontend/views/bottle_details.py
index 65667ea9..7ae1eb19 100644
--- a/bottles/frontend/views/bottle_details.py
+++ b/bottles/frontend/views/bottle_details.py
@@ -436,20 +436,19 @@ class BottleView(Adw.PreferencesPage):
dialog.connect("response", execute)
dialog.show()
- if Xdp.Portal.running_under_sandbox():
- if self.window.settings.get_boolean("show-sandbox-warning"):
- dialog = Adw.MessageDialog.new(
- self.window,
- _("Be Aware of Sandbox"),
- _(
- "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there."
- ),
- )
- dialog.add_response("dismiss", _("_Dismiss"))
- dialog.connect("response", show_chooser)
- dialog.present()
- else:
- show_chooser()
+ if self.window.settings.get_boolean("show-sandbox-warning"):
+ dialog = Adw.MessageDialog.new(
+ self.window,
+ _("Be Aware of Sandbox"),
+ _(
+ "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there."
+ ),
+ )
+ dialog.add_response("dismiss", _("_Dismiss"))
+ dialog.connect("response", show_chooser)
+ dialog.present()
+ else:
+ show_chooser()
def __backup(self, widget, backup_type):
"""
diff --git a/bottles/frontend/views/bottle_preferences.py b/bottles/frontend/views/bottle_preferences.py
index 288e693b..b8b57618 100644
--- a/bottles/frontend/views/bottle_preferences.py
+++ b/bottles/frontend/views/bottle_preferences.py
@@ -139,7 +139,7 @@ class PreferencesView(Adw.PreferencesPage):
self.queue = details.queue
self.details = details
- if not gamemode_available or not Xdp.Portal.running_under_sandbox():
+ if not gamemode_available:
return
_not_available = _("This feature is unavailable on your system.")
diff --git a/bottles/frontend/views/list.py b/bottles/frontend/views/list.py
index 43ab9c22..a283b178 100644
--- a/bottles/frontend/views/list.py
+++ b/bottles/frontend/views/list.py
@@ -82,8 +82,6 @@ class BottlesBottleRow(Adw.ActionRow):
def run_executable(self, *_args):
"""Display file dialog for executable"""
- if not Xdp.Portal.running_under_sandbox():
- return
def set_path(_dialog, response):
if response != Gtk.ResponseType.ACCEPT:
diff --git a/bottles/frontend/views/new_bottle_dialog.py b/bottles/frontend/views/new_bottle_dialog.py
index a8b007d4..c6f0a156 100644
--- a/bottles/frontend/views/new_bottle_dialog.py
+++ b/bottles/frontend/views/new_bottle_dialog.py
@@ -80,7 +80,7 @@ class BottlesNewBottleDialog(Adw.Dialog):
super().__init__(**kwargs)
# common variables and references
self.window = GtkUtils.get_parent_window()
- if not self.window or not Xdp.Portal.running_under_sandbox():
+ if not self.window:
return
self.app = self.window.get_application()
@@ -1,7 +1,7 @@
diff --git a/bottles/frontend/windows/main_window.py b/bottles/frontend/windows/main_window.py
diff --git a/bottles/frontend/windows/window.py b/bottles/frontend/windows/window.py
index 79bf0d72..e3a15cb5 100644
--- a/bottles/frontend/windows/main_window.py
+++ b/bottles/frontend/windows/main_window.py
--- a/bottles/frontend/windows/window.py
+++ b/bottles/frontend/windows/window.py
@@ -104,29 +104,29 @@ class MainWindow(Adw.ApplicationWindow):
def response(dialog, response, *args):
+32
View File
@@ -0,0 +1,32 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "cerca";
version = "0-unstable-2025-05-06";
src = fetchFromGitHub {
owner = "cblgh";
repo = "cerca";
rev = "a2706a35e3efc8b816b4374e24493548429041db";
hash = "sha256-FDlASFjI+D/iOH0r2Yd638aS0na19TxkN7Z1kD/o/fY";
};
vendorHash = "sha256-yfsI0nKfzyzmtbS9bSHRaD2pEgxN6gOKAA/FRDxJx40=";
ldflags = [
"-s"
"-w"
];
meta = {
description = "Lean forum software";
homepage = "https://github.com/cblgh/cerca";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ dansbandit ];
mainProgram = "cerca";
};
}
+15 -20
View File
@@ -7,11 +7,8 @@
cinny,
desktop-file-utils,
wrapGAppsHook3,
makeBinaryWrapper,
pkg-config,
openssl,
dbus,
glib,
glib-networking,
webkitgtk_4_0,
jq,
@@ -64,31 +61,29 @@ rustPlatform.buildRustPackage rec {
--set-key="Categories" --set-value="Network;InstantMessaging;" \
$out/share/applications/cinny.desktop
'';
postFixup = lib.optionalString stdenv.hostPlatform.isLinux ''
wrapProgram "$out/bin/cinny" \
--inherit-argv0 \
preFixup = ''
gappsWrapperArgs+=(
--set-default WEBKIT_DISABLE_DMABUF_RENDERER "1"
)
'';
nativeBuildInputs = [
wrapGAppsHook3
pkg-config
cargo-tauri_1.hook
desktop-file-utils
makeBinaryWrapper
];
buildInputs =
nativeBuildInputs =
[
openssl
cargo-tauri_1.hook
]
++ lib.optionals stdenv.hostPlatform.isLinux [
dbus
glib
glib-networking
webkitgtk_4_0
desktop-file-utils
pkg-config
wrapGAppsHook3
];
buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
glib-networking
openssl
webkitgtk_4_0
];
meta = {
description = "Yet another matrix client for desktop";
homepage = "https://github.com/cinnyapp/cinny-desktop";
+3 -28
View File
@@ -8,8 +8,6 @@
wrapGAppsHook3,
v2ray-geoip,
v2ray-domain-list-community,
copyDesktopItems,
makeDesktopItem,
libsoup,
}:
let
@@ -31,7 +29,7 @@ let
};
service-cargo-hash = "sha256-lMOQznPlkHIMSm5nOLuGP9qJXt3CXnd+q8nCu+Xbbt8=";
npm-hash = "sha256-v9+1NjXo/1ogmep+4IP+9qoUR1GJz87VGeOoMzQ1Rfw=";
pnpm-hash = "sha256-v9+1NjXo/1ogmep+4IP+9qoUR1GJz87VGeOoMzQ1Rfw=";
vendor-hash = "sha256-y3XVHi00mnuVFxSd02YBgfWuXYRVIs+e0tITXNOFRsA=";
service = callPackage ./service.nix {
@@ -44,23 +42,13 @@ let
;
};
webui = callPackage ./webui.nix {
inherit
version
src
pname
meta
npm-hash
;
};
unwrapped = callPackage ./unwrapped.nix {
inherit
pname
version
src
pnpm-hash
vendor-hash
webui
meta
libsoup
;
@@ -92,20 +80,6 @@ stdenv.mkDerivation {
nativeBuildInputs = [
wrapGAppsHook3
copyDesktopItems
];
desktopItems = [
(makeDesktopItem {
name = "clash-verge";
exec = "clash-verge";
comment = "Clash Verge Rev";
type = "Application";
icon = "clash-verge";
desktopName = "Clash Verge Rev";
terminal = false;
categories = [ "Network" ];
})
];
installPhase = ''
@@ -121,6 +95,7 @@ stdenv.mkDerivation {
ln -s ${v2ray-geoip}/share/v2ray/geoip.dat $out/lib/Clash\ Verge/resources/geoip.dat
ln -s ${v2ray-domain-list-community}/share/v2ray/geosite.dat $out/lib/Clash\ Verge/resources/geosite.dat
ln -s ${dbip-country-lite.mmdb} $out/lib/Clash\ Verge/resources/Country.mmdb
runHook postInstall
'';
}
+50 -42
View File
@@ -2,35 +2,53 @@
pname,
version,
src,
libayatana-appindicator,
vendor-hash,
glib,
webui,
pkg-config,
libsoup,
rustPlatform,
makeDesktopItem,
libsForQt5,
kdePackages,
meta,
webkitgtk_4_1,
openssl,
pnpm-hash,
vendor-hash,
rustPlatform,
cargo-tauri,
jq,
moreutils,
nodejs,
pkg-config,
pnpm_9,
glib,
kdePackages,
libayatana-appindicator,
libsForQt5,
libsoup,
openssl,
webkitgtk_4_1,
}:
rustPlatform.buildRustPackage {
inherit version src meta;
pname = "${pname}-unwrapped";
sourceRoot = "${src.name}/src-tauri";
cargoRoot = "src-tauri";
buildAndTestSubdir = "src-tauri";
useFetchCargoVendor = true;
cargoHash = vendor-hash;
pnpmDeps = pnpm_9.fetchDeps {
inherit pname version src;
hash = pnpm-hash;
};
env = {
OPENSSL_NO_VENDOR = 1;
};
postPatch = ''
# We disable the option to try to use the bleeding-edge version of mihomo
# If you need a newer version, you can override the mihomo input of the wrapped package
sed -i -e '/Mihomo Alpha/d' ./src/components/setting/mods/clash-core-viewer.tsx
substituteInPlace $cargoDepsCopy/libappindicator-sys-*/src/lib.rs \
--replace-fail "libayatana-appindicator3.so.1" "${libayatana-appindicator}/lib/libayatana-appindicator3.so.1"
@@ -41,48 +59,38 @@ rustPlatform.buildRustPackage {
--replace-fail '"kwriteconfig5"' '"${libsForQt5.kconfig}/bin/kwriteconfig5"' \
--replace-fail '"kwriteconfig6"' '"${kdePackages.kconfig}/bin/kwriteconfig6"'
cat tauri.conf.json | jq 'del(.bundle.resources) | del(.bundle.externalBin) | .build.frontendDist = "${webui}" | .build.beforeBuildCommand = ""' > tauri.conf.json.2
mv tauri.conf.json.2 tauri.conf.json
cat tauri.linux.conf.json | jq 'del(.bundle.externalBin)' > tauri.linux.conf.json.2
mv tauri.linux.conf.json.2 tauri.linux.conf.json
chmod 777 ../.cargo
rm ../.cargo/config.toml
# this file tries to override the linker used when compiling for certain platforms
rm .cargo/config.toml
# disable updater and don't try to bundle helper binaries
jq '
.bundle.createUpdaterArtifacts = false |
del(.bundle.resources) |
del(.bundle.externalBin)
' src-tauri/tauri.conf.json | sponge src-tauri/tauri.conf.json
jq 'del(.bundle.externalBin)' src-tauri/tauri.linux.conf.json | sponge src-tauri/tauri.linux.conf.json
# As a side effect of patching the service to fix the arbitrary file overwrite issue,
# we also need to update the timestamp format in the filename to the second level.
# This ensures that the Clash kernel can still be restarted within one minute without problems.
substituteInPlace src/utils/dirs.rs \
substituteInPlace src-tauri/src/utils/dirs.rs \
--replace-fail '%Y-%m-%d-%H%M' '%Y-%m-%d-%H%M%S'
'';
nativeBuildInputs = [
pkg-config
rustPlatform.cargoSetupHook
cargo-tauri.hook
jq
moreutils
nodejs
pkg-config
pnpm_9.configHook
];
buildInputs = [
openssl
libayatana-appindicator
libsoup
openssl
webkitgtk_4_1
];
postInstall = ''
install -DT icons/128x128@2x.png $out/share/icons/hicolor/128x128@2/apps/clash-verge.png
install -DT icons/128x128.png $out/share/icons/hicolor/128x128/apps/clash-verge.png
install -DT icons/32x32.png $out/share/icons/hicolor/32x32/apps/clash-verge.png
'';
desktopItems = [
(makeDesktopItem {
name = "clash-verge-rev";
exec = "clash-verge %u";
icon = "clash-verge-rev";
desktopName = "Clash Verge Rev";
genericName = meta.description;
mimeTypes = [ "x-scheme-handler/clash" ];
type = "Application";
terminal = false;
})
];
}
-45
View File
@@ -1,45 +0,0 @@
{
version,
src,
pname,
pnpm_9,
nodejs,
stdenv,
meta,
npm-hash,
}:
stdenv.mkDerivation {
inherit version src meta;
pname = "${pname}-webui";
pnpmDeps = pnpm_9.fetchDeps {
inherit pname version src;
hash = npm-hash;
};
nativeBuildInputs = [
nodejs
pnpm_9.configHook
];
postPatch = ''
chmod -R +644 -- ./src/components/setting/mods/clash-core-viewer.tsx
chmod -R +644 -- ./src/components/setting/mods
sed -i -e '/Mihomo Alpha/d' ./src/components/setting/mods/clash-core-viewer.tsx
'';
buildPhase = ''
runHook preBuild
node --max_old_space_size=1024000 ./node_modules/vite/bin/vite.js build
runHook postBuild
'';
installPhase = ''
runHook preInstall
cp -r dist $out
runHook postInstall
'';
}
+2 -2
View File
@@ -22,14 +22,14 @@
python3.pkgs.buildPythonApplication rec {
pname = "curtail";
version = "1.12.0";
version = "1.13.0";
format = "other";
src = fetchFromGitHub {
owner = "Huluti";
repo = "Curtail";
tag = version;
sha256 = "sha256-+TnGCLRJsdqdChqonHGuA4kUEiB9Mfc2aQttyt+uFnM=";
sha256 = "sha256-JfioWtd0jGTyaD5uELAqH6J+h04MOrfEqdR7GWgXyMw=";
};
nativeBuildInputs = [
+10
View File
@@ -2,6 +2,7 @@
lib,
stdenv,
fetchFromGitHub,
fetchpatch2,
cmake,
fuse,
zlib,
@@ -25,6 +26,15 @@ stdenv.mkDerivation {
hash = "sha256-QM75GuFHl2gRlRw1BmTexUE1d9YNnhG0qmTqmE9kMX4=";
};
patches = [
# Fix compilation
(fetchpatch2 {
name = "cmake-cxx-standard-17.patch";
url = "https://github.com/darlinghq/darling-dmg/pull/105/commits/b7c620f76a5f76748b3d14dd2a58e77f8b6ed0c0.patch";
hash = "sha256-i1lisEiwYm4IxgKmBYnjscvW6ObT7XGLVbjW2i5yXV4=";
})
];
nativeBuildInputs = [ cmake ];
buildInputs = [
fuse
+3 -2
View File
@@ -6,11 +6,11 @@
}:
stdenv.mkDerivation rec {
version = "1.99.8";
version = "1.99.21";
pname = "dd_rescue";
src = fetchurl {
sha256 = "1gbxm8gr9sx5g1q9dycs21hkxikcy97q09lp1lvs59pnd9qpdnwh";
hash = "sha256-YB3gyUX/8dsFfIbGUWX5rvRuIa2q9E4LOCtEOz+z/bk=";
url = "http://www.garloff.de/kurt/linux/ddrescue/${pname}-${version}.tar.bz2";
};
@@ -44,5 +44,6 @@ stdenv.mkDerivation rec {
platforms = platforms.linux;
homepage = "http://www.garloff.de/kurt/linux/ddrescue/";
license = licenses.gpl2Plus;
mainProgram = "dd_rescue";
};
}
+100
View File
@@ -0,0 +1,100 @@
{
lib,
stdenv,
fetchFromGitHub,
meson,
glib,
gjs,
ninja,
gtk4,
gsettings-desktop-schemas,
wrapGAppsHook4,
desktop-file-utils,
gobject-introspection,
glib-networking,
pkg-config,
libadwaita,
appstream,
blueprint-compiler,
gettext,
libportal-gtk4,
languagetool,
libsoup_3,
openjdk,
xdg-desktop-portal,
dbus,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "eloquent";
version = "1.2";
src = fetchFromGitHub {
owner = "sonnyp";
repo = "Eloquent";
tag = "v${finalAttrs.version}";
fetchSubmodules = true;
hash = "sha256-I4AQZl1zoZPhOwDR1uYNJTMRq5vQHPvyimC8OUAe+vY=";
};
nativeBuildInputs = [
appstream
blueprint-compiler
desktop-file-utils
gjs
gobject-introspection
libportal-gtk4
meson
ninja
pkg-config
wrapGAppsHook4
];
buildInputs = [
dbus
gettext
gjs
glib
glib-networking
gsettings-desktop-schemas
gtk4
libadwaita
libportal-gtk4
libsoup_3
xdg-desktop-portal
];
postPatch = ''
substituteInPlace troll/gjspack/bin/gjspack \
--replace-fail "/usr/bin/env -S gjs" "${gjs}/bin/gjs"
substituteInPlace src/languagetool.js \
--replace-fail "/app/LanguageTool/languagetool-server.jar" "${languagetool}/share/languagetool-server.jar" \
--replace-fail "--config" "" \
--replace-fail "/app/share/server.properties" ""
sed -i "1 a imports.package._findEffectiveEntryPointName = () => 're.sonny.Eloquent';" src/bin.js
patchShebangs .
'';
strictDeps = true;
preFixup = ''
gappsWrapperArgs+=(
--set JAVA_HOME ${openjdk}
--prefix PATH : ${openjdk}/bin
)
'';
passthru.updateScript = nix-update-script { };
meta = {
description = "Proofreading software for English, Spanish, French, German, and more than 20 other languages";
homepage = "https://github.com/sonnyp/eloquent";
license = lib.licenses.gpl3Only;
maintainers = with lib.maintainers; [ thtrf ];
mainProgram = "eloquent";
platforms = lib.platforms.linux;
};
})
+79
View File
@@ -0,0 +1,79 @@
{
lib,
stdenv,
buildGoModule,
fetchFromGitHub,
fetchNpmDeps,
npmHooks,
nodejs,
withUI ? true,
}:
buildGoModule (finalAttrs: {
pname = "exatorrent";
version = "1.3.0";
src = fetchFromGitHub {
owner = "varbhat";
repo = "exatorrent";
tag = "v${finalAttrs.version}";
hash = "sha256-FvL3ekpj1HwARgY3vj0xAwCgDBa97OqtFFY4rSBKr50=";
};
nativeBuildInputs = lib.optionals withUI [
npmHooks.npmConfigHook
nodejs
];
npmRoot = "internal/web";
npmDeps =
if withUI then
fetchNpmDeps {
name = "${finalAttrs.pname}-${finalAttrs.version}-npm-deps";
inherit (finalAttrs) src;
sourceRoot = "${finalAttrs.src.name}/${finalAttrs.npmRoot}";
hash = "sha256-eNrBKTW4KlLNf/Y9NTvGt5r28MG7SLGzUi+p9mOyrmI=";
}
else
null;
preBuild = lib.optionalString withUI ''
pushd "$npmRoot"
npm run build
popd
'';
# I dislike the fact that buildGoModule's fetcher FOD automatically inherits some attrs from the non-FOD part
overrideModAttrs = prev: {
nativeBuildInputs = lib.filter (e: e != npmHooks.npmConfigHook) prev.nativeBuildInputs;
preBuild = "";
};
vendorHash = "sha256-fE+GVQ2HAfElO1UDmDMeu2ca7t5yNs83CXhqgT0t1Js=";
tags = lib.optionals (!withUI) [ "noui" ];
ldflags =
[
"-s"
"-w"
]
++ lib.optionals stdenv.hostPlatform.isGnu [
# upstream also tries to compile statically if possible
"-extldflags '-static'"
];
buildInputs = lib.optionals stdenv.hostPlatform.isGnu [
stdenv.cc.libc.static
];
meta = {
changelog = "https://github.com/varbhat/exatorrent/releases/tag/${finalAttrs.src.tag}";
description = "Self-hostable, easy-to-use, lightweight, and feature-rich torrent client written in Go";
homepage = "https://github.com/varbhat/exatorrent/";
license = lib.licenses.gpl3Only;
mainProgram = "exatorrent";
maintainers = with lib.maintainers; [ tomasajt ];
};
})
+17 -43
View File
@@ -15,65 +15,39 @@
webkitgtk_4_1,
openssl,
}:
let
pnpm = pnpm_10;
in
rustPlatform.buildRustPackage (finalAttrs: {
pname = "fedistar";
version = "1.11.3";
src = fetchFromGitHub {
owner = "h3poteto";
repo = "fedistar";
tag = "v${version}";
tag = "v${finalAttrs.version}";
hash = "sha256-Q2j6K4ys/z77+n3kdGJ15rWbFlbbIHBWB9hOARsgg2A=";
};
fedistar-frontend = stdenvNoCC.mkDerivation (finalAttrs: {
pname = "fedistar-frontend";
inherit version src;
pnpmDeps = pnpm.fetchDeps {
inherit pname version src;
hash = "sha256-xXVsjAXmrsOp+mXrYAxSKz4vX5JApLZ+Rh6hrYlnJDI=";
};
nativeBuildInputs = [
pnpm.configHook
pnpm
nodejs
];
buildPhase = ''
runHook preBuild
pnpm run build
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out
cp -r out/* $out/
runHook postInstall
'';
});
in
rustPlatform.buildRustPackage {
inherit
pname
version
src
fedistar-frontend
;
sourceRoot = "${src.name}/src-tauri";
cargoRoot = "src-tauri";
buildAndTestSubdir = "src-tauri";
useFetchCargoVendor = true;
cargoHash = "sha256-ZJgyrFDtzAH3XqDdnJ27Yn+WsTMrZR2+lnkZ6bw6hzg=";
postPatch = ''
substituteInPlace ./tauri.conf.json \
--replace-fail '"frontendDist": "../out",' '"frontendDist": "${fedistar-frontend}",' \
--replace-fail '"beforeBuildCommand": "pnpm build",' '"beforeBuildCommand": "",'
'';
pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src;
hash = "sha256-xXVsjAXmrsOp+mXrYAxSKz4vX5JApLZ+Rh6hrYlnJDI=";
};
nativeBuildInputs = [
cargo-tauri.hook
pnpm.configHook
pnpm
nodejs
pkg-config
wrapGAppsHook4
];
@@ -107,6 +81,6 @@ rustPlatform.buildRustPackage {
mainProgram = "fedistar";
license = lib.licenses.gpl3Only;
maintainers = with lib.maintainers; [ noodlez1232 ];
changelog = "https://github.com/h3poteto/fedistar/releases/tag/v${version}";
changelog = "https://github.com/h3poteto/fedistar/releases/tag/v${finalAttrs.version}";
};
}
})
+2 -2
View File
@@ -6,10 +6,10 @@
let
pname = "fflogs";
version = "8.17.1";
version = "8.17.13";
src = fetchurl {
url = "https://github.com/RPGLogs/Uploaders-fflogs/releases/download/v${version}/fflogs-v${version}.AppImage";
hash = "sha256-ky9MsRo6/wxNNHrAC8BcWkBBgJTtSmssKiU4cADW3kk=";
hash = "sha256-mCHycRks9HXWhHOA/LbhjPCRjEuyGklgBuvY7e+KXnc=";
};
extracted = appimageTools.extractType2 { inherit pname version src; };
in
+2 -2
View File
@@ -20,13 +20,13 @@
stdenv.mkDerivation rec {
pname = "foliate";
version = "3.2.1";
version = "3.3.0";
src = fetchFromGitHub {
owner = "johnfactotum";
repo = "foliate";
tag = version;
hash = "sha256-NU4lM+J5Tpd9Fl+eVbBy7WnCQ6LJ7oeWVkBxp6euTHU=";
hash = "sha256-QpWJDwatT4zOAPF+dn+Sm5xivk9SIZOvexj0M/Nyu24=";
fetchSubmodules = true;
};
+4 -4
View File
@@ -16,17 +16,17 @@
rustPlatform.buildRustPackage {
pname = "forecast";
version = "0-unstable-2025-04-12";
version = "0-unstable-2025-05-15";
src = fetchFromGitHub {
owner = "cosmic-utils";
repo = "forecast";
rev = "2dc599ff9a4417d511305d910367dd195aa1378a";
hash = "sha256-sD6aGpU1gET+0YPCD8wtxJWEJgWE/xYTWQAaIu2+e/8=";
rev = "7e10d602788c2da526c85cafdc5b167a8bfc2e2c";
hash = "sha256-HsnQll+xqLXA3vRjsiYKkXLKw+uZZoJsSOfms4+fQg0=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-mqZ2tIZzQWU39SMj8UBnScsGAg4xGhkcm51aXx3UBSk=";
cargoHash = "sha256-cLObhwMVnaj1HvMhCgSQOYN7IRPKcSeYuAfIy2V5Fns=";
nativeBuildInputs = [
libcosmicAppHook
@@ -44,6 +44,7 @@ stdenv.mkDerivation rec {
meson
ninja
gettext
glib # for glib-genmarshal
libxslt
docbook-xsl-nons
docbook_xml_dtd_43
@@ -87,6 +88,7 @@ stdenv.mkDerivation rec {
# - https://github.com/NixOS/nixpkgs/issues/51121
# - At least “gnome-keyring:gkm::xdg-store / xdg-trust” is still flaky on 48.beta.
doCheck = false;
strictDeps = true;
checkPhase = ''
runHook postCheck
+4 -10
View File
@@ -8,25 +8,19 @@
buildGoModule rec {
pname = "jfrog-cli";
version = "2.73.0";
version = "2.75.1";
src = fetchFromGitHub {
owner = "jfrog";
repo = "jfrog-cli";
tag = "v${version}";
hash = "sha256-GzxJAatMI7H4XaRgza8+nq4JtIlPN9H3WkdKr0PfXWM=";
hash = "sha256-2vJiT0gr+Ix91KeM+wlldDHkrWN4Zug7RmuxJ5XfSGQ=";
};
proxyVendor = true;
vendorHash = "sha256-tblmLEYHZt8manxuu5OpHeuAW18+0/kSvZIJmhEfQYQ=";
vendorHash = "sha256-1SLzXB9lw5U9xJtUqI5nSoeDEa2IT8FbRH11yEY8kS4=";
postPatch = ''
# Patch out broken test cleanup.
substituteInPlace artifactory_test.go \
--replace-fail \
'deleteReceivedReleaseBundle(t, "cli-tests", "2")' \
'// deleteReceivedReleaseBundle(t, "cli-tests", "2")'
'';
checkFlags = "-skip=^TestReleaseBundle";
postInstall = ''
# Name the output the same way as the original build script does
@@ -1,3 +1,5 @@
source 'https://rubygems.org'
gem 'ledger_web'
gem "csv", "~> 3.3"
@@ -24,14 +24,15 @@ GEM
benchmark (0.4.0)
bigdecimal (3.1.9)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
connection_pool (2.5.3)
csv (3.3.4)
database_cleaner (2.1.0)
database_cleaner-active_record (>= 2, < 3)
database_cleaner-active_record (2.2.0)
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
diff-lcs (1.6.0)
diff-lcs (1.6.1)
directory_watcher (1.5.1)
drb (2.2.1)
i18n (1.14.7)
@@ -46,18 +47,18 @@ GEM
sinatra
sinatra-contrib
sinatra-session
logger (1.6.6)
minitest (5.25.4)
logger (1.7.0)
minitest (5.25.5)
multi_json (1.15.0)
mustermann (3.0.3)
ruby2_keywords (~> 0.0.1)
pg (1.5.9)
rack (3.1.12)
rack (3.1.14)
rack-protection (4.1.1)
base64 (>= 0.1.0)
logger (>= 1.6.0)
rack (>= 3.0.0, < 4)
rack-session (2.1.0)
rack-session (2.1.1)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rspec (3.13.0)
@@ -66,16 +67,16 @@ GEM
rspec-mocks (~> 3.13.0)
rspec-core (3.13.3)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.3)
rspec-expectations (3.13.4)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.2)
rspec-mocks (3.13.4)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-support (3.13.2)
rspec-support (3.13.3)
ruby2_keywords (0.0.5)
securerandom (0.4.1)
sequel (5.90.0)
sequel (5.92.0)
bigdecimal
sinatra (4.1.1)
logger (>= 1.6.0)
@@ -102,7 +103,8 @@ PLATFORMS
ruby
DEPENDENCIES
csv (~> 3.3)
ledger_web
BUNDLED WITH
2.6.2
2.6.6
@@ -94,10 +94,20 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1z7bag6zb2vwi7wp2bkdkmk7swkj6zfnbsnc949qq0wfsgw94fr3";
sha256 = "0nrhsk7b3sjqbyl1cah6ibf1kvi3v93a7wf4637d355hp614mmyg";
type = "gem";
};
version = "2.5.0";
version = "2.5.3";
};
csv = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1kfqg0m6vqs6c67296f10cr07im5mffj90k2b5dsm51liidcsvp9";
type = "gem";
};
version = "3.3.4";
};
database_cleaner = {
dependencies = [ "database_cleaner-active_record" ];
@@ -139,10 +149,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0bnss89lcm3b1k3xcjd35grxqz5q040d12imd73qybwnfarggrx1";
sha256 = "1m3cv0ynmxq93axp6kiby9wihpsdj42y6s3j8bsf5a1p7qzsi98j";
type = "gem";
};
version = "1.6.0";
version = "1.6.1";
};
directory_watcher = {
groups = [ "default" ];
@@ -201,20 +211,20 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "05s008w9vy7is3njblmavrbdzyrwwc1fsziffdr58w9pwqj8sqfx";
sha256 = "00q2zznygpbls8asz5knjvvj2brr3ghmqxgr83xnrdj4rk3xwvhr";
type = "gem";
};
version = "1.6.6";
version = "1.7.0";
};
minitest = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0izrg03wn2yj3gd76ck7ifbm9h2kgy8kpg4fk06ckpy4bbicmwlw";
sha256 = "0mn7q9yzrwinvfvkyjiz548a4rmcwbmz2fn9nyzh4j1snin6q6rr";
type = "gem";
};
version = "5.25.4";
version = "5.25.5";
};
multi_json = {
groups = [ "default" ];
@@ -252,10 +262,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0h65a1f9gsqx2ryisdy4lrd9a9l8gdv65dcscw9ynwwjr1ak1n00";
sha256 = "0i2bjh42cmlkwxjrldqj8g5sfrasdp64xhfr25kvp4ziilm3qqc4";
type = "gem";
};
version = "3.1.12";
version = "3.1.14";
};
rack-protection = {
dependencies = [
@@ -281,10 +291,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1452c1bhh6fdnv17s1z65ajwh08axqnlmkhnr1qyyn2vacb3jz23";
sha256 = "1sg4laz2qmllxh1c5sqlj9n1r7scdn08p3m4b0zmhjvyx9yw0v8b";
type = "gem";
};
version = "2.1.0";
version = "2.1.1";
};
rspec = {
dependencies = [
@@ -321,10 +331,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0n3cyrhsa75x5wwvskrrqk56jbjgdi2q1zx0irllf0chkgsmlsqf";
sha256 = "1n7cb6szws90hxbzqrfybs4rj1xb0vhn24xa4l5r1vnzcnblahsf";
type = "gem";
};
version = "3.13.3";
version = "3.13.4";
};
rspec-mocks = {
dependencies = [
@@ -335,20 +345,20 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1vxxkb2sf2b36d8ca2nq84kjf85fz4x7wqcvb8r6a5hfxxfk69r3";
sha256 = "14xr5bq7s80hm97fcp3pvk4v515qfw3lrlsf20idalwwf6h5icbb";
type = "gem";
};
version = "3.13.2";
version = "3.13.4";
};
rspec-support = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1v6v6xvxcpkrrsrv7v1xgf7sl0d71vcfz1cnrjflpf6r7x3a58yf";
sha256 = "0hrzdcklbl8pv721cq906yfl38fmqmlnh33ff8l752z1ys9y6q9a";
type = "gem";
};
version = "3.13.2";
version = "3.13.3";
};
ruby2_keywords = {
groups = [ "default" ];
@@ -376,10 +386,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1s5qhylirrmfbjhdjdfqaiksjlaqmgixl25sxd8znq8dqwqlrydz";
sha256 = "0ga49hliy5alb1x42mvpkmasqv71rhm4081zv5gpwr5q8lcsc1nb";
type = "gem";
};
version = "5.90.0";
version = "5.92.0";
};
sinatra = {
dependencies = [
@@ -0,0 +1,23 @@
diff --git a/plugin/httpgetter/html_meta_test.go b/plugin/httpgetter/html_meta_test.go
index d0b0d903..d1668db1 100644
--- a/plugin/httpgetter/html_meta_test.go
+++ b/plugin/httpgetter/html_meta_test.go
@@ -2,7 +2,6 @@ package httpgetter
import (
"errors"
- "strings"
"testing"
"github.com/stretchr/testify/require"
@@ -30,10 +29,4 @@ func TestGetHTMLMetaForInternal(t *testing.T) {
if _, err := GetHTMLMeta("http://localhost"); !errors.Is(err, ErrInternalIP) {
t.Errorf("Expected error for resolved internal IP, got %v", err)
}
-
- // test for redirected internal IP
- // 49.232.126.226:1110 will redirects to 127.0.0.1
- if _, err := GetHTMLMeta("http://49.232.126.226:1110"); !(errors.Is(err, ErrInternalIP) && strings.Contains(err.Error(), "redirect")) {
- t.Errorf("Expected error for redirected internal IP, got %v", err)
- }
}
+122
View File
@@ -0,0 +1,122 @@
{
fetchFromGitHub,
buildGoModule,
stdenvNoCC,
nix-update-script,
nodejs,
lib,
pnpm,
buf,
cacert,
grpc-gateway,
protoc-gen-go,
protoc-gen-go-grpc,
protoc-gen-validate,
}:
let
version = "0.24.2";
src = fetchFromGitHub {
owner = "usememos";
repo = "memos";
rev = "v${version}";
hash = "sha256-DWOJ6+lUTbOzMLsfTDNZfhgNomajNCnNi7U1A+tqXm4=";
};
protobufsGenerated = stdenvNoCC.mkDerivation {
name = "memos-protobuf-gen";
inherit src;
nativeBuildInputs = [
buf
cacert
grpc-gateway
protoc-gen-go
protoc-gen-go-grpc
protoc-gen-validate
];
buildPhase = ''
runHook preBuild
pushd proto
HOME=$TMPDIR buf generate
popd
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/{proto,web/src/types}
cp -r {.,$out}/proto/gen
cp -r {.,$out}/web/src/types/proto
runHook postInstall
'';
outputHashMode = "recursive";
outputHashAlgo = "sha256";
outputHash = "sha256-u+Wq/fXvWTjXdhC2h6RCsn7pjdFJ+gUdTPRvrn9cZ+k=";
};
frontend = stdenvNoCC.mkDerivation (finalAttrs: {
pname = "memos-web";
inherit version src;
pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src;
sourceRoot = "${finalAttrs.src.name}/web";
hash = "sha256-lopCa7F/foZ42cAwCxE+TWAnglTZg8jY8eRWmeck/W8=";
};
pnpmRoot = "web";
nativeBuildInputs = [
nodejs
pnpm.configHook
];
preBuild = ''
cp -r {${protobufsGenerated},.}/web/src/types/proto
'';
buildPhase = ''
runHook preBuild
pnpm -C web build
runHook postBuild
'';
installPhase = ''
runHook preInstall
cp -r web/dist $out
runHook postInstall
'';
});
in
buildGoModule {
pname = "memos";
inherit version src;
vendorHash = "sha256-hdL4N0tg/lYGTeiKl9P2QsV8HTxlvHfsSqsqq/C0cg8=";
preBuild = ''
rm -rf server/router/frontend/dist
cp -r ${frontend} server/router/frontend/dist
cp -r {${protobufsGenerated},.}/proto/gen
'';
patches = [
# to be removed in next release (test was removed upstream as part of a bigger commit)
./nixbuild-check.patch
];
passthru.updateScript = nix-update-script {
extraArgs = [
"--subpackage"
"memos-web"
"--subpackage"
"memos-protobuf-gen"
];
};
meta = {
homepage = "https://usememos.com";
description = "Lightweight, self-hosted memo hub";
maintainers = with lib.maintainers; [
indexyz
kuflierl
];
license = lib.licenses.mit;
mainProgram = "memos";
};
}
+3 -3
View File
@@ -6,18 +6,18 @@
rustPlatform.buildRustPackage rec {
pname = "mitra";
version = "4.1.1";
version = "4.2.1";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "silverpill";
repo = "mitra";
rev = "v${version}";
hash = "sha256-GKatTwdgBhhYtnKm+UNTJpcspG5pQBqHA616ELGGucg=";
hash = "sha256-rT29QByrg/rn13Hj4UTzwA22xLsQhNESQPM0lb/dsf8=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-E6Sdu5QmALroJ6QLLy7QZOjieGut41lcoHwHuZftXvs=";
cargoHash = "sha256-whAUofVJgqhwasOaYNmrWcZVyg0YpvNemt7/LJHxgCs=";
# require running database
doCheck = false;
+7 -7
View File
@@ -8,13 +8,13 @@
stdenv.mkDerivation {
pname = "ogdf";
version = "2022.02";
version = "2023.09";
src = fetchFromGitHub {
owner = "ogdf";
repo = "ogdf";
rev = "dogwood-202202";
sha256 = "sha256-zkQ6sS0EUmiigv3T7To+tG3XbFbR3XEbFo15oQ0bWf0=";
tag = "elderberry-202309";
hash = "sha256-vnhPuMhz+pE4ExhRhjwHy4OilIkJ/kXc2LWU+9auY9k=";
};
nativeBuildInputs = [
@@ -28,12 +28,12 @@ stdenv.mkDerivation {
"-DOGDF_WARNING_ERRORS=OFF"
];
meta = with lib; {
meta = {
description = "Open Graph Drawing Framework/Open Graph algorithms and Data structure Framework";
homepage = "http://www.ogdf.net";
license = licenses.gpl2;
maintainers = [ maintainers.ianwookim ];
platforms = platforms.all;
license = lib.licenses.gpl2;
maintainers = [ lib.maintainers.ianwookim ];
platforms = lib.platforms.all;
longDescription = ''
OGDF stands both for Open Graph Drawing Framework (the original name) and
Open Graph algorithms and Data structures Framework.
+50
View File
@@ -0,0 +1,50 @@
{
lib,
stdenv,
fetchFromGitHub,
autoreconfHook,
pkg-config,
help2man,
gengetopt,
openssl,
nix-update-script,
}:
stdenv.mkDerivation rec {
pname = "openpace";
version = "1.1.3";
src = fetchFromGitHub {
owner = "frankmorgner";
repo = "openpace";
tag = version;
hash = "sha256-KsgCTHvbqxNOcf9HWgXGxagpIjHEcQ5Kryjq71F8XRk=";
};
nativeBuildInputs = [
autoreconfHook
pkg-config
help2man
gengetopt
];
buildInputs = [ openssl ];
preConfigure = ''
autoreconf --verbose --install
'';
preFixup = ''
rm $out/bin/example
'';
passthru.updateScript = nix-update-script { };
meta = {
description = "Cryptographic library for EAC version 2";
homepage = "https://github.com/frankmorgner/openpace";
license = lib.licenses.gpl3Plus;
platforms = lib.platforms.unix;
maintainers = with lib.maintainers; [ vaavaav ];
broken = !stdenv.buildPlatform.canExecute stdenv.hostPlatform; # help2man
};
}
+2 -2
View File
@@ -13,14 +13,14 @@
python3Packages.buildPythonApplication rec {
pname = "plattenalbum";
version = "2.2.2";
version = "2.3.0";
pyproject = false;
src = fetchFromGitHub {
owner = "SoongNoonien";
repo = "plattenalbum";
tag = "v${version}";
hash = "sha256-IuyEy6w1JxuuA+domZ+XNIq5vmcOVs0sHO4dp1dyE6k=";
hash = "sha256-5/4t7tnMGuy5TIIdGN5hm0I0O0oC3FC503PNpnUHkV8=";
};
nativeBuildInputs = [
@@ -2,30 +2,32 @@
lib,
stdenv,
fetchgit,
ant,
jdk,
stripJavaArchivesHook,
makeWrapper,
jre,
stripJavaArchivesHook,
coreutils,
jre,
which,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "projectlibre";
version = "1.9.3";
version = "1.9.8";
src = fetchgit {
url = "https://git.code.sf.net/p/projectlibre/code";
rev = "20814e88dc83694f9fc6780c2550ca5c8a87aa16"; # version 1.9.3 was not tagged
hash = "sha256-yXgYyy3jWxYMXKsNCRWdO78gYRmjKpO9U5WWU6PtwMU=";
rev = "0530be227f4a10c5545cce8d3db20ac5a4d76a66"; # version 1.9.8 was not tagged
hash = "sha256-eGoPtHy1XfPLnJXNDOMcek4spNKkNyZdby0IsZFZfME=";
};
nativeBuildInputs = [
ant
jdk
stripJavaArchivesHook
makeWrapper
stripJavaArchivesHook
];
runtimeDeps = [
@@ -34,8 +36,6 @@ stdenv.mkDerivation (finalAttrs: {
which
];
env.JAVA_TOOL_OPTIONS = "-Dfile.encoding=UTF8";
buildPhase = ''
runHook preBuild
ant -f projectlibre_build/build.xml
@@ -57,10 +57,10 @@ stdenv.mkDerivation (finalAttrs: {
popd
substituteInPlace $out/bin/projectlibre \
--replace-fail "/usr/share/projectlibre" "$out/share/projectlibre"
--replace-fail "/usr/share/projectlibre" "$out/share/projectlibre"
wrapProgram $out/bin/projectlibre \
--prefix PATH : ${lib.makeBinPath finalAttrs.runtimeDeps}
--prefix PATH : ${lib.makeBinPath finalAttrs.runtimeDeps}
runHook postInstall
'';
+9 -60
View File
@@ -1,21 +1,9 @@
commit 070bf216bacf6ce1b473f2819a017d1be29716d0
commit 58bdfa7ef92ba07dc41a07aeef6d790ecd8f888c
Author: kuflierl <41301536+kuflierl@users.noreply.github.com>
Date: Sun Apr 13 19:56:58 2025 +0200
Date: Sat May 3 21:02:26 2025 +0200
add support for nix-build-system for tests
fix(tests): add support for nix-build-system for tests
diff --git a/Cargo.toml b/Cargo.toml
index eba0ef8..9153f00 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -58,6 +58,7 @@ default = []
as-root = [] # for tests only
gen-man-pages = ["dep:clap_mangen"]
nightly = [] # for benchmarks only
+nix-build-env = [] # perform checks in a way compatable with nix build
[lints.rust]
# https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html
diff --git a/src/systemd/resolver.rs b/src/systemd/resolver.rs
index e2abbb7..1151592 100644
--- a/src/systemd/resolver.rs
@@ -44,7 +32,7 @@ index e2abbb7..1151592 100644
let actions = vec![ProgramAction::Read("/var/data".into())];
let candidates = resolve(&opts, &actions, &hardening_opts);
diff --git a/tests/options.rs b/tests/options.rs
index 835ee14..cac55e5 100644
index 835ee14..a9c9973 100644
--- a/tests/options.rs
+++ b/tests/options.rs
@@ -24,7 +24,7 @@ fn run_true() {
@@ -116,7 +104,7 @@ index 835ee14..cac55e5 100644
BoxPredicate::new(predicate::str::contains("ProtectHome=true\n").count(1))
} else {
BoxPredicate::new(predicate::str::contains("ProtectHome=").not())
@@ -227,11 +227,12 @@ fn run_read_kallsyms() {
@@ -227,7 +227,7 @@ fn run_read_kallsyms() {
.stdout(predicate::str::contains("LockPersonality=true\n").count(1))
.stdout(predicate::str::contains("RestrictRealtime=true\n").count(1))
.stdout(predicate::str::contains("ProtectClock=true\n").count(1))
@@ -125,30 +113,7 @@ index 835ee14..cac55e5 100644
.stdout(predicate::str::contains("CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_BPF CAP_CHOWN CAP_MKNOD CAP_NET_RAW CAP_PERFMON CAP_SYS_BOOT CAP_SYS_CHROOT CAP_SYS_MODULE CAP_SYS_NICE CAP_SYS_PACCT CAP_SYS_PTRACE CAP_SYS_TIME CAP_SYS_TTY_CONFIG CAP_SYSLOG CAP_WAKE_ALARM\n").count(1));
}
#[test]
+#[cfg_attr(feature = "nix-build-env", ignore)]
fn run_ls_modules() {
Command::cargo_bin("shh")
.unwrap()
@@ -240,7 +241,7 @@ fn run_ls_modules() {
.assert()
.success()
.stdout(predicate::str::contains("ProtectSystem=strict\n").count(1))
- .stdout(if Uid::effective().is_root() {
+ .stdout(if Uid::effective().is_root() || !env::current_exe().unwrap().starts_with("/home") {
BoxPredicate::new(predicate::str::contains("ProtectHome=true\n").count(1))
} else {
BoxPredicate::new(predicate::str::contains("ProtectHome=").not())
@@ -304,7 +305,7 @@ fn run_dmesg() {
}
#[test]
-#[cfg_attr(feature = "as-root", ignore)]
+#[cfg_attr(any(feature = "nix-build-env", feature = "as-root"), ignore)]
fn run_systemctl() {
assert!(!Uid::effective().is_root());
@@ -344,6 +345,7 @@ fn run_systemctl() {
@@ -344,6 +344,7 @@ fn run_systemctl() {
.stdout(predicate::str::contains("CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_BPF CAP_CHOWN CAP_MKNOD CAP_NET_RAW CAP_PERFMON CAP_SYS_BOOT CAP_SYS_CHROOT CAP_SYS_MODULE CAP_SYS_NICE CAP_SYS_PACCT CAP_SYS_PTRACE CAP_SYS_TIME CAP_SYS_TTY_CONFIG CAP_SYSLOG CAP_WAKE_ALARM\n").count(1));
}
@@ -156,7 +121,7 @@ index 835ee14..cac55e5 100644
#[test]
fn run_ss() {
Command::cargo_bin("shh")
@@ -353,7 +355,7 @@ fn run_ss() {
@@ -353,7 +354,7 @@ fn run_ss() {
.assert()
.success()
.stdout(predicate::str::contains("ProtectSystem=strict\n").count(1))
@@ -165,7 +130,7 @@ index 835ee14..cac55e5 100644
BoxPredicate::new(predicate::str::contains("ProtectHome=true\n").count(1))
} else {
BoxPredicate::new(predicate::str::contains("ProtectHome=").not())
@@ -369,7 +371,7 @@ fn run_ss() {
@@ -369,7 +370,7 @@ fn run_ss() {
.stdout(predicate::str::contains("ProtectKernelModules=true\n").count(1))
.stdout(predicate::str::contains("ProtectKernelLogs=true\n").count(1))
.stdout(predicate::str::contains("ProtectControlGroups=true\n").count(1))
@@ -174,7 +139,7 @@ index 835ee14..cac55e5 100644
.stdout(predicate::str::contains("MemoryDenyWriteExecute=true\n").count(1))
.stdout(predicate::str::contains("RestrictAddressFamilies=AF_NETLINK AF_UNIX\n").count(1).or(predicate::str::contains("RestrictAddressFamilies=AF_NETLINK\n").count(1)))
.stdout(predicate::str::contains("SocketBindDeny=ipv4:tcp\n").count(1))
@@ -379,7 +381,7 @@ fn run_ss() {
@@ -379,7 +380,7 @@ fn run_ss() {
.stdout(predicate::str::contains("LockPersonality=true\n").count(1))
.stdout(predicate::str::contains("RestrictRealtime=true\n").count(1))
.stdout(predicate::str::contains("ProtectClock=true\n").count(1))
@@ -183,19 +148,3 @@ index 835ee14..cac55e5 100644
.stdout(predicate::str::contains("CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_BPF CAP_CHOWN CAP_MKNOD CAP_NET_RAW CAP_PERFMON CAP_SYS_BOOT CAP_SYS_CHROOT CAP_SYS_MODULE CAP_SYS_NICE CAP_SYS_PACCT CAP_SYS_PTRACE CAP_SYS_TIME CAP_SYS_TTY_CONFIG CAP_SYSLOG CAP_WAKE_ALARM\n").count(1));
}
@@ -741,6 +743,7 @@ fn run_mknod() {
}
#[test]
+#[cfg_attr(feature = "nix-build-env", ignore)] // no raw socket cap in nix build
fn run_ping_4() {
Command::cargo_bin("shh")
.unwrap()
@@ -759,6 +762,7 @@ fn run_ping_4() {
}
#[test]
+#[cfg_attr(feature = "nix-build-env", ignore)] // no raw socket cap in nix build
fn run_ping_6() {
Command::cargo_bin("shh")
.unwrap()
+81 -7
View File
@@ -2,12 +2,21 @@
lib,
rustPlatform,
fetchFromGitHub,
nix-update-script,
fetchpatch,
installShellFiles,
python3,
strace,
systemd,
iproute2,
stdenv,
enableDocumentationFeature ? true,
enableDocumentationGeneration ? true,
}:
let
isNativeDocgen =
(stdenv.buildPlatform.canExecute stdenv.hostPlatform) && enableDocumentationFeature;
in
rustPlatform.buildRustPackage rec {
pname = "shh";
version = "2025.4.12";
@@ -19,36 +28,101 @@ rustPlatform.buildRustPackage rec {
hash = "sha256-+JWz0ya6gi8pPERnpAcQIe7zZUzWGxha+9/gizMVtEw=";
};
cargoHash = "sha256-TdP+1sb1GEFM57z+rc+gqhoWQhPAXzvMt/FCWf3wpr8=";
cargoHash = "sha256-rrOH76LHYSEeuNiMIICpAO7U/sz5V0JRO22mbIICQWw=";
# needs to be done this way to bypass patch conflicts
cargoPatches = [
(fetchpatch {
# to be removed after next release
name = "refactor-man-page-generation-command.patch";
url = "https://github.com/desbma/shh/commit/849b9a6646981c83a72a977b6398371e29d3b928.patch";
hash = "sha256-LZlUFfPtt2ScTxQbQ9j3Kzvp7T4MCFs92cJiI3YbWns=";
})
(fetchpatch {
# to be removed after next release
name = "support-shell-auto-complete.patch";
url = "https://github.com/desbma/shh/commit/74914dc8cfd74dbd7e051a090cc4c1f561b8cdde.patch";
hash = "sha256-WgKRQAEwSpXdQUnrZC1Bp4RfKg2J9kPkT1k6R2wwgT8=";
})
];
patches = [
./fix_run_checks.patch
./pr13-profile-path-fix-strace.patch
(fetchpatch {
# to be removed after next release
name = "feat-static-strace-path-support-at-compile-time.patch";
url = "https://github.com/desbma/shh/commit/da62ceeb227de853be06610721744667c6fe994b.patch";
hash = "sha256-p/W7HRZZ4TpIwrWN8wQB/SH3C8x3ZLXzwGV50oK/znQ=";
})
];
# buildFeatures = [ /*"gen-man-pages"*/ ];
env = {
SHH_STRACE_BIN_PATH = lib.getExe strace;
};
checkFeatures = [ "nix-build-env" ];
buildFeatures = lib.optional enableDocumentationFeature "generate-extra";
checkFlags = [
# no access to system modules in build env
"--skip=run_ls_modules"
# missing systemd daemon in build env
"--skip=run_systemctl"
# no raw socket cap in nix build
"--skip=run_ping_4"
"--skip=run_ping_6"
];
buildInputs = [
strace
systemd
];
nativeCheckInputs = [
strace
nativeBuildInputs = [
installShellFiles
systemd
strace
];
nativeCheckInputs = [
python3
iproute2
];
# todo elvish
postInstall = lib.optionalString enableDocumentationGeneration ''
mkdir -p target/{mangen,shellcomplete}
${
if isNativeDocgen then
''
$out/bin/shh gen-man-pages target/mangen
$out/bin/shh gen-shell-complete target/shellcomplete
''
else
''
unset SHH_STRACE_BIN_PATH
cargo run --features generate-extra -- gen-man-pages target/mangen
cargo run --features generate-extra -- gen-shell-complete target/shellcomplete
''
}
installManPage target/mangen/*
installShellCompletion --cmd ${pname} \
target/shellcomplete/${pname}.{bash,fish} \
--zsh target/shellcomplete/_${pname}
'';
# RUST_BACKTRACE = 1;
passthru.updateScript = nix-update-script { };
meta = {
description = "Automatic systemd service hardening guided by strace profiling";
homepage = "https://github.com/desbma/shh";
license = lib.licenses.gpl3Only;
platforms = lib.platforms.linux;
changelog = "https://github.com/desbma/shh/blob/v${version}/CHANGELOG.md";
mainProgram = "shh";
maintainers = with lib.maintainers; [
erdnaxe
@@ -1,83 +0,0 @@
commit 4d2c1556d769695770c95a982e0dcda4d70eee57
Author: kuflierl <41301536+kuflierl@users.noreply.github.com>
Date: Sun Apr 13 19:57:50 2025 +0200
service.rs: profile path fix for strace
Enable path env fixing when path env doesn't have strace to unbreak tool on unique systems and units.
This fixes handling on non FHS operating systems and systemd units that define their own PATH that doesn't include strace.
diff --git a/src/systemd/service.rs b/src/systemd/service.rs
index 908fdf0..e9294cf 100644
--- a/src/systemd/service.rs
+++ b/src/systemd/service.rs
@@ -7,6 +7,7 @@ use std::{
ops::RangeInclusive,
path::{Path, PathBuf},
process::{Command, Stdio},
+ ffi::OsString,
};
use anyhow::Context as _;
@@ -99,6 +100,41 @@ impl Service {
)
}
+ // A function for locating the parent directory i.e. PATH of an executable
+ fn resolve_exec_path<P>(exe_name: &P, path_env: OsString) -> Option<PathBuf>
+ where P: AsRef<Path> + ?Sized,
+ {
+ env::split_paths(&path_env).filter_map(|dir| {
+ let full_path = dir.join(&exe_name);
+ if full_path.is_file() {
+ Some(dir)
+ } else {
+ None
+ }
+ }).next()
+ }
+
+ // determine PATH env used for unit
+ pub(crate) fn get_exec_path(config_paths: &Vec<&Path>) -> anyhow::Result<String> {
+ let old_path_env_option = Self::config_vals("Environment", &config_paths)?
+ .into_iter().filter(|x| x.starts_with("\"PATH=")).last().map(|x| x.trim_matches('\"').get(5..).unwrap().to_owned());
+ Ok(match old_path_env_option {
+ Some(path_env) => {
+ log::info!("Found hard coded PATH environment in unit: {path_env}");
+ path_env
+ },
+ None => {
+ let output = Command::new("systemd-path").arg("search-binaries-default").output()?;
+ if !output.status.success() {
+ anyhow::bail!("systemd-path invocation failed with code {:?}", output.status);
+ }
+ let default_systemd_path = output.stdout.lines().next().ok_or_else(|| anyhow::anyhow!("Unable to get global systemd default PATH"))??;
+ log::info!("Could not find hard coded PATH environment in unit, using systemd default: {default_systemd_path}");
+ default_systemd_path
+ }
+ })
+ }
+
/// Get systemd "exposure level" for the service (0-100).
/// 100 means extremely exposed (no hardening), 0 means so sandboxed it can't do much.
/// Although this is a very crude heuristic, below 40-50 is generally good.
@@ -170,6 +206,20 @@ impl Service {
writeln!(fragment_file, "KillMode=control-group")?;
writeln!(fragment_file, "StandardOutput=journal")?;
+ // Modifying Env Path for strace availability if needed
+ let old_path_env = Self::get_exec_path(&config_paths)?;
+ match Self::resolve_exec_path("strace", (&old_path_env).into()) {
+ Some(_) => log::info!("Found strace in previous path, no correction needed"),
+ None => {
+ let path_with_strace = Self::resolve_exec_path("strace", env::var_os("PATH").unwrap()).unwrap();
+ log::info!("Found strace from local PATH in {}, inserting it into unit config!", path_with_strace.display());
+ let mut paths = env::split_paths(&old_path_env).collect::<Vec<_>>();
+ paths.push(path_with_strace);
+ let new_path = env::join_paths(paths)?;
+ writeln!(fragment_file, "Environment=\"PATH={}\"", new_path.to_str().unwrap())?;
+ },
+ }
+
// Profile data dir
let mut rng = rand::rng();
let profile_data_dir = PathBuf::from(format!(
+1
View File
@@ -25,6 +25,7 @@ let
jre' = jre_minimal.override {
jdk = jdk17_headless;
jdkOnBuild = jdk17_headless;
# from https://gitlab.com/signald/signald/-/blob/0.23.0/build.gradle#L173
modules = [
"java.base"
+23
View File
@@ -0,0 +1,23 @@
GEM
remote: https://rubygems.org/
specs:
bigdecimal (3.1.9)
chronic (0.10.2)
mini_portile2 (2.8.8)
sequel (5.90.0)
bigdecimal
sqlite3 (1.7.3)
mini_portile2 (~> 2.8.0)
timetrap (1.15.5)
chronic (~> 0.10.2)
sequel (~> 5.90.0)
sqlite3 (~> 1.4)
PLATFORMS
ruby
DEPENDENCIES
timetrap
BUNDLED WITH
2.6.6
+69
View File
@@ -0,0 +1,69 @@
{
bigdecimal = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1k6qzammv9r6b2cw3siasaik18i6wjc5m0gw5nfdc6jj64h79z1g";
type = "gem";
};
version = "3.1.9";
};
chronic = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
type = "gem";
};
version = "0.10.2";
};
mini_portile2 = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0x8asxl83msn815lwmb2d7q5p29p7drhjv5va0byhk60v9n16iwf";
type = "gem";
};
version = "2.8.8";
};
sequel = {
dependencies = [ "bigdecimal" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1s5qhylirrmfbjhdjdfqaiksjlaqmgixl25sxd8znq8dqwqlrydz";
type = "gem";
};
version = "5.90.0";
};
sqlite3 = {
dependencies = [ "mini_portile2" ];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "073hd24qwx9j26cqbk0jma0kiajjv9fb8swv9rnz8j4mf0ygcxzs";
type = "gem";
};
version = "1.7.3";
};
timetrap = {
dependencies = [
"chronic"
"sequel"
"sqlite3"
];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0gcs9vyg1i3nsiiwrkqza14qj7h3chlg6w5icbf0ggjzswz3rwd2";
type = "gem";
};
version = "1.15.5";
};
}
@@ -34,18 +34,18 @@ stdenv.mkDerivation {
nativeBuildInputs = [ installShellFiles ];
installPhase = ''
mkdir $out;
cd $out;
mkdir $out
cd $out
mkdir bin; pushd bin;
ln -vs ${ttBundlerApp}/bin/t;
ln -vs ${ttBundlerApp}/bin/timetrap;
popd;
mkdir bin; pushd bin
ln -vs ${ttBundlerApp}/bin/t
ln -vs ${ttBundlerApp}/bin/timetrap
popd
for c in t timetrap; do
installShellCompletion --cmd $c --bash ${ttGem}/lib/ruby/gems/*/gems/timetrap*/completions/bash/*;
installShellCompletion --cmd $c --zsh ${ttGem}/lib/ruby/gems/*/gems/timetrap*/completions/zsh/*;
done;
installShellCompletion --cmd $c --bash ${ttGem}/lib/ruby/gems/*/gems/timetrap*/completions/bash/*
installShellCompletion --cmd $c --zsh ${ttGem}/lib/ruby/gems/*/gems/timetrap*/completions/zsh/*
done
'';
meta = with lib; {
@@ -59,4 +59,8 @@ stdenv.mkDerivation {
];
platforms = platforms.unix;
};
passthru = {
updateScript = ttBundlerApp.passthru.updateScript;
};
}
+2 -2
View File
@@ -15,14 +15,14 @@
python3Packages.buildPythonApplication rec {
pname = "varia";
version = "2025.1.24-1";
version = "2025.4.22";
pyproject = false;
src = fetchFromGitHub {
owner = "giantpinkrobots";
repo = "varia";
tag = "v${version}";
hash = "sha256-ZTsp2nVqNe+7uEk6HH95AtJMbdKHmKMy3l6q1Xpx4FY=";
hash = "sha256-y14I/K1fw7Skiuq+CglTRsotqafpP9yabuHhywB2WXE=";
};
postPatch = ''
+2 -2
View File
@@ -15,13 +15,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "vencord";
version = "1.12.1";
version = "1.12.2";
src = fetchFromGitHub {
owner = "Vendicated";
repo = "Vencord";
rev = "v${finalAttrs.version}";
hash = "sha256-Vs6S8N3q5JzXfeogfD0JrVIhMnYIio7+Dfy12gUJrlU=";
hash = "sha256-a4lbeuXEHDMDko8wte7jUdJ0yUcjfq3UPQAuSiz1UQU=";
};
pnpmDeps = pnpm_10.fetchDeps {
+3 -3
View File
@@ -6,20 +6,20 @@
rustPlatform.buildRustPackage rec {
pname = "wasm-tools";
version = "1.229.0";
version = "1.230.0";
src = fetchFromGitHub {
owner = "bytecodealliance";
repo = "wasm-tools";
rev = "v${version}";
hash = "sha256-fJQN5AKhILP7d+0GEtnHKuZtZEr/61TfGwpH1EbbSg4=";
hash = "sha256-xtGPZXb/tgReshmpW5zzG0EOVYPMoXU+avnO5uLKJnI=";
fetchSubmodules = true;
};
# Disable cargo-auditable until https://github.com/rust-secure-code/cargo-auditable/issues/124 is solved.
auditable = false;
useFetchCargoVendor = true;
cargoHash = "sha256-OqQJ2jvceHPoSx7Iic/hsJWv8vJnEo9F1bbpqfL5HsM=";
cargoHash = "sha256-P+5g1ynZVFIU2bgait+2rwJoVYClF7lyq4j2roV/w2o=";
cargoBuildFlags = [
"--package"
"wasm-tools"
@@ -229,10 +229,11 @@ if [[ -n "$newUrl" ]]; then
die "Couldn't evaluate source url from '$attr.$sourceKey'!"
fi
# Escape regex metacharacter that are allowed in store path names
oldUrlEscaped=$(echo "$oldUrl" | sed -re 's|[${}.+?]|\\&|g')
# Escape regex metacharacter that may appear in URLs
oldUrlEscaped=$(echo "$oldUrl" | sed -e 's|[*.^$[\|]|\\&|g')
newUrlEscaped=$(echo "$newUrl" | sed -e 's|[&\|]|\\&|g')
sed -i.cmp "$nixFile" -re "s|\"$oldUrlEscaped\"|\"$newUrl\"|"
sed -i.cmp "$nixFile" -e "s|\"$oldUrlEscaped\"|\"$newUrlEscaped\"|"
if cmp -s "$nixFile" "$nixFile.cmp"; then
die "Failed to replace source URL '$oldUrl' to '$newUrl' in '$attr'!"
fi
+19
View File
@@ -77,3 +77,22 @@ Instead of applying the patches to the worktree per the above instructions, one
For newer LLVM versions, enough has has been upstreamed,
(see https://reviews.llvm.org/differential/query/5UAfpj_9zHwY/ for my progress upstreaming),
that I have just assembled new gnu-install-dirs patches from the remaining unmerged patches instead of rebasing from the prior LLVM's gnu install dirs patch.
## Adding a patch
To add an LLVM patch in the Nixpkgs tree,
1. Put the patch in the corresponding directory (`<VERSION>/<PACKAGE>`).
_Example_: If you want your patch to apply to clang version 12 (and, optionally, later versions), put it in `./12/clang`.
2. Add the patch to the `patches` argument of the corresponding package in `./common`, guarded by a `lib.optionals` with the desired version constraints, passed through the `getVersionFile` function.
_Example_: If you want the patch `./12/llvm/fix-llvm-issue-49955.patch` to apply to LLVM 12, add `lib.optional (lib.versions.major release_version == "12") (getVersionFile "llvm/fix-llvm-issue-49955.patch")` to `./common/llvm/default.nix`.
3. If you wish for this single patch to apply to multiple versions of the package, extend the conditions in the `lib.optional` guard and add the corresponding constraints to `./common/patches.nix`; note that `after` is inclusive and `before` is exclusive.
_Example_:
If you want the patch `./12/clang/purity.patch` to apply to versions 12, 13 and 14, you have to
- Modify the guard in `./common/clang/default.nix` as follows: `lib.optional (lib.versionAtLeast release_version "12" && lib.versionOlder release_version "15")`
- Add `{ "clang/purity.patch" = [ { after = 12; before = 15; path = ../12; } ]; }` to `common/patches.nix`.
You may have multiple different patches with the same name that would apply to different versions; in that case, add the necessary constraints to `common/patches.nix`.
@@ -0,0 +1,16 @@
diff --git a/t/core_surface.t b/t/core_surface.t
index 897536b6..03efa859 100644
--- a/t/core_surface.t
+++ b/t/core_surface.t
@@ -51,7 +51,10 @@ is( $image->h, 32, 'image has height' );
my $pixel_format = $image->format;
isa_ok( $pixel_format, 'SDL::PixelFormat' );
-is( $pixel_format->BitsPerPixel, 8, ' BitsPerPixel' );
+# the bitmap has a bitdepth of 4
+# SDL_classic could not allocate less than full bytes per pixel
+# sdl12-compat returns the actual bit depth of the image here
+is( $pixel_format->BitsPerPixel, 4, ' BitsPerPixel' );
is( $pixel_format->BytesPerPixel, 1, ' BytesPerPixel' );
is( $pixel_format->Rloss, 8, ' Rloss' );
is( $pixel_format->Gloss, 8, ' Gloss' );
@@ -18,7 +18,7 @@
buildPythonPackage rec {
pname = "aiodiscover";
version = "2.6.1";
version = "2.7.0";
pyproject = true;
disabled = pythonOlder "3.9";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
owner = "bdraco";
repo = "aiodiscover";
tag = "v${version}";
hash = "sha256-dgmRgokHDw0ooxD8Ksxb8QKeAdUhYj/WO85EC57MeNg=";
hash = "sha256-zJOsf4oZbZgaiaaPM0HfR0GNwxvGoR6fgkJB5ZFY0O8=";
};
build-system = [ poetry-core ];
@@ -20,7 +20,7 @@
buildPythonPackage rec {
pname = "deebot-client";
version = "13.1.0";
version = "13.2.0";
pyproject = true;
disabled = pythonOlder "3.13";
@@ -29,12 +29,12 @@ buildPythonPackage rec {
owner = "DeebotUniverse";
repo = "client.py";
tag = version;
hash = "sha256-EIhefThzHC9hpI4bGkTu+TskdzajI7cc90DhrfDlbcs=";
hash = "sha256-0DGOdfr6vqtgYwabhJWfxV2kACzixiCnqPNssPHyLhw=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit pname version src;
hash = "sha256-WYWrfNigmu18yEa2QstJ5RfjLWS/Tckem48j8JK2NHk=";
hash = "sha256-A/axIsDfpWNLQXeExshzlJfKWh5yFZYqxDQYPn1+fHg=";
};
pythonRelaxDeps = [
@@ -17,7 +17,7 @@
buildPythonPackage rec {
pname = "ical";
version = "9.2.2";
version = "9.2.4";
pyproject = true;
disabled = pythonOlder "3.11";
@@ -26,7 +26,7 @@ buildPythonPackage rec {
owner = "allenporter";
repo = "ical";
tag = version;
hash = "sha256-eh8XOKn7Xo4JprMwVVdsBWdXajn2URYVR5tz2y2wKrg=";
hash = "sha256-R9BuCLuVYuUvrmF/arEDsUPPUeSLjpqiEJ/ovvGIsYQ=";
};
build-system = [ setuptools ];
@@ -1,25 +0,0 @@
{
lib,
buildPythonPackage,
fetchPypi,
}:
buildPythonPackage rec {
pname = "oauth";
version = "1.0.1";
format = "setuptools";
src = fetchPypi {
inherit pname version;
sha256 = "0pdgi35hczsslil4890xqawnbpdazkgf2v1443847h5hy2gq2sg7";
};
# No tests included in archive
doCheck = false;
meta = with lib; {
homepage = "https://code.google.com/archive/p/oauth/";
description = "Library for OAuth version 1.0a";
license = licenses.mit;
};
}
@@ -1,36 +0,0 @@
{
lib,
buildPythonPackage,
fetchPypi,
httplib2,
mock,
coverage,
}:
buildPythonPackage rec {
pname = "oauth2";
version = "1.9.0.post1";
format = "setuptools";
src = fetchPypi {
inherit pname version;
sha256 = "c006a85e7c60107c7cc6da1b184b5c719f6dd7202098196dfa6e55df669b59bf";
};
propagatedBuildInputs = [ httplib2 ];
buildInputs = [
mock
coverage
];
# ServerNotFoundError: Unable to find the server at oauth-sandbox.sevengoslings.net
doCheck = false;
meta = with lib; {
homepage = "https://github.com/simplegeo/python-oauth2";
description = "Library for OAuth version 1.0";
license = licenses.mit;
maintainers = [ ];
platforms = platforms.unix;
};
}
@@ -29,6 +29,10 @@ buildPythonPackage rec {
propagatedBuildInputs = [ numpy ];
# Fix GCC 14 build.
# from incompatible pointer type [-Wincompatible-pointer-types
env.NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-pointer-types";
patches = [
# make sure X11 and OpenGL can be found at runtime
./static-libs.patch
@@ -9,14 +9,14 @@
buildPythonPackage rec {
pname = "pysensibo";
version = "1.1.0";
version = "1.2.1";
pyproject = true;
disabled = pythonOlder "3.11";
src = fetchPypi {
inherit pname version;
hash = "sha256-yITcVEBtqH1B+MyhQweOzmdgPgWrueAkczp/UsT4J/4=";
hash = "sha256-Otk5W3VTbOAeZOVnXvW8VSxU1nHa8zUvmvduRTdlwVs=";
};
build-system = [ poetry-core ];
@@ -18,7 +18,7 @@
buildPythonPackage rec {
pname = "pysmartthings";
version = "3.2.1";
version = "3.2.2";
pyproject = true;
disabled = pythonOlder "3.12";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
owner = "andrewsayre";
repo = "pysmartthings";
tag = "v${version}";
hash = "sha256-KgwNXIzQWae91R0qmInlm6m+NwrSJgP9SY80WSneTY4=";
hash = "sha256-tQ+AQDHwr9JO4AQ+2ZAGQbSrfnuzPUEi2F19wLijv1Y=";
};
build-system = [ poetry-core ];
+6 -6
View File
@@ -180,9 +180,9 @@
"hash": "sha256-mwN0b9AIUEqW9Wnzetj/kCzHFJXn4SPao8beef8qzEU="
},
"kirigami": {
"version": "6.14.0",
"url": "mirror://kde/stable/frameworks/6.14/kirigami-6.14.0.tar.xz",
"hash": "sha256-Fixim6UOfa5EOe9QJyoMFQy6s3FBWn0esWDb42OPYZo="
"version": "6.14.1",
"url": "mirror://kde/stable/frameworks/6.14/kirigami-6.14.1.tar.xz",
"hash": "sha256-LJG04pUURPfW89at2W3EHGK/nb90eoWU1dL8kY0nMJ8="
},
"kitemmodels": {
"version": "6.14.0",
@@ -290,9 +290,9 @@
"hash": "sha256-JKzW0rhYK91q6b/KlyeKlnY+4YSmzey8Dc1k/U/COLI="
},
"kwallet": {
"version": "6.14.0",
"url": "mirror://kde/stable/frameworks/6.14/kwallet-6.14.0.tar.xz",
"hash": "sha256-p0d+Tl58y0NJHFoOzK32oz6WIIjVrzLEtrSqy5IPWeM="
"version": "6.14.1",
"url": "mirror://kde/stable/frameworks/6.14/kwallet-6.14.1.tar.xz",
"hash": "sha256-70gr4tUhH3EdV4qh0fN/ceZBpqUv034RMn4ZkV/UISc="
},
"kwidgetsaddons": {
"version": "6.14.0",
+3 -3
View File
@@ -10,13 +10,13 @@
stdenv.mkDerivation rec {
name = "rtl8189es-${kernel.version}-${version}";
version = "2024-01-21";
version = "2025-04-29";
src = fetchFromGitHub {
owner = "jwrdegoede";
repo = "rtl8189ES_linux";
rev = "eb51e021b0e1b6f94a4b49da3f4ee5c5fb20b715";
sha256 = "sha256-n7Bsstr1H1RvguAyJnVqk/JgEx8WEZWaVg7ZfEYykR0=";
rev = "7b43c5c7971eabea263dc2b6cc0928b84323f310";
sha256 = "sha256-1BCrMJlXswVZrnbulrF2m0lh7jw8PgHzYPkLk6Stbx8=";
};
nativeBuildInputs = [
+3 -3
View File
@@ -8,13 +8,13 @@
# rtl8189fs is a branch of the rtl8189es driver
rtl8189es.overrideAttrs (drv: rec {
name = "rtl8189fs-${kernel.version}-${version}";
version = "2024-01-22";
version = "2025-05-04";
src = fetchFromGitHub {
owner = "jwrdegoede";
repo = "rtl8189ES_linux";
rev = "5d523593f41c0b8d723c6aa86b217ee1d0965786";
sha256 = "sha256-pziaUM6XfF4Tt9yfWUnLUiTw+sw6uZrr1HcaXdRQ31E=";
rev = "06e89edce6817616d963414825dccf87094a7e54";
sha256 = "sha256-W+gBpK17PmF8BdmBoUHPX7hZoSNOyGe3W1NypR8bc6A=";
};
meta = with lib; {
@@ -2,7 +2,7 @@
# Do not edit!
{
version = "2025.5.1";
version = "2025.5.2";
components = {
"3_day_blinds" =
ps: with ps; [
+13 -3
View File
@@ -194,6 +194,16 @@ let
doCheck = false; # no tests
});
plexapi = super.plexapi.overrideAttrs (oldAttrs: rec {
version = "4.15.16";
src = fetchFromGitHub {
owner = "pkkid";
repo = "python-plexapi";
tag = version;
hash = "sha256-NwGGNN6LC3gvE8zoVL5meNWMbqZjJ+6PcU2ebJTfJmU=";
};
});
# Pinned due to API changes in 0.1.0
poolsense = super.poolsense.overridePythonAttrs (oldAttrs: rec {
version = "0.0.8";
@@ -367,7 +377,7 @@ let
extraBuildInputs = extraPackages python.pkgs;
# Don't forget to run update-component-packages.py after updating
hassVersion = "2025.5.1";
hassVersion = "2025.5.2";
in
python.pkgs.buildPythonApplication rec {
@@ -388,13 +398,13 @@ python.pkgs.buildPythonApplication rec {
owner = "home-assistant";
repo = "core";
tag = version;
hash = "sha256-/ItMm6/SV0MazK16NfW53XPcIV7ERUUabjcwHBC4c7Y=";
hash = "sha256-el5s82R4MuTjUnMVXRQj4PhPxJxHoL6Jqvc6XRnJl8w=";
};
# Secondary source is pypi sdist for translations
sdist = fetchPypi {
inherit pname version;
hash = "sha256-zllQ0h1Ws+HNyfBvAAoKtovQtwkr0fNNtnF2pAjRrqM=";
hash = "sha256-lddnAM3fja9enPYRSonwSe1aG8t55jSJQNveWPwrhOE=";
};
build-system = with python.pkgs; [
+2 -2
View File
@@ -8,7 +8,7 @@ buildPythonPackage rec {
# the frontend version corresponding to a specific home-assistant version can be found here
# https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json
pname = "home-assistant-frontend";
version = "20250509.0";
version = "20250516.0";
format = "wheel";
src = fetchPypi {
@@ -16,7 +16,7 @@ buildPythonPackage rec {
pname = "home_assistant_frontend";
dist = "py3";
python = "py3";
hash = "sha256-tlBdUA3Gj7P6KTjY2UNnWjQqpnwgvAlXC09P7QFR0r0=";
hash = "sha256-KyZE9SmEoAKgaZMRvs83BK73Yo3fqD8O+vMBO4JE+Ng=";
};
# there is nothing to strip in this package
@@ -18,7 +18,7 @@
buildPythonPackage rec {
pname = "pytest-homeassistant-custom-component";
version = "0.13.244";
version = "0.13.245";
pyproject = true;
disabled = pythonOlder "3.13";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
owner = "MatthewFlamm";
repo = "pytest-homeassistant-custom-component";
rev = "refs/tags/${version}";
hash = "sha256-jYKPkhOKxi3Ue4Q/FHaBn/3p8b1VYsje1/awvOCBDfk=";
hash = "sha256-l/NStiw2tajXydNv9EDqRZ1ku2CeRdDOsHDFIEA9vdM=";
};
build-system = [ setuptools ];
+2 -2
View File
@@ -10,7 +10,7 @@
buildPythonPackage rec {
pname = "homeassistant-stubs";
version = "2025.5.1";
version = "2025.5.2";
pyproject = true;
disabled = python.version != home-assistant.python.version;
@@ -19,7 +19,7 @@ buildPythonPackage rec {
owner = "KapJI";
repo = "homeassistant-stubs";
tag = version;
hash = "sha256-esKI8bqTI2ov5i0vrUDTjCPWKp7PG/Pay/lvYbvMQkU=";
hash = "sha256-jvXsGWVXviwC2KjMuRPdLy2uY5fkqsMALG1RZ3XvzvU=";
};
build-system = [
+24 -1
View File
@@ -63,6 +63,17 @@ let
};
extraDisabledTests = {
sensor = [
# Failed: Translation not found for sensor
"test_validate_unit_change_convertible"
"test_validate_statistics_unit_change_no_device_class"
"test_validate_statistics_state_class_removed"
"test_validate_statistics_state_class_removed_issue_cleaned_up"
"test_validate_statistics_unit_change_no_conversion"
"test_validate_statistics_unit_change_equivalent_units_2"
"test_update_statistics_issues"
"test_validate_statistics_mean_type_changed"
];
shell_command = [
# tries to retrieve file from github
"test_non_text_stdout_capture"
@@ -75,6 +86,10 @@ let
# AssertionError: assert 'unknown_error' == 'template_error'
"test_render_template_with_timeout"
];
zeroconf = [
# multicast socket bind, not possible in the sandbox
"test_subscribe_discovery"
];
};
extraPytestFlagsArray = {
@@ -84,7 +99,7 @@ let
];
bmw_connected_drive = [
# outdated snapshot
"--deselect tests/components/bmw_connected_drive/test_select.py::test_entity_state_attrs"
"--deselect tests/components/bmw_connected_drive/test_binary_sensor.py::test_entity_state_attrs"
];
dnsip = [
# Tries to resolve DNS entries
@@ -104,6 +119,14 @@ let
# aioserial mock produces wrong state
"--deselect tests/components/modem_callerid/test_init.py::test_setup_entry"
];
openai_conversation = [
# outdated snapshot
"--deselect tests/components/openai_conversation/test_conversation.py::test_function_call"
];
technove = [
# outdated snapshot
"--deselect tests/components/technove/test_switch.py::test_switches"
];
};
in
lib.listToAttrs (
+3 -3
View File
@@ -16,13 +16,13 @@
stdenv.mkDerivation {
pname = "solanum";
version = "0-unstable-2025-02-25";
version = "0-unstable-2025-05-11";
src = fetchFromGitHub {
owner = "solanum-ircd";
repo = "solanum";
rev = "1669c6406cea5092f5ac25634136341a92c6373b";
hash = "sha256-Y/fXtBgqzt9tRxL4Xs0KM9nX7Os9QBHBjoDuiaHOsfY=";
rev = "b3d3796e690ce2482c1365d99e3329d5587b75d5";
hash = "sha256-hRiBcX2KDAdtx4G3jJyQlLvhfUutHoy85Upni1RfOHY=";
};
patches = [
-61
View File
@@ -1,61 +0,0 @@
{
fetchFromGitHub,
buildGoModule,
jq,
buildNpmPackage,
lib,
makeWrapper,
}:
let
version = "0.13.2";
src = fetchFromGitHub {
owner = "usememos";
repo = "memos";
rev = "v${version}";
hash = "sha256-lcOZg5mlFPp04ZCm5GDhQfSwE2ahSmGhmdAw+pygK0A=";
};
frontend = buildNpmPackage {
pname = "memos-web";
inherit version;
src = "${src}/web";
npmDepsHash = "sha256-36UcHE98dsGvYQWLIc/xgP8Q0IyJ7la0Qoo3lZqUcmw=";
postPatch = ''
cp ${./package-lock.json} package-lock.json
'';
installPhase = ''
cp -r dist $out
'';
};
in
buildGoModule {
pname = "memos";
inherit version src;
# check will unable to access network in sandbox
doCheck = false;
vendorHash = "sha256-UM/xeRvfvlq+jGzWpc3EU5GJ6Dt7RmTbSt9h3da6f8w=";
# Inject frontend assets into go embed
prePatch = ''
rm -rf server/dist
cp -r ${frontend} server/dist
'';
passthru = {
updateScript = ./update.sh;
};
meta = with lib; {
homepage = "https://usememos.com";
description = "Lightweight, self-hosted memo hub";
maintainers = with maintainers; [ indexyz ];
license = licenses.mit;
mainProgram = "memos";
};
}
File diff suppressed because it is too large Load Diff
-56
View File
@@ -1,56 +0,0 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p nix wget nix-prefetch-github moreutils jq prefetch-npm-deps nodejs
set -euo pipefail
TARGET_VERSION_REMOTE=$(curl -s https://api.github.com/repos/usememos/memos/releases/latest | jq -r ".tag_name")
TARGET_VERSION=${TARGET_VERSION_REMOTE#v}
if [[ "$UPDATE_NIX_OLD_VERSION" == "$TARGET_VERSION" ]]; then
echo "memos is up-to-date: ${UPDATE_NIX_OLD_VERSION}"
exit 0
fi
extractVendorHash() {
original="${1?original hash missing}"
result="$(nix-build -A memos.goModules 2>&1 | tail -n3 | grep 'got:' | cut -d: -f2- | xargs echo || true)"
[ -z "$result" ] && { echo "$original"; } || { echo "$result"; }
}
replaceHash() {
old="${1?old hash missing}"
new="${2?new hash missing}"
awk -v OLD="$old" -v NEW="$new" '{
if (i=index($0, OLD)) {
$0 = substr($0, 1, i-1) NEW substr($0, i+length(OLD));
}
print $0;
}' ./pkgs/servers/memos/default.nix | sponge ./pkgs/servers/memos/default.nix
}
# change version number
sed -e "s/version =.*;/version = \"$TARGET_VERSION\";/g" \
-i ./pkgs/servers/memos/default.nix
# update hash
SRC_HASH="$(nix-instantiate --eval -A memos.src.outputHash | tr -d '"')"
NEW_HASH="$(nix-prefetch-github usememos memos --rev v$TARGET_VERSION | jq -r .hash)"
replaceHash "$SRC_HASH" "$NEW_HASH"
GO_HASH="$(nix-instantiate --eval -A memos.vendorHash | tr -d '"')"
EMPTY_HASH="$(nix-instantiate --eval -A lib.fakeHash | tr -d '"')"
replaceHash "$GO_HASH" "$EMPTY_HASH"
replaceHash "$EMPTY_HASH" "$(extractVendorHash "$GO_HASH")"
# update src yarn lock
SRC_FILE_BASE="https://raw.githubusercontent.com/usememos/memos/v$TARGET_VERSION"
trap 'rm -rf ./pkgs/servers/memos/package.json' EXIT
pushd ./pkgs/servers/memos
wget -q "$SRC_FILE_BASE/web/package.json"
npm install --package-lock-only
NPM_HASH=$(prefetch-npm-deps ./package-lock.json)
popd
sed -i -E -e "s#npmDepsHash = \".*\"#npmDepsHash = \"$NPM_HASH\"#" ./pkgs/servers/memos/default.nix
-13
View File
@@ -1125,8 +1125,6 @@ with pkgs;
};
};
memos = callPackage ../servers/memos { };
mkosi = python3Packages.callPackage ../tools/virtualization/mkosi { inherit systemd; };
mkosi-full = mkosi.override { withQemu = true; };
@@ -4236,11 +4234,6 @@ with pkgs;
polaris-web = callPackage ../servers/polaris/web.nix { };
projectlibre = callPackage ../applications/misc/projectlibre {
jre = jre8;
jdk = jdk8;
};
projectm_3 = libsForQt5.callPackage ../applications/audio/projectm_3 { };
proxmark3 = libsForQt5.callPackage ../tools/security/proxmark3/default.nix { };
@@ -4581,8 +4574,6 @@ with pkgs;
tiled = libsForQt5.callPackage ../applications/editors/tiled { };
timetrap = callPackage ../applications/office/timetrap { };
tinc = callPackage ../tools/networking/tinc { };
tikzit = libsForQt5.callPackage ../tools/typesetting/tikzit { };
@@ -6821,8 +6812,6 @@ with pkgs;
### DEVELOPMENT / TOOLS
actiona = libsForQt5.callPackage ../applications/misc/actiona { };
inherit (callPackage ../development/tools/alloy { })
alloy5
alloy6
@@ -13204,8 +13193,6 @@ with pkgs;
libutp = callPackage ../applications/networking/p2p/libutp { };
libutp_3_4 = callPackage ../applications/networking/p2p/libutp/3.4.nix { };
ledger-web = callPackage ../applications/office/ledger-web { };
linphone = libsForQt5.callPackage ../applications/networking/instant-messengers/linphone { };
lmms = libsForQt5.callPackage ../applications/audio/lmms {
+3
View File
@@ -30215,6 +30215,9 @@ with self;
patches = [
# https://github.com/PerlGameDev/SDL/pull/304
../development/perl-modules/sdl-modern-perl.patch
# sdl-compat correctly reports the bit depth of the test image,
# while SDL_classic rounded to the next byte
../development/perl-modules/sdl-compat-bit-depth.patch
(fetchpatch {
url = "https://aur.archlinux.org/cgit/aur.git/plain/surface-xs-declare-calc-offset-earlier.diff?h=perl-sdl&id=d4b6da86d33046cde0e84fa2cd6eaccff1667cab";
hash = "sha256-dQ2O4dO18diSAilSZrZj6II+mBuKKI3cx9fR1SJqUvo=";
+2
View File
@@ -455,6 +455,8 @@ mapAliases ({
notifymuch = throw "notifymuch has been promoted to a top-level attribute name: `pkgs.notifymuch`"; # added 2022-10-02
Nuitka = nuitka; # added 2023-02-19
ntlm-auth = throw "ntlm-auth has been removed, because it relies on the md4 implementation provided by openssl. Use pyspnego instead.";
oauth = throw "oauth has been removed as it is unmaintained"; # added 2025-05-16
oauth2 = throw "oauth2 has been removed as it is unmaintained"; # added 2025-05-16
openai-triton = triton; # added 2024-07-18
openai-triton-bin = triton-bin; # added 2024-07-18
openai-triton-cuda = triton-cuda; # added 2024-07-18
-4
View File
@@ -10181,10 +10181,6 @@ self: super: with self; {
oath = callPackage ../development/python-modules/oath { };
oauth = callPackage ../development/python-modules/oauth { };
oauth2 = callPackage ../development/python-modules/oauth2 { };
oauth2client = callPackage ../development/python-modules/oauth2client { };
oauthenticator = callPackage ../development/python-modules/oauthenticator { };