mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-14 06:00:33 +03:00
Merge master into staging-next
This commit is contained in:
commit
b7b46e40c2
59 changed files with 1325 additions and 901 deletions
2
.mailmap
2
.mailmap
|
@ -3,7 +3,7 @@ Anderson Torres <torres.anderson.85@protonmail.com>
|
|||
Atemu <git@atemu.net> <atemu.main@gmail.com>
|
||||
Daniel Løvbrøtte Olsen <me@dandellion.xyz> <daniel.olsen99@gmail.com>
|
||||
Fabian Affolter <mail@fabian-affolter.ch> <fabian@affolter-engineering.ch>
|
||||
goatastronaut0212 <goatastronaut0212@proton.me> <goatastronaut0212@outlook.com>
|
||||
goatastronaut0212 <goatastronaut0212@outlook.com> <goatastronaut0212@proton.me>
|
||||
Janne Heß <janne@hess.ooo> <dasJ@users.noreply.github.com>
|
||||
Jörg Thalheim <joerg@thalheim.io> <Mic92@users.noreply.github.com>
|
||||
Martin Weinelt <hexa@darmstadt.ccc.de> <mweinelt@users.noreply.github.com>
|
||||
|
|
|
@ -17035,6 +17035,12 @@
|
|||
githubId = 1332289;
|
||||
name = "Quentin Machu";
|
||||
};
|
||||
quincepie = {
|
||||
email = "flaky@quincepie.dev";
|
||||
github = "Quince-Pie";
|
||||
githubId = 127546159;
|
||||
name = "QuincePie";
|
||||
};
|
||||
quinn-dougherty = {
|
||||
email = "quinnd@riseup.net";
|
||||
github = "quinn-dougherty";
|
||||
|
|
|
@ -390,6 +390,9 @@
|
|||
- The `antennas` package and the `services.antennas` module have been
|
||||
removed as they only work with `tvheadend` (see above).
|
||||
|
||||
- The `services.syncplay` module now exposes all currently available command-line arguments for `syncplay-server` as options, as well as a `useACMEHost` option for easy TLS setup.
|
||||
The systemd service now uses `DynamicUser`/`StateDirectory` and the `user` and `group` options have been deprecated.
|
||||
|
||||
## Other Notable Changes {#sec-release-24.11-notable-changes}
|
||||
|
||||
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
||||
|
|
|
@ -1479,6 +1479,7 @@
|
|||
./services/web-apps/pretix.nix
|
||||
./services/web-apps/prosody-filer.nix
|
||||
./services/web-apps/rimgo.nix
|
||||
./services/web-apps/rutorrent.nix
|
||||
./services/web-apps/screego.nix
|
||||
./services/web-apps/sftpgo.nix
|
||||
./services/web-apps/suwayomi-server.nix
|
||||
|
|
|
@ -7,18 +7,41 @@ let
|
|||
|
||||
cmdArgs =
|
||||
[ "--port" cfg.port ]
|
||||
++ optionals (cfg.isolateRooms) [ "--isolate-rooms" ]
|
||||
++ optionals (!cfg.ready) [ "--disable-ready" ]
|
||||
++ optionals (!cfg.chat) [ "--disable-chat" ]
|
||||
++ optionals (cfg.salt != null) [ "--salt" cfg.salt ]
|
||||
++ optionals (cfg.motdFile != null) [ "--motd-file" cfg.motdFile ]
|
||||
++ optionals (cfg.roomsDBFile != null) [ "--rooms-db-file" cfg.roomsDBFile ]
|
||||
++ optionals (cfg.permanentRoomsFile != null) [ "--permanent-rooms-file" cfg.permanentRoomsFile ]
|
||||
++ [ "--max-chat-message-length" cfg.maxChatMessageLength ]
|
||||
++ [ "--max-username-length" cfg.maxUsernameLength ]
|
||||
++ optionals (cfg.statsDBFile != null) [ "--stats-db-file" cfg.statsDBFile ]
|
||||
++ optionals (cfg.certDir != null) [ "--tls" cfg.certDir ]
|
||||
++ optionals cfg.ipv4Only [ "--ipv4-only" ]
|
||||
++ optionals cfg.ipv6Only [ "--ipv6-only" ]
|
||||
++ optionals (cfg.interfaceIpv4 != "") [ "--interface-ipv4" cfg.interfaceIpv4 ]
|
||||
++ optionals (cfg.interfaceIpv6 != "") [ "--interface-ipv6" cfg.interfaceIpv6 ]
|
||||
++ cfg.extraArgs;
|
||||
|
||||
useACMEHostDir = optionalString (cfg.useACMEHost != null) config.security.acme.certs.${cfg.useACMEHost}.directory;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
(mkRemovedOptionModule [ "services" "syncplay" "user" ]
|
||||
"The syncplay service now uses DynamicUser, override the systemd unit settings if you need the old functionality.")
|
||||
(mkRemovedOptionModule [ "services" "syncplay" "group" ]
|
||||
"The syncplay service now uses DynamicUser, override the systemd unit settings if you need the old functionality.")
|
||||
];
|
||||
|
||||
options = {
|
||||
services.syncplay = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "If enabled, start the Syncplay server.";
|
||||
description = ''
|
||||
If enabled, start the Syncplay server.
|
||||
'';
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
|
@ -29,6 +52,39 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
passwordFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to the file that contains the server password. If
|
||||
`null`, the server doesn't require a password.
|
||||
'';
|
||||
};
|
||||
|
||||
isolateRooms = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable room isolation.
|
||||
'';
|
||||
};
|
||||
|
||||
ready = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Check readiness of users.
|
||||
'';
|
||||
};
|
||||
|
||||
chat = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Chat with users in the same room.
|
||||
'';
|
||||
};
|
||||
|
||||
salt = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
|
@ -37,7 +93,7 @@ in
|
|||
instance to still work when the server is restarted. The salt will be
|
||||
readable in the nix store and the processlist. If this is not
|
||||
intended use `saltFile` instead. Mutually exclusive with
|
||||
<option>services.syncplay.saltFile</option>.
|
||||
{option}`services.syncplay.saltFile`.
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -49,7 +105,83 @@ in
|
|||
operator passwords generated by this server instance to still work
|
||||
when the server is restarted. `null`, the server doesn't load the
|
||||
salt from a file. Mutually exclusive with
|
||||
<option>services.syncplay.salt</option>.
|
||||
{option}`services.syncplay.salt`.
|
||||
'';
|
||||
};
|
||||
|
||||
motd = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Text to display when users join. The motd will be readable in the nix store
|
||||
and the processlist. If this is not intended use `motdFile` instead.
|
||||
Will be overriden by {option}`services.syncplay.motdFile`.
|
||||
'';
|
||||
};
|
||||
|
||||
motdFile = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = if cfg.motd != null then (builtins.toFile "motd" cfg.motd) else null;
|
||||
defaultText = literalExpression ''if services.syncplay.motd != null then (builtins.toFile "motd" services.syncplay.motd) else null'';
|
||||
description = ''
|
||||
Path to text to display when users join.
|
||||
Will override {option}`services.syncplay.motd`.
|
||||
'';
|
||||
};
|
||||
|
||||
roomsDBFile = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "rooms.db";
|
||||
description = ''
|
||||
Path to SQLite database file to store room states.
|
||||
Relative to the working directory provided by systemd.
|
||||
'';
|
||||
};
|
||||
|
||||
permanentRooms = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [ ];
|
||||
description = ''
|
||||
List of rooms that will be listed even if the room is empty.
|
||||
Will be overriden by {option}`services.syncplay.permanentRoomsFile`.
|
||||
'';
|
||||
};
|
||||
|
||||
permanentRoomsFile = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = if cfg.permanentRooms != [ ] then (builtins.toFile "perm" (builtins.concatStringsSep "\n" cfg.permanentRooms)) else null;
|
||||
defaultText = literalExpression ''if services.syncplay.permanentRooms != [ ] then (builtins.toFile "perm" (builtins.concatStringsSep "\n" services.syncplay.permanentRooms)) else null'';
|
||||
description = ''
|
||||
File with list of rooms that will be listed even if the room is empty,
|
||||
newline delimited.
|
||||
Will override {option}`services.syncplay.permanentRooms`.
|
||||
'';
|
||||
};
|
||||
|
||||
maxChatMessageLength = mkOption {
|
||||
type = types.ints.unsigned;
|
||||
default = 150;
|
||||
description = ''
|
||||
Maximum number of characters in a chat message.
|
||||
'';
|
||||
};
|
||||
|
||||
maxUsernameLength = mkOption {
|
||||
type = types.ints.unsigned;
|
||||
default = 16;
|
||||
description = ''
|
||||
Maximum number of characters in a username.
|
||||
'';
|
||||
};
|
||||
|
||||
statsDBFile = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "stats.db";
|
||||
description = ''
|
||||
Path to SQLite database file to store stats.
|
||||
Relative to the working directory provided by systemd.
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -62,6 +194,49 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
useACMEHost = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "syncplay.example.com";
|
||||
description = ''
|
||||
If set, use NixOS-generated ACME certificate with the specified name for TLS.
|
||||
|
||||
Note that it requires {option}`security.acme` to be setup, e.g., credentials provided if using DNS-01 validation.
|
||||
'';
|
||||
};
|
||||
|
||||
ipv4Only = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Listen only on IPv4 when strting the server.
|
||||
'';
|
||||
};
|
||||
|
||||
ipv6Only = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Listen only on IPv6 when strting the server.
|
||||
'';
|
||||
};
|
||||
|
||||
interfaceIpv4 = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
The IP address to bind to for IPv4. Leaving it empty defaults to using all.
|
||||
'';
|
||||
};
|
||||
|
||||
interfaceIpv6 = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
The IP address to bind to for IPv6. Leaving it empty defaults to using all.
|
||||
'';
|
||||
};
|
||||
|
||||
extraArgs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [ ];
|
||||
|
@ -70,28 +245,12 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "nobody";
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.syncplay-nogui;
|
||||
defaultText = literalExpression "pkgs.syncplay-nogui";
|
||||
description = ''
|
||||
User to use when running Syncplay.
|
||||
'';
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "nogroup";
|
||||
description = ''
|
||||
Group to use when running Syncplay.
|
||||
'';
|
||||
};
|
||||
|
||||
passwordFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to the file that contains the server password. If
|
||||
`null`, the server doesn't require a password.
|
||||
Package to use for syncplay.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
@ -103,7 +262,24 @@ in
|
|||
assertion = cfg.salt == null || cfg.saltFile == null;
|
||||
message = "services.syncplay.salt and services.syncplay.saltFile are mutually exclusive.";
|
||||
}
|
||||
{
|
||||
assertion = cfg.certDir == null || cfg.useACMEHost == null;
|
||||
message = "services.syncplay.certDir and services.syncplay.useACMEHost are mutually exclusive.";
|
||||
}
|
||||
{
|
||||
assertion = !cfg.ipv4Only || !cfg.ipv6Only;
|
||||
message = "services.syncplay.ipv4Only and services.syncplay.ipv6Only are mutually exclusive.";
|
||||
}
|
||||
];
|
||||
|
||||
warnings = optional (cfg.interfaceIpv4 != "" && cfg.ipv6Only) "You have specified services.syncplay.interfaceIpv4 but IPv4 is disabled by services.syncplay.ipv6Only."
|
||||
++ optional (cfg.interfaceIpv6 != "" && cfg.ipv4Only) "You have specified services.syncplay.interfaceIpv6 but IPv6 is disabled by services.syncplay.ipv4Only.";
|
||||
|
||||
security.acme.certs = mkIf (cfg.useACMEHost != null) {
|
||||
"${cfg.useACMEHost}".reloadServices = [ "syncplay.service" ];
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ cfg.port ];
|
||||
systemd.services.syncplay = {
|
||||
description = "Syncplay Service";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
@ -111,20 +287,26 @@ in
|
|||
after = [ "network-online.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
LoadCredential = lib.optional (cfg.passwordFile != null) "password:${cfg.passwordFile}"
|
||||
++ lib.optional (cfg.saltFile != null) "salt:${cfg.saltFile}";
|
||||
DynamicUser = true;
|
||||
StateDirectory = "syncplay";
|
||||
WorkingDirectory = "%S/syncplay";
|
||||
LoadCredential = optional (cfg.passwordFile != null) "password:${cfg.passwordFile}"
|
||||
++ optional (cfg.saltFile != null) "salt:${cfg.saltFile}"
|
||||
++ optionals (cfg.useACMEHost != null) [
|
||||
"cert.pem:${useACMEHostDir}/cert.pem"
|
||||
"privkey.pem:${useACMEHostDir}/key.pem"
|
||||
"chain.pem:${useACMEHostDir}/chain.pem"
|
||||
];
|
||||
};
|
||||
|
||||
script = ''
|
||||
${lib.optionalString (cfg.passwordFile != null) ''
|
||||
${optionalString (cfg.passwordFile != null) ''
|
||||
export SYNCPLAY_PASSWORD=$(cat "''${CREDENTIALS_DIRECTORY}/password")
|
||||
''}
|
||||
${lib.optionalString (cfg.saltFile != null) ''
|
||||
${optionalString (cfg.saltFile != null) ''
|
||||
export SYNCPLAY_SALT=$(cat "''${CREDENTIALS_DIRECTORY}/salt")
|
||||
''}
|
||||
exec ${pkgs.syncplay-nogui}/bin/syncplay-server ${escapeShellArgs cmdArgs}
|
||||
exec ${cfg.package}/bin/syncplay-server ${escapeShellArgs cmdArgs} ${optionalString (cfg.useACMEHost != null) "--tls $CREDENTIALS_DIRECTORY"}
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
|
302
nixos/modules/services/web-apps/rutorrent.nix
Normal file
302
nixos/modules/services/web-apps/rutorrent.nix
Normal file
|
@ -0,0 +1,302 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.rutorrent;
|
||||
|
||||
rtorrentPluginDependencies = with pkgs; {
|
||||
_task = [ procps ];
|
||||
unpack = [ unzip unrar ];
|
||||
rss = [ curl ];
|
||||
mediainfo = [ mediainfo ];
|
||||
spectrogram = [ sox ];
|
||||
screenshots = [ ffmpeg ];
|
||||
};
|
||||
|
||||
phpPluginDependencies = with pkgs; {
|
||||
_cloudflare = [ python3 ];
|
||||
};
|
||||
|
||||
getPluginDependencies = dependencies: concatMap (p: attrByPath [ p ] [] dependencies);
|
||||
|
||||
in {
|
||||
options = {
|
||||
services.rutorrent = {
|
||||
enable = mkEnableOption "ruTorrent";
|
||||
|
||||
hostName = mkOption {
|
||||
type = types.str;
|
||||
description = "FQDN for the ruTorrent instance.";
|
||||
};
|
||||
|
||||
dataDir = mkOption {
|
||||
type = types.str;
|
||||
default = "/var/lib/rutorrent";
|
||||
description = "Storage path of ruTorrent.";
|
||||
};
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "rutorrent";
|
||||
description = ''
|
||||
User which runs the ruTorrent service.
|
||||
'';
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "rutorrent";
|
||||
description = ''
|
||||
Group which runs the ruTorrent service.
|
||||
'';
|
||||
};
|
||||
|
||||
rpcSocket = mkOption {
|
||||
type = types.str;
|
||||
default = config.services.rtorrent.rpcSocket;
|
||||
defaultText = "config.services.rtorrent.rpcSocket";
|
||||
description = ''
|
||||
Path to rtorrent rpc socket.
|
||||
'';
|
||||
};
|
||||
|
||||
plugins = mkOption {
|
||||
type = with types; listOf (either str package);
|
||||
default = [ "httprpc" ];
|
||||
example = literalExpression ''[ "httprpc" "data" "diskspace" "edit" "erasedata" "theme" "trafic" ]'';
|
||||
description = ''
|
||||
List of plugins to enable. See the list of <link xlink:href="https://github.com/Novik/ruTorrent/wiki/Plugins#currently-there-are-the-following-plugins">available plugins</link>. Note: the <literal>unpack</literal> plugin needs the nonfree <literal>unrar</literal> package.
|
||||
You need to either enable one of the <literal>rpc</literal> or <literal>httprpc</literal> plugin or enable the <xref linkend="opt-services.rutorrent.nginx.exposeInsecureRPC2mount"/> option.
|
||||
'';
|
||||
};
|
||||
|
||||
poolSettings = mkOption {
|
||||
type = with types; attrsOf (oneOf [ str int bool ]);
|
||||
default = {
|
||||
"pm" = "dynamic";
|
||||
"pm.max_children" = 32;
|
||||
"pm.start_servers" = 2;
|
||||
"pm.min_spare_servers" = 2;
|
||||
"pm.max_spare_servers" = 4;
|
||||
"pm.max_requests" = 500;
|
||||
};
|
||||
description = ''
|
||||
Options for ruTorrent's PHP pool. See the documentation on <literal>php-fpm.conf</literal> for details on configuration directives.
|
||||
'';
|
||||
};
|
||||
|
||||
nginx = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to enable nginx virtual host management.
|
||||
Further nginx configuration can be done by adapting <literal>services.nginx.virtualHosts.<name></literal>.
|
||||
See <xref linkend="opt-services.nginx.virtualHosts"/> for further information.
|
||||
'';
|
||||
};
|
||||
|
||||
exposeInsecureRPC2mount = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
If you do not enable one of the <literal>rpc</literal> or <literal>httprpc</literal> plugins you need to expose an RPC mount through scgi using this option.
|
||||
Warning: This allow to run arbitrary commands, as the rtorrent user, so make sure to use authentification. The simplest way would be to use the <literal>services.nginx.virtualHosts.<name>.basicAuth</literal> option.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (mkMerge [
|
||||
{ assertions = let
|
||||
usedRpcPlugins = intersectLists cfg.plugins [ "httprpc" "rpc" ];
|
||||
in [
|
||||
{ assertion = (length usedRpcPlugins < 2);
|
||||
message = "Please specify only one of httprpc or rpc plugins";
|
||||
}
|
||||
{ assertion = !(length usedRpcPlugins > 0 && cfg.nginx.exposeInsecureRPC2mount);
|
||||
message = "Please do not use exposeInsecureRPC2mount if you use one of httprpc or rpc plugins";
|
||||
}
|
||||
];
|
||||
|
||||
warnings = let
|
||||
nginxVhostCfg = config.services.nginx.virtualHosts."${cfg.hostName}";
|
||||
in []
|
||||
++ (optional (cfg.nginx.exposeInsecureRPC2mount && (nginxVhostCfg.basicAuth == {} || nginxVhostCfg.basicAuthFile == null )) ''
|
||||
You are using exposeInsecureRPC2mount without using basic auth on the virtual host. The exposed rpc mount allow for remote command execution.
|
||||
|
||||
Please make sure it is not accessible from the outside.
|
||||
'');
|
||||
|
||||
systemd = {
|
||||
services = {
|
||||
rtorrent.path = getPluginDependencies rtorrentPluginDependencies cfg.plugins;
|
||||
rutorrent-setup = let
|
||||
rutorrentConfig = pkgs.writeText "rutorrent-config.php" ''
|
||||
<?php
|
||||
// configuration parameters
|
||||
|
||||
// for snoopy client
|
||||
@define('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36', true);
|
||||
@define('HTTP_TIME_OUT', 30, true); // in seconds
|
||||
@define('HTTP_USE_GZIP', true, true);
|
||||
$httpIP = null; // IP string. Or null for any.
|
||||
$httpProxy = array
|
||||
(
|
||||
'use' => false,
|
||||
'proto' => 'http', // 'http' or 'https'
|
||||
'host' => 'PROXY_HOST_HERE',
|
||||
'port' => 3128
|
||||
);
|
||||
|
||||
@define('RPC_TIME_OUT', 5, true); // in seconds
|
||||
|
||||
@define('LOG_RPC_CALLS', false, true);
|
||||
@define('LOG_RPC_FAULTS', true, true);
|
||||
|
||||
// for php
|
||||
@define('PHP_USE_GZIP', false, true);
|
||||
@define('PHP_GZIP_LEVEL', 2, true);
|
||||
|
||||
$schedule_rand = 10; // rand for schedulers start, +0..X seconds
|
||||
|
||||
$do_diagnostic = true;
|
||||
$log_file = '${cfg.dataDir}/logs/errors.log'; // path to log file (comment or leave blank to disable logging)
|
||||
|
||||
$saveUploadedTorrents = true; // Save uploaded torrents to profile/torrents directory or not
|
||||
$overwriteUploadedTorrents = false; // Overwrite existing uploaded torrents in profile/torrents directory or make unique name
|
||||
|
||||
$topDirectory = '/'; // Upper available directory. Absolute path with trail slash.
|
||||
$forbidUserSettings = false;
|
||||
|
||||
$scgi_port = 0;
|
||||
$scgi_host = "unix://${cfg.rpcSocket}";
|
||||
|
||||
$XMLRPCMountPoint = "/RPC2"; // DO NOT DELETE THIS LINE!!! DO NOT COMMENT THIS LINE!!!
|
||||
|
||||
$throttleMaxSpeed = 327625*1024;
|
||||
|
||||
$pathToExternals = array(
|
||||
"php" => "${pkgs.php}/bin/php", // Something like /usr/bin/php. If empty, will be found in PATH.
|
||||
"curl" => "${pkgs.curl}/bin/curl", // Something like /usr/bin/curl. If empty, will be found in PATH.
|
||||
"gzip" => "${pkgs.gzip}/bin/gzip", // Something like /usr/bin/gzip. If empty, will be found in PATH.
|
||||
"id" => "${pkgs.coreutils}/bin/id", // Something like /usr/bin/id. If empty, will be found in PATH.
|
||||
"stat" => "${pkgs.coreutils}/bin/stat", // Something like /usr/bin/stat. If empty, will be found in PATH.
|
||||
"pgrep" => "${pkgs.procps}/bin/pgrep", // TODO why can't we use phpEnv.PATH
|
||||
);
|
||||
|
||||
$localhosts = array( // list of local interfaces
|
||||
"127.0.0.1",
|
||||
"localhost",
|
||||
);
|
||||
|
||||
$profilePath = '${cfg.dataDir}/share'; // Path to user profiles
|
||||
$profileMask = 0770; // Mask for files and directory creation in user profiles.
|
||||
// Both Webserver and rtorrent users must have read-write access to it.
|
||||
// For example, if Webserver and rtorrent users are in the same group then the value may be 0770.
|
||||
|
||||
$tempDirectory = null; // Temp directory. Absolute path with trail slash. If null, then autodetect will be used.
|
||||
|
||||
$canUseXSendFile = false; // If true then use X-Sendfile feature if it exist
|
||||
|
||||
$locale = "UTF8";
|
||||
'';
|
||||
in {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
before = [ "phpfpm-rutorrent.service" ];
|
||||
script = ''
|
||||
ln -sf ${pkgs.rutorrent}/{css,images,js,lang,index.html} ${cfg.dataDir}/
|
||||
mkdir -p ${cfg.dataDir}/{conf,logs,plugins} ${cfg.dataDir}/share/{settings,torrents,users}
|
||||
ln -sf ${pkgs.rutorrent}/conf/{access.ini,plugins.ini} ${cfg.dataDir}/conf/
|
||||
ln -sf ${rutorrentConfig} ${cfg.dataDir}/conf/config.php
|
||||
|
||||
cp -r ${pkgs.rutorrent}/php ${cfg.dataDir}/
|
||||
|
||||
${optionalString (cfg.plugins != [])
|
||||
''cp -r ${concatMapStringsSep " " (p: "${pkgs.rutorrent}/plugins/${p}") cfg.plugins} ${cfg.dataDir}/plugins/''}
|
||||
|
||||
chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir}/{conf,share,logs,plugins}
|
||||
chmod -R 755 ${cfg.dataDir}/{conf,share,logs,plugins}
|
||||
'';
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
};
|
||||
|
||||
tmpfiles.rules = [ "d '${cfg.dataDir}' 0775 ${cfg.user} ${cfg.group} -" ];
|
||||
};
|
||||
|
||||
users.groups."${cfg.group}" = {};
|
||||
|
||||
users.users = {
|
||||
"${cfg.user}" = {
|
||||
home = cfg.dataDir;
|
||||
group = cfg.group;
|
||||
extraGroups = [ config.services.rtorrent.group ];
|
||||
description = "ruTorrent Daemon user";
|
||||
isSystemUser = true;
|
||||
};
|
||||
|
||||
"${config.services.rtorrent.user}" = {
|
||||
extraGroups = [ cfg.group ];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
(mkIf cfg.nginx.enable (mkMerge [
|
||||
{ services = {
|
||||
phpfpm.pools.rutorrent = let
|
||||
envPath = lib.makeBinPath (getPluginDependencies phpPluginDependencies cfg.plugins);
|
||||
pool = {
|
||||
user = cfg.user;
|
||||
group = config.services.rtorrent.group;
|
||||
settings = mapAttrs (name: mkDefault) {
|
||||
"listen.owner" = config.services.nginx.user;
|
||||
"listen.group" = config.services.nginx.group;
|
||||
} // cfg.poolSettings;
|
||||
};
|
||||
in if (envPath == "") then pool else pool // { phpEnv.PATH = envPath; };
|
||||
|
||||
nginx = {
|
||||
enable = true;
|
||||
virtualHosts = {
|
||||
${cfg.hostName} = {
|
||||
root = cfg.dataDir;
|
||||
locations = {
|
||||
"~ [^/]\.php(/|$)" = {
|
||||
extraConfig = ''
|
||||
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
|
||||
if (!-f $document_root$fastcgi_script_name) {
|
||||
return 404;
|
||||
}
|
||||
|
||||
# Mitigate https://httpoxy.org/ vulnerabilities
|
||||
fastcgi_param HTTP_PROXY "";
|
||||
|
||||
fastcgi_pass unix:${config.services.phpfpm.pools.rutorrent.socket};
|
||||
fastcgi_index index.php;
|
||||
|
||||
include ${pkgs.nginx}/conf/fastcgi.conf;
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
(mkIf cfg.nginx.exposeInsecureRPC2mount {
|
||||
services.nginx.virtualHosts."${cfg.hostName}".locations."/RPC2" = {
|
||||
extraConfig = ''
|
||||
include ${pkgs.nginx}/conf/scgi_params;
|
||||
scgi_pass unix:${cfg.rpcSocket};
|
||||
'';
|
||||
};
|
||||
|
||||
services.rtorrent.group = "nginx";
|
||||
})
|
||||
]))
|
||||
]);
|
||||
}
|
|
@ -3,27 +3,27 @@
|
|||
, fetchFromGitHub
|
||||
, pnpm
|
||||
, nodejs
|
||||
, electron_30
|
||||
, electron_31
|
||||
, makeWrapper
|
||||
, copyDesktopItems
|
||||
, makeDesktopItem
|
||||
}:
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "armcord";
|
||||
version = "3.2.8";
|
||||
version = "3.3.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "ArmCord";
|
||||
repo = "ArmCord";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-H/Y3xA7gE24UsUkrxmrRFSvs16qZCVxli9vdnt7ihi8=";
|
||||
hash = "sha256-nVirmGgR5yssMRXFUialMjTTSEa5nVNtue207eYUJCg=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pnpm.configHook nodejs makeWrapper copyDesktopItems ];
|
||||
|
||||
pnpmDeps = pnpm.fetchDeps {
|
||||
inherit pname version src;
|
||||
hash = "sha256-hYp1XbWQL5NbIzzUSnZ7y7V+vYQmymRNo+EiSjn5d9E=";
|
||||
hash = "sha256-ETnTWErdOIdcyK/v42bx+dFPPt+Lc0Lxyzo+RpxvEjU=";
|
||||
};
|
||||
|
||||
ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
|
||||
|
@ -35,8 +35,8 @@ stdenv.mkDerivation rec {
|
|||
|
||||
npm exec electron-builder -- \
|
||||
--dir \
|
||||
-c.electronDist="${electron_30.dist}" \
|
||||
-c.electronVersion="${electron_30.version}"
|
||||
-c.electronDist="${electron_31.dist}" \
|
||||
-c.electronVersion="${electron_31.version}"
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
@ -49,7 +49,7 @@ stdenv.mkDerivation rec {
|
|||
|
||||
install -Dm644 "build/icon.png" "$out/share/icons/hicolor/256x256/apps/armcord.png"
|
||||
|
||||
makeShellWrapper "${lib.getExe electron_30}" "$out/bin/armcord" \
|
||||
makeShellWrapper "${lib.getExe electron_31}" "$out/bin/armcord" \
|
||||
--add-flags "$out/share/lib/armcord/resources/app.asar" \
|
||||
"''${gappsWrapperArgs[@]}" \
|
||||
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
|
||||
|
|
|
@ -84,20 +84,20 @@ buildGoModule rec {
|
|||
printf "#!/bin/sh\ntrue" > ./Tools/src/checkstyle.sh
|
||||
|
||||
substituteInPlace agent/platform/platform_unix.go \
|
||||
--replace "/usr/bin/uname" "${coreutils}/bin/uname" \
|
||||
--replace '"/bin", "hostname"' '"${nettools}/bin/hostname"' \
|
||||
--replace '"lsb_release"' '"${fake-lsb-release}/bin/lsb_release"'
|
||||
--replace-fail "/usr/bin/uname" "${coreutils}/bin/uname" \
|
||||
--replace-fail '"/bin", "hostname"' '"${nettools}/bin/hostname"' \
|
||||
--replace-fail '"lsb_release"' '"${fake-lsb-release}/bin/lsb_release"'
|
||||
|
||||
substituteInPlace agent/session/shell/shell_unix.go \
|
||||
--replace '"script"' '"${util-linux}/bin/script"'
|
||||
--replace-fail '"script"' '"${util-linux}/bin/script"'
|
||||
|
||||
substituteInPlace agent/rebooter/rebooter_unix.go \
|
||||
--replace "/sbin/shutdown" "shutdown"
|
||||
--replace-fail "/sbin/shutdown" "shutdown"
|
||||
|
||||
echo "${version}" > VERSION
|
||||
'' + lib.optionalString stdenv.isLinux ''
|
||||
substituteInPlace agent/managedInstances/fingerprint/hardwareInfo_unix.go \
|
||||
--replace /usr/sbin/dmidecode ${dmidecode}/bin/dmidecode
|
||||
--replace-fail /usr/sbin/dmidecode ${dmidecode}/bin/dmidecode
|
||||
'';
|
||||
|
||||
preBuild = ''
|
||||
|
|
|
@ -20,7 +20,7 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
in ''
|
||||
substituteInPlace \
|
||||
apfs-snap/Makefile apfsck/Makefile mkapfs/Makefile \
|
||||
--replace \
|
||||
--replace-fail \
|
||||
'$(shell git describe --always HEAD | tail -c 9)' \
|
||||
'${shortRev}'
|
||||
'';
|
||||
|
|
|
@ -87,13 +87,13 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
|
||||
install -Dm755 dist/unix/armitage $out/bin/armitage
|
||||
substituteInPlace $out/bin/armitage \
|
||||
--replace "armitage.jar" "$JAR"
|
||||
--replace-fail "armitage.jar" "$JAR"
|
||||
wrapProgram $out/bin/armitage \
|
||||
--prefix PATH : "${lib.makeBinPath [ jdk11 metasploit ]}"
|
||||
|
||||
install -Dm755 dist/unix/teamserver $out/bin/teamserver
|
||||
substituteInPlace $out/bin/teamserver \
|
||||
--replace "armitage.jar" "$JAR"
|
||||
--replace-fail "armitage.jar" "$JAR"
|
||||
wrapProgram $out/bin/teamserver \
|
||||
--prefix PATH : "${lib.makeBinPath [ jdk11 metasploit ]}"
|
||||
|
||||
|
|
|
@ -10,13 +10,13 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "marwaita-red";
|
||||
version = "20.3.1";
|
||||
version = "21";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "darkomarko42";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
hash = "sha256-cMZDd/WQFrfr6Zrq1/1It26OmML3cf7+ZU/I8IMjuX4=";
|
||||
hash = "sha256-VCNwWtAzMORF+gXjcLhJCsmllGD2xGgRSS3WxaVoRfU=";
|
||||
};
|
||||
|
||||
buildInputs = [
|
||||
|
|
|
@ -6,13 +6,13 @@
|
|||
|
||||
buildGoModule rec {
|
||||
pname = "meteor-git";
|
||||
version = "0.23.0";
|
||||
version = "0.23.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "stefanlogue";
|
||||
repo = "meteor";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-UA6bye9ti9AwnZkBIGjljDElkIEOhsiJ0NyYdKbF5m0=";
|
||||
hash = "sha256-APsP9kzO5QMCgqIaMF01/NB3bT17gNNFZ1mxFThfvgQ=";
|
||||
};
|
||||
|
||||
vendorHash = "sha256-jKd/eJwp5SZvTrP3RN7xT7ibAB0PQondGR3RT+HQXIo=";
|
||||
|
|
|
@ -7,17 +7,17 @@
|
|||
|
||||
let
|
||||
pname = "mqttx";
|
||||
version = "1.9.9";
|
||||
version = "1.10.1";
|
||||
|
||||
suffixedUrl = suffix: "https://github.com/emqx/MQTTX/releases/download/v${version}/MQTTX-${version}${suffix}.AppImage";
|
||||
sources = {
|
||||
"aarch64-linux" = fetchurl {
|
||||
url = suffixedUrl "-arm64";
|
||||
hash = "sha256-mCCRvLS6diKoKYZNUMsyiWyFWmyYYB0pAxNT0yriJHI=";
|
||||
hash = "sha256-QumOqOOFXOXf0oqXWVaz0+69kHDk3HQKvNcQl8X7Fp8=";
|
||||
};
|
||||
"x86_64-linux" = fetchurl {
|
||||
url = suffixedUrl "";
|
||||
hash = "sha256-InGfGiT3c5M8ueFZl5/hFmYRPeXnwSCUPhAqmz0jsU8=";
|
||||
hash = "sha256-+TyZnx3/qraoA3rcpIDKedGyTzFvdaAE/v4pzXrB0zU=";
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -10,11 +10,11 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "nexus";
|
||||
version = "3.69.0-02";
|
||||
version = "3.70.1-02";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://download.sonatype.com/nexus/3/nexus-${version}-unix.tar.gz";
|
||||
hash = "sha256-7sgLPuM93mFEPlTd3qJY+FGVHErvgcTGJWwSBcqBgWI=";
|
||||
hash = "sha256-oBappm8WRcgyD5HWqJKPbMHjlwCUo9y5+FtB2Kq1PCE=";
|
||||
};
|
||||
|
||||
preferLocalBuild = true;
|
||||
|
|
25
pkgs/by-name/ru/rutorrent/package.nix
Normal file
25
pkgs/by-name/ru/rutorrent/package.nix
Normal file
|
@ -0,0 +1,25 @@
|
|||
{stdenv, lib, fetchFromGitHub }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "rutorrent";
|
||||
version = "4.2.10";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "Novik";
|
||||
repo = "ruTorrent";
|
||||
rev = "v${version}";
|
||||
sha256 = "Hkh2fWaZpJLxUYaojR97XVQWXTRzmFkQe4xKsmY1E8M=";
|
||||
};
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/
|
||||
cp -r . $out/
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Yet another web front-end for rTorrent";
|
||||
homepage = "https://github.com/Novik/ruTorrent";
|
||||
license = licenses.gpl3Plus;
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
|
@ -26,13 +26,13 @@
|
|||
}:
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "swayimg";
|
||||
version = "2.3";
|
||||
version = "3.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "artemsen";
|
||||
repo = "swayimg";
|
||||
rev = "v${finalAttrs.version}";
|
||||
hash = "sha256-MAVxOUM1x6dkvbWPz/JS+sITi3BhCeaweKZZserkXz8=";
|
||||
hash = "sha256-Eqs8U2BpjcweDi4oGS9nWpoyoXeuiD+6jviPA3s9/YY=";
|
||||
};
|
||||
|
||||
strictDeps = true;
|
||||
|
|
|
@ -14,16 +14,16 @@
|
|||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "tpnote";
|
||||
version = "1.24.7";
|
||||
version = "1.24.8";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "getreu";
|
||||
repo = "tp-note";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-BSq+9qjBdJZvx65mumyPbjhbBHpHXgWeGqdx/xevL50=";
|
||||
hash = "sha256-tn6GCBX3DrqyZZz2FJLTn1vJd4eEbawyJM5huco21/8=";
|
||||
};
|
||||
|
||||
cargoHash = "sha256-jwG68aAG4D+ulsQa+UEyJu5fVwbrHeeW9bJNQfcpg4o=";
|
||||
cargoHash = "sha256-2qGObTu7g6GbUwd4obgqufig7bABFLBsCWSyZt8AVac=";
|
||||
|
||||
nativeBuildInputs = [
|
||||
cmake
|
||||
|
|
|
@ -102,8 +102,9 @@ in stdenv.mkDerivation {
|
|||
runHook postInstall
|
||||
'';
|
||||
|
||||
# .so files in the SystemARM64 directory are not loaded properly on aarch64-linux
|
||||
appendRunpaths = lib.optionals (stdenv.hostPlatform.system == "aarch64-linux") [
|
||||
# Bring in game's .so files into lookup. Otherwise game fails to start
|
||||
# as: `Object not found: Class Render.Render`
|
||||
appendRunpaths = [
|
||||
"${placeholder "out"}/${systemDir}"
|
||||
];
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
|
||||
postPatch = ''
|
||||
substituteInPlace Makefile \
|
||||
--replace '/bin/echo' 'echo'
|
||||
--replace-fail '/bin/echo' 'echo'
|
||||
'';
|
||||
|
||||
dontConfigure = true;
|
||||
|
|
|
@ -26,7 +26,7 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
postPatch = ''
|
||||
patchShebangs findsymbols scripts/
|
||||
substituteInPlace Makefile \
|
||||
--replace '/bin/echo' 'echo'
|
||||
--replace-fail '/bin/echo' 'echo'
|
||||
'';
|
||||
|
||||
dontConfigure = true;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"branch": "master",
|
||||
"commit_hash": "4ac238a00ca0b36e9755e55e54a22d3107ba443c",
|
||||
"commit_message": "Update packages",
|
||||
"date": "2024-08-27",
|
||||
"tag": "v5.13.2"
|
||||
"commit_hash": "8d7a26f3f3095044dd08422d9bca5607aa173103",
|
||||
"commit_message": "Merge pull request #105 from byBenPuls/master",
|
||||
"date": "2024-09-02",
|
||||
"tag": "v5.14.0"
|
||||
}
|
||||
|
|
|
@ -14,13 +14,13 @@
|
|||
}:
|
||||
stdenvNoCC.mkDerivation rec {
|
||||
pname = "yandex-music";
|
||||
version = "5.13.2";
|
||||
version = "5.14.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "cucumber-sp";
|
||||
repo = "yandex-music-linux";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-yQX2GEulAQ02BndpwAAwGdTYtUlNXCgsCUdmXxPwtKU=";
|
||||
hash = "sha256-M0UcnrYtlrRY1sN65UPXcgEAzcdSpKWeHn4kbLDRRaw=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"ym": {
|
||||
"version": "5.13.2",
|
||||
"exe_name": "Yandex_Music_x64_5.13.2.exe",
|
||||
"exe_link": "https://music-desktop-application.s3.yandex.net/stable/Yandex_Music_x64_5.13.2.exe",
|
||||
"exe_sha256": "ac7a489a59e074358559f544a26143ca81a6bdfa41481242f3419b76eaffdb0b"
|
||||
"version": "5.14.0",
|
||||
"exe_name": "Yandex_Music_x64_5.14.0.exe",
|
||||
"exe_link": "https://music-desktop-application.s3.yandex.net/stable/Yandex_Music_x64_5.14.0.exe",
|
||||
"exe_sha256": "b7a0a974666e68b5ed324a72ca9f53dcbdb35271e2b48fe5adc6bc6c8876e03d"
|
||||
},
|
||||
"electron": {
|
||||
"version": "29.4.6",
|
||||
|
|
|
@ -43,7 +43,7 @@ let
|
|||
elvis-erlang = callPackage ./elvis-erlang { };
|
||||
|
||||
# BEAM-based languages.
|
||||
elixir = elixir_1_16;
|
||||
elixir = elixir_1_17;
|
||||
|
||||
elixir_1_17 = lib'.callElixir ../interpreters/elixir/1.17.nix {
|
||||
inherit erlang;
|
||||
|
|
|
@ -84,8 +84,13 @@ let
|
|||
}
|
||||
{
|
||||
after = "19";
|
||||
before = "20";
|
||||
path = ../19;
|
||||
}
|
||||
{
|
||||
after = "20";
|
||||
path = ../git;
|
||||
}
|
||||
];
|
||||
"clang/purity.patch" = [
|
||||
{
|
||||
|
|
|
@ -25,9 +25,9 @@ let
|
|||
"18.1.8".officialRelease.sha256 = "sha256-iiZKMRo/WxJaBXct9GdAcAT3cz9d9pnAcO1mmR6oPNE=";
|
||||
"19.1.0-rc3".officialRelease.sha256 = "sha256-SRonSpXt1pH6Xk+rQZk9mrfMdvYIvOImwUfMUu3sBgs=";
|
||||
"20.0.0-git".gitRelease = {
|
||||
rev = "2579b411a13799534c8b8a22246134b88ba7785d";
|
||||
rev-version = "20.0.0-unstable-2024-08-25";
|
||||
sha256 = "sha256-/Gymj9bEoaAAH5kWPRflD+lBWyPjWBpYGnQsP5vAlsk=";
|
||||
rev = "837ee5b46a5f7f898f0de7e46a19600b896a0a1f";
|
||||
rev-version = "20.0.0-unstable-2024-09-01";
|
||||
sha256 = "sha256-GZDc1o7dLhPWrHA/LELsKs5ydHv9gn1bNFMg6Lfjs5Y=";
|
||||
};
|
||||
} // llvmVersions;
|
||||
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake
|
||||
index 75b0080f6..c895b884c 100644
|
||||
--- a/cmake/modules/AddClang.cmake
|
||||
+++ b/cmake/modules/AddClang.cmake
|
||||
@@ -119,8 +119,8 @@ macro(add_clang_library name)
|
||||
install(TARGETS ${lib}
|
||||
COMPONENT ${lib}
|
||||
${export_to_clangtargets}
|
||||
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
||||
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
||||
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
|
||||
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
|
||||
if (NOT LLVM_ENABLE_IDE)
|
||||
diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt
|
||||
index e6ae4e19e..5ef01aea2 100644
|
||||
--- a/lib/Headers/CMakeLists.txt
|
||||
+++ b/lib/Headers/CMakeLists.txt
|
||||
@@ -337,6 +337,7 @@ set(llvm_libc_wrapper_files
|
||||
|
||||
include(GetClangResourceDir)
|
||||
get_clang_resource_dir(output_dir PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)
|
||||
+set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include)
|
||||
set(out_files)
|
||||
set(generated_files)
|
||||
|
||||
diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt
|
||||
index b5b6d2807..6b592d255 100644
|
||||
--- a/tools/libclang/CMakeLists.txt
|
||||
+++ b/tools/libclang/CMakeLists.txt
|
||||
@@ -246,7 +246,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
|
||||
COMPONENT
|
||||
libclang-python-bindings
|
||||
DESTINATION
|
||||
- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
|
||||
+ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
|
||||
endforeach()
|
||||
if(NOT LLVM_ENABLE_IDE)
|
||||
add_custom_target(libclang-python-bindings)
|
||||
diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt
|
||||
index 3aca22c0b..3115353e3 100644
|
||||
--- a/tools/scan-build-py/CMakeLists.txt
|
||||
+++ b/tools/scan-build-py/CMakeLists.txt
|
||||
@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild})
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib})
|
||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib})
|
||||
install(FILES lib/libscanbuild/${lib}
|
||||
- DESTINATION lib/libscanbuild
|
||||
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild"
|
||||
COMPONENT scan-build-py)
|
||||
endforeach()
|
||||
|
||||
@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources})
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource})
|
||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource})
|
||||
install(FILES lib/libscanbuild/resources/${resource}
|
||||
- DESTINATION lib/libscanbuild/resources
|
||||
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources"
|
||||
COMPONENT scan-build-py)
|
||||
endforeach()
|
||||
|
||||
@@ -122,7 +122,7 @@ foreach(lib ${LibEar})
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib})
|
||||
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib})
|
||||
install(FILES lib/libear/${lib}
|
||||
- DESTINATION lib/libear
|
||||
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear"
|
||||
COMPONENT scan-build-py)
|
||||
endforeach()
|
||||
|
|
@ -5,13 +5,15 @@ mkCoqDerivation rec {
|
|||
owner = "DeepSpec";
|
||||
inherit version;
|
||||
defaultVersion = with lib.versions; lib.switch coq.version [
|
||||
{ case = range "8.13" "8.20"; out = "5.1.2"; }
|
||||
{ case = range "8.13" "8.20"; out = "5.2.0"; }
|
||||
{ case = range "8.10" "8.16"; out = "4.0.0"; }
|
||||
] null;
|
||||
release."5.2.0".sha256 = "sha256-rKLz7ekZf/9xcQefBRsAdULmk81olzQ1W28y61vCDsY=";
|
||||
release."5.1.2".sha256 = "sha256-uKJIjNXGWl0YS0WH52Rnr9Jz98Eo2k0X0qWB9hUYJMk=";
|
||||
release."5.1.1".sha256 = "sha256-VlmPNwaGkdWrH7Z6DGXRosGtjuuQ+FBiGcadN2Hg5pY=";
|
||||
release."5.1.0".sha256 = "sha256-ny7Mi1KgWADiFznkNJiRgD7Djc5SUclNgKOmWRxK+eo=";
|
||||
release."4.0.0".sha256 = "0h5rhndl8syc24hxq1gch86kj7mpmgr89bxp2hmf28fd7028ijsm";
|
||||
release."3.2.0".sha256 = "sha256-10ckCAqSQ0I3CZKlSllI1obOgWVxDagTd7eyhrl1xpE=";
|
||||
releaseRev = v: "${v}";
|
||||
propagatedBuildInputs = [ coq-ext-lib paco ];
|
||||
meta = {
|
||||
|
|
|
@ -14,13 +14,13 @@
|
|||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "libphonenumber";
|
||||
version = "8.13.43";
|
||||
version = "8.13.44";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "google";
|
||||
repo = "libphonenumber";
|
||||
rev = "v${finalAttrs.version}";
|
||||
hash = "sha256-EJjtPqSk2p+J4f6tiaGEnik5LrrqGpGa0XfcnLLp9vg=";
|
||||
hash = "sha256-DnYWHrOePDdQ9tZnKu8W9jnqpp5MjhjrrSfbD1jV/fU=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
|
|
|
@ -20,13 +20,13 @@
|
|||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "indilib";
|
||||
version = "2.0.8";
|
||||
version = "2.0.9";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "indilib";
|
||||
repo = "indi";
|
||||
rev = "v${finalAttrs.version}";
|
||||
hash = "sha256-qdPQMC8HCMdcbHyO8B0OFiefO+jM1ytA2dYNymE0Xuc=";
|
||||
hash = "sha256-CV8nSz53wFeS/h7hGj9adN8qmyhsqOkTYj/0nuvhlSM=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
libexif,
|
||||
libftdi1,
|
||||
libgphoto2,
|
||||
libgpiod_1,
|
||||
libpng,
|
||||
libraw,
|
||||
ninja,
|
||||
|
@ -44,7 +45,7 @@ let
|
|||
owner = "indilib";
|
||||
repo = "indi-3rdparty";
|
||||
rev = "v${indilib.version}";
|
||||
hash = "sha256-0M+k3A2Lw9EU9V5bX9dGztmdcJzc71XQZv8srmY5NmY=";
|
||||
hash = "sha256-RhtdhMvseQUUFcKDuR1N5qc/86IxmQ/7owpjT+qweqc=";
|
||||
};
|
||||
|
||||
buildIndi3rdParty =
|
||||
|
@ -217,7 +218,7 @@ let
|
|||
pname = "libfishcamp";
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt --replace "/lib/firmware" "lib/firmware"
|
||||
substituteInPlace CMakeLists.txt --replace-fail "/lib/firmware" "lib/firmware"
|
||||
'';
|
||||
|
||||
buildInputs = [
|
||||
|
@ -327,7 +328,7 @@ let
|
|||
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt \
|
||||
--replace "set (PK_DATADIR /usr/share/pktriggercord)" "set (PK_DATADIR $out/share/pkgtriggercord)"
|
||||
--replace-fail "set (PK_DATADIR /usr/share/pktriggercord)" "set (PK_DATADIR $out/share/pkgtriggercord)"
|
||||
'';
|
||||
|
||||
buildInputs = [ indilib ];
|
||||
|
@ -342,7 +343,7 @@ let
|
|||
pname = "libplayerone";
|
||||
postPatch = ''
|
||||
substituteInPlace 99-player_one_astronomy.rules \
|
||||
--replace "/bin/echo" "${coreutils}/bin/echo" \
|
||||
--replace-fail "/bin/echo" "${coreutils}/bin/echo" \
|
||||
--replace "/bin/sh" "${bash}/bin/sh"
|
||||
'';
|
||||
|
||||
|
@ -362,14 +363,13 @@ let
|
|||
pname = "libqhy";
|
||||
|
||||
postPatch = ''
|
||||
sed -ie 's/LIBQHY_SOVERSION "24"/LIBQHY_SOVERSION "20"/' CMakeLists.txt
|
||||
substituteInPlace CMakeLists.txt \
|
||||
substituteInPlace --replace-fail CMakeLists.txt \
|
||||
--replace "/lib/firmware" "lib/firmware"
|
||||
|
||||
substituteInPlace 85-qhyccd.rules \
|
||||
--replace "/sbin/fxload" "${fxload}/sbin/fxload" \
|
||||
--replace "/lib/firmware" "$out/lib/firmware" \
|
||||
--replace "/bin/sleep" "${coreutils}/bin/sleep"
|
||||
--replace-fail "/sbin/fxload" "${fxload}/sbin/fxload" \
|
||||
--replace-fail "/lib/firmware" "$out/lib/firmware" \
|
||||
--replace-fail "/bin/sleep" "${coreutils}/bin/sleep"
|
||||
|
||||
sed -e 's|-D $env{DEVNAME}|-p $env{BUSNUM},$env{DEVNUM}|' -i 85-qhyccd.rules
|
||||
'';
|
||||
|
@ -418,10 +418,10 @@ let
|
|||
pname = "libsbig";
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt --replace "/lib/firmware" "lib/firmware"
|
||||
substituteInPlace CMakeLists.txt --replace-fail "/lib/firmware" "lib/firmware"
|
||||
substituteInPlace 51-sbig-debian.rules \
|
||||
--replace "/sbin/fxload" "${fxload}/sbin/fxload" \
|
||||
--replace "/lib/firmware" "$out/lib/firmware"
|
||||
--replace-fail "/sbin/fxload" "${fxload}/sbin/fxload" \
|
||||
--replace-fail "/lib/firmware" "$out/lib/firmware"
|
||||
|
||||
sed -e 's|-D $env{DEVNAME}|-p $env{BUSNUM},$env{DEVNUM}|' -i 51-sbig-debian.rules
|
||||
'';
|
||||
|
@ -516,7 +516,7 @@ in
|
|||
libnova
|
||||
];
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt --replace "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
substituteInPlace CMakeLists.txt --replace-fail "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -637,11 +637,11 @@ in
|
|||
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt \
|
||||
--replace "/lib/udev/rules.d" "lib/udev/rules.d" \
|
||||
--replace "/lib/firmware" "lib/firmware"
|
||||
--replace-fail "/lib/udev/rules.d" "lib/udev/rules.d" \
|
||||
--replace-fail "/lib/firmware" "lib/firmware"
|
||||
substituteInPlace 99-meadedsi.rules \
|
||||
--replace "/sbin/fxload" "${fxload}/sbin/fxload" \
|
||||
--replace "/lib/firmware" "$out/lib/firmware"
|
||||
--replace-fail "/sbin/fxload" "${fxload}/sbin/fxload" \
|
||||
--replace-fail "/lib/firmware" "$out/lib/firmware"
|
||||
|
||||
sed -e 's|-D $env{DEVNAME}|-p $env{BUSNUM},$env{DEVNUM}|' -i 99-meadedsi.rules
|
||||
'';
|
||||
|
@ -725,6 +725,16 @@ in
|
|||
propagatedBuildInputs = [ libgphoto2 ];
|
||||
};
|
||||
|
||||
indi-gpio = buildIndi3rdParty {
|
||||
pname = "indi-gpio";
|
||||
buildInputs = [
|
||||
indilib
|
||||
libgpiod_1
|
||||
libnova
|
||||
zlib
|
||||
];
|
||||
};
|
||||
|
||||
indi-gpsd = buildIndi3rdParty {
|
||||
pname = "indi-gpsd";
|
||||
buildInputs = [
|
||||
|
@ -862,7 +872,7 @@ in
|
|||
];
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt --replace "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
substituteInPlace CMakeLists.txt --replace-fail "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -918,7 +928,7 @@ in
|
|||
];
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt --replace "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
substituteInPlace CMakeLists.txt --replace-fail "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
'';
|
||||
|
||||
meta.platforms = libqsi.meta.platforms;
|
||||
|
@ -1015,7 +1025,7 @@ in
|
|||
libusb1
|
||||
];
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt --replace "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
substituteInPlace CMakeLists.txt --replace-fail "/lib/udev/rules.d" "lib/udev/rules.d"
|
||||
'';
|
||||
};
|
||||
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
diff --git a/nyxt.asd b/nyxt.asd
|
||||
index ea2630ce..fdf837e4 100644
|
||||
--- a/nyxt.asd
|
||||
+++ b/nyxt.asd
|
||||
@@ -480,7 +480,6 @@ The renderer is configured from NYXT_RENDERER or `*nyxt-renderer*'."))
|
||||
:defsystem-depends-on ("nasdf")
|
||||
:class :nasdf-system
|
||||
:depends-on (nyxt/gi-gtk)
|
||||
- :build-operation "program-op"
|
||||
:build-pathname "nyxt"
|
||||
:entry-point "nyxt:entry-point")
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "holidays";
|
||||
version = "0.55";
|
||||
version = "0.56";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.8";
|
||||
|
@ -23,7 +23,7 @@ buildPythonPackage rec {
|
|||
owner = "vacanza";
|
||||
repo = "python-holidays";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-4TJgXY0n7UMr5dGuhfE7WqPCgEBfvb0QUxJNYdaAOLE=";
|
||||
hash = "sha256-oNqgkDIMWfu48vVt1382IWdwHhhvpoR2U60l9jSF6Qo=";
|
||||
};
|
||||
|
||||
build-system = [
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "hstspreload";
|
||||
version = "2024.8.1";
|
||||
version = "2024.9.1";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.6";
|
||||
|
@ -17,7 +17,7 @@ buildPythonPackage rec {
|
|||
owner = "sethmlarson";
|
||||
repo = "hstspreload";
|
||||
rev = "refs/tags/${version}";
|
||||
hash = "sha256-zVBwV+pCmZAnTJi8oyTCs9FxUktDFOxctGeB8fZcsfw=";
|
||||
hash = "sha256-mpHJG2TqhlTNZ9fbyOZsoKusAvx8EiiP7dATCZh19dQ=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
|
|
|
@ -2,14 +2,13 @@
|
|||
buildPythonPackage,
|
||||
fetchPypi,
|
||||
setuptools,
|
||||
wheel,
|
||||
comm,
|
||||
ipykernel,
|
||||
ipython,
|
||||
jsonschema,
|
||||
jupyterlab-widgets,
|
||||
lib,
|
||||
pytest7CheckHook,
|
||||
pytestCheckHook,
|
||||
pytz,
|
||||
traitlets,
|
||||
widgetsnbextension,
|
||||
|
@ -17,20 +16,17 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "ipywidgets";
|
||||
version = "8.1.3";
|
||||
version = "8.1.5";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-9fnuquCCsYI86erCV1JylS9A10iJOXKVbcCXAKY5LZw=";
|
||||
hash = "sha256-hw5DsaNWVqgMGMlQO78tFoAtsctIfuxvqyfWgzgd3hc=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
setuptools
|
||||
wheel
|
||||
];
|
||||
build-system = [ setuptools ];
|
||||
|
||||
propagatedBuildInputs = [
|
||||
dependencies = [
|
||||
comm
|
||||
ipython
|
||||
jupyterlab-widgets
|
||||
|
@ -41,7 +37,7 @@ buildPythonPackage rec {
|
|||
nativeCheckInputs = [
|
||||
ipykernel
|
||||
jsonschema
|
||||
pytest7CheckHook
|
||||
pytestCheckHook
|
||||
pytz
|
||||
];
|
||||
|
||||
|
|
|
@ -2,41 +2,45 @@
|
|||
lib,
|
||||
buildPythonPackage,
|
||||
fetchPypi,
|
||||
notebook,
|
||||
qtconsole,
|
||||
jupyter-console,
|
||||
nbconvert,
|
||||
setuptools,
|
||||
ipykernel,
|
||||
ipywidgets,
|
||||
jupyter-console,
|
||||
jupyterlab,
|
||||
nbconvert,
|
||||
notebook,
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
version = "1.0.0";
|
||||
format = "setuptools";
|
||||
pname = "jupyter";
|
||||
version = "1.1.1";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f";
|
||||
hash = "sha256-1VRnvOq96knX42JK9+M9WcN//1PtOjUOGslXvtcx3no=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
notebook
|
||||
qtconsole
|
||||
jupyter-console
|
||||
nbconvert
|
||||
build-system = [ setuptools ];
|
||||
|
||||
dependencies = [
|
||||
ipykernel
|
||||
ipywidgets
|
||||
jupyter-console
|
||||
jupyterlab
|
||||
nbconvert
|
||||
notebook
|
||||
];
|
||||
|
||||
# Meta-package, no tests
|
||||
doCheck = false;
|
||||
|
||||
dontUsePythonImportsCheck = true;
|
||||
|
||||
meta = with lib; {
|
||||
description = "Installs all the Jupyter components in one go";
|
||||
homepage = "https://jupyter.org/";
|
||||
license = licenses.bsd3;
|
||||
platforms = platforms.all;
|
||||
priority = 100; # This is a metapackage which is unimportant
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "jupyterlab-widgets";
|
||||
version = "3.0.11";
|
||||
version = "3.0.13";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchPypi {
|
||||
pname = "jupyterlab_widgets";
|
||||
inherit version;
|
||||
hash = "sha256-3VrGeVk8lprynJvtBUwk8mhCuqUTUhFHNnVrwDXe7ic=";
|
||||
hash = "sha256-opZtOFMowZQraDqM2WuJuN2CyLj4HdqQK7K8BtRvW+0=";
|
||||
};
|
||||
|
||||
# jupyterlab is required to build from source but we use the pre-build package
|
||||
|
|
|
@ -21,14 +21,14 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "jupyterlab";
|
||||
version = "4.2.4";
|
||||
version = "4.2.5";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.8";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-NDqXn7lYL9CMhRGCPjIHAygc0HKgBJvNr9x6/tp/JTc=";
|
||||
hash = "sha256-rn86G4y4i09VAJznn6fAb5nXDNY2Ae5KqRgV0FT0b3U=";
|
||||
};
|
||||
|
||||
build-system = [
|
||||
|
|
|
@ -24,14 +24,14 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "marimo";
|
||||
version = "0.8.3";
|
||||
version = "0.8.7";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.8";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-t7VYKInsZ0hYW+svD0vnsMyGcMtIeuWaor8nijyDhn8=";
|
||||
hash = "sha256-gxfb5MYPbl8KnvIL+93CyYLOaJ6UflqaikXLAWCS55g=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "nbsphinx";
|
||||
version = "0.9.4";
|
||||
version = "0.9.5";
|
||||
pyproject = true;
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-BCpggG/CPVGbxb71nZVXBxORP+RC/adZ1T46r2IQR5Q=";
|
||||
hash = "sha256-c2kW57Daso/JBPSprjtTqaUMKfzMYynAUvzHSFq88rc=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
|
|
|
@ -1,360 +0,0 @@
|
|||
Based on upstream 66b7fb630903fdcf3e83b6b6d56d82e904264a20, adjusted to
|
||||
apply to 1.15.0 & avoid implicit inclusion of changes from other
|
||||
intermediate commits
|
||||
|
||||
diff --git a/onnx/checker.cc b/onnx/checker.cc
|
||||
index fac56f56..c9fda9b2 100644
|
||||
--- a/onnx/checker.cc
|
||||
+++ b/onnx/checker.cc
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <vector>
|
||||
|
||||
#include "onnx/common/file_utils.h"
|
||||
-#include "onnx/common/path.h"
|
||||
#include "onnx/defs/schema.h"
|
||||
#include "onnx/defs/tensor_proto_util.h"
|
||||
#include "onnx/proto_utils.h"
|
||||
@@ -135,85 +134,7 @@ void check_tensor(const TensorProto& tensor, const CheckerContext& ctx) {
|
||||
for (const StringStringEntryProto& entry : tensor.external_data()) {
|
||||
if (entry.has_key() && entry.has_value() && entry.key() == "location") {
|
||||
has_location = true;
|
||||
-#ifdef _WIN32
|
||||
- auto file_path = std::filesystem::path(utf8str_to_wstring(entry.value()));
|
||||
- if (file_path.is_absolute()) {
|
||||
- fail_check(
|
||||
- "Location of external TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be a relative path, but it is an absolute path: ",
|
||||
- entry.value());
|
||||
- }
|
||||
- auto relative_path = file_path.lexically_normal().make_preferred().wstring();
|
||||
- // Check that normalized relative path contains ".." on Windows.
|
||||
- if (relative_path.find(L"..", 0) != std::string::npos) {
|
||||
- fail_check(
|
||||
- "Data of TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be file inside the ",
|
||||
- ctx.get_model_dir(),
|
||||
- ", but the '",
|
||||
- entry.value(),
|
||||
- "' points outside the directory");
|
||||
- }
|
||||
- std::wstring data_path = path_join(utf8str_to_wstring(ctx.get_model_dir()), relative_path);
|
||||
- struct _stat64 buff;
|
||||
- if (_wstat64(data_path.c_str(), &buff) != 0) {
|
||||
- fail_check(
|
||||
- "Data of TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be stored in ",
|
||||
- entry.value(),
|
||||
- ", but it doesn't exist or is not accessible.");
|
||||
- }
|
||||
-#else // POSIX
|
||||
- if (entry.value().empty()) {
|
||||
- fail_check("Location of external TensorProto ( tensor name: ", tensor.name(), ") should not be empty.");
|
||||
- } else if (entry.value()[0] == '/') {
|
||||
- fail_check(
|
||||
- "Location of external TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be a relative path, but it is an absolute path: ",
|
||||
- entry.value());
|
||||
- }
|
||||
- std::string relative_path = clean_relative_path(entry.value());
|
||||
- // Check that normalized relative path contains ".." on POSIX
|
||||
- if (relative_path.find("..", 0) != std::string::npos) {
|
||||
- fail_check(
|
||||
- "Data of TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be file inside the ",
|
||||
- ctx.get_model_dir(),
|
||||
- ", but the '",
|
||||
- entry.value(),
|
||||
- "' points outside the directory");
|
||||
- }
|
||||
- std::string data_path = path_join(ctx.get_model_dir(), relative_path);
|
||||
- // use stat64 to check whether the file exists
|
||||
-#if defined(__APPLE__) || defined(__wasm__) || !defined(__GLIBC__)
|
||||
- struct stat buffer; // APPLE, wasm and non-glic stdlibs do not have stat64
|
||||
- if (stat((data_path).c_str(), &buffer) != 0) {
|
||||
-#else
|
||||
- struct stat64 buffer; // All POSIX under glibc except APPLE and wasm have stat64
|
||||
- if (stat64((data_path).c_str(), &buffer) != 0) {
|
||||
-#endif
|
||||
- fail_check(
|
||||
- "Data of TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be stored in ",
|
||||
- data_path,
|
||||
- ", but it doesn't exist or is not accessible.");
|
||||
- }
|
||||
- // Do not allow symlinks or directories.
|
||||
- if (!S_ISREG(buffer.st_mode)) {
|
||||
- fail_check(
|
||||
- "Data of TensorProto ( tensor name: ",
|
||||
- tensor.name(),
|
||||
- ") should be stored in ",
|
||||
- data_path,
|
||||
- ", but it is not regular file.");
|
||||
- }
|
||||
-#endif
|
||||
+ resolve_external_data_location(ctx.get_model_dir(), entry.value(), tensor.name());
|
||||
}
|
||||
}
|
||||
if (!has_location) {
|
||||
@@ -1054,6 +975,93 @@ void check_model(const ModelProto& model, bool full_check, bool skip_opset_compa
|
||||
}
|
||||
}
|
||||
|
||||
+std::string resolve_external_data_location(
|
||||
+ const std::string& base_dir,
|
||||
+ const std::string& location,
|
||||
+ const std::string& tensor_name) {
|
||||
+#ifdef _WIN32
|
||||
+ auto file_path = std::filesystem::path(utf8str_to_wstring(location));
|
||||
+ if (file_path.is_absolute()) {
|
||||
+ fail_check(
|
||||
+ "Location of external TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be a relative path, but it is an absolute path: ",
|
||||
+ location);
|
||||
+ }
|
||||
+ auto relative_path = file_path.lexically_normal().make_preferred().wstring();
|
||||
+ // Check that normalized relative path contains ".." on Windows.
|
||||
+ if (relative_path.find(L"..", 0) != std::string::npos) {
|
||||
+ fail_check(
|
||||
+ "Data of TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be file inside the ",
|
||||
+ base_dir,
|
||||
+ ", but the '",
|
||||
+ location,
|
||||
+ "' points outside the directory");
|
||||
+ }
|
||||
+ std::wstring data_path = path_join(utf8str_to_wstring(base_dir), relative_path);
|
||||
+ struct _stat64 buff;
|
||||
+ if (_wstat64(data_path.c_str(), &buff) != 0) {
|
||||
+ fail_check(
|
||||
+ "Data of TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be stored in ",
|
||||
+ location,
|
||||
+ ", but it doesn't exist or is not accessible.");
|
||||
+ }
|
||||
+ return wstring_to_utf8str(data_path);
|
||||
+#else // POSIX
|
||||
+ if (location.empty()) {
|
||||
+ fail_check("Location of external TensorProto ( tensor name: ", tensor_name, ") should not be empty.");
|
||||
+ } else if (location[0] == '/') {
|
||||
+ fail_check(
|
||||
+ "Location of external TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be a relative path, but it is an absolute path: ",
|
||||
+ location);
|
||||
+ }
|
||||
+ std::string relative_path = clean_relative_path(location);
|
||||
+ // Check that normalized relative path contains ".." on POSIX
|
||||
+ if (relative_path.find("..", 0) != std::string::npos) {
|
||||
+ fail_check(
|
||||
+ "Data of TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be file inside the ",
|
||||
+ base_dir,
|
||||
+ ", but the '",
|
||||
+ location,
|
||||
+ "' points outside the directory");
|
||||
+ }
|
||||
+ std::string data_path = path_join(base_dir, relative_path);
|
||||
+ // use stat64 to check whether the file exists
|
||||
+#if defined(__APPLE__) || defined(__wasm__) || !defined(__GLIBC__)
|
||||
+ struct stat buffer; // APPLE, wasm and non-glic stdlibs do not have stat64
|
||||
+ if (stat((data_path).c_str(), &buffer) != 0) {
|
||||
+#else
|
||||
+ struct stat64 buffer; // All POSIX under glibc except APPLE and wasm have stat64
|
||||
+ if (stat64((data_path).c_str(), &buffer) != 0) {
|
||||
+#endif
|
||||
+ fail_check(
|
||||
+ "Data of TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be stored in ",
|
||||
+ data_path,
|
||||
+ ", but it doesn't exist or is not accessible.");
|
||||
+ }
|
||||
+ // Do not allow symlinks or directories.
|
||||
+ if (!S_ISREG(buffer.st_mode)) {
|
||||
+ fail_check(
|
||||
+ "Data of TensorProto ( tensor name: ",
|
||||
+ tensor_name,
|
||||
+ ") should be stored in ",
|
||||
+ data_path,
|
||||
+ ", but it is not regular file.");
|
||||
+ }
|
||||
+ return data_path;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
std::set<std::string> experimental_ops = {
|
||||
"ATen",
|
||||
"Affine",
|
||||
diff --git a/onnx/checker.h b/onnx/checker.h
|
||||
index 6796acab..83012213 100644
|
||||
--- a/onnx/checker.h
|
||||
+++ b/onnx/checker.h
|
||||
@@ -160,7 +160,10 @@ void check_model_local_functions(
|
||||
|
||||
void check_model(const ModelProto& model, bool full_check = false, bool skip_opset_compatibility_check = false);
|
||||
void check_model(const std::string& model_path, bool full_check = false, bool skip_opset_compatibility_check = false);
|
||||
-
|
||||
+std::string resolve_external_data_location(
|
||||
+ const std::string& base_dir,
|
||||
+ const std::string& location,
|
||||
+ const std::string& tensor_name);
|
||||
bool check_is_experimental_op(const NodeProto& node);
|
||||
|
||||
} // namespace checker
|
||||
diff --git a/onnx/common/path.h b/onnx/common/path.h
|
||||
index 6eaf5e67..09212747 100644
|
||||
--- a/onnx/common/path.h
|
||||
+++ b/onnx/common/path.h
|
||||
@@ -31,11 +31,22 @@ inline std::wstring utf8str_to_wstring(const std::string& utf8str) {
|
||||
if (utf8str.size() > INT_MAX) {
|
||||
fail_check("utf8str_to_wstring: string is too long for converting to wstring.");
|
||||
}
|
||||
- int size_required = MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), (int)utf8str.size(), NULL, 0);
|
||||
+ int size_required = MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), static_cast<int>(utf8str.size()), NULL, 0);
|
||||
std::wstring ws_str(size_required, 0);
|
||||
- MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), (int)utf8str.size(), &ws_str[0], size_required);
|
||||
+ MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), static_cast<int>(utf8str.size()), &ws_str[0], size_required);
|
||||
return ws_str;
|
||||
}
|
||||
+inline std::string wstring_to_utf8str(const std::wstring& ws_str) {
|
||||
+ if (ws_str.size() > INT_MAX) {
|
||||
+ fail_check("wstring_to_utf8str: string is too long for converting to UTF-8.");
|
||||
+ }
|
||||
+ int size_required =
|
||||
+ WideCharToMultiByte(CP_UTF8, 0, ws_str.c_str(), static_cast<int>(ws_str.size()), NULL, 0, NULL, NULL);
|
||||
+ std::string utf8str(size_required, 0);
|
||||
+ WideCharToMultiByte(
|
||||
+ CP_UTF8, 0, ws_str.c_str(), static_cast<int>(ws_str.size()), &utf8str[0], size_required, NULL, NULL);
|
||||
+ return utf8str;
|
||||
+}
|
||||
|
||||
#else
|
||||
std::string path_join(const std::string& origin, const std::string& append);
|
||||
diff --git a/onnx/cpp2py_export.cc b/onnx/cpp2py_export.cc
|
||||
index bc2594db..83cea68f 100644
|
||||
--- a/onnx/cpp2py_export.cc
|
||||
+++ b/onnx/cpp2py_export.cc
|
||||
@@ -545,6 +545,8 @@ PYBIND11_MODULE(onnx_cpp2py_export, onnx_cpp2py_export) {
|
||||
"full_check"_a = false,
|
||||
"skip_opset_compatibility_check"_a = false);
|
||||
|
||||
+ checker.def("_resolve_external_data_location", &checker::resolve_external_data_location);
|
||||
+
|
||||
// Submodule `version_converter`
|
||||
auto version_converter = onnx_cpp2py_export.def_submodule("version_converter");
|
||||
version_converter.doc() = "VersionConverter submodule";
|
||||
diff --git a/onnx/external_data_helper.py b/onnx/external_data_helper.py
|
||||
index bbc2717f..05c486c6 100644
|
||||
--- a/onnx/external_data_helper.py
|
||||
+++ b/onnx/external_data_helper.py
|
||||
@@ -8,6 +8,7 @@ import uuid
|
||||
from itertools import chain
|
||||
from typing import Callable, Iterable, Optional
|
||||
|
||||
+import onnx.onnx_cpp2py_export.checker as c_checker
|
||||
from onnx.onnx_pb import AttributeProto, GraphProto, ModelProto, TensorProto
|
||||
|
||||
|
||||
@@ -39,9 +40,9 @@ def load_external_data_for_tensor(tensor: TensorProto, base_dir: str) -> None:
|
||||
base_dir: directory that contains the external data.
|
||||
"""
|
||||
info = ExternalDataInfo(tensor)
|
||||
- file_location = _sanitize_path(info.location)
|
||||
- external_data_file_path = os.path.join(base_dir, file_location)
|
||||
-
|
||||
+ external_data_file_path = c_checker._resolve_external_data_location( # type: ignore[attr-defined]
|
||||
+ base_dir, info.location, tensor.name
|
||||
+ )
|
||||
with open(external_data_file_path, "rb") as data_file:
|
||||
if info.offset:
|
||||
data_file.seek(info.offset)
|
||||
@@ -259,14 +260,6 @@ def _get_attribute_tensors(onnx_model_proto: ModelProto) -> Iterable[TensorProto
|
||||
yield from _get_attribute_tensors_from_graph(onnx_model_proto.graph)
|
||||
|
||||
|
||||
-def _sanitize_path(path: str) -> str:
|
||||
- """Remove path components which would allow traversing up a directory tree from a base path.
|
||||
-
|
||||
- Note: This method is currently very basic and should be expanded.
|
||||
- """
|
||||
- return path.lstrip("/.")
|
||||
-
|
||||
-
|
||||
def _is_valid_filename(filename: str) -> bool:
|
||||
"""Utility to check whether the provided filename is valid."""
|
||||
exp = re.compile('^[^<>:;,?"*|/]+$')
|
||||
diff --git a/onnx/test/test_external_data.py b/onnx/test/test_external_data.py
|
||||
index 63f6b4ef..bb14d279 100644
|
||||
--- a/onnx/test/test_external_data.py
|
||||
+++ b/onnx/test/test_external_data.py
|
||||
@@ -3,6 +3,7 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
from __future__ import annotations
|
||||
|
||||
+import itertools
|
||||
import os
|
||||
import pathlib
|
||||
import tempfile
|
||||
@@ -204,6 +205,52 @@ class TestLoadExternalDataSingleFile(TestLoadExternalDataBase):
|
||||
attribute_tensor = new_model.graph.node[0].attribute[0].t
|
||||
np.testing.assert_allclose(to_array(attribute_tensor), self.attribute_value)
|
||||
|
||||
+ @parameterized.parameterized.expand(itertools.product((True, False), (True, False)))
|
||||
+ def test_save_external_invalid_single_file_data_and_check(
|
||||
+ self, use_absolute_path: bool, use_model_path: bool
|
||||
+ ) -> None:
|
||||
+ model = onnx.load_model(self.model_filename, self.serialization_format)
|
||||
+
|
||||
+ model_dir = os.path.join(self.temp_dir, "save_copy")
|
||||
+ os.mkdir(model_dir)
|
||||
+
|
||||
+ traversal_external_data_dir = os.path.join(
|
||||
+ self.temp_dir, "invlid_external_data"
|
||||
+ )
|
||||
+ os.mkdir(traversal_external_data_dir)
|
||||
+
|
||||
+ if use_absolute_path:
|
||||
+ traversal_external_data_location = os.path.join(
|
||||
+ traversal_external_data_dir, "tensors.bin"
|
||||
+ )
|
||||
+ else:
|
||||
+ traversal_external_data_location = "../invlid_external_data/tensors.bin"
|
||||
+
|
||||
+ external_data_dir = os.path.join(self.temp_dir, "external_data")
|
||||
+ os.mkdir(external_data_dir)
|
||||
+ new_model_filepath = os.path.join(model_dir, "model.onnx")
|
||||
+
|
||||
+ def convert_model_to_external_data_no_check(model: ModelProto, location: str):
|
||||
+ for tensor in model.graph.initializer:
|
||||
+ if tensor.HasField("raw_data"):
|
||||
+ set_external_data(tensor, location)
|
||||
+
|
||||
+ convert_model_to_external_data_no_check(
|
||||
+ model,
|
||||
+ location=traversal_external_data_location,
|
||||
+ )
|
||||
+
|
||||
+ onnx.save_model(model, new_model_filepath, self.serialization_format)
|
||||
+ if use_model_path:
|
||||
+ with self.assertRaises(onnx.checker.ValidationError):
|
||||
+ _ = onnx.load_model(new_model_filepath, self.serialization_format)
|
||||
+ else:
|
||||
+ onnx_model = onnx.load_model(
|
||||
+ new_model_filepath, self.serialization_format, load_external_data=False
|
||||
+ )
|
||||
+ with self.assertRaises(onnx.checker.ValidationError):
|
||||
+ load_external_data_for_model(onnx_model, external_data_dir)
|
||||
+
|
||||
|
||||
@parameterized.parameterized_class(
|
||||
[
|
265
pkgs/development/python-modules/pycrdt/Cargo.lock
generated
265
pkgs/development/python-modules/pycrdt/Cargo.lock
generated
|
@ -9,10 +9,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
|
||||
|
||||
[[package]]
|
||||
name = "atomic_refcell"
|
||||
version = "0.1.13"
|
||||
name = "async-lock"
|
||||
version = "3.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c"
|
||||
checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
|
||||
dependencies = [
|
||||
"event-listener",
|
||||
"event-listener-strategy",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.82"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
|
@ -20,6 +36,12 @@ version = "1.3.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.16.0"
|
||||
|
@ -33,10 +55,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.1.0"
|
||||
name = "concurrent-queue"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
|
||||
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
|
||||
|
||||
[[package]]
|
||||
name = "dashmap"
|
||||
version = "6.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"crossbeam-utils",
|
||||
"hashbrown",
|
||||
"lock_api",
|
||||
"once_cell",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "event-listener"
|
||||
version = "5.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
|
||||
dependencies = [
|
||||
"concurrent-queue",
|
||||
"parking",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "event-listener-strategy"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
|
||||
dependencies = [
|
||||
"event-listener",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
@ -54,6 +126,12 @@ dependencies = [
|
|||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.14.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
|
@ -74,18 +152,28 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
|||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.69"
|
||||
version = "0.3.70"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
|
||||
checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
|
||||
dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.155"
|
||||
version = "0.2.158"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
|
||||
checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
|
@ -114,6 +202,31 @@ version = "1.19.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
|
||||
[[package]]
|
||||
name = "parking"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
|
||||
|
||||
[[package]]
|
||||
name = "portable-atomic"
|
||||
version = "1.7.0"
|
||||
|
@ -131,7 +244,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "pycrdt"
|
||||
version = "0.9.8"
|
||||
version = "0.9.11"
|
||||
dependencies = [
|
||||
"pyo3",
|
||||
"yrs",
|
||||
|
@ -202,13 +315,22 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.36"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.18"
|
||||
|
@ -216,19 +338,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.206"
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b3e4cd94123dd520a128bcd11e34d9e9e423e7e3e50425cb1b4b1e3549d0284"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.209"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.206"
|
||||
version = "1.0.209"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97"
|
||||
checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -237,9 +365,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.124"
|
||||
version = "1.0.127"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d"
|
||||
checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
|
@ -264,9 +392,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
|||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.74"
|
||||
version = "2.0.77"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7"
|
||||
checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -319,19 +447,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
|||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.92"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
|
||||
checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"wasm-bindgen-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-backend"
|
||||
version = "0.2.92"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
|
||||
checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"log",
|
||||
|
@ -344,9 +473,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.92"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
|
||||
checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
|
@ -354,9 +483,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.92"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
|
||||
checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -367,18 +496,84 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.92"
|
||||
version = "0.2.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
|
||||
checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_gnullvm",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||
|
||||
[[package]]
|
||||
name = "yrs"
|
||||
version = "0.19.2"
|
||||
version = "0.21.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8ca5126331b9a5ef5bb10f3f1c3d01b05f298d348c66f8fb15497d83ee73176"
|
||||
checksum = "7a6eac182a01ef4cbf4edb5e71e2c560a34144ae82680aab66a62c172b7ae2a2"
|
||||
dependencies = [
|
||||
"arc-swap",
|
||||
"atomic_refcell",
|
||||
"async-lock",
|
||||
"async-trait",
|
||||
"dashmap",
|
||||
"fastrand",
|
||||
"serde",
|
||||
"serde_json",
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "pycrdt";
|
||||
version = "0.9.8";
|
||||
version = "0.9.11";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "jupyter-server";
|
||||
repo = "pycrdt";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-W93rLSDcCB9jrxC/Z88ToCkcfMGnCTGjBkVRNk3lLaI=";
|
||||
hash = "sha256-62r3AO+x9du6UjIdtqDPmwJ30/YmQxbPcCXgOaGNtL0=";
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
|
@ -39,6 +39,8 @@ buildPythonPackage rec {
|
|||
|
||||
buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
|
||||
|
||||
dependencies = [ anyio ];
|
||||
|
||||
pythonImportsCheck = [ "pycrdt" ];
|
||||
|
||||
nativeCheckInputs = [
|
||||
|
@ -52,11 +54,11 @@ buildPythonPackage rec {
|
|||
|
||||
passthru.updateScript = nix-update-script { extraArgs = [ "--generate-lockfile" ]; };
|
||||
|
||||
meta = with lib; {
|
||||
meta = {
|
||||
description = "CRDTs based on Yrs";
|
||||
homepage = "https://github.com/jupyter-server/pycrdt";
|
||||
changelog = "https://github.com/jupyter-server/pycrdt/releases/tag/${lib.removePrefix "refs/tags/" src.rev}";
|
||||
license = licenses.mit;
|
||||
maintainers = teams.jupyter.members;
|
||||
license = lib.licenses.mit;
|
||||
maintainers = lib.teams.jupyter.members;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "rules";
|
||||
version = "3.4.0";
|
||||
version = "3.5.0";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "dfunckt";
|
||||
repo = "django-rules";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-fxLaxjni+0S59vtvKBduR0pYMwJWWBPzR5mnH+j6gVE=";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-8Kay2b2uwaI/ml/cPpcj9svoDQI0ptV8tyGeZ76SgZw=";
|
||||
};
|
||||
|
||||
build-system = [ setuptools ];
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
From 02266a00ce0eb6a089e7efe07816da1aa5152fc9 Mon Sep 17 00:00:00 2001
|
||||
From: Maksim Terpilovskii <maximtrp@gmail.com>
|
||||
Date: Sun, 31 Jul 2022 12:25:14 +0300
|
||||
Subject: [PATCH] increased abs tolerance for wilcoxon test
|
||||
|
||||
---
|
||||
tests/test_posthocs.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/test_posthocs.py b/tests/test_posthocs.py
|
||||
index 956d808..8cc65e4 100644
|
||||
--- a/tests/test_posthocs.py
|
||||
+++ b/tests/test_posthocs.py
|
||||
@@ -471,7 +471,7 @@ class TestPosthocs(unittest.TestCase):
|
||||
[2.857818e-06, 1.230888e-05, 1]])
|
||||
|
||||
results = sp.posthoc_wilcoxon(self.df.sort_index(), val_col = 'pulse', group_col = 'kind')
|
||||
- self.assertTrue(np.allclose(results, r_results))
|
||||
+ self.assertTrue(np.allclose(results, r_results, atol=1e-4))
|
||||
|
||||
|
||||
def test_posthoc_scheffe(self):
|
||||
--
|
||||
2.36.1
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
From 5416ffba3ab01aebab3909400b5a9e847022898e Mon Sep 17 00:00:00 2001
|
||||
From: Maksim Terpilovskii <maximtrp@gmail.com>
|
||||
Date: Thu, 16 Mar 2023 00:20:02 +0300
|
||||
Subject: [PATCH] Update test_posthocs.py
|
||||
|
||||
---
|
||||
tests/test_posthocs.py | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tests/test_posthocs.py b/tests/test_posthocs.py
|
||||
index 8cc65e4..42ca5f3 100644
|
||||
--- a/tests/test_posthocs.py
|
||||
+++ b/tests/test_posthocs.py
|
||||
@@ -71,7 +71,7 @@ class TestPosthocs(unittest.TestCase):
|
||||
a = splt.sign_plot(x, flat=True, labels=False)
|
||||
with self.assertRaises(ValueError):
|
||||
splt.sign_plot(x.astype(float), flat=True, labels=False)
|
||||
- self.assertTrue(isinstance(a, ma._subplots.Axes))
|
||||
+ self.assertTrue(isinstance(a, ma._axes.Axes))
|
||||
|
||||
def test_sign_plot_nonflat(self):
|
||||
|
||||
@@ -85,7 +85,7 @@ class TestPosthocs(unittest.TestCase):
|
||||
with self.assertRaises(ValueError):
|
||||
splt.sign_plot(x.astype(np.int64), labels=False)
|
||||
|
||||
- self.assertTrue(isinstance(a, ma._subplots.Axes) and isinstance(cbar, mpl.colorbar.ColorbarBase))
|
||||
+ self.assertTrue(isinstance(a, ma._axes.Axes) and isinstance(cbar, mpl.colorbar.ColorbarBase))
|
||||
|
||||
# Outliers tests
|
||||
def test_outliers_iqr(self):
|
||||
--
|
||||
2.36.1
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
diff --git a/sopel/plugins/handlers.py b/sopel/plugins/handlers.py
|
||||
index 76902aa0..05f0279d 100644
|
||||
--- a/sopel/plugins/handlers.py
|
||||
+++ b/sopel/plugins/handlers.py
|
||||
@@ -46,20 +46,15 @@ from __future__ import absolute_import, division, print_function, unicode_litera
|
||||
|
||||
import imp
|
||||
import importlib
|
||||
+import importlib.util
|
||||
import inspect
|
||||
import itertools
|
||||
import os
|
||||
+import sys
|
||||
|
||||
from sopel import loader
|
||||
from . import exceptions
|
||||
|
||||
-try:
|
||||
- reload = importlib.reload
|
||||
-except AttributeError:
|
||||
- # py2: no reload function
|
||||
- # TODO: imp is deprecated, to be removed when py2 support is dropped
|
||||
- reload = imp.reload
|
||||
-
|
||||
|
||||
class AbstractPluginHandler(object):
|
||||
"""Base class for plugin handlers.
|
||||
@@ -301,7 +296,7 @@ class PyModulePlugin(AbstractPluginHandler):
|
||||
|
||||
This method assumes the plugin is already loaded.
|
||||
"""
|
||||
- self._module = reload(self._module)
|
||||
+ self._module = importlib.reload(self._module)
|
||||
|
||||
def is_loaded(self):
|
||||
return self._module is not None
|
||||
@@ -402,45 +397,31 @@ class PyFilePlugin(PyModulePlugin):
|
||||
|
||||
if good_file:
|
||||
name = os.path.basename(filename)[:-3]
|
||||
- module_type = imp.PY_SOURCE
|
||||
+ spec = importlib.util.spec_from_file_location(
|
||||
+ name,
|
||||
+ filename,
|
||||
+ )
|
||||
elif good_dir:
|
||||
name = os.path.basename(filename)
|
||||
- module_type = imp.PKG_DIRECTORY
|
||||
+ spec = importlib.util.spec_from_file_location(
|
||||
+ name,
|
||||
+ os.path.join(filename, '__init__.py'),
|
||||
+ submodule_search_locations=filename,
|
||||
+ )
|
||||
else:
|
||||
raise exceptions.PluginError('Invalid Sopel plugin: %s' % filename)
|
||||
|
||||
self.filename = filename
|
||||
self.path = filename
|
||||
- self.module_type = module_type
|
||||
+ self.module_spec = spec
|
||||
|
||||
super(PyFilePlugin, self).__init__(name)
|
||||
|
||||
def _load(self):
|
||||
- # The current implementation uses `imp.load_module` to perform the
|
||||
- # load action, which also reloads the module. However, `imp` is
|
||||
- # deprecated in Python 3, so that might need to be changed when the
|
||||
- # support for Python 2 is dropped.
|
||||
- #
|
||||
- # However, the solution for Python 3 is non-trivial, since the
|
||||
- # `importlib` built-in module does not have a similar function,
|
||||
- # therefore requires to dive into its public internals
|
||||
- # (``importlib.machinery`` and ``importlib.util``).
|
||||
- #
|
||||
- # All of that is doable, but represents a lot of work. As long as
|
||||
- # Python 2 is supported, we can keep it for now.
|
||||
- #
|
||||
- # TODO: switch to ``importlib`` when Python2 support is dropped.
|
||||
- if self.module_type == imp.PY_SOURCE:
|
||||
- with open(self.path) as mod:
|
||||
- description = ('.py', 'U', self.module_type)
|
||||
- mod = imp.load_module(self.name, mod, self.path, description)
|
||||
- elif self.module_type == imp.PKG_DIRECTORY:
|
||||
- description = ('', '', self.module_type)
|
||||
- mod = imp.load_module(self.name, None, self.path, description)
|
||||
- else:
|
||||
- raise TypeError('Unsupported module type')
|
||||
-
|
||||
- return mod
|
||||
+ module = importlib.util.module_from_spec(self.module_spec)
|
||||
+ sys.modules[self.name] = module
|
||||
+ self.module_spec.loader.exec_module(module)
|
||||
+ return module
|
||||
|
||||
def get_meta_description(self):
|
||||
"""Retrieve a meta description for the plugin.
|
|
@ -7,12 +7,12 @@
|
|||
|
||||
buildPythonPackage rec {
|
||||
pname = "widgetsnbextension";
|
||||
version = "4.0.11";
|
||||
version = "4.0.13";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-iyKo8ZEL/RiOWW/n/AXcvYfoEMikugEL2z2oZjc5hHQ=";
|
||||
hash = "sha256-/8tnvJ/r0QI0o2J5X2Q5J/TgwF2TQscntl0jhPj+rLY=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ jupyter-packaging ];
|
||||
|
|
|
@ -48,11 +48,11 @@ buildGoModule rec {
|
|||
installShellCompletion completion/{bash,fish,zsh}/*
|
||||
|
||||
substituteInPlace $out/share/bash-completion/completions/task.bash \
|
||||
--replace-warn 'complete -F _task task' 'complete -F _task task go-task'
|
||||
--replace-fail 'complete -F _task task' 'complete -F _task task go-task'
|
||||
substituteInPlace $out/share/fish/vendor_completions.d/task.fish \
|
||||
--replace-warn 'complete -c $GO_TASK_PROGNAME' 'complete -c $GO_TASK_PROGNAME -c go-task'
|
||||
--replace-fail 'complete -c $GO_TASK_PROGNAME' 'complete -c $GO_TASK_PROGNAME -c go-task'
|
||||
substituteInPlace $out/share/zsh/site-functions/_task \
|
||||
--replace-warn '#compdef task' '#compdef task go-task'
|
||||
--replace-fail '#compdef task' '#compdef task go-task'
|
||||
'';
|
||||
|
||||
passthru.tests = {
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
{ lib, stdenv, fetchurl, alsa-lib, fixDarwinDylibNames }:
|
||||
{ lib, stdenv, fetchurl, alsa-lib, fixDarwinDylibNames, gitUpdater }:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "sndio";
|
||||
version = "1.9.0";
|
||||
version = "1.10.0";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://www.sndio.org/sndio-${finalAttrs.version}.tar.gz";
|
||||
hash = "sha256-8wgm/JwH42nTkk1fzt9qClPA30rh9atQ/pzygFQPaZo=";
|
||||
hash = "sha256-vr07/QHFDJN2zz54FLk3m+2eF9A5O1ETt+t6PQ0DjFQ=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
|
||||
|
@ -18,6 +18,13 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
'';
|
||||
|
||||
enableParallelBuilding = true;
|
||||
# does not provide --disable-static
|
||||
dontDisableStatic = true;
|
||||
|
||||
passthru.updateScript = gitUpdater {
|
||||
url = "https://sndio.org/git/sndio";
|
||||
rev-prefix = "v";
|
||||
};
|
||||
|
||||
meta = {
|
||||
homepage = "https://www.sndio.org";
|
||||
|
|
|
@ -8,13 +8,13 @@ let
|
|||
x86_64-darwin = "x64";
|
||||
}."${stdenv.hostPlatform.system}" or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
|
||||
hash = {
|
||||
x64-linux_hash = "sha256-ulWg9BhDr/RFE4sfXGf+i9W0KpOYKjtk49qBeIwI9dU=";
|
||||
arm64-linux_hash = "sha256-iSXXx89I7Pj2nAuapHwJtIblj+TDrd/k9OiBK8QExSg=";
|
||||
x64-osx_hash = "sha256-xjnDePaxQWRNo1VmH1sbp0Xtvbac3nu0+fiMg0wMddg=";
|
||||
x64-linux_hash = "sha256-RrxGd96O9vFtBR5AEKTr58XfHzYST3TW3eG95+5vsHA=";
|
||||
arm64-linux_hash = "sha256-SqRE62hIOmaE6kAyu7903OiDQC2byd/Q4S1WKxpIwuU=";
|
||||
x64-osx_hash = "sha256-9/P9B4iIcB0/OF/ZjdAvaPhrwJ1VJtbL6NgYJ5CVf8A=";
|
||||
}."${arch}-${os}_hash";
|
||||
in stdenv.mkDerivation rec {
|
||||
pname = "lidarr";
|
||||
version = "2.3.3.4204";
|
||||
version = "2.5.3.4341";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/lidarr/Lidarr/releases/download/v${version}/Lidarr.master.${version}.${os}-core-${arch}.tar.gz";
|
||||
|
|
|
@ -17,20 +17,20 @@ let
|
|||
in
|
||||
python3.pkgs.buildPythonApplication rec {
|
||||
pname = "matrix-synapse";
|
||||
version = "1.113.0";
|
||||
version = "1.114.0";
|
||||
format = "pyproject";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "element-hq";
|
||||
repo = "synapse";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-8Ts2QOSugPU8Do1Mpusez9tSqiaB+UzCWWY4XJk/KRM=";
|
||||
hash = "sha256-AvUc6vE2gjsUEbRLaexDbvEPwJio7W3YMyN3fJvr4c0=";
|
||||
};
|
||||
|
||||
cargoDeps = rustPlatform.fetchCargoTarball {
|
||||
inherit src;
|
||||
name = "${pname}-${version}";
|
||||
hash = "sha256-Jlnv3GAobrXaO5fBq6oI9Gq8phz2/jFc+QIUYsUyeNo=";
|
||||
hash = "sha256-cAGTEi7UwNVfTzckWBpjxfEMWXZRZDdkXIhx/HjAiTg=";
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
|
|
|
@ -33,6 +33,7 @@ python3.pkgs.buildPythonApplication rec {
|
|||
chardet
|
||||
cryptography
|
||||
dnspython
|
||||
elementpath
|
||||
eventlet
|
||||
feedgen
|
||||
flask
|
||||
|
|
|
@ -15,11 +15,11 @@
|
|||
}:
|
||||
python3Packages.buildPythonApplication rec {
|
||||
pname = "borgmatic";
|
||||
version = "1.8.13";
|
||||
version = "1.8.14";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-4Z5imxNjfvd4fkpFsggSO9XueN5Yzcz4RCl+BqmddCM=";
|
||||
hash = "sha256-WYs7wiwZ1TvTdeUpWv7FbREXWfdGcYRarP4FXFOfp0Y=";
|
||||
};
|
||||
|
||||
nativeCheckInputs = with python3Packages; [ flexmock pytestCheckHook pytest-cov ] ++ passthru.optional-dependencies.apprise;
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
buildGoModule rec {
|
||||
pname = "gvproxy";
|
||||
version = "0.7.4";
|
||||
version = "0.7.5";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "containers";
|
||||
repo = "gvisor-tap-vsock";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-ovNYPYLC01xt7uiaXkFsLHiywAhQVa0tELk/AA8dxqs=";
|
||||
hash = "sha256-A2nG3Or5EhUSjTIpV05rWVcLJpGHtAWP5/n07KjM/E8=";
|
||||
};
|
||||
|
||||
vendorHash = null;
|
||||
|
|
|
@ -5,20 +5,13 @@
|
|||
, runCommand
|
||||
, python3
|
||||
, encryptionSupport ? true
|
||||
, sqliteSupport ? true
|
||||
}:
|
||||
|
||||
let
|
||||
python = python3.override {
|
||||
self = python;
|
||||
packageOverrides = final: prev: {
|
||||
# aiosqlite>=0.16,<0.19
|
||||
aiosqlite = prev.aiosqlite.overridePythonAttrs (old: rec {
|
||||
version = "0.18.0";
|
||||
src = old.src.override {
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-yPGSKqjOz1EY5/V0oKz2EiZ90q2O4TINoXdxHuB7Gqk=";
|
||||
};
|
||||
});
|
||||
# SQLAlchemy>=1,<1.4
|
||||
# SQLAlchemy 2.0's derivation is very different, so don't override, just write it from scratch
|
||||
# (see https://github.com/NixOS/nixpkgs/blob/65dbed73949e4c0207e75dcc7271b29f9e457670/pkgs/development/python-modules/sqlalchemy/default.nix)
|
||||
|
@ -43,29 +36,27 @@ let
|
|||
|
||||
maubot = python.pkgs.buildPythonPackage rec {
|
||||
pname = "maubot";
|
||||
version = "0.4.2";
|
||||
disabled = python.pythonOlder "3.9";
|
||||
version = "0.5.0";
|
||||
disabled = python.pythonOlder "3.10";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-svdg7KpCy/+T9Hu+FbsgLNU8nVuIn0flPg7qyn7I+30=";
|
||||
hash = "sha256-PkeZ7C4Srs2I10g7X1XD/HclumUwWTYj2F3J2CxN4Hs=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# add entry point - https://github.com/maubot/maubot/pull/146
|
||||
(fetchpatch {
|
||||
url = "https://github.com/maubot/maubot/commit/283f0a3ed5dfae13062b6f0fd153fbdc477f4381.patch";
|
||||
sha256 = "0yn5357z346qzy5v5g124mgiah1xsi9yyfq42zg028c8paiw8s8x";
|
||||
url = "https://github.com/maubot/maubot/commit/ef6e23eccb530187dd3447b6aac2047d4a32fb83.patch";
|
||||
hash = "sha256-d5fu47F93aXZmk6MiSsxTE8pHjMKNL0FUdU+ynUqY2o=";
|
||||
})
|
||||
];
|
||||
|
||||
propagatedBuildInputs = with python.pkgs; [
|
||||
setuptools
|
||||
# requirements.txt
|
||||
(mautrix.override { withOlm = encryptionSupport; })
|
||||
aiohttp
|
||||
yarl
|
||||
sqlalchemy
|
||||
asyncpg
|
||||
aiosqlite
|
||||
commonmark
|
||||
|
@ -77,12 +68,22 @@ let
|
|||
colorama
|
||||
questionary
|
||||
jinja2
|
||||
setuptools
|
||||
]
|
||||
# optional-requirements.txt
|
||||
++ lib.optionals encryptionSupport [
|
||||
python-olm
|
||||
pycryptodome
|
||||
unpaddedbase64
|
||||
]
|
||||
++ lib.optionals sqliteSupport [
|
||||
sqlalchemy
|
||||
];
|
||||
|
||||
# used for plugin tests
|
||||
propagatedNativeBuildInputs = with python.pkgs; [
|
||||
pytest
|
||||
pytest-asyncio
|
||||
];
|
||||
|
||||
postInstall = ''
|
||||
|
|
|
@ -1,35 +1,4 @@
|
|||
{
|
||||
"activity-tracker": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/williamkray/maubot-kickbot/releases",
|
||||
"description": "A plugin that minimally tracks user activity within a space. Useful for kicking inactive users from a private community.",
|
||||
"downloadPage": "https://github.com/williamkray/maubot-kickbot/releases",
|
||||
"homepage": "https://github.com/williamkray/maubot-kickbot"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-TLaGpLrTR4TLR0TjY3v9FFST8JxEP4swJ7kzt0fDwJI=",
|
||||
"owner": "williamkray",
|
||||
"repo": "maubot-kickbot",
|
||||
"rev": "a4c31c7a1492585f2155705be8cab7e3f73f6b69"
|
||||
},
|
||||
"manifest": {
|
||||
"database": true,
|
||||
"database_type": "asyncpg",
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "org.jobmachine.kickbot",
|
||||
"license": "MIT",
|
||||
"main_class": "KickBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"kickbot"
|
||||
],
|
||||
"version": "0.0.10"
|
||||
}
|
||||
},
|
||||
"alertbot": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
@ -116,17 +85,17 @@
|
|||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/coffeebank/coffee-maubot/releases",
|
||||
"description": "An anime/manga bot for Matrix. Search anime, manga (manhwa/manhua), and light novels from Anilist. See series info, status, and episodes/chapters.",
|
||||
"description": "An anime/manga bot for Matrix. Search anime, manga (manhwa/manhua), and light novels. See series info, status, episodes/chapters, and tags. Search Anilist, MangaDex, and Batoto.",
|
||||
"downloadPage": "https://github.com/coffeebank/coffee-maubot/releases",
|
||||
"homepage": "https://github.com/coffeebank/coffee-maubot/tree/master/animemanga"
|
||||
},
|
||||
"postPatch": "cd animemanga"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-k+M/Wk4nyXUZBJxmxQr64dPp3rK7i1oQeLFtncle3dI=",
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "b25112508d65f7560910e67d3074dd60f4048821"
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -140,7 +109,7 @@
|
|||
"modules": [
|
||||
"animemanga"
|
||||
],
|
||||
"version": "0.1.1.216"
|
||||
"version": "0.2.0.66"
|
||||
}
|
||||
},
|
||||
"antithread": {
|
||||
|
@ -201,36 +170,36 @@
|
|||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"bard": {
|
||||
"awareness-bot": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/ser/maubot-bard/releases",
|
||||
"description": "Allow your maubot instance to return queries from Google(TM) Bard(TM) pseudoAI",
|
||||
"downloadPage": "https://github.com/ser/maubot-bard/releases",
|
||||
"homepage": "https://github.com/ser/maubot-bard/",
|
||||
"license": "MIT"
|
||||
"changelog": "https://github.com/besendorf/awareness-bot/releases",
|
||||
"description": "maubot plugin that helps moderate a matrix room by muting users that use foul language",
|
||||
"downloadPage": "https://github.com/besendorf/awareness-bot/releases",
|
||||
"homepage": "https://github.com/besendorf/awareness-bot",
|
||||
"license": "AGPL-3.0-only"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-E8pz71wfH+SmFNzBcPUrnqK0xs7wlyB6SaRXH/PDqKw=",
|
||||
"owner": "ser",
|
||||
"repo": "maubot-bard",
|
||||
"rev": "4ff3ce8d86ed19c973dee89228779fed74811341"
|
||||
"hash": "sha256-ZXmsDQSr07M46BLRmSnKw1KkBwCQt7Ki6dPx9oxunwE=",
|
||||
"owner": "besendorf",
|
||||
"repo": "awareness-bot",
|
||||
"rev": "a7d77491c371e189f8fac7f8c2ff31ac48c32e08"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"dependencies": [
|
||||
"bardapi"
|
||||
],
|
||||
"database": true,
|
||||
"database_type": "asyncpg",
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "sergevictor.eu.maubot.bard",
|
||||
"main_class": "BardPlugin",
|
||||
"id": "org.besendorf.awarenessbot",
|
||||
"main_class": "Awareness",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"bard"
|
||||
"awarenessbot"
|
||||
],
|
||||
"version": "0.99.100"
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"characterai": {
|
||||
|
@ -279,10 +248,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-XOhjSrgbVUwMO6/v/Znoc5l/k2n6Zi42Ydhv9/vyX7E=",
|
||||
"hash": "sha256-ZloRMHaYl1rt2vurLo7pugQRg9gIT4X2LCmxOqACb2c=",
|
||||
"owner": "williamkray",
|
||||
"repo": "maubot-chatgpt",
|
||||
"rev": "d313920165f8fca7a04314a73bb1dca30c67d9f5"
|
||||
"rev": "101ea08743ed7bd251c3c0de7386d322e650af26"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
|
@ -296,7 +265,7 @@
|
|||
"modules": [
|
||||
"gpt"
|
||||
],
|
||||
"version": "0.0.10"
|
||||
"version": "0.0.11"
|
||||
}
|
||||
},
|
||||
"choose": {
|
||||
|
@ -310,10 +279,10 @@
|
|||
"postPatch": "cd choose"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-k+M/Wk4nyXUZBJxmxQr64dPp3rK7i1oQeLFtncle3dI=",
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "b25112508d65f7560910e67d3074dd60f4048821"
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -358,35 +327,35 @@
|
|||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"create-room": {
|
||||
"communitybot": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/williamkray/maubot-createroom/releases",
|
||||
"description": "A plugin that creates new rooms and automatically sets them to be part of a private Matrix Space.",
|
||||
"downloadPage": "https://github.com/williamkray/maubot-createroom/releases",
|
||||
"homepage": "https://github.com/williamkray/maubot-createroom"
|
||||
"changelog": "https://github.com/williamkray/maubot-communitybot/releases",
|
||||
"description": "helps admins manage a matrix space, with user management, room creation\ntools, and much more! replaces activity-tracker, createroom, and welcome\nplugins.\n",
|
||||
"downloadPage": "https://github.com/williamkray/maubot-communitybot/releases",
|
||||
"homepage": "https://github.com/williamkray/maubot-communitybot"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-x1eoUX8u1IR/hLgS8YcpSoTByl+m3GoTW3fnFMDs1XA=",
|
||||
"hash": "sha256-wO63G2mdpz2FWjatVY5R+L7Chki087Ev7oMfpgyOnxM=",
|
||||
"owner": "williamkray",
|
||||
"repo": "maubot-createroom",
|
||||
"rev": "4eecdcffa6c06276287c2a3d4e65905a72ad18ad"
|
||||
"repo": "maubot-communitybot",
|
||||
"rev": "v0.1.7"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"database": false,
|
||||
"database": true,
|
||||
"database_type": "asyncpg",
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "org.jobmachine.createspaceroom",
|
||||
"id": "org.jobmachine.communitybot",
|
||||
"license": "MIT",
|
||||
"main_class": "CreateSpaceRoom",
|
||||
"main_class": "CommunityBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"createspaceroom"
|
||||
"community"
|
||||
],
|
||||
"version": "0.1.2"
|
||||
"version": "0.1.7"
|
||||
}
|
||||
},
|
||||
"dice": {
|
||||
|
@ -533,6 +502,36 @@
|
|||
"version": "3.0.0"
|
||||
}
|
||||
},
|
||||
"gemini": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/shanks219/maubot-gemini-bot/releases",
|
||||
"description": "A simple gemini-pro chatbot.",
|
||||
"downloadPage": "https://github.com/shanks219/maubot-gemini-bot/releases",
|
||||
"homepage": "https://github.com/shanks219/maubot-gemini-bot/"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-mPKPksfgK1eyCiqqxC3/mPKEwVXjVAMYz8PHf78l7wk=",
|
||||
"owner": "shanks219",
|
||||
"repo": "maubot-gemini-bot",
|
||||
"rev": "v0.1.0"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "com.shanks.matrix.bot.gemini",
|
||||
"license": "MIT",
|
||||
"main_class": "GeminiBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"geminibot"
|
||||
],
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"gifme": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
@ -543,10 +542,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-5MHLtm3qktUyvWyuwQEUQWL8fxszZ6h/hHClLLr0Uvs=",
|
||||
"hash": "sha256-VtZp4c3bbKCgbqQoJRnkle7Qn1zSGhgSPFAIlijQDOs=",
|
||||
"owner": "williamkray",
|
||||
"repo": "maubot-gifme",
|
||||
"rev": "6dbbb9ebce903887b62f95b04f4640779762e57a"
|
||||
"rev": "a896a07fba53c90455431e79904f79d949c91f92"
|
||||
},
|
||||
"manifest": {
|
||||
"database": true,
|
||||
|
@ -715,10 +714,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-twvVeMD2nRwpazc21inbdr6mUjMXJ4T6v5ieNrwB+O4=",
|
||||
"hash": "sha256-UWJGvLs/zrg3pNtZjc2PLNZfmiWl7QWGesyjojljXeQ=",
|
||||
"owner": "ser",
|
||||
"repo": "maubot-hateheif",
|
||||
"rev": "52cf166960ac3fb71d291e13d5f3621caa9d7af1"
|
||||
"rev": "64b36a2447c6bb3bedc25e8afd85abde60c3d755"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
|
@ -838,10 +837,10 @@
|
|||
"postPatch": "cd jadict"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-k+M/Wk4nyXUZBJxmxQr64dPp3rK7i1oQeLFtncle3dI=",
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "b25112508d65f7560910e67d3074dd60f4048821"
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -855,7 +854,7 @@
|
|||
"modules": [
|
||||
"jadict"
|
||||
],
|
||||
"version": "0.1.0.10"
|
||||
"version": "0.1.1.12"
|
||||
}
|
||||
},
|
||||
"join": {
|
||||
|
@ -868,10 +867,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-aqpL+KO5p0hre7RCUZrM270Ah+cR4cQxZn7LTXLT79k=",
|
||||
"hash": "sha256-6bggnk3196M0eCkfYTJWLhiIwIVTtluffQzc58yIYzw=",
|
||||
"owner": "williamkray",
|
||||
"repo": "maubot-join",
|
||||
"rev": "1b57758dfe3a2191588bb903ea546328146e69d8"
|
||||
"rev": "v0.3.1"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -885,7 +884,7 @@
|
|||
"modules": [
|
||||
"join"
|
||||
],
|
||||
"version": "0.3.0"
|
||||
"version": "0.3.1"
|
||||
}
|
||||
},
|
||||
"karma": {
|
||||
|
@ -919,6 +918,44 @@
|
|||
"version": "1.0.1"
|
||||
}
|
||||
},
|
||||
"kodict": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/coffeebank/coffee-maubot/releases",
|
||||
"description": "A Korean dictionary Matrix bot for searching and translating Korean vocabulary (Hangul/Hangeul, Hanja). Searches National Institute of Korean Language's Korean-English Learners' Dictionary (\ud55c\uad6d\uc5b4\uae30\ucd08\uc0ac\uc804).",
|
||||
"downloadPage": "https://github.com/coffeebank/coffee-maubot/releases",
|
||||
"homepage": "https://github.com/coffeebank/coffee-maubot/tree/master/kodict"
|
||||
},
|
||||
"postPatch": "cd kodict"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
"dependencies": [
|
||||
"cssselect",
|
||||
"kodict-core",
|
||||
"korean-romanizer",
|
||||
"krdict.py@git+https://github.com/coffeebank/krdict.py",
|
||||
"lxml"
|
||||
],
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "coffee.maubot.kodict",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"main_class": "KodictBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"kodict"
|
||||
],
|
||||
"version": "0.1.0.366"
|
||||
}
|
||||
},
|
||||
"ldap-ad-inviterbot": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
@ -954,6 +991,68 @@
|
|||
"version": "0.1.6"
|
||||
}
|
||||
},
|
||||
"ldap-inviter": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/davidmehren/maubot-ldap-inviter/releases",
|
||||
"description": "A maubot plugin to invite users to Matrix rooms according to LDAP groups",
|
||||
"downloadPage": "https://github.com/davidmehren/maubot-ldap-inviter/releases",
|
||||
"homepage": "https://github.com/davidmehren/maubot-ldap-inviter"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-eLbAFGQ/WGXvL8N4B1MW9Q4mY5axXl8PEdIEYtmiyb0=",
|
||||
"owner": "davidmehren",
|
||||
"repo": "maubot-ldap-inviter",
|
||||
"rev": "ece581ba397df0030f65eeccbe141b7fc3fcfb19"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "de.herrmehren.ldap-inviter",
|
||||
"license": "MIT",
|
||||
"main_class": "LDAPInviterBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"inviter"
|
||||
],
|
||||
"version": "0.0.1"
|
||||
}
|
||||
},
|
||||
"llm": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/brokensandals/maubot-llm/releases",
|
||||
"description": "Allows chatting with LLMs running on OpenAI-compatible servers (including local instances like LM Studio). Can use different backends, models, and system prompts per room.",
|
||||
"downloadPage": "https://github.com/brokensandals/maubot-llm/releases",
|
||||
"homepage": "https://github.com/brokensandals/maubot-llm"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-b/zFfgZPaODyyfk8ZgU+fihgqbsuxspGQj+oDmG3Nqc=",
|
||||
"owner": "brokensandals",
|
||||
"repo": "maubot-llm",
|
||||
"rev": "fc527836acf57cad90020d2dc0127a44ae7f73bd"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"database": true,
|
||||
"database_type": "asyncpg",
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "net.brokensandals.llm",
|
||||
"license": "MIT",
|
||||
"main_class": "LlmBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"maubot_llm"
|
||||
],
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"local-stt": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
@ -1020,6 +1119,40 @@
|
|||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"matrix-to-discourse": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/gitayam/matrix-to-discourse/releases",
|
||||
"description": "A plugin create Discourse forum post from messages in Matrix or Bridged rooms and perform advanced forum searches directly from Matrix or Bridged rooms. Perfect for community building and engagement.",
|
||||
"downloadPage": "https://github.com/gitayam/matrix-to-discourse/releases",
|
||||
"homepage": "https://github.com/gitayam/matrix-to-discourse"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-QIFgCQL9O/SVemXfxlXzPcPQ/qx68IU7ntArCk946iA=",
|
||||
"owner": "gitayam",
|
||||
"repo": "matrix-to-discourse",
|
||||
"rev": "v0.1.0.1"
|
||||
},
|
||||
"manifest": {
|
||||
"dependencies": [
|
||||
"aiohttp",
|
||||
"maubot",
|
||||
"mautrix",
|
||||
"openai",
|
||||
"pyyaml",
|
||||
"requests"
|
||||
],
|
||||
"id": "com.irregularchat.matrix_to_discourse",
|
||||
"license": "GPL-3.0",
|
||||
"main_class": "MatrixToDiscourseBot",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"bot"
|
||||
],
|
||||
"version": "0.1.0.0"
|
||||
}
|
||||
},
|
||||
"media": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
@ -1056,10 +1189,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-qtGGCaATIzJMRhLWzFN0kSa6P/tlckCkxatKEfXyi0E=",
|
||||
"hash": "sha256-dSsCmDAKfr1HyxiOUb+ogB86FRzuRYJIZ4/vk+PP8r8=",
|
||||
"owner": "edwardsdean",
|
||||
"repo": "maubot_metric_bot",
|
||||
"rev": "0.0.4"
|
||||
"rev": "0.0.5"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -1070,7 +1203,7 @@
|
|||
"modules": [
|
||||
"metric"
|
||||
],
|
||||
"version": "0.0.4"
|
||||
"version": "0.0.5"
|
||||
}
|
||||
},
|
||||
"ntfy": {
|
||||
|
@ -1116,24 +1249,24 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-+aDQF/hW66M25zsvIsjNt7K2l32rV1g3fPrb45XdHVU=",
|
||||
"hash": "sha256-vw2MT4pwmUUWolgzkq0nZ/YaAlKUANrN0NPXXFf7B1k=",
|
||||
"owner": "tcpipuk",
|
||||
"repo": "maubot-openai-translate",
|
||||
"rev": "v0.3.0"
|
||||
"rev": "v0.3.1"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "xyz.maubot.openaitranslate",
|
||||
"id": "uk.tcpip.openaitranslate",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"main_class": "OpenAITranslate",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"openaitranslate"
|
||||
],
|
||||
"version": "0.3.0"
|
||||
"version": "0.3.1"
|
||||
}
|
||||
},
|
||||
"ovgumensabot": {
|
||||
|
@ -1259,6 +1392,36 @@
|
|||
"version": "3.0.1"
|
||||
}
|
||||
},
|
||||
"pretix-inviter": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/fedora-infra/maubot-pretix-invite/blob/v0.3.2/CHANGELOG.md",
|
||||
"description": "A maubot plugin for inviting event participants from the pretix ticketing platform into a matrix room",
|
||||
"downloadPage": "https://github.com/fedora-infra/maubot-pretix-invite/releases",
|
||||
"homepage": "https://github.com/fedora-infra/maubot-pretix-invite"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-KgWGvZ7QHcH0/u6+kodW8MAXtco4MM5MpbKscW903nQ=",
|
||||
"owner": "fedora-infra",
|
||||
"repo": "maubot-pretix-invite",
|
||||
"rev": "v0.3.2"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "org.fedoraproject.maubot.events",
|
||||
"license": "MIT",
|
||||
"main_class": "EventManagement",
|
||||
"modules": [
|
||||
"event_helper"
|
||||
],
|
||||
"version": "0.3.2",
|
||||
"webapp": true
|
||||
}
|
||||
},
|
||||
"random-quote": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
@ -1331,10 +1494,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-GfroQ7iaBfN8WClORrkYccPHq8FsKupZtYKJvHGZg1o=",
|
||||
"hash": "sha256-IKuOJFBfSC4sKSKoD+MuvuLBrsAMhs/PC1qYb5nP5jk=",
|
||||
"owner": "ajkessel",
|
||||
"repo": "reacjibot",
|
||||
"rev": "v0.7.4"
|
||||
"rev": "v2.7.14"
|
||||
},
|
||||
"manifest": {
|
||||
"extra_files": [
|
||||
|
@ -1347,7 +1510,7 @@
|
|||
"modules": [
|
||||
"reacjibot"
|
||||
],
|
||||
"version": "0.7.4"
|
||||
"version": "2.7.14"
|
||||
}
|
||||
},
|
||||
"reactbot": {
|
||||
|
@ -1590,10 +1753,10 @@
|
|||
"postPatch": "cd send-custom-html"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-k+M/Wk4nyXUZBJxmxQr64dPp3rK7i1oQeLFtncle3dI=",
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "b25112508d65f7560910e67d3074dd60f4048821"
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -1607,7 +1770,7 @@
|
|||
"modules": [
|
||||
"sendcustomhtml"
|
||||
],
|
||||
"version": "0.1.0.6"
|
||||
"version": "0.2.0.256"
|
||||
}
|
||||
},
|
||||
"social-media-download": {
|
||||
|
@ -1620,10 +1783,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-RMyQzGz2Z4m9FN0Nt5E6Tj0yZarysygCtvEZDfG143M=",
|
||||
"hash": "sha256-naHY6f034uGnPIHidI7WXjcf2h/t0IYaPkO5QfKkXMs=",
|
||||
"owner": "ggogel",
|
||||
"repo": "SocialMediaDownloadMaubot",
|
||||
"rev": "1.2.0"
|
||||
"rev": "1.4.2"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
|
@ -1639,7 +1802,7 @@
|
|||
"instaloader",
|
||||
"socialmediadownload"
|
||||
],
|
||||
"version": "1.2.0"
|
||||
"version": "1.4.2"
|
||||
}
|
||||
},
|
||||
"songwhip": {
|
||||
|
@ -1799,17 +1962,17 @@
|
|||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/coffeebank/coffee-maubot/releases",
|
||||
"description": "Get the time in specific cities. Check timezones. !timein New York (Python 3.9+) (Python <3.9 requires pytz, fuzzywuzzy)",
|
||||
"description": "Get the time in specific cities. Check timezones. !timein America/New_York (Python 3.9+)",
|
||||
"downloadPage": "https://github.com/coffeebank/coffee-maubot/releases",
|
||||
"homepage": "https://github.com/coffeebank/coffee-maubot/tree/master/timein"
|
||||
},
|
||||
"postPatch": "cd timein"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-k+M/Wk4nyXUZBJxmxQr64dPp3rK7i1oQeLFtncle3dI=",
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "b25112508d65f7560910e67d3074dd60f4048821"
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -1892,10 +2055,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-8ZAH9Kn0EQYY9gLx48gF+aEsFOdlZlrbUIvLMP0uwi4=",
|
||||
"hash": "sha256-Gm90IsokLEhbWGksHgjSQNBY/WOpccqfKJTmwD2cvBE=",
|
||||
"owner": "yoxcu",
|
||||
"repo": "maubot-token",
|
||||
"rev": "v1.1.0"
|
||||
"rev": "v1.1.1"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
|
@ -1911,7 +2074,7 @@
|
|||
"modules": [
|
||||
"tokenbot"
|
||||
],
|
||||
"version": "1.1.0"
|
||||
"version": "1.1.1"
|
||||
}
|
||||
},
|
||||
"translate": {
|
||||
|
@ -1953,16 +2116,17 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-WlrFt+uj6E7Ecg+3KW6fjrMXSUP5YFA5ZyitvBON3pA=",
|
||||
"hash": "sha256-CMEwzkvHnBpFUg7HssAF7ga221XCQlU/dScMy7JhmuQ=",
|
||||
"owner": "jeffcasavant",
|
||||
"repo": "MaubotTrumpTweet",
|
||||
"rev": "v1.1.2"
|
||||
"rev": "v1.1.3"
|
||||
},
|
||||
"isPoetry": true,
|
||||
"manifest": {
|
||||
"database": false,
|
||||
"dependencies": [
|
||||
"Pillow>=9.0.1, <10.0.0"
|
||||
"Pillow>=9.3.0, <10.0.0",
|
||||
"asyncpg>=0.26.0"
|
||||
],
|
||||
"extra_files": [
|
||||
"res/font/Roboto-Black.ttf",
|
||||
|
@ -2021,7 +2185,7 @@
|
|||
"modules": [
|
||||
"trumptweet"
|
||||
],
|
||||
"version": "1.1.2"
|
||||
"version": "1.1.3"
|
||||
}
|
||||
},
|
||||
"twilio": {
|
||||
|
@ -2128,10 +2292,10 @@
|
|||
"postPatch": "cd urlpreview"
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-k+M/Wk4nyXUZBJxmxQr64dPp3rK7i1oQeLFtncle3dI=",
|
||||
"hash": "sha256-dKSXBwkIVFnoTcjXQXPf8xdzP44VZR8Bq3KQhsBpABA=",
|
||||
"owner": "coffeebank",
|
||||
"repo": "coffee-maubot",
|
||||
"rev": "b25112508d65f7560910e67d3074dd60f4048821"
|
||||
"rev": "f2329cf643a80fc7200fd225ba697fea639f2e99"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
|
@ -2187,10 +2351,10 @@
|
|||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-GGbd7PvW2P0u1h7Cp1GMuEg3uQ0osZBWWHzSW524aBc=",
|
||||
"hash": "sha256-1UCQxUldc9nE9wh4OUsHcQay5TuPLkY8ppcTAb/10EQ=",
|
||||
"owner": "jkhsjdhjs",
|
||||
"repo": "maubot-webhook",
|
||||
"rev": "v0.2.0"
|
||||
"rev": "v0.4.0"
|
||||
},
|
||||
"manifest": {
|
||||
"config": true,
|
||||
|
@ -2207,40 +2371,10 @@
|
|||
"modules": [
|
||||
"plugin"
|
||||
],
|
||||
"version": "0.2.0",
|
||||
"version": "0.4.0",
|
||||
"webapp": true
|
||||
}
|
||||
},
|
||||
"welcome": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
"changelog": "https://github.com/williamkray/maubot-welcome/releases",
|
||||
"description": "A plugin that greets new people with a configurable message when they join a room.",
|
||||
"downloadPage": "https://github.com/williamkray/maubot-welcome/releases",
|
||||
"homepage": "https://github.com/williamkray/maubot-welcome"
|
||||
}
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-8BIDj/kHys/Pw1n1lLtxjYOstI/UG5UAlxD+3rpKj0Q=",
|
||||
"owner": "williamkray",
|
||||
"repo": "maubot-welcome",
|
||||
"rev": "a6d3e6cbea87056a1d4694f5379c9ae9d9cdf1c5"
|
||||
},
|
||||
"manifest": {
|
||||
"database": false,
|
||||
"extra_files": [
|
||||
"base-config.yaml"
|
||||
],
|
||||
"id": "org.jobmachine.welcome",
|
||||
"license": "MIT",
|
||||
"main_class": "Greeter",
|
||||
"maubot": "0.1.0",
|
||||
"modules": [
|
||||
"welcome"
|
||||
],
|
||||
"version": "0.0.4"
|
||||
}
|
||||
},
|
||||
"wolframalpha": {
|
||||
"attrs": {
|
||||
"meta": {
|
||||
|
|
|
@ -19,7 +19,7 @@ let
|
|||
resolveDeps = deps: map
|
||||
(name:
|
||||
let
|
||||
packageName = builtins.head (builtins.match "([^~=<>]*).*" name);
|
||||
packageName = builtins.head (builtins.match "([^~=<>@]*).*" name);
|
||||
lower = lib.toLower packageName;
|
||||
dash = builtins.replaceStrings ["_"] ["-"] packageName;
|
||||
lowerDash = builtins.replaceStrings ["_"] ["-"] lower;
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
{ fetchFromGitHub
|
||||
, lib
|
||||
, makeWrapper
|
||||
, nodejs
|
||||
, node-gyp
|
||||
, pnpm_9
|
||||
, python3
|
||||
, stdenv
|
||||
, xcbuild
|
||||
{
|
||||
fetchFromGitHub,
|
||||
lib,
|
||||
makeWrapper,
|
||||
nodejs,
|
||||
node-gyp,
|
||||
pnpm_9,
|
||||
python3,
|
||||
stdenv,
|
||||
xcbuild,
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "cdxgen";
|
||||
version = "10.8.1";
|
||||
version = "10.9.6";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "CycloneDX";
|
||||
repo = "cdxgen";
|
||||
rev = "v${finalAttrs.version}";
|
||||
hash = "sha256-PFvSHuIaHaGfKI5s7DOW1adSKpnURaQtk5lAO9lr1OM=";
|
||||
hash = "sha256-WgY0soHwedYbQNDvDIqtaxMSzVcaOVV2/22wOXU2nbA=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
@ -30,7 +31,7 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
|
||||
pnpmDeps = pnpm_9.fetchDeps {
|
||||
inherit (finalAttrs) pname version src;
|
||||
hash = "sha256-IO7hn5xHdlQ+uyH8RWc7ZnnthXydCnMSde22YYMWOoc=";
|
||||
hash = "sha256-IgmTYmCmZ65Da5zL6Tx7P4bt2o+YhX0UvU0DEONmr7w=";
|
||||
};
|
||||
|
||||
buildPhase = ''
|
||||
|
@ -56,12 +57,14 @@ stdenv.mkDerivation (finalAttrs: {
|
|||
runHook postInstall
|
||||
'';
|
||||
|
||||
|
||||
meta = with lib; {
|
||||
description = "Creates CycloneDX Software Bill-of-Materials (SBOM) for your projects from source and container images";
|
||||
mainProgram = "cdxgen";
|
||||
homepage = "https://github.com/CycloneDX/cdxgen";
|
||||
license = licenses.asl20;
|
||||
maintainers = with maintainers; [ dit7ya ];
|
||||
maintainers = with maintainers; [
|
||||
dit7ya
|
||||
quincepie
|
||||
];
|
||||
};
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue