push sheeet
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s

This commit is contained in:
Dark Steveneq
2025-10-09 14:15:47 +02:00
commit 646b892680
49168 changed files with 5897842 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
{
lib,
fetchFromGitHub,
rustPlatform,
makeWrapper,
watchman,
}:
rustPlatform.buildRustPackage rec {
pname = "rs-git-fsmonitor";
version = "0.2.0";
src = fetchFromGitHub {
owner = "jgavris";
repo = "rs-git-fsmonitor";
tag = "v${version}";
hash = "sha256-+5nR+/09HmFk3mq2B8NTeBT50aBG85yXEdeO6BhStVw=";
};
cargoHash = "sha256-WkqJSbtaJxaagJMsdFiVozi1SkrfxXyM9bdZeimwJag=";
nativeBuildInputs = [ makeWrapper ];
postFixup = ''
wrapProgram $out/bin/rs-git-fsmonitor --prefix PATH ":" "${lib.makeBinPath [ watchman ]}"
'';
meta = {
description = "Fast git core.fsmonitor hook written in Rust";
homepage = "https://github.com/jgavris/rs-git-fsmonitor";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ nilscc ];
mainProgram = "rs-git-fsmonitor";
};
}

View File

@@ -0,0 +1,36 @@
{
lib,
rustPlatform,
fetchFromGitHub,
nix-update-script,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "rs-tftpd";
version = "0.5.0";
src = fetchFromGitHub {
owner = "altugbakan";
repo = "rs-tftpd";
tag = finalAttrs.version;
hash = "sha256-YxXUwbzkuxnRrri49DhjvO/LJRWWtFutLbg151GnT5M=";
};
cargoHash = "sha256-FKwQr4u7lVN12XPyDus7QoIpthYbT84SFkMJvLTqXRU=";
buildFeatures = [ "client" ];
passthru.updateScript = nix-update-script { };
meta = with lib; {
description = "TFTP Server Daemon implemented in Rust";
homepage = "https://github.com/altugbakan/rs-tftpd";
changelog = "https://github.com/altugbakan/rs-tftpd/releases/tag/${finalAttrs.version}";
license = licenses.mit;
maintainers = with maintainers; [
adamcstephens
matthewcroughan
];
mainProgram = "tftpd";
};
})

View File

@@ -0,0 +1,26 @@
Original from OpenBSD src/lib/libc/stdlib/reallocarray.c
--- a/rs.c 2024-04-15 10:13:41
+++ b/rs.c 2024-04-15 10:15:20
@@ -103,6 +103,21 @@
ep = getptrs(ep); \
} while(0)
+#ifdef __APPLE__
+#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
+
+void *
+reallocarray(void *optr, size_t nmemb, size_t size)
+{
+ if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
+ nmemb > 0 && SIZE_MAX / nmemb < size) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ return realloc(optr, size * nmemb);
+}
+#endif
+
int
main(int argc, char *argv[])
{

View File

@@ -0,0 +1,73 @@
{
lib,
stdenv,
fetchurl,
installShellFiles,
libbsd,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "rs";
version = "20200313";
src = fetchurl {
url = "https://www.mirbsd.org/MirOS/dist/mir/rs/rs-${finalAttrs.version}.tar.gz";
hash = "sha256-kZIV3J/oWiejC/Y9VkBs+1A/n8mCAyPEvTv+daajvD8=";
};
nativeBuildInputs = [ installShellFiles ];
patches = [
# add an implementation of reallocarray() from openbsd (not available on darwin)
./macos-reallocarray.patch
];
buildInputs = [ libbsd ];
buildPhase = ''
runHook preBuild
${stdenv.cc}/bin/cc -DNEED_STRTONUM utf8.c rs.c -o rs -lbsd
runHook postBuild
'';
installPhase = ''
runHook preInstall
install -Dm 755 rs -t $out/bin
installManPage rs.1
runHook postInstall
'';
meta = {
homepage = "http://www.mirbsd.org/htman/i386/man1/rs.htm";
description = "Reshape a data array from standard input";
mainProgram = "rs";
longDescription = ''
rs reads the standard input, interpreting each line as a row of blank-
separated entries in an array, transforms the array according to the op-
tions, and writes it on the standard output. With no arguments (argc < 2)
it transforms stream input into a columnar format convenient for terminal
viewing, i.e. if the length (in bytes!) of the first line is smaller than
the display width, -et is implied, -t otherwise.
The shape of the input array is deduced from the number of lines and the
number of columns on the first line. If that shape is inconvenient, a more
useful one might be obtained by skipping some of the input with the -k
option. Other options control interpretation of the input columns.
The shape of the output array is influenced by the rows and cols specifi-
cations, which should be positive integers. If only one of them is a po-
sitive integer, rs computes a value for the other which will accommodate
all of the data. When necessary, missing data are supplied in a manner
specified by the options and surplus data are deleted. There are options
to control presentation of the output columns, including transposition of
the rows and columns.
'';
license = lib.licenses.bsd3;
maintainers = [ ];
platforms = lib.platforms.unix;
};
})

View File

@@ -0,0 +1,30 @@
{
lib,
rustPlatform,
fetchCrate,
}:
rustPlatform.buildRustPackage rec {
pname = "rsass";
version = "0.29.0";
src = fetchCrate {
pname = "rsass-cli";
inherit version;
hash = "sha256-3Xi+8TKmlZJYsZogzezce0KvasqTRfh04SmeC1UbJQ0=";
};
cargoHash = "sha256-TZZweDTF5sGdrCBXh42yaBMTI9ehjHGSFQu9HzVQEdA=";
meta = {
description = "Sass reimplemented in rust with nom";
mainProgram = "rsass";
homepage = "https://github.com/kaj/rsass";
changelog = "https://github.com/kaj/rsass/blob/v${version}/CHANGELOG.md";
license = with lib.licenses; [
mit # or
asl20
];
maintainers = with lib.maintainers; [ figsoda ];
};
}

View File

@@ -0,0 +1,57 @@
{
lib,
stdenv,
coreutils,
gawk,
fetchFromGitHub,
}:
stdenv.mkDerivation rec {
pname = "rsbep";
version = "0.2.0";
src = fetchFromGitHub {
owner = "ttsiodras";
repo = "rsbep-backup";
rev = "v${version}";
sha256 = "0is4jgil3wdqbvx9h66xcyzbqy84ndyydnnay2g9k81a4mcz4dns";
};
postFixup = ''
cd $out/bin
# Move internal tool 'rsbep_chopper' to libexec
libexecDir=$out/libexec/rsbep
mkdir -p $libexecDir
mv rsbep_chopper $libexecDir
# Fix store dependencies in scripts
path="export PATH=$out/bin:$libexecDir:${
lib.makeBinPath [
coreutils
gawk
]
}"
sed -i "2i$path" freeze.sh
sed -i "2i$path" melt.sh
# Remove unneded binary
rm poorZFS.py
'';
doInstallCheck = true;
installCheckPhase = ''
cd $TMP
echo hello > input
$out/bin/freeze.sh input > packed
$out/bin/melt.sh packed > output
diff -u input output
'';
meta = with lib; {
description = "Create resilient backups with Reed-Solomon error correction and byte-spreading";
homepage = "https://www.thanassis.space/rsbep.html";
license = licenses.gpl3Plus;
maintainers = [ maintainers.erikarvstedt ];
};
}

View File

@@ -0,0 +1,43 @@
{
lib,
fetchFromGitHub,
rustPlatform,
enableAppletSymlinks ? true,
}:
let
version = "1.4";
in
rustPlatform.buildRustPackage {
pname = "rsbkb";
inherit version;
src = fetchFromGitHub {
owner = "trou";
repo = "rsbkb";
rev = "release-${version}";
hash = "sha256-c5+Q/y2tZfhXQIAs1W67/xfB+qz1Xn33tKXRGDAi3qs=";
};
cargoPatches = [
./time.patch
];
cargoHash = "sha256-fg8LQXqmw5GXiQe7ZVciORWI/yhKAhywolpapNpHXZY=";
# Setup symlinks for all the utilities,
# busybox style
postInstall = lib.optionalString enableAppletSymlinks ''
cd $out/bin || exit 1
path="$(realpath --canonicalize-missing ./rsbkb)"
for i in $(./rsbkb list) ; do ln -s $path $i ; done
'';
meta = {
description = "Command line tools to encode/decode things";
homepage = "https://github.com/trou/rsbkb";
changelog = "https://github.com/trou/rsbkb/releases/tag/release-${version}";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ ProducerMatt ];
};
}

View File

@@ -0,0 +1,28 @@
diff --git a/Cargo.lock b/Cargo.lock
index a23d825..183db77 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -564,9 +564,9 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
[[package]]
name = "time"
-version = "0.3.34"
+version = "0.3.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"
+checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [
"deranged",
"itoa",
@@ -587,9 +587,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]]
name = "time-macros"
-version = "0.2.17"
+version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"
+checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
dependencies = [
"num-conv",
"time-core",

View File

@@ -0,0 +1,27 @@
{
lib,
rustPlatform,
fetchFromGitHub,
}:
rustPlatform.buildRustPackage rec {
pname = "rsClock";
version = "0.1.12";
src = fetchFromGitHub {
owner = "valebes";
repo = "rsClock";
rev = "v${version}";
sha256 = "sha256-l5750zP90KnB+OIg1WOikQ6OgQZK4iwVvGBN3jegjGc=";
};
cargoHash = "sha256-Bnec98FEG2aWUa2IoBOLy0K6mqggcSwOBL3S5+0mSkU=";
meta = with lib; {
description = "Simple terminal clock written in Rust";
homepage = "https://github.com/valebes/rsClock";
license = licenses.mit;
maintainers = with maintainers; [ valebes ];
mainProgram = "rsclock";
};
}

View File

@@ -0,0 +1,41 @@
{
lib,
stdenv,
fetchurl,
fftw,
gtk2,
pkg-config,
}:
stdenv.mkDerivation rec {
pname = "rscw";
version = "0.1e";
src = fetchurl {
url = "https://www.pa3fwm.nl/software/${pname}/${pname}-${version}.tgz";
sha256 = "1hxwxmqc5jinr14ya1idigqigc8qhy1vimzcwy2vmwdjay2sqik2";
};
sourceRoot = ".";
nativeBuildInputs = [ pkg-config ];
buildInputs = [
gtk2
fftw
];
installPhase = ''
install -D -m 0755 noisycw $out/bin/noisycw
install -D -m 0755 rs12tlmdec $out/bin/rs12tlmdec
install -D -m 0755 rscw $out/bin/rscw
install -D -m 0755 rscwx $out/bin/rscwx
'';
meta = with lib; {
description = "Receive CW through the soundcard";
homepage = "https://www.pa3fwm.nl/software/rscw/";
license = licenses.gpl2;
maintainers = with maintainers; [ earldouglas ];
platforms = platforms.linux;
};
}

View File

@@ -0,0 +1,57 @@
{
lib,
stdenv,
fetchFromGitHub,
coreutils,
openssh,
gnutar,
}:
stdenv.mkDerivation rec {
pname = "rset";
version = "3.2";
src = fetchFromGitHub {
owner = "eradman";
repo = "rset";
tag = version;
hash = "sha256-b797R79aMopiPApTJ4Q3SP2MRjqCcNNO9BIxtuiNZks=";
};
patches = [ ./paths.patch ];
postPatch = ''
substituteInPlace rset.c \
--replace-fail @ssh@ ${openssh}/bin/ssh \
--replace-fail @miniquark@ $out/bin/miniquark \
--replace-fail @rinstall@ $out/bin/rinstall \
--replace-fail @rsub@ $out/bin/rsub
substituteInPlace execute.c \
--replace-fail @ssh@ ${openssh}/bin/ssh \
--replace-fail @ssh-add@ ${openssh}/bin/ssh-add \
--replace-fail @tar@ ${gnutar}/bin/tar
substituteInPlace rutils.c \
--replace-fail @install@ ${coreutils}/bin/install
'';
# these are to be run on the remote host,
# so we want to preserve the original shebang.
postFixup = ''
sed -i "1s@.*@#!/bin/sh@" $out/bin/rinstall
sed -i "1s@.*@#!/bin/sh@" $out/bin/rsub
'';
dontAddPrefix = true;
installFlags = [ "PREFIX=$(out)" ];
meta = {
homepage = "https://scriptedconfiguration.org/";
description = "Configure systems using any scripting language";
changelog = "https://github.com/eradman/rset/raw/${version}/NEWS";
license = lib.licenses.isc;
platforms = lib.platforms.unix;
maintainers = [ ];
};
}

View File

@@ -0,0 +1,137 @@
diff --git a/execute.c b/execute.c
index be06068..3468fa7 100644
--- a/execute.c
+++ b/execute.c
@@ -260,7 +260,7 @@
char *output;
char *argv[32];
- append(argv, 0, "ssh-add", "-l", NULL);
+ append(argv, 0, "@ssh-add@", "-l", NULL);
output = cmd_pipe_stdout(argv, &error_code, &output_size);
free(output);
@@ -300,7 +300,7 @@
}
argc = 0;
- argc = append(argv, argc, "ssh", "-fN", "-R", port_forwarding, "-S", socket_path, "-M", NULL);
+ argc = append(argv, argc, "@ssh@", "-fN", "-R", port_forwarding, "-S", socket_path, "-M", NULL);
if (ssh_config)
(void) append(argv, argc, "-F", ssh_config, host_name, NULL);
else
@@ -309,8 +309,8 @@
return ret;
snprintf(cmd, PATH_MAX,
- "tar " TAR_OPTIONS " -cf - -C " REPLICATED_DIRECTORY " . "
- "| ssh -q -S %s %s 'mkdir %s; tar -xf - -C %s'",
+ "@tar@ " TAR_OPTIONS " -cf - -C " REPLICATED_DIRECTORY " . "
+ "| @ssh@ -q -S %s %s 'mkdir %s; tar -xf - -C %s'",
socket_path, host_name, stagedir(http_port), stagedir(http_port));
if ((ret = system(cmd)) != 0)
return ret;
@@ -320,8 +320,8 @@
array_to_str(route_label->export_paths, path_repr, sizeof(path_repr), " ");
snprintf(cmd, PATH_MAX,
- "tar " TAR_OPTIONS " -cf - %s "
- "| ssh -q -S %s %s 'tar -xf - -C %s'",
+ "@tar@ " TAR_OPTIONS " -cf - %s "
+ "| @ssh@ -q -S %s %s 'tar -xf - -C %s'",
path_repr, socket_path, host_name, stagedir(http_port));
if ((ret = system(cmd)) != 0)
@@ -407,7 +407,7 @@
/* construct ssh command */
argc = 0;
- argc = append(argv, argc, "ssh", "-T", "-S", socket_path, NULL);
+ argc = append(argv, argc, "@ssh@", "-T", "-S", socket_path, NULL);
(void) append(argv, argc, host_name, cmd, NULL);
ret = cmd_pipe_stdin(argv, host_label->content, host_label->content_size);
@@ -432,7 +432,7 @@
snprintf(cmd, sizeof(cmd), "cat > %s/_script", stagedir(http_port));
/* construct ssh command */
argc = 0;
- argc = append(argv, argc, "ssh", "-T", "-S", socket_path, NULL);
+ argc = append(argv, argc, "@ssh@", "-T", "-S", socket_path, NULL);
(void) append(argv, argc, host_name, cmd, NULL);
cmd_pipe_stdin(argv, host_label->content, host_label->content_size);
@@ -450,7 +450,7 @@
/* construct ssh command */
argc = 0;
- argc = append(argv, argc, "ssh", "-t", "-S", socket_path, NULL);
+ argc = append(argv, argc, "@ssh@", "-t", "-S", socket_path, NULL);
(void) append(argv, argc, host_name, cmd, NULL);
ret = run(argv);
@@ -498,11 +498,11 @@
if (access(socket_path, F_OK) == -1)
return;
- append(argv, 0, "ssh", "-S", socket_path, host_name, "rm", "-rf", stagedir(http_port), NULL);
+ append(argv, 0, "@ssh@", "-S", socket_path, host_name, "rm", "-rf", stagedir(http_port), NULL);
if (run(argv) != 0)
warn("remote tmp dir");
- append(argv, 0, "ssh", "-q", "-S", socket_path, "-O", "exit", host_name, NULL);
+ append(argv, 0, "@ssh@", "-q", "-S", socket_path, "-O", "exit", host_name, NULL);
if (run(argv) != 0)
warn("exec ssh -O exit");
}
diff --git a/rset.c b/rset.c
index 383fc82..9c20f65 100644
--- a/rset.c
+++ b/rset.c
@@ -104,10 +104,8 @@
if ((renv_bin = findprog("renv")) == 0)
not_found("renv");
- if ((rinstall_bin = findprog("rinstall")) == 0)
- not_found("rinstall");
- if ((rsub_bin = findprog("rsub")) == 0)
- not_found("rsub");
+ rinstall_bin = "@rinstall@";
+ rsub_bin = "@rsub@";
/* all operations must be relative to the routes file */
if (realpath(xdirname(routes_file), routes_realpath) == NULL)
@@ -404,7 +402,7 @@
if (socket_path && hostname && http_port) {
printf("caught signal %d, terminating connection to '%s'\n", sig, hostname);
/* clean up socket and SSH connection; leaving staging dir */
- execlp("ssh", "ssh", "-S", socket_path, "-O", "exit", hostname, NULL);
+ execlp("@ssh@", "@ssh@", "-S", socket_path, "-O", "exit", hostname, NULL);
err(1, "ssh -O exit");
}
}
@@ -533,10 +531,9 @@
/* Convert http server command line into a vector */
inputstring = malloc(PATH_MAX);
- snprintf(inputstring, PATH_MAX, "miniquark -p %d -d " PUBLIC_DIRECTORY, http_port);
+ snprintf(inputstring, PATH_MAX, "@miniquark@ -p %d -d " PUBLIC_DIRECTORY, http_port);
str_to_array(http_srv_argv, inputstring, sizeof(http_srv_argv), " ");
- if ((httpd_bin = findprog(http_srv_argv[0])) == 0)
- not_found(http_srv_argv[0]);
+ httpd_bin = "@miniquark@";
/* start the web server */
pipe(stdout_pipe);
diff --git a/rutils.c b/rutils.c
index 1e182d8..9aef76d 100644
--- a/rutils.c
+++ b/rutils.c
@@ -123,7 +123,7 @@
pid = fork();
if (pid == 0) {
- if (execl("/usr/bin/install", "/usr/bin/install", src, dst, NULL) != -1)
+ if (execl("@install@", "@install@", src, dst, NULL) != -1)
err(1, "%s", dst);
}
waitpid(pid, &status, 0);

View File

@@ -0,0 +1,48 @@
{
lib,
stdenv,
fetchFromGitHub,
pkg-config,
cmake,
libebur128,
taglib,
ffmpeg,
inih,
fmt,
zlib,
}:
stdenv.mkDerivation rec {
pname = "rsgain";
version = "3.6";
src = fetchFromGitHub {
owner = "complexlogic";
repo = "rsgain";
rev = "v${version}";
hash = "sha256-dqvaPLVpNnbN2W0TOphS7QU6MDh5pxFJoUDGvkat164=";
};
nativeBuildInputs = [
pkg-config
cmake
];
buildInputs = [
libebur128
taglib
ffmpeg
inih
fmt
zlib
];
meta = {
description = "Simple, but powerful ReplayGain 2.0 tagging utility";
mainProgram = "rsgain";
homepage = "https://github.com/complexlogic/rsgain";
changelog = "https://github.com/complexlogic/rsgain/blob/v${version}/CHANGELOG";
license = lib.licenses.bsd2;
platforms = lib.platforms.all;
maintainers = [ lib.maintainers.felipeqq2 ];
};
}

View File

@@ -0,0 +1,28 @@
{
lib,
fetchFromGitHub,
rustPlatform,
}:
rustPlatform.buildRustPackage rec {
pname = "rshijack";
version = "0.5.2";
src = fetchFromGitHub {
owner = "kpcyrd";
repo = "rshijack";
rev = "v${version}";
sha256 = "sha256-vTbjb0tm6jCP9+QWG5R83v31W6RUgSEv96iR37QdnFo=";
};
cargoHash = "sha256-wRy+bSi6XxbbvxqE5PFWs4xW1zfkvTHyyGgRZCOU7cY=";
meta = with lib; {
description = "TCP connection hijacker";
homepage = "https://github.com/kpcyrd/rshijack";
license = licenses.gpl3;
maintainers = with maintainers; [ xrelkd ];
platforms = platforms.unix;
mainProgram = "rshijack";
};
}

View File

@@ -0,0 +1,98 @@
{
autoconf,
automake,
bashNonInteractive,
coreutils,
fetchFromGitHub,
fuse,
gawk,
gnugrep,
gnused,
lib,
libusb1,
makeBinaryWrapper,
pciutils,
pkg-config,
procps,
pv,
stdenv,
which,
util-linux,
withBfbInstall ? true,
}:
stdenv.mkDerivation rec {
pname = "rshim-user-space";
version = "2.4.4";
src = fetchFromGitHub {
owner = "Mellanox";
repo = "rshim-user-space";
rev = "rshim-${version}";
hash = "sha256-w2+1tUDWYmgDC0ycWGdtVfdbkZCmtvwXm47qK5PCCfg=";
};
nativeBuildInputs = [
autoconf
automake
pkg-config
]
++ lib.optionals withBfbInstall [ makeBinaryWrapper ];
buildInputs = [
pciutils
libusb1
fuse
];
prePatch = ''
patchShebangs scripts/bfb-install
'';
strictDeps = true;
preConfigure = "./bootstrap.sh";
installPhase = ''
mkdir -p "$out"/bin
cp -a src/rshim "$out"/bin/
''
+ lib.optionalString withBfbInstall ''
cp -a scripts/bfb-install "$out"/bin/
'';
postFixup = lib.optionalString withBfbInstall ''
wrapProgram $out/bin/bfb-install \
--set PATH ${
lib.makeBinPath [
bashNonInteractive
coreutils
gawk
gnugrep
gnused
pciutils
procps
pv
util-linux
which
]
}
'';
meta = with lib; {
description = "User-space rshim driver for the BlueField SoC";
longDescription = ''
The rshim driver provides a way to access the rshim resources on the
BlueField target from external host machine. The current version
implements device files for boot image push and virtual console access.
It also creates virtual network interface to connect to the BlueField
target and provides a way to access the internal rshim registers.
'';
homepage = "https://github.com/Mellanox/rshim-user-space";
license = licenses.gpl2Only;
platforms = platforms.linux;
maintainers = with maintainers; [
thillux
];
};
}

View File

@@ -0,0 +1,25 @@
{
lib,
rustPlatform,
fetchCrate,
}:
rustPlatform.buildRustPackage rec {
pname = "rsign2";
version = "0.6.4";
src = fetchCrate {
inherit pname version;
hash = "sha256-SmrTMMHnB5r0K6zL9B2qJwyywFxUTidQDejnFsOTT4E=";
};
cargoHash = "sha256-eWPZROftFA0pTgFDl4AuUP5yO863ar+HAcjCRk5c+cA=";
meta = with lib; {
description = "Command-line tool to sign files and verify signatures";
homepage = "https://github.com/jedisct1/rsign2";
license = licenses.mit;
maintainers = with maintainers; [ figsoda ];
mainProgram = "rsign";
};
}

View File

@@ -0,0 +1,33 @@
{
lib,
rustPlatform,
fetchFromGitHub,
}:
rustPlatform.buildRustPackage rec {
pname = "rslint";
version = "0.3.2";
src = fetchFromGitHub {
owner = "rslint";
repo = "rslint";
rev = "v${version}";
sha256 = "sha256-3DEwi+bhqwP8aMpZYl07GZbe7IecraB3m54lZ5LViVc=";
};
cargoHash = "sha256-4DzQSnrUUNaeyNLKvnx4HKM4dAS10y5mu5S2NpzfFRQ=";
cargoBuildFlags = [
"-p"
"rslint_cli"
"-p"
"rslint_lsp"
];
meta = with lib; {
description = "Fast, customizable, and easy to use JavaScript and TypeScript linter";
homepage = "https://rslint.org";
license = licenses.mit;
maintainers = with maintainers; [ figsoda ];
};
}

View File

@@ -0,0 +1,46 @@
{
lib,
stdenvNoCC,
fetchFromGitHub,
testers,
ruby,
}:
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "rsmangler";
version = "1.5-unstable-2019-07-24";
src = fetchFromGitHub {
owner = "digininja";
repo = "RSMangler";
rev = "e85da7d4a6e6241a92389aecf376077adc7544c3";
hash = "sha256-DN20XzrlkunLyk4nkgytUJEtCOlFjWUUUAQ416l3Aug=";
};
buildInputs = [ ruby ];
postPatch = ''
substituteInPlace rsmangler.rb \
--replace-quiet ./rsmangler.rb rsmangler \
--replace-quiet rsmangler.rb rsmangler
'';
postInstall = ''
install -Dm555 rsmangler.rb $out/bin/rsmangler
'';
passthru.tests.version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "rsmangler --help";
version = "rsmangler v ${lib.versions.majorMinor finalAttrs.version}";
};
meta = with lib; {
description = "Perform various manipulations on the wordlists";
homepage = "https://github.com/digininja/RSMangler";
license = licenses.cc-by-sa-20;
mainProgram = "rsmangler";
maintainers = with maintainers; [ d3vil0p3r ];
platforms = ruby.meta.platforms;
};
})

View File

@@ -0,0 +1,55 @@
{
fetchurl,
lib,
stdenv,
perl,
openssh,
rsync,
logger,
versionCheckHook,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "rsnapshot";
version = "1.5.1";
src = fetchurl {
url = "https://github.com/rsnapshot/rsnapshot/releases/download/${finalAttrs.version}/rsnapshot-${finalAttrs.version}.tar.gz";
hash = "sha256-j2r4BG7msCk7JjidCMtpUMf33f/8H3Tu/LCHvUnUT2I=";
};
propagatedBuildInputs = [
perl
openssh
rsync
logger
];
configureFlags = [ "--sysconfdir=/etc --prefix=/" ];
makeFlags = [ "DESTDIR=$(out)" ];
patchPhase = ''
substituteInPlace "Makefile.in" --replace \
"/usr/bin/pod2man" "${perl}/bin/pod2man"
'';
nativeInstallCheckInputs = [
versionCheckHook
];
versionCheckProgramArg = "--version";
doInstallCheck = true;
passthru = {
updateScript = nix-update-script { };
};
meta = {
description = "Filesystem snapshot utility for making backups of local and remote systems";
homepage = "https://rsnapshot.org/";
license = lib.licenses.gpl2Plus;
maintainers = with lib.maintainers; [ liberodark ];
platforms = lib.platforms.linux;
mainProgram = "rsnapshot";
};
})

View File

@@ -0,0 +1,36 @@
{
lib,
rustPlatform,
fetchFromGitHub,
unstableGitUpdater,
}:
rustPlatform.buildRustPackage rec {
pname = "rsonpath";
version = "0.9.1-unstable-2024-11-15";
src = fetchFromGitHub {
owner = "rsonquery";
repo = "rsonpath";
rev = "979e6374a68747dfba7b87b61bbe77951f749659";
hash = "sha256-YQCbkdv7PRf5hVXAGUg6DrtaCLIyS9nUGXsl8XHpKZU=";
};
passthru.updateScript = unstableGitUpdater {
tagPrefix = "v";
};
cargoHash = "sha256-9pSn0f0VWsBg1z1UYGRtMb1z23htRm7qLmO80zvSjN8=";
cargoBuildFlags = [ "-p=rsonpath" ];
cargoTestFlags = cargoBuildFlags;
meta = {
description = "Experimental JSONPath engine for querying massive streamed datasets";
homepage = "https://github.com/v0ldek/rsonpath";
changelog = "https://github.com/v0ldek/rsonpath/blob/${src.rev}/CHANGELOG.md";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ figsoda ];
mainProgram = "rq";
};
}

View File

@@ -0,0 +1,49 @@
{
lib,
rustPlatform,
fetchFromGitea,
pkg-config,
pcsclite,
nix-update-script,
testers,
rsop,
}:
rustPlatform.buildRustPackage rec {
pname = "rsop";
version = "0.8.0";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "heiko";
repo = "rsop";
rev = "rsop/v${version}";
hash = "sha256-bbB2IefXauVV6LjpJxSNy4RVYjAGH0osTpUZGGscGec=";
};
cargoHash = "sha256-P27PnFNArKn3CQtik6TaV7eW/8bQiOZ57ZbMth2pNiY=";
nativeBuildInputs = [ pkg-config ];
buildInputs = [ pcsclite ];
passthru = {
updateScript = nix-update-script { };
tests.version = testers.testVersion {
command = "rsop version";
package = rsop;
};
};
meta = {
homepage = "https://codeberg.org/heiko/rsop";
description = "Stateless OpenPGP (SOP) based on rpgp";
license = with lib.licenses; [
mit
apsl20
cc0
];
maintainers = with lib.maintainers; [ nikstur ];
mainProgram = "rsop";
};
}

View File

@@ -0,0 +1,62 @@
{
lib,
python3,
python3Packages,
fetchFromGitLab,
fetchpatch,
rspamd,
nixosTests,
}:
python3Packages.buildPythonApplication {
pname = "rspamd-trainer";
version = "unstable-2023-11-27";
format = "pyproject";
src = fetchFromGitLab {
owner = "onlime";
repo = "rspamd-trainer";
rev = "eb6639a78a019ade6781f3a8418eddc030f8fa14";
hash = "sha256-Me6WZhQ6SvDGGBQQtSA/7bIfKtsz6D5rvQeU12sVzgY=";
};
patches = [
# Refactor pyproject.toml
# https://gitlab.com/onlime/rspamd-trainer/-/merge_requests/2
(fetchpatch {
url = "https://gitlab.com/onlime/rspamd-trainer/-/commit/8824bfb9a9826988a90a401b8e51c20f5366ed70.patch";
hash = "sha256-qiXfwMUfM/iV+fHba8xdwQD92RQz627+HdUTgwgRZdc=";
name = "refactor_pyproject.patch";
})
];
postPatch = ''
# Fix module path not applied by patch
mv helper src/
touch src/helper/__init__.py
mv settings.py src/rspamd_trainer/
sed -i 's/from settings/from .settings/' src/rspamd_trainer/run.py
# Fix rspamc path
sed -i "s|/usr/bin/rspamc|${rspamd}/bin/rspamc|" src/rspamd_trainer/run.py
'';
nativeBuildInputs = with python3.pkgs; [
setuptools-scm
];
propagatedBuildInputs = with python3.pkgs; [
python-dotenv
imapclient
];
passthru.tests = { inherit (nixosTests) rspamd-trainer; };
meta = {
homepage = "https://gitlab.com/onlime/rspamd-trainer";
description = "Grabs messages from a spam mailbox via IMAP and feeds them to Rspamd for training";
mainProgram = "rspamd-trainer";
license = lib.licenses.gpl3Only;
maintainers = with lib.maintainers; [ onny ];
};
}

View File

@@ -0,0 +1,126 @@
{
stdenv,
lib,
fetchFromGitHub,
fetchpatch2,
cmake,
doctest,
fmt,
perl,
glib,
luajit,
openssl,
pcre,
pkg-config,
sqlite,
ragel,
fasttext,
icu,
hyperscan,
vectorscan,
jemalloc,
blas,
lapack,
lua,
libsodium,
xxHash,
zstd,
libarchive,
# Enabling blas support breaks bayes filter training from dovecot in nixos-mailserver tests
# https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/issues/321
withBlas ? false,
withHyperscan ? false,
withLuaJIT ? stdenv.hostPlatform.isx86_64,
withVectorscan ? true,
nixosTests,
}:
assert withHyperscan -> stdenv.hostPlatform.isx86_64;
assert (!withHyperscan) || (!withVectorscan);
stdenv.mkDerivation rec {
pname = "rspamd";
version = "3.13.0";
src = fetchFromGitHub {
owner = "rspamd";
repo = "rspamd";
rev = version;
hash = "sha256-0qX/rvcEXxzr/PGL2A59T18Mfcalrjz0KJpEWBKJsZg=";
};
patches = [
(fetchpatch2 {
url = "https://github.com/rspamd/rspamd/commit/d808fd75ff1db1821b1dd817eb4ba9a118b31090.patch";
hash = "sha256-v1Gn3dPxN/h92NYK3PTrZomnbwUcVkAWcYeQCFzQNyo=";
})
];
hardeningEnable = [ "pie" ];
nativeBuildInputs = [
cmake
pkg-config
perl
ragel
];
buildInputs = [
doctest
fmt
glib
openssl
pcre
sqlite
ragel
fasttext
icu
jemalloc
libsodium
xxHash
zstd
libarchive
]
++ lib.optionals withBlas [
blas
lapack
]
++ lib.optional withHyperscan hyperscan
++ lib.optional withLuaJIT luajit
++ lib.optional (!withLuaJIT) lua
++ lib.optional withVectorscan vectorscan;
cmakeFlags = [
# pcre2 jit seems to cause crashes: https://github.com/NixOS/nixpkgs/pull/181908
"-DENABLE_PCRE2=OFF"
"-DDEBIAN_BUILD=ON"
"-DRUNDIR=/run/rspamd"
"-DDBDIR=/var/lib/rspamd"
"-DLOGDIR=/var/log/rspamd"
"-DLOCAL_CONFDIR=/etc/rspamd"
"-DENABLE_BLAS=${if withBlas then "ON" else "OFF"}"
"-DENABLE_FASTTEXT=ON"
"-DENABLE_JEMALLOC=ON"
"-DSYSTEM_DOCTEST=ON"
"-DSYSTEM_FMT=ON"
"-DSYSTEM_XXHASH=ON"
"-DSYSTEM_ZSTD=ON"
"-DENABLE_HYPERSCAN=ON"
]
++ lib.optional (!withLuaJIT) "-DENABLE_LUAJIT=OFF";
passthru.tests.rspamd = nixosTests.rspamd;
meta = with lib; {
homepage = "https://rspamd.com";
license = licenses.asl20;
description = "Advanced spam filtering system";
maintainers = with maintainers; [
avnik
fpletz
globin
lewo
];
platforms = with platforms; linux;
};
}

View File

@@ -0,0 +1,38 @@
{
lib,
fetchFromGitHub,
rustPlatform,
openssl,
pkg-config,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "rsrpc";
version = "0.24.3";
src = fetchFromGitHub {
owner = "SpikeHD";
repo = "rsRPC";
tag = "v${finalAttrs.version}";
hash = "sha256-qQduMRITva425T+w2sWX/mRmJLq2SsfPkFzgjyq9x9E=";
};
cargoHash = "sha256-aUTy+8XCUgsBEBBWr0PmvZ6agkq0sojXPWi9rDWp2Iw=";
nativeBuildInputs = [
pkg-config
];
buildInputs = [
openssl
];
meta = {
changelog = "https://github.com/SpikeHD/rsRPC/releases/tag/v${finalAttrs.version}";
description = "Rust implementation of the Discord RPC server";
homepage = "https://github.com/SpikeHD/rsRPC";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.pyrox0 ];
mainProgram = "rsrpc-cli";
};
})

View File

@@ -0,0 +1,39 @@
{
lib,
writeShellScriptBin,
rss-bridge,
php,
}:
let
phpWithExts = (
php.withExtensions (
{ all, ... }:
with all;
[
curl
filter
iconv
mbstring
openssl
simplexml
sqlite3
]
)
);
phpBin = "${phpWithExts}/bin/php";
in
(writeShellScriptBin "rss-bridge-cli" ''
${phpBin} ${rss-bridge}/index.php "$@"
'').overrideAttrs
(oldAttrs: {
version = rss-bridge.version;
meta = with lib; {
description = "Command-line interface for RSS-Bridge";
homepage = "https://github.com/RSS-Bridge/rss-bridge";
license = licenses.unlicense;
maintainers = with maintainers; [ ymeister ];
mainProgram = "rss-bridge-cli";
};
})

View File

@@ -0,0 +1,42 @@
{
stdenv,
lib,
fetchFromGitHub,
nixosTests,
nix-update-script,
}:
stdenv.mkDerivation rec {
pname = "rss-bridge";
version = "2025-08-05";
src = fetchFromGitHub {
owner = "RSS-Bridge";
repo = "rss-bridge";
rev = version;
sha256 = "sha256-SH5iYsdvGD51j+2xqaG51VDtb35m1v9MR0+yLE1eyWo=";
};
installPhase = ''
mkdir $out/
cp -R ./* $out
'';
passthru = {
tests = {
inherit (nixosTests.rss-bridge) caddy nginx;
};
updateScript = nix-update-script { };
};
meta = with lib; {
description = "RSS feed for websites missing it";
homepage = "https://github.com/RSS-Bridge/rss-bridge";
license = licenses.unlicense;
maintainers = with maintainers; [
dawidsowa
mynacol
];
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,12 @@
diff --git i/src/Implicit/impSurface.h w/src/Implicit/impSurface.h
index 41fab81..027587f 100644
--- i/src/Implicit/impSurface.h
+++ w/src/Implicit/impSurface.h
@@ -25,6 +25,7 @@
#ifdef WIN32
#include <windows.h>
#endif
+#include <cstddef>
#include <vector>
#include <GL/gl.h>

View File

@@ -0,0 +1,54 @@
{
lib,
stdenv,
fetchurl,
autoconf,
pkg-config,
libX11,
libXext,
libGLU,
libGL,
imagemagick6,
libtiff,
bzip2,
}:
stdenv.mkDerivation rec {
version = "0.9.1";
pname = "rss-glx";
src = fetchurl {
url = "mirror://sourceforge/rss-glx/rss-glx_${version}.tar.bz2";
sha256 = "1aikafjqrfmv23jnrrm5d56dg6injh4l67zjdxzdapv9chw7g3cg";
};
nativeBuildInputs = [
autoconf
pkg-config
];
buildInputs = [
libGLU
libGL
libX11
libXext
imagemagick6
libtiff
bzip2
];
patches = [
./cstddef.patch
];
env.NIX_CFLAGS_COMPILE = "-I${imagemagick6.dev}/include/ImageMagick";
meta = {
description = "Really Slick Screensavers Port to GLX";
longDescription = ''
This package currently contains all of the screensavers from the
original collection, plus a few others.
'';
license = lib.licenses.gpl2Only;
platforms = lib.platforms.linux;
};
}

View File

@@ -0,0 +1,250 @@
From 6625fded5d55b89ce77e0dd5f1bd153428c3bdd2 Mon Sep 17 00:00:00 2001
From: Brand Huntsman <au@qzx.com>
Date: Mon, 5 May 2025 02:35:02 -0600
Subject: [PATCH] Fix tests when using html2text 2025.4.15.
https://github.com/Alir3z4/html2text/pull/431 changed the 'pre' tag
indentation spacing.
Fixes #278.
Reported-By: Luis Henriques
---
test/data/tails/1.expected | 94 +++++++++++++++++++-------------------
test/data/tails/2.expected | 92 ++++++++++++++++++-------------------
2 files changed, 93 insertions(+), 93 deletions(-)
diff --git a/test/data/tails/1.expected b/test/data/tails/1.expected
index cd6238c..0feef24 100644
--- a/test/data/tails/1.expected
+++ b/test/data/tails/1.expected
@@ -362,48 +362,48 @@ YzEuCgpUbyBkbyBhbiBhdXRvbWF0aWMgdXBncmFkZSB0byBUYWlscyA0LjExfnJjMToKCiAgICAx
LiBTdGFydCBUYWlscyA0LjIgb3IgbGF0ZXIgYW5kIFtzZXQgYW4gYWRtaW5pc3RyYXRpb24gcGFz
c3dvcmRdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvZG9jL2ZpcnN0X3N0ZXBzL3dlbGNvbWVfc2Ny
ZWVuL2FkbWluaXN0cmF0aW9uX3Bhc3N3b3JkL2luZGV4LmVuLmh0bWwpLgoKICAgIDIuIFJ1biB0
-aGlzIGNvbW1hbmQgaW4gYSBfVGVybWluYWxfIDoKICAgICAgICAKICAgICAgICAgICAgICAgIGVj
-aG8gVEFJTFNfQ0hBTk5FTD1cImFscGhhXCIgfCBzdWRvIHRlZSAtYSAvZXRjL29zLXJlbGVhc2Ug
-JiYgXAogICAgICAgICAgICAgdGFpbHMtdXBncmFkZS1mcm9udGVuZC13cmFwcGVyCiAgICAgICAg
-CgpFbnRlciB0aGUgYWRtaW5pc3RyYXRpb24gcGFzc3dvcmQgd2hlbiBhc2tlZCBmb3IgdGhlICJw
-YXNzd29yZCBmb3IgYW1uZXNpYSIuCgogICAgMy4gQWZ0ZXIgdGhlIHVwZ3JhZGUgaXMgYXBwbGll
-ZCwgcmVzdGFydCBUYWlscyBhbmQgY2hvb3NlICoqQXBwbGljYXRpb25zICDilrggVGFpbHMg4pa4
-IEFib3V0IFRhaWxzKiogdG8gdmVyaWZ5IHRoYXQgeW91IGFyZSBydW5uaW5nIFRhaWxzIDQuMTF+
-cmMxLgoKICAqIElmIHlvdSBjYW5ub3QgZG8gYW4gYXV0b21hdGljIHVwZ3JhZGUgb3IgaWYgVGFp
-bHMgZmFpbHMgdG8gc3RhcnQgYWZ0ZXIgYW4gYXV0b21hdGljIHVwZ3JhZGUsIHBsZWFzZSB0cnkg
-dG8gZG8gYSBbbWFudWFsIHVwZ3JhZGVdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvZG9jL3VwZ3Jh
-ZGUvaW5kZXguZW4uaHRtbCNtYW51YWwpLgoKIyMgVG8gZG93bmxvYWQgNC4xMX5yYzEKCiMjIyBE
-aXJlY3QgZG93bmxvYWQKCiAgKiBbRm9yIFVTQiBzdGlja3MgKFVTQiBpbWFnZSldKGh0dHA6Ly9k
-bC5hbW5lc2lhLmJvdW0ub3JnL3RhaWxzL2FscGhhL3RhaWxzLWFtZDY0LTQuMTF+cmMxL3RhaWxz
-LWFtZDY0LTQuMTF+cmMxLmltZykgKFs/XShodHRwczovL3RhaWxzLmJvdW0ub3JnL2lraXdpa2ku
-Y2dpP2RvPWNyZWF0ZSZmcm9tPW5ld3MlMkZ0ZXN0XzQuMTEtcmMxJnBhZ2U9dG9ycmVudHMlMkZm
-aWxlcyUyRnRhaWxzLWFtZDY0LTQuMTF+cmMxLmltZy5zaWcpT3BlblBHUCBzaWduYXR1cmUpCgog
-ICogW0ZvciBEVkRzIGFuZCB2aXJ0dWFsIG1hY2hpbmVzIChJU08gaW1hZ2UpXShodHRwOi8vZGwu
-YW1uZXNpYS5ib3VtLm9yZy90YWlscy9hbHBoYS90YWlscy1hbWQ2NC00LjExfnJjMS90YWlscy1h
-bWQ2NC00LjExfnJjMS5pc28pIChbP10oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy9pa2l3aWtpLmNn
-aT9kbz1jcmVhdGUmZnJvbT1uZXdzJTJGdGVzdF80LjExLXJjMSZwYWdlPXRvcnJlbnRzJTJGZmls
-ZXMlMkZ0YWlscy1hbWQ2NC00LjExfnJjMS5pc28uc2lnKU9wZW5QR1Agc2lnbmF0dXJlKQoKIyMj
-IEJpdFRvcnJlbnQgZG93bmxvYWQKCiAgKiBbRm9yIFVTQiBzdGlja3MgKFVTQiBpbWFnZSldKGh0
-dHBzOi8vdGFpbHMuYm91bS5vcmcvdG9ycmVudHMvZmlsZXMvdGFpbHMtYW1kNjQtNC4xMX5yYzEu
-aW1nLnRvcnJlbnQpCgogICogW0ZvciBEVkRzIGFuZCB2aXJ0dWFsIG1hY2hpbmVzIChJU08gaW1h
-Z2UpXShodHRwczovL3RhaWxzLmJvdW0ub3JnL3RvcnJlbnRzL2ZpbGVzL3RhaWxzLWFtZDY0LTQu
-MTF+cmMxLmlzby50b3JyZW50KQoKIyMgVG8gaW5zdGFsbCBUYWlscyBvbiBhIG5ldyBVU0Igc3Rp
-Y2sKCkZvbGxvdyBvdXIgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9uczoKCiAgKiBbSW5zdGFsbCBm
-cm9tIFdpbmRvd3NdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvaW5zdGFsbC93aW4vdXNiL2luZGV4
-LmVuLmh0bWwpCiAgKiBbSW5zdGFsbCBmcm9tIG1hY09TXShodHRwczovL3RhaWxzLmJvdW0ub3Jn
-L2luc3RhbGwvbWFjL3VzYi9pbmRleC5lbi5odG1sKQogICogW0luc3RhbGwgZnJvbSBMaW51eF0o
-aHR0cHM6Ly90YWlscy5ib3VtLm9yZy9pbnN0YWxsL2xpbnV4L3VzYi9pbmRleC5lbi5odG1sKQoK
-QWxsIHRoZSBkYXRhIG9uIHRoaXMgVVNCIHN0aWNrIHdpbGwgYmUgbG9zdC4KCiMgV2hhdCdzIGNv
-bWluZyB1cD8KClRhaWxzIDQuMTEgaXMgW3NjaGVkdWxlZF0oaHR0cHM6Ly90YWlscy5ib3VtLm9y
-Zy9jb250cmlidXRlL2NhbGVuZGFyLykgZm9yClNlcHRlbWJlciAyMi4KCkhhdmUgYSBsb29rIGF0
-IG91ciBbcm9hZG1hcF0oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy9jb250cmlidXRlL3JvYWRtYXAp
-IHRvIHNlZQp3aGVyZSB3ZSBhcmUgaGVhZGluZyB0by4KCldlIG5lZWQgeW91ciBoZWxwIGFuZCB0
-aGVyZSBhcmUgbWFueSB3YXlzIHRvIFtjb250cmlidXRlIHRvClRhaWxzXShodHRwczovL3RhaWxz
-LmJvdW0ub3JnL2NvbnRyaWJ1dGUvaW5kZXguZW4uaHRtbCkKKFtkb25hdGluZ10oaHR0cHM6Ly90
-YWlscy5ib3VtLm9yZy9kb25hdGUvP3I9NC4xMS1yYzEpIGlzIG9ubHkgb25lIG9mIHRoZW0pLgpD
-b21lIFt0YWxrIHRvIHVzXShodHRwczovL3RhaWxzLmJvdW0ub3JnL2Fib3V0L2NvbnRhY3QvaW5k
-ZXguZW4uaHRtbCN0YWlscy0KZGV2KSEKCgoKVVJMOiBodHRwczovL3RhaWxzLmJvdW0ub3JnL25l
-d3MvdGVzdF80LjExLXJjMS8=
+aGlzIGNvbW1hbmQgaW4gYSBfVGVybWluYWxfIDoKICAgICAgICAgICAKICAgICAgICAgICBlY2hv
+IFRBSUxTX0NIQU5ORUw9XCJhbHBoYVwiIHwgc3VkbyB0ZWUgLWEgL2V0Yy9vcy1yZWxlYXNlICYm
+IFwKICAgICAgICAgICAgICAgIHRhaWxzLXVwZ3JhZGUtZnJvbnRlbmQtd3JhcHBlcgogICAgICAg
+ICAgIAoKRW50ZXIgdGhlIGFkbWluaXN0cmF0aW9uIHBhc3N3b3JkIHdoZW4gYXNrZWQgZm9yIHRo
+ZSAicGFzc3dvcmQgZm9yIGFtbmVzaWEiLgoKICAgIDMuIEFmdGVyIHRoZSB1cGdyYWRlIGlzIGFw
+cGxpZWQsIHJlc3RhcnQgVGFpbHMgYW5kIGNob29zZSAqKkFwcGxpY2F0aW9ucyAg4pa4IFRhaWxz
+IOKWuCBBYm91dCBUYWlscyoqIHRvIHZlcmlmeSB0aGF0IHlvdSBhcmUgcnVubmluZyBUYWlscyA0
+LjExfnJjMS4KCiAgKiBJZiB5b3UgY2Fubm90IGRvIGFuIGF1dG9tYXRpYyB1cGdyYWRlIG9yIGlm
+IFRhaWxzIGZhaWxzIHRvIHN0YXJ0IGFmdGVyIGFuIGF1dG9tYXRpYyB1cGdyYWRlLCBwbGVhc2Ug
+dHJ5IHRvIGRvIGEgW21hbnVhbCB1cGdyYWRlXShodHRwczovL3RhaWxzLmJvdW0ub3JnL2RvYy91
+cGdyYWRlL2luZGV4LmVuLmh0bWwjbWFudWFsKS4KCiMjIFRvIGRvd25sb2FkIDQuMTF+cmMxCgoj
+IyMgRGlyZWN0IGRvd25sb2FkCgogICogW0ZvciBVU0Igc3RpY2tzIChVU0IgaW1hZ2UpXShodHRw
+Oi8vZGwuYW1uZXNpYS5ib3VtLm9yZy90YWlscy9hbHBoYS90YWlscy1hbWQ2NC00LjExfnJjMS90
+YWlscy1hbWQ2NC00LjExfnJjMS5pbWcpIChbP10oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy9pa2l3
+aWtpLmNnaT9kbz1jcmVhdGUmZnJvbT1uZXdzJTJGdGVzdF80LjExLXJjMSZwYWdlPXRvcnJlbnRz
+JTJGZmlsZXMlMkZ0YWlscy1hbWQ2NC00LjExfnJjMS5pbWcuc2lnKU9wZW5QR1Agc2lnbmF0dXJl
+KQoKICAqIFtGb3IgRFZEcyBhbmQgdmlydHVhbCBtYWNoaW5lcyAoSVNPIGltYWdlKV0oaHR0cDov
+L2RsLmFtbmVzaWEuYm91bS5vcmcvdGFpbHMvYWxwaGEvdGFpbHMtYW1kNjQtNC4xMX5yYzEvdGFp
+bHMtYW1kNjQtNC4xMX5yYzEuaXNvKSAoWz9dKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvaWtpd2lr
+aS5jZ2k/ZG89Y3JlYXRlJmZyb209bmV3cyUyRnRlc3RfNC4xMS1yYzEmcGFnZT10b3JyZW50cyUy
+RmZpbGVzJTJGdGFpbHMtYW1kNjQtNC4xMX5yYzEuaXNvLnNpZylPcGVuUEdQIHNpZ25hdHVyZSkK
+CiMjIyBCaXRUb3JyZW50IGRvd25sb2FkCgogICogW0ZvciBVU0Igc3RpY2tzIChVU0IgaW1hZ2Up
+XShodHRwczovL3RhaWxzLmJvdW0ub3JnL3RvcnJlbnRzL2ZpbGVzL3RhaWxzLWFtZDY0LTQuMTF+
+cmMxLmltZy50b3JyZW50KQoKICAqIFtGb3IgRFZEcyBhbmQgdmlydHVhbCBtYWNoaW5lcyAoSVNP
+IGltYWdlKV0oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy90b3JyZW50cy9maWxlcy90YWlscy1hbWQ2
+NC00LjExfnJjMS5pc28udG9ycmVudCkKCiMjIFRvIGluc3RhbGwgVGFpbHMgb24gYSBuZXcgVVNC
+IHN0aWNrCgpGb2xsb3cgb3VyIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnM6CgogICogW0luc3Rh
+bGwgZnJvbSBXaW5kb3dzXShodHRwczovL3RhaWxzLmJvdW0ub3JnL2luc3RhbGwvd2luL3VzYi9p
+bmRleC5lbi5odG1sKQogICogW0luc3RhbGwgZnJvbSBtYWNPU10oaHR0cHM6Ly90YWlscy5ib3Vt
+Lm9yZy9pbnN0YWxsL21hYy91c2IvaW5kZXguZW4uaHRtbCkKICAqIFtJbnN0YWxsIGZyb20gTGlu
+dXhdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvaW5zdGFsbC9saW51eC91c2IvaW5kZXguZW4uaHRt
+bCkKCkFsbCB0aGUgZGF0YSBvbiB0aGlzIFVTQiBzdGljayB3aWxsIGJlIGxvc3QuCgojIFdoYXQn
+cyBjb21pbmcgdXA/CgpUYWlscyA0LjExIGlzIFtzY2hlZHVsZWRdKGh0dHBzOi8vdGFpbHMuYm91
+bS5vcmcvY29udHJpYnV0ZS9jYWxlbmRhci8pIGZvcgpTZXB0ZW1iZXIgMjIuCgpIYXZlIGEgbG9v
+ayBhdCBvdXIgW3JvYWRtYXBdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvY29udHJpYnV0ZS9yb2Fk
+bWFwKSB0byBzZWUKd2hlcmUgd2UgYXJlIGhlYWRpbmcgdG8uCgpXZSBuZWVkIHlvdXIgaGVscCBh
+bmQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBbY29udHJpYnV0ZSB0bwpUYWlsc10oaHR0cHM6Ly90
+YWlscy5ib3VtLm9yZy9jb250cmlidXRlL2luZGV4LmVuLmh0bWwpCihbZG9uYXRpbmddKGh0dHBz
+Oi8vdGFpbHMuYm91bS5vcmcvZG9uYXRlLz9yPTQuMTEtcmMxKSBpcyBvbmx5IG9uZSBvZiB0aGVt
+KS4KQ29tZSBbdGFsayB0byB1c10oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy9hYm91dC9jb250YWN0
+L2luZGV4LmVuLmh0bWwjdGFpbHMtCmRldikhCgoKClVSTDogaHR0cHM6Ly90YWlscy5ib3VtLm9y
+Zy9uZXdzL3Rlc3RfNC4xMS1yYzEv
SENT BY: "Tails - News: <author>" <user@rss2email.invalid>
@@ -796,17 +796,17 @@ For more details, read our
# Known issues
* Ledger wallets are not detected by _Electrum_ , with the following error message returned. ([#18080](https://gitlab.tails.boum.org/tails/tails/-/issues/18080))
-
+
"No hardware device detected"
-
+
Please try to execute the following command in a [root
terminal](https://tails.boum.org/doc/first_steps/welcome_screen/administration_password/index.en.html#open_root_terminal)
before starting _Electrum_ :
-
- apt update && apt install python3-btchip/testing
-
+
+ apt update && apt install python3-btchip/testing
+
See the list of [long-standing
issues](https://tails.boum.org/support/known_issues/index.en.html).
diff --git a/test/data/tails/2.expected b/test/data/tails/2.expected
index 7b48a67..7e9fd49 100644
--- a/test/data/tails/2.expected
+++ b/test/data/tails/2.expected
@@ -933,47 +933,47 @@ bHMgNC4xMX5yYzE6CgogICAgMS4gU3RhcnQgVGFpbHMgNC4yIG9yIGxhdGVyIGFuZCBbc2V0IGFu
IGFkbWluaXN0cmF0aW9uIHBhc3N3b3JkXShodHRwczovL3RhaWxzLmJvdW0ub3JnL2RvYy9maXJz
dF9zdGVwcy93ZWxjb21lX3NjcmVlbi9hZG1pbmlzdHJhdGlvbl9wYXNzd29yZC9pbmRleC5lbi5o
dG1sKS4KCiAgICAyLiBSdW4gdGhpcyBjb21tYW5kIGluIGEgX1Rlcm1pbmFsXyA6CiAgICAgICAg
-CiAgICAgICAgICAgICAgICBlY2hvIFRBSUxTX0NIQU5ORUw9XCJhbHBoYVwiIHwgc3VkbyB0ZWUg
-LWEgL2V0Yy9vcy1yZWxlYXNlICYmIFwKICAgICAgICAgICAgIHRhaWxzLXVwZ3JhZGUtZnJvbnRl
-bmQtd3JhcHBlcgogICAgICAgIAoKRW50ZXIgdGhlIGFkbWluaXN0cmF0aW9uIHBhc3N3b3JkIHdo
-ZW4gYXNrZWQgZm9yIHRoZSAicGFzc3dvcmQgZm9yIGFtbmVzaWEiLgoKICAgIDMuIEFmdGVyIHRo
-ZSB1cGdyYWRlIGlzIGFwcGxpZWQsIHJlc3RhcnQgVGFpbHMgYW5kIGNob29zZSAqKkFwcGxpY2F0
-aW9ucyAg4pa4IFRhaWxzIOKWuCBBYm91dCBUYWlscyoqIHRvIHZlcmlmeSB0aGF0IHlvdSBhcmUg
-cnVubmluZyBUYWlscyA0LjExfnJjMS4KCiAgKiBJZiB5b3UgY2Fubm90IGRvIGFuIGF1dG9tYXRp
-YyB1cGdyYWRlIG9yIGlmIFRhaWxzIGZhaWxzIHRvIHN0YXJ0IGFmdGVyIGFuIGF1dG9tYXRpYyB1
-cGdyYWRlLCBwbGVhc2UgdHJ5IHRvIGRvIGEgW21hbnVhbCB1cGdyYWRlXShodHRwczovL3RhaWxz
-LmJvdW0ub3JnL2RvYy91cGdyYWRlL2luZGV4LmVuLmh0bWwjbWFudWFsKS4KCiMjIFRvIGRvd25s
-b2FkIDQuMTF+cmMxCgojIyMgRGlyZWN0IGRvd25sb2FkCgogICogW0ZvciBVU0Igc3RpY2tzIChV
-U0IgaW1hZ2UpXShodHRwOi8vZGwuYW1uZXNpYS5ib3VtLm9yZy90YWlscy9hbHBoYS90YWlscy1h
-bWQ2NC00LjExfnJjMS90YWlscy1hbWQ2NC00LjExfnJjMS5pbWcpIChbP10oaHR0cHM6Ly90YWls
-cy5ib3VtLm9yZy9pa2l3aWtpLmNnaT9kbz1jcmVhdGUmZnJvbT1uZXdzJTJGdGVzdF80LjExLXJj
-MSZwYWdlPXRvcnJlbnRzJTJGZmlsZXMlMkZ0YWlscy1hbWQ2NC00LjExfnJjMS5pbWcuc2lnKU9w
-ZW5QR1Agc2lnbmF0dXJlKQoKICAqIFtGb3IgRFZEcyBhbmQgdmlydHVhbCBtYWNoaW5lcyAoSVNP
-IGltYWdlKV0oaHR0cDovL2RsLmFtbmVzaWEuYm91bS5vcmcvdGFpbHMvYWxwaGEvdGFpbHMtYW1k
-NjQtNC4xMX5yYzEvdGFpbHMtYW1kNjQtNC4xMX5yYzEuaXNvKSAoWz9dKGh0dHBzOi8vdGFpbHMu
-Ym91bS5vcmcvaWtpd2lraS5jZ2k/ZG89Y3JlYXRlJmZyb209bmV3cyUyRnRlc3RfNC4xMS1yYzEm
-cGFnZT10b3JyZW50cyUyRmZpbGVzJTJGdGFpbHMtYW1kNjQtNC4xMX5yYzEuaXNvLnNpZylPcGVu
-UEdQIHNpZ25hdHVyZSkKCiMjIyBCaXRUb3JyZW50IGRvd25sb2FkCgogICogW0ZvciBVU0Igc3Rp
-Y2tzIChVU0IgaW1hZ2UpXShodHRwczovL3RhaWxzLmJvdW0ub3JnL3RvcnJlbnRzL2ZpbGVzL3Rh
-aWxzLWFtZDY0LTQuMTF+cmMxLmltZy50b3JyZW50KQoKICAqIFtGb3IgRFZEcyBhbmQgdmlydHVh
-bCBtYWNoaW5lcyAoSVNPIGltYWdlKV0oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy90b3JyZW50cy9m
-aWxlcy90YWlscy1hbWQ2NC00LjExfnJjMS5pc28udG9ycmVudCkKCiMjIFRvIGluc3RhbGwgVGFp
-bHMgb24gYSBuZXcgVVNCIHN0aWNrCgpGb2xsb3cgb3VyIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlv
-bnM6CgogICogW0luc3RhbGwgZnJvbSBXaW5kb3dzXShodHRwczovL3RhaWxzLmJvdW0ub3JnL2lu
-c3RhbGwvd2luL3VzYi9pbmRleC5lbi5odG1sKQogICogW0luc3RhbGwgZnJvbSBtYWNPU10oaHR0
-cHM6Ly90YWlscy5ib3VtLm9yZy9pbnN0YWxsL21hYy91c2IvaW5kZXguZW4uaHRtbCkKICAqIFtJ
-bnN0YWxsIGZyb20gTGludXhdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvaW5zdGFsbC9saW51eC91
-c2IvaW5kZXguZW4uaHRtbCkKCkFsbCB0aGUgZGF0YSBvbiB0aGlzIFVTQiBzdGljayB3aWxsIGJl
-IGxvc3QuCgojIFdoYXQncyBjb21pbmcgdXA/CgpUYWlscyA0LjExIGlzIFtzY2hlZHVsZWRdKGh0
-dHBzOi8vdGFpbHMuYm91bS5vcmcvY29udHJpYnV0ZS9jYWxlbmRhci8pIGZvcgpTZXB0ZW1iZXIg
-MjIuCgpIYXZlIGEgbG9vayBhdCBvdXIgW3JvYWRtYXBdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcv
-Y29udHJpYnV0ZS9yb2FkbWFwKSB0byBzZWUKd2hlcmUgd2UgYXJlIGhlYWRpbmcgdG8uCgpXZSBu
-ZWVkIHlvdXIgaGVscCBhbmQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBbY29udHJpYnV0ZSB0bwpU
-YWlsc10oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy9jb250cmlidXRlL2luZGV4LmVuLmh0bWwpCihb
-ZG9uYXRpbmddKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvZG9uYXRlLz9yPTQuMTEtcmMxKSBpcyBv
-bmx5IG9uZSBvZiB0aGVtKS4KQ29tZSBbdGFsayB0byB1c10oaHR0cHM6Ly90YWlscy5ib3VtLm9y
-Zy9hYm91dC9jb250YWN0L2luZGV4LmVuLmh0bWwjdGFpbHMtCmRldikhCgpVUkw6IDxodHRwczov
-L3RhaWxzLmJvdW0ub3JnL25ld3MvdGVzdF80LjExLXJjMS8+Cgo=
+ICAgCiAgICAgICAgICAgZWNobyBUQUlMU19DSEFOTkVMPVwiYWxwaGFcIiB8IHN1ZG8gdGVlIC1h
+IC9ldGMvb3MtcmVsZWFzZSAmJiBcCiAgICAgICAgICAgICAgICB0YWlscy11cGdyYWRlLWZyb250
+ZW5kLXdyYXBwZXIKICAgICAgICAgICAKCkVudGVyIHRoZSBhZG1pbmlzdHJhdGlvbiBwYXNzd29y
+ZCB3aGVuIGFza2VkIGZvciB0aGUgInBhc3N3b3JkIGZvciBhbW5lc2lhIi4KCiAgICAzLiBBZnRl
+ciB0aGUgdXBncmFkZSBpcyBhcHBsaWVkLCByZXN0YXJ0IFRhaWxzIGFuZCBjaG9vc2UgKipBcHBs
+aWNhdGlvbnMgIOKWuCBUYWlscyDilrggQWJvdXQgVGFpbHMqKiB0byB2ZXJpZnkgdGhhdCB5b3Ug
+YXJlIHJ1bm5pbmcgVGFpbHMgNC4xMX5yYzEuCgogICogSWYgeW91IGNhbm5vdCBkbyBhbiBhdXRv
+bWF0aWMgdXBncmFkZSBvciBpZiBUYWlscyBmYWlscyB0byBzdGFydCBhZnRlciBhbiBhdXRvbWF0
+aWMgdXBncmFkZSwgcGxlYXNlIHRyeSB0byBkbyBhIFttYW51YWwgdXBncmFkZV0oaHR0cHM6Ly90
+YWlscy5ib3VtLm9yZy9kb2MvdXBncmFkZS9pbmRleC5lbi5odG1sI21hbnVhbCkuCgojIyBUbyBk
+b3dubG9hZCA0LjExfnJjMQoKIyMjIERpcmVjdCBkb3dubG9hZAoKICAqIFtGb3IgVVNCIHN0aWNr
+cyAoVVNCIGltYWdlKV0oaHR0cDovL2RsLmFtbmVzaWEuYm91bS5vcmcvdGFpbHMvYWxwaGEvdGFp
+bHMtYW1kNjQtNC4xMX5yYzEvdGFpbHMtYW1kNjQtNC4xMX5yYzEuaW1nKSAoWz9dKGh0dHBzOi8v
+dGFpbHMuYm91bS5vcmcvaWtpd2lraS5jZ2k/ZG89Y3JlYXRlJmZyb209bmV3cyUyRnRlc3RfNC4x
+MS1yYzEmcGFnZT10b3JyZW50cyUyRmZpbGVzJTJGdGFpbHMtYW1kNjQtNC4xMX5yYzEuaW1nLnNp
+ZylPcGVuUEdQIHNpZ25hdHVyZSkKCiAgKiBbRm9yIERWRHMgYW5kIHZpcnR1YWwgbWFjaGluZXMg
+KElTTyBpbWFnZSldKGh0dHA6Ly9kbC5hbW5lc2lhLmJvdW0ub3JnL3RhaWxzL2FscGhhL3RhaWxz
+LWFtZDY0LTQuMTF+cmMxL3RhaWxzLWFtZDY0LTQuMTF+cmMxLmlzbykgKFs/XShodHRwczovL3Rh
+aWxzLmJvdW0ub3JnL2lraXdpa2kuY2dpP2RvPWNyZWF0ZSZmcm9tPW5ld3MlMkZ0ZXN0XzQuMTEt
+cmMxJnBhZ2U9dG9ycmVudHMlMkZmaWxlcyUyRnRhaWxzLWFtZDY0LTQuMTF+cmMxLmlzby5zaWcp
+T3BlblBHUCBzaWduYXR1cmUpCgojIyMgQml0VG9ycmVudCBkb3dubG9hZAoKICAqIFtGb3IgVVNC
+IHN0aWNrcyAoVVNCIGltYWdlKV0oaHR0cHM6Ly90YWlscy5ib3VtLm9yZy90b3JyZW50cy9maWxl
+cy90YWlscy1hbWQ2NC00LjExfnJjMS5pbWcudG9ycmVudCkKCiAgKiBbRm9yIERWRHMgYW5kIHZp
+cnR1YWwgbWFjaGluZXMgKElTTyBpbWFnZSldKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvdG9ycmVu
+dHMvZmlsZXMvdGFpbHMtYW1kNjQtNC4xMX5yYzEuaXNvLnRvcnJlbnQpCgojIyBUbyBpbnN0YWxs
+IFRhaWxzIG9uIGEgbmV3IFVTQiBzdGljawoKRm9sbG93IG91ciBpbnN0YWxsYXRpb24gaW5zdHJ1
+Y3Rpb25zOgoKICAqIFtJbnN0YWxsIGZyb20gV2luZG93c10oaHR0cHM6Ly90YWlscy5ib3VtLm9y
+Zy9pbnN0YWxsL3dpbi91c2IvaW5kZXguZW4uaHRtbCkKICAqIFtJbnN0YWxsIGZyb20gbWFjT1Nd
+KGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvaW5zdGFsbC9tYWMvdXNiL2luZGV4LmVuLmh0bWwpCiAg
+KiBbSW5zdGFsbCBmcm9tIExpbnV4XShodHRwczovL3RhaWxzLmJvdW0ub3JnL2luc3RhbGwvbGlu
+dXgvdXNiL2luZGV4LmVuLmh0bWwpCgpBbGwgdGhlIGRhdGEgb24gdGhpcyBVU0Igc3RpY2sgd2ls
+bCBiZSBsb3N0LgoKIyBXaGF0J3MgY29taW5nIHVwPwoKVGFpbHMgNC4xMSBpcyBbc2NoZWR1bGVk
+XShodHRwczovL3RhaWxzLmJvdW0ub3JnL2NvbnRyaWJ1dGUvY2FsZW5kYXIvKSBmb3IKU2VwdGVt
+YmVyIDIyLgoKSGF2ZSBhIGxvb2sgYXQgb3VyIFtyb2FkbWFwXShodHRwczovL3RhaWxzLmJvdW0u
+b3JnL2NvbnRyaWJ1dGUvcm9hZG1hcCkgdG8gc2VlCndoZXJlIHdlIGFyZSBoZWFkaW5nIHRvLgoK
+V2UgbmVlZCB5b3VyIGhlbHAgYW5kIHRoZXJlIGFyZSBtYW55IHdheXMgdG8gW2NvbnRyaWJ1dGUg
+dG8KVGFpbHNdKGh0dHBzOi8vdGFpbHMuYm91bS5vcmcvY29udHJpYnV0ZS9pbmRleC5lbi5odG1s
+KQooW2RvbmF0aW5nXShodHRwczovL3RhaWxzLmJvdW0ub3JnL2RvbmF0ZS8/cj00LjExLXJjMSkg
+aXMgb25seSBvbmUgb2YgdGhlbSkuCkNvbWUgW3RhbGsgdG8gdXNdKGh0dHBzOi8vdGFpbHMuYm91
+bS5vcmcvYWJvdXQvY29udGFjdC9pbmRleC5lbi5odG1sI3RhaWxzLQpkZXYpIQoKVVJMOiA8aHR0
+cHM6Ly90YWlscy5ib3VtLm9yZy9uZXdzL3Rlc3RfNC4xMS1yYzEvPgoK
--===============...==--
@@ -1951,17 +1951,17 @@ For more details, read our
# Known issues
* Ledger wallets are not detected by _Electrum_ , with the following error message returned. ([#18080](https://gitlab.tails.boum.org/tails/tails/-/issues/18080))
-
+
"No hardware device detected"
-
+
Please try to execute the following command in a [root
terminal](https://tails.boum.org/doc/first_steps/welcome_screen/administration_password/index.en.html#open_root_terminal)
before starting _Electrum_ :
-
- apt update && apt install python3-btchip/testing
-
+
+ apt update && apt install python3-btchip/testing
+
See the list of [long-standing
issues](https://tails.boum.org/support/known_issues/index.en.html).

View File

@@ -0,0 +1,84 @@
{
lib,
python3Packages,
fetchPypi,
fetchpatch2,
nixosTests,
}:
python3Packages.buildPythonApplication rec {
pname = "rss2email";
version = "3.14";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-RwORS2PHquxBZLNKqCJtR5XX4SHqPCb/Fn+Y68dfI/g=";
};
patches = [
(fetchpatch2 {
name = "html2text-2024.2.25-compat.patch";
url = "https://github.com/rss2email/rss2email/commit/b5c0e78006c2db6929b5ff50e8529de58a00412a.patch";
hash = "sha256-edmsi3I0acx5iF9xoAS9deSexqW2UtWZR/L7CgeZs/M=";
})
# https://github.com/rss2email/rss2email/pull/279
./html2text-2025.4.15-compat.patch
(fetchpatch2 {
name = "use-poetry-core.patch";
url = "https://github.com/rss2email/rss2email/commit/183a17aefe4eb66f898cf088519b1e845559f2bd.patch";
hash = "sha256-SoWahlOJ7KkaHMwOrKIBgwEz8zJQrSXVD1w2wiV1phE=";
})
];
outputs = [
"out"
"man"
"doc"
];
postPatch = ''
# sendmail executable is called from PATH instead of sbin by default
substituteInPlace rss2email/config.py \
--replace-fail '/usr/sbin/sendmail' 'sendmail'
'';
build-system = with python3Packages; [
poetry-core
];
dependencies = with python3Packages; [
feedparser
html2text
];
postInstall = ''
install -Dm 644 r2e.1 $man/share/man/man1/r2e.1
# an alias for better finding the manpage
ln -s -T r2e.1 $man/share/man/man1/rss2email.1
# copy documentation
mkdir -p $doc/share/doc/rss2email
cp AUTHORS COPYING CHANGELOG README.rst $doc/share/doc/rss2email/
'';
nativeCheckInputs = [
python3Packages.unittestCheckHook
];
unittestFlagsArray = [
"-s"
"test"
];
meta = with lib; {
description = "Tool that converts RSS/Atom newsfeeds to email";
homepage = "https://pypi.python.org/pypi/rss2email";
license = licenses.gpl2;
maintainers = with maintainers; [ ekleog ];
mainProgram = "r2e";
};
passthru.tests = {
smoke-test = nixosTests.rss2email;
};
}

View File

@@ -0,0 +1,53 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
kdePackages,
wrapGAppsHook4,
}:
stdenv.mkDerivation rec {
pname = "rssguard";
version = "4.8.6";
src = fetchFromGitHub {
owner = "martinrotter";
repo = "rssguard";
tag = version;
sha256 = "sha256-2gwzk23t9WRHrXlASzba9HQRijHjH0nfWsBjMcqgq68=";
};
buildInputs = [
kdePackages.qtwebengine
kdePackages.qttools
kdePackages.mpvqt
kdePackages.full
];
nativeBuildInputs = [
cmake
wrapGAppsHook4
kdePackages.wrapQtAppsHook
];
cmakeFlags = with lib; [
(cmakeFeature "CMAKE_BUILD_TYPE" "\"Release\"")
];
meta = {
description = "Simple RSS/Atom feed reader with online synchronization";
mainProgram = "rssguard";
longDescription = ''
RSS Guard is a simple, light and easy-to-use RSS/ATOM feed aggregator
developed using Qt framework and with online feed synchronization support
for ownCloud/Nextcloud.
'';
homepage = "https://github.com/martinrotter/rssguard";
changelog = "https://github.com/martinrotter/rssguard/releases/tag/${version}";
license = lib.licenses.gpl3Plus;
platforms = lib.platforms.linux;
maintainers = with lib.maintainers; [
jluttine
tebriel
];
};
}

View File

@@ -0,0 +1,30 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Guanran Wang <guanran928@outlook.com>
Date: Tue, 9 Jul 2024 16:49:41 +0800
Subject: [PATCH] fix git hash
---
lib/utils/git-hash.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/lib/utils/git-hash.ts b/lib/utils/git-hash.ts
index 9a8131696..f1f568fb4 100644
--- a/lib/utils/git-hash.ts
+++ b/lib/utils/git-hash.ts
@@ -1,14 +1,6 @@
import { execSync } from 'child_process';
-let gitHash = process.env.HEROKU_SLUG_COMMIT?.slice(0, 8) || process.env.VERCEL_GIT_COMMIT_SHA?.slice(0, 8);
-let gitDate: Date | undefined;
-if (!gitHash) {
- try {
- gitHash = execSync('git rev-parse HEAD').toString().trim().slice(0, 8);
- gitDate = new Date(execSync('git log -1 --format=%cd').toString().trim());
- } catch {
- gitHash = 'unknown';
- }
-}
+let gitHash = '@GIT_HASH@'.slice(0, 8);
+let gitDate = new Date('Thu Jan 1 00:00:00 1970 +0000');
export { gitHash, gitDate };

View File

@@ -0,0 +1,18 @@
diff --git a/scripts/workflow/build-routes.ts b/scripts/workflow/build-routes.ts
index 9807cfc..b9dcfb9 100644
--- a/scripts/workflow/build-routes.ts
+++ b/scripts/workflow/build-routes.ts
@@ -4,6 +4,7 @@ import { parse } from 'tldts';
import fs from 'node:fs';
import path from 'node:path';
import toSource from 'tosource';
+import { exit } from 'node:process';
import { getCurrentPath } from '../../lib/utils/helpers';
const __dirname = getCurrentPath(import.meta.url);
@@ -73,3 +74,5 @@ fs.writeFileSync(path.join(__dirname, '../../assets/build/radar-rules.js'), `(${
fs.writeFileSync(path.join(__dirname, '../../assets/build/maintainers.json'), JSON.stringify(maintainers, null, 2));
fs.writeFileSync(path.join(__dirname, '../../assets/build/routes.json'), JSON.stringify(namespaces, null, 2));
fs.writeFileSync(path.join(__dirname, '../../assets/build/routes.js'), `export default ${JSON.stringify(namespaces, null, 2)}`.replaceAll(/"module": "(.*)"\n/g, `"module": $1\n`));
+
+exit(0);

View File

@@ -0,0 +1,82 @@
{
lib,
fetchFromGitHub,
makeBinaryWrapper,
nodejs,
pnpm_9,
replaceVars,
stdenv,
}:
let
pnpm = pnpm_9;
in
stdenv.mkDerivation (finalAttrs: {
pname = "rsshub";
version = "0-unstable-2025-05-31";
src = fetchFromGitHub {
owner = "DIYgod";
repo = "RSSHub";
rev = "2dce2e32dd5f4dade2fc915ac8384c953e11cc83";
hash = "sha256-gS/t6O3MishJgi2K9hV22hT95oYHfm44cJqrUo2GPlM=";
};
patches = [
(replaceVars ./0001-fix-git-hash.patch {
"GIT_HASH" = finalAttrs.src.rev;
})
./0002-fix-network-call.patch
];
pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src;
fetcherVersion = 1;
hash = "sha256-7qh6YZbIH/kHVssDZxHY7X8bytrnMcUq0MiJzWZYItc=";
};
nativeBuildInputs = [
makeBinaryWrapper
nodejs
pnpm.configHook
];
buildPhase = ''
runHook preBuild
pnpm build
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin $out/lib/rsshub
cp -r lib node_modules assets api package.json tsconfig.json $out/lib/rsshub
runHook postInstall
'';
preFixup = ''
makeWrapper ${lib.getExe nodejs} $out/bin/rsshub \
--chdir "$out/lib/rsshub" \
--set "NODE_ENV" "production" \
--set "NO_LOGFILES" "true" \
--set "TSX_TSCONFIG_PATH" "$out/lib/rsshub/tsconfig.json" \
--append-flags "$out/lib/rsshub/node_modules/tsx/dist/cli.mjs" \
--append-flags "$out/lib/rsshub/lib/index.ts"
'';
meta = {
description = "RSS feed generator";
longDescription = ''
RSSHub is an open source, easy to use, and extensible RSS feed generator.
It's capable of generating RSS feeds from pretty much everything.
RSSHub delivers millions of contents aggregated from all kinds of sources,
our vibrant open source community is ensuring the deliver of RSSHub's new routes,
new features and bug fixes.
'';
homepage = "https://docs.rsshub.app";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ Guanran928 ];
mainProgram = "rsshub";
platforms = lib.platforms.all;
};
})

View File

@@ -0,0 +1,29 @@
{
lib,
python3,
fetchPypi,
}:
python3.pkgs.buildPythonApplication rec {
pname = "rsstail-py";
version = "0.6.0";
pyproject = true;
src = fetchPypi {
pname = "rsstail";
inherit version;
hash = "sha256-nAqk8qomG02SVq2cbQAO0MidGbxCHCk2kPNB+7YgGOQ=";
};
build-system = with python3.pkgs; [ setuptools ];
dependencies = with python3.pkgs; [ feedparser ];
meta = {
description = "Command-line syndication feed monitor";
mainProgram = "rsstail";
homepage = "https://github.com/gvalkov/rsstail.py";
changelog = "https://github.com/gvalkov/rsstail.py/releases/tag/v${version}";
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [ zoriya ];
};
}

View File

@@ -0,0 +1,43 @@
{
lib,
stdenv,
fetchFromGitHub,
libmrss,
}:
stdenv.mkDerivation (final: {
pname = "rsstail";
version = "2.2";
src = fetchFromGitHub {
owner = "folkertvanheusden";
repo = "rsstail";
rev = "v${final.version}";
hash = "sha256-wbdf9zhwMN7QhJ5WoJo1Csu0EcKUTON8Q2Ic5scbn7I=";
};
buildInputs = [ libmrss ];
makeFlags = [ "prefix=$(out)" ];
enableParallelBuilding = true;
env = lib.optionalAttrs stdenv.hostPlatform.isDarwin {
NIX_LDFLAGS = "-liconv";
};
# just runs cppcheck linter
doCheck = false;
meta = with lib; {
description = "Monitor RSS feeds for new entries";
mainProgram = "rsstail";
longDescription = ''
RSSTail is more or less an RSS reader: it monitors an RSS feed and if it
detects a new entry it'll emit only that new entry.
'';
homepage = "https://www.vanheusden.com/rsstail/";
license = licenses.gpl2Only;
maintainers = [ maintainers.Necior ];
platforms = platforms.unix;
};
})

View File

@@ -0,0 +1,38 @@
{
lib,
python3,
fetchPypi,
}:
python3.pkgs.buildPythonPackage rec {
pname = "rst2html5";
version = "2.0.1";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-MJmYyF+rAo8vywGizNyIbbCvxDmCYueVoC6pxNDzKuk=";
};
build-system = with python3.pkgs; [ poetry-core ];
dependencies = with python3.pkgs; [
beautifulsoup4
docutils
genshi
pygments
];
# Tests are not shipped as PyPI releases
doCheck = false;
pythonImportsCheck = [ "rst2html5" ];
meta = with lib; {
description = "Converts ReSTructuredText to (X)HTML5";
homepage = "https://rst2html5.readthedocs.io/";
license = licenses.mit;
maintainers = [ ];
mainProgram = "rst2html5";
};
}

View File

@@ -0,0 +1,41 @@
{
lib,
fetchFromGitHub,
python3,
}:
python3.pkgs.buildPythonApplication rec {
pname = "rstfmt";
version = "0.0.14";
pyproject = true;
src = fetchFromGitHub {
owner = "dzhu";
repo = "rstfmt";
tag = "v${version}";
hash = "sha256-zvmKgNzfxyWYHoaD+q84I48r1Mpp4kU4oIGAwMSRRlA=";
};
build-system = with python3.pkgs; [ setuptools ];
dependencies = with python3.pkgs; [
aiohttp
black
docutils
sphinx
];
# Project has no unittest just sample files
doCheck = false;
pythonImportsCheck = [ "rstfmt" ];
meta = {
description = "Formatter for reStructuredText";
homepage = "https://github.com/dzhu/rstfmt";
changelog = "https://github.com/dzhu/rstfmt/releases/tag/${src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "rstfmt";
};
}

View File

@@ -0,0 +1,41 @@
diff --git a/src/cpp/core/libclang/LibClang.cpp b/src/cpp/core/libclang/LibClang.cpp
index f166a43b37..d8024b2ce7 100644
--- a/src/cpp/core/libclang/LibClang.cpp
+++ b/src/cpp/core/libclang/LibClang.cpp
@@ -84,34 +84,13 @@ std::vector<std::string> systemClangVersions()
// line tools since we request their installation in other
// contexts as well)
clangVersions = {
- "/Library/Developer/CommandLineTools/usr/lib/libclang.dylib"
+ "@libclang@/lib/libclang.dylib"
};
#elif defined(__unix__)
// default set of versions
clangVersions = {
- "/usr/lib/libclang.so",
- "/usr/lib/llvm/libclang.so",
- "/usr/lib64/libclang.so",
- "/usr/lib64/llvm/libclang.so",
+ "@libclang@/lib/libclang.so",
};
-
- // iterate through the set of available 'llvm' directories
- for (const char* prefix : {"/usr/lib", "/usr/lib64"})
- {
- FilePath prefixPath(prefix);
- if (!prefixPath.exists())
- continue;
-
- std::vector<FilePath> directories;
- Error error = prefixPath.getChildren(directories);
- if (error)
- LOG_ERROR(error);
-
- // generate a path for each 'llvm' directory
- for (const FilePath& path : directories)
- if (path.getFilename().find("llvm") == 0)
- clangVersions.push_back(path.completePath("lib/libclang.so.1").getAbsolutePath());
- }
#endif
return clangVersions;

View File

@@ -0,0 +1,30 @@
diff --git a/src/node/desktop/CMakeLists.txt b/src/node/desktop/CMakeLists.txt
index bccf5b3..71e10a7 100644
--- a/src/node/desktop/CMakeLists.txt
+++ b/src/node/desktop/CMakeLists.txt
@@ -117,11 +117,7 @@ file(MAKE_DIRECTORY "${ELECTRON_BINARY_DIR}")
file(
COPY "${CMAKE_CURRENT_SOURCE_DIR}/"
DESTINATION "${ELECTRON_BINARY_DIR}/"
- REGEX "/.webpack$" EXCLUDE
- REGEX "/build$" EXCLUDE
- REGEX "/bin$" EXCLUDE
- REGEX "/out$" EXCLUDE
- REGEX "/node_modules$" EXCLUDE)
+)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/src/main/build-info.ts.in
diff --git a/src/node/desktop/package.json b/src/node/desktop/package.json
index df92166..47ca4b4 100644
--- a/src/node/desktop/package.json
+++ b/src/node/desktop/package.json
@@ -10,7 +10,7 @@
"scripts": {
"clean": "ts-node scripts/clean.ts",
"lint": "eslint ./src ./test",
- "package": "npm ci && electron-forge package",
+ "package": "electron-forge package",
"start": "electron-forge start -- --no-sandbox",
"debug": "electron-forge start --inspect-electron",
"fullstart": "npm install && electron-forge start",

View File

@@ -0,0 +1,16 @@
diff --git a/src/gwt/build.xml b/src/gwt/build.xml
index 27ffe33..4218678 100644
--- a/src/gwt/build.xml
+++ b/src/gwt/build.xml
@@ -139,11 +139,6 @@
<echo message="panmirror minify: ${panmirror.minify}"/>
<mkdir dir="${panmirror.build.dir}"/>
- <exec executable="${yarn.bin}" dir="${panmirror.dir}" resolveexecutable="true" failonerror="true">
- <arg value="install"/>
- <arg value="--network-timeout"/>
- <arg value="240000"/>
- </exec>
<exec executable="${yarn.bin}" dir="${panmirror.dir}" resolveexecutable="true" failonerror="true">
<arg value="build"/>
<arg value="--minify"/>

View File

@@ -0,0 +1,146 @@
diff --git a/cmake/globals.cmake b/cmake/globals.cmake
index e53248b..c705d67 100644
--- a/cmake/globals.cmake
+++ b/cmake/globals.cmake
@@ -334,6 +334,7 @@ if (APPLE)
set(RSTUDIO_INSTALL_SUPPORTING RStudio.app/Contents/Resources/app)
# handles Quarto share when not stored alongside bin
set(RSTUDIO_INSTALL_RESOURCES RStudio.app/Contents/Resources)
+ set(RSTUDIO_INSTALL_ELECTRON .)
else()
set(RSTUDIO_INSTALL_BIN RStudio.app/Contents/MacOS)
set(RSTUDIO_INSTALL_SUPPORTING RStudio.app/Contents/Resources)
diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt
index 76f3acb..2910cee 100644
--- a/src/cpp/CMakeLists.txt
+++ b/src/cpp/CMakeLists.txt
@@ -243,7 +243,7 @@ endif()
# determine whether we should statically link boost. we always do this
# unless we are building a non-packaged build on linux (in which case
# boost dynamic libraries are presumed to be installed on the system ldpath)
-if(APPLE OR WIN32 OR RSTUDIO_PACKAGE_BUILD)
+if(WIN32 OR RSTUDIO_PACKAGE_BUILD)
set(Boost_USE_STATIC_LIBS ON)
endif()
@@ -483,7 +483,7 @@ endif()
# find SOCI libraries
if(UNIX)
- if(NOT APPLE AND RSTUDIO_USE_SYSTEM_SOCI)
+ if(RSTUDIO_USE_SYSTEM_SOCI)
find_library(SOCI_CORE_LIB NAMES "libsoci_core.a" "soci_core" REQUIRED)
find_library(SOCI_SQLITE_LIB NAMES "libsoci_sqlite3.a" "soci_sqlite3" REQUIRED)
if(RSTUDIO_PRO_BUILD)
diff --git a/src/node/CMakeNodeTools.txt b/src/node/CMakeNodeTools.txt
index 40ae0f3..756fd5f 100644
--- a/src/node/CMakeNodeTools.txt
+++ b/src/node/CMakeNodeTools.txt
@@ -27,17 +27,7 @@ endif()
# set cmake env vars for node (NODEJS) and node tools, like YARN, and NPM
-if(APPLE AND UNAME_M STREQUAL arm64)
-
- # make sure we're using arm64 binaries of node / npm for arm64 builds
- set(NODEJS
- "${CMAKE_CURRENT_LIST_DIR}/../../dependencies/common/node/${RSTUDIO_NODE_VERSION}-arm64/bin/node")
- set(NPM
- "${CMAKE_CURRENT_LIST_DIR}/../../dependencies/common/node/${RSTUDIO_NODE_VERSION}-arm64/bin/npm")
- set(NPX
- "${CMAKE_CURRENT_LIST_DIR}/../../dependencies/common/node/${RSTUDIO_NODE_VERSION}-arm64/bin/npx")
-
-else()
+if(true)
# Detect node.js, npm, and npx; use versions supplied by the dependency scripts
find_program(NODEJS
diff --git a/src/node/desktop/CMakeLists.txt b/src/node/desktop/CMakeLists.txt
index bccf5b3..0cc798a 100644
--- a/src/node/desktop/CMakeLists.txt
+++ b/src/node/desktop/CMakeLists.txt
@@ -236,16 +236,21 @@ if(WIN32)
install(FILES ${VCRUNTIME_X86_FILES} DESTINATION "${RSTUDIO_INSTALL_BIN}/x86")
install(FILES ${VCRUNTIME_X64_FILES} DESTINATION "${RSTUDIO_INSTALL_BIN}")
-elseif(LINUX)
+elseif(LINUX OR APPLE)
- if(UNAME_M STREQUAL aarch64)
+ if(UNAME_M STREQUAL aarch64 OR UNAME_M STREQUAL arm64)
set(ELECTRON_ARCH arm64)
else()
set(ELECTRON_ARCH x64)
endif()
+ if(APPLE)
+ set(ELECTRON_PLATFORM darwin)
+ else()
+ set(ELECTRON_PLATFORM linux)
+ endif()
install(
- DIRECTORY "${ELECTRON_BINARY_DIR}/out/RStudio-linux-${ELECTRON_ARCH}/"
+ DIRECTORY "${ELECTRON_BINARY_DIR}/out/RStudio-${ELECTRON_PLATFORM}-${ELECTRON_ARCH}/"
DIRECTORY_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
diff --git a/src/node/desktop/src/main/session-launcher.ts b/src/node/desktop/src/main/session-launcher.ts
index 94f56ac..fe7d5d9 100644
--- a/src/node/desktop/src/main/session-launcher.ts
+++ b/src/node/desktop/src/main/session-launcher.ts
@@ -91,29 +91,9 @@ function launchProcess(absPath: FilePath, argList: string[]): ChildProcess {
// DYLD_INSERT_LIBRARIES to inject the library we wish to use
const rHome = new FilePath(getenv('R_HOME'));
const rLib = rHome.completePath('lib/libR.dylib');
- const dyldArgs = [
- '-e',
- `DYLD_INSERT_LIBRARIES=${rLib.getAbsolutePath()}`,
- '-e',
- `DYLD_FALLBACK_LIBRARY_PATH=${dyldFallbackLibraryPath}`,
- ];
-
- // launch via /usr/bin/arch, so we can control whether the OS requests
- // x86 or arm64 versions of the libraries in the launched rsession
- const path = absPath.getAbsolutePath();
- if (process.arch === 'arm64') {
- const fileInfo = execSync(`/usr/bin/file "${rLib}"`, { encoding: 'utf-8' });
- if (fileInfo.indexOf('arm64') === -1 && fileInfo.indexOf('x86_64') !== -1) {
- argList = ['-x86_64', ...dyldArgs, path, ...argList];
- absPath = new FilePath('/usr/bin/arch');
- } else {
- argList = ['-arm64', ...dyldArgs, path, ...argList];
- absPath = new FilePath('/usr/bin/arch');
- }
- } else {
- argList = ['-x86_64', ...dyldArgs, path, ...argList];
- absPath = new FilePath('/usr/bin/arch');
- }
+
+ env['DYLD_INSERT_LIBRARIES'] = rLib.getAbsolutePath();
+ env['DYLD_FALLBACK_LIBRARY_PATH'] = dyldFallbackLibraryPath;
}
const rsessionOptions = new LogOptions('rsession');
@@ -566,22 +546,6 @@ export class SessionLauncher {
}
}
- // on macOS, we need to look at R and figure out if we should be trying to run
- // with the arm64 session binary (rsession-arm64) or with the x64 session binary (rsession)
- if (app.isPackaged && process.platform === 'darwin' && process.arch === 'arm64') {
- const rHome = getenv('R_HOME');
- const rLibPath = `${rHome}/lib/libR.dylib`;
- logger().logDebug(`$ /usr/bin/file "${rLibPath}"`);
- const fileInfo = execSync(`/usr/bin/file "${rLibPath}"`, { encoding: 'utf-8' });
- logger().logDebug(fileInfo);
- if (fileInfo.indexOf('arm64') !== -1) {
- this.sessionPath = this.sessionPath.getParent().completeChildPath('rsession-arm64');
- logger().logDebug(`R is arm64; using ${this.sessionPath}`);
- } else {
- logger().logDebug(`R is x86_64; using ${this.sessionPath}`);
- }
- }
-
// if we're running automation tests, set that up now
if (app.commandLine.hasSwitch('run-automation')) {
argList.push('--run-automation');

View File

@@ -0,0 +1,77 @@
diff --git a/cmake/globals.cmake b/cmake/globals.cmake
index e53248b..179e3cb 100644
--- a/cmake/globals.cmake
+++ b/cmake/globals.cmake
@@ -23,11 +23,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL Linux)
set(LINUX TRUE CACHE INTERNAL "")
endif()
-# read /etc/os-release
-if(LINUX)
- include(OsRelease)
-endif()
-
# version info
if ("$ENV{RSTUDIO_VERSION_MAJOR}" STREQUAL "")
string(TIMESTAMP CPACK_PACKAGE_VERSION_MAJOR "%Y")
diff --git a/cmake/modules/OsRelease.cmake b/cmake/modules/OsRelease.cmake
deleted file mode 100644
index 81a9e1f..0000000
--- a/cmake/modules/OsRelease.cmake
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# OsRelease.cmake
-#
-# Copyright (C) 2022 by Posit Software, PBC
-#
-# This program is licensed to you under the terms of version 3 of the
-# GNU Affero General Public License. This program is distributed WITHOUT
-# ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
-# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
-# AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
-#
-#
-
-# reads and parses /etc/os-release into CMake variables
-file(STRINGS "/etc/os-release" OS_RELEASE)
-foreach(LINE ${OS_RELEASE})
- string(FIND "${LINE}" "=" INDEX)
- string(SUBSTRING "${LINE}" 0 "${INDEX}" KEY)
- math(EXPR INDEX "${INDEX} + 1")
- string(SUBSTRING "${LINE}" "${INDEX}" -1 VALUE)
- separate_arguments(VALUE UNIX_COMMAND "${VALUE}")
- set("OS_RELEASE_${KEY}" "${VALUE}" CACHE INTERNAL "/etc/os-release: ${KEY}")
-endforeach()
-
diff --git a/package/linux/CMakeLists.txt b/package/linux/CMakeLists.txt
index 2c55ebe..7ac9651 100644
--- a/package/linux/CMakeLists.txt
+++ b/package/linux/CMakeLists.txt
@@ -16,7 +16,7 @@
# configure cpack install location
set(CPACK_SET_DESTDIR "ON")
set(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
-message(STATUS "Packaging RStudio for ${OS_RELEASE_PRETTY_NAME}")
+message(STATUS "Packaging RStudio for Nix")
# detect architecture (packaging platform specific)
find_program(DPKG_EXECUTABLE dpkg)
@@ -42,17 +42,6 @@ if(EXISTS "/etc/redhat-release")
endif()
endif()
-# set libssl dependency
-if(OS_RELEASE_ID STREQUAL "ubuntu")
- if(OS_RELEASE_VERSION_ID VERSION_GREATER_EQUAL "22.04")
- set(RSTUDIO_DEBIAN_DEPENDS_SSL "libssl-dev")
- else()
- set(RSTUDIO_DEBIAN_DEPENDS_SSL "libssl1.0.0 | libssl1.0.2 | libssl1.1")
- endif()
-else()
- set(RSTUDIO_DEBIAN_DEPENDS_SSL "libssl-dev")
-endif()
-
# configuration specific
if(RSTUDIO_SERVER)

View File

@@ -0,0 +1,375 @@
{
lib,
stdenv,
server ? false, # build server version
fetchFromGitHub,
fetchNpmDeps,
fetchYarnDeps,
fetchzip,
replaceVars,
runCommand,
ant,
cacert,
cmake,
git,
jdk,
makeWrapper,
nodejs,
npmHooks,
xcbuild,
yarn,
yarnConfigHook,
zip,
apple-sdk_11,
boost187,
electron_37,
fontconfig,
gnumake,
hunspellDicts,
libuuid,
llvmPackages,
openssl,
pam,
pandoc,
quarto,
R,
soci,
sqlite,
zlib,
nixosTests,
}:
let
electron = electron_37;
mathJaxSrc = fetchzip {
url = "https://s3.amazonaws.com/rstudio-buildtools/mathjax-27.zip";
hash = "sha256-J7SZK/9q3HcXTD7WFHxvh++ttuCd89Vc4SEBrUEU0AI=";
};
# Note: we could build this from source, but let's just do what upstream does for now
gwt = fetchzip {
url = "https://rstudio-buildtools.s3.us-east-1.amazonaws.com/gwt/gwt-2.12.2.tar.gz";
stripRoot = false;
hash = "sha256-DgcCiheYeP7sISduz6E3WhTty2nSs14k2OYIG93KmkY=";
};
quartoSrc = fetchFromGitHub {
owner = "quarto-dev";
repo = "quarto";
# Note: rev should ideally be the last commit of the release/rstudio-[codename] branch
# Note: This is the last working revision, because https://github.com/quarto-dev/quarto/pull/757
# started using `file:` in the lockfile, which our fetcher can't handle
rev = "faef822a085df65809adf55fb77c273e9cdb87b9";
hash = "sha256-DLpVYl0OkaBQtkFinJAS2suZ8gqx9BVS5HBaYrrT1HA=";
};
hunspellDictionaries = lib.filter lib.isDerivation (lib.unique (lib.attrValues hunspellDicts));
# These dicts contain identically-named dict files, so we only keep the
# -large versions in case of clashes
largeDicts = lib.filter (d: lib.hasInfix "-large-wordlist" d.name) hunspellDictionaries;
otherDicts = lib.filter (
d: !(lib.hasAttr "dictFileName" d && lib.elem d.dictFileName (map (d: d.dictFileName) largeDicts))
) hunspellDictionaries;
dictionaries = largeDicts ++ otherDicts;
# rstudio assumes quarto bundles pandoc into bin/tools/
quartoWrapper = runCommand "quarto-wrapper" { } ''
mkdir -p $out/bin/tools
ln -s ${lib.getExe pandoc} $out/bin/tools/pandoc
ln -s ${lib.getExe quarto} $out/bin/quarto
ln -s ${quarto}/share $out/share
'';
in
stdenv.mkDerivation rec {
pname = "RStudio";
version = "2025.09.1+401";
src = fetchFromGitHub {
owner = "rstudio";
repo = "rstudio";
tag = "v${version}";
hash = "sha256-FVK/1trMVFEv17HbUpaISC9gyE2HBKtdZWjxbgdXALc=";
};
# sources fetched into _deps via cmake's FetchContent
extSrcs = stdenv.mkDerivation {
name = "${pname}-${version}-ext-srcs";
inherit src;
nativeBuildInputs = [
cacert
cmake
git
];
installPhase = ''
runHook preInstall
# this will fail, since this is not meant to be a cmake entrypoint
# but it will fetch the dependencies regardless
cmake -S src/cpp/ext -B build || true
mkdir -p "$out"
cp -r build/_deps/*-src "$out/"
find "$out" -name .git -print0 | xargs -0 rm -rf
runHook postInstall
'';
dontConfigure = true;
dontBuild = true;
dontFixup = true;
outputHash = "sha256-pXpp42hjjKrV75f2XLDYK7A9lrvWhuQBDJ0oymXE8Fg=";
outputHashAlgo = "sha256";
outputHashMode = "recursive";
};
nativeBuildInputs = [
cmake
git
ant
jdk
nodejs
yarn
yarnConfigHook
zip
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
xcbuild
]
++ lib.optionals (!server) [
makeWrapper
(nodejs.python.withPackages (ps: [ ps.setuptools ]))
npmHooks.npmConfigHook
];
buildInputs = [
boost187
libuuid
openssl
R
soci
sqlite.dev
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
apple-sdk_11
]
++ lib.optionals (!server) [
fontconfig
]
++ lib.optionals server [
pam
zlib
];
cmakeFlags = [
(lib.cmakeFeature "RSTUDIO_TARGET" (if server then "Server" else "Electron"))
# don't try fetching the external dependencies already fetched in extSrcs
(lib.cmakeBool "FETCHCONTENT_FULLY_DISCONNECTED" true)
(lib.cmakeBool "RSTUDIO_USE_SYSTEM_BOOST" true)
(lib.cmakeBool "RSTUDIO_USE_SYSTEM_SOCI" true)
(lib.cmakeBool "RSTUDIO_DISABLE_CHECK_FOR_UPDATES" true)
(lib.cmakeBool "QUARTO_ENABLED" true)
(lib.cmakeBool "RSTUDIO_ENABLE_COPILOT" false) # copilot-language-server is unfree
(lib.cmakeBool "RSTUDIO_CRASHPAD_ENABLED" false) # This is a NOOP except on x86_64-darwin
(lib.cmakeFeature "CMAKE_INSTALL_PREFIX" (
(placeholder "out") + (if stdenv.hostPlatform.isDarwin then "/Applications" else "/lib/rstudio")
))
]
++ lib.optionals (!server) [
(lib.cmakeBool "RSTUDIO_INSTALL_FREEDESKTOP" stdenv.hostPlatform.isLinux)
];
env = {
ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
# on Darwin, cmake uses find_library to locate R instead of using the PATH
NIX_LDFLAGS = "-L${R}/lib/R/lib";
RSTUDIO_VERSION_MAJOR = lib.versions.major version;
RSTUDIO_VERSION_MINOR = lib.versions.minor version;
RSTUDIO_VERSION_PATCH = lib.versions.patch version;
RSTUDIO_VERSION_SUFFIX = "+" + toString (lib.tail (lib.splitString "+" version));
};
patches = [
# Hack RStudio to only use the input R and provided libclang.
(replaceVars ./r-location.patch {
R = lib.getBin R;
})
(replaceVars ./clang-location.patch {
libclang = lib.getLib llvmPackages.libclang;
})
./ignore-etc-os-release.patch
./dont-yarn-install.patch
./dont-npm-ci.patch
./fix-darwin.patch
];
postPatch = ''
# fix .desktop Exec field
substituteInPlace src/node/desktop/resources/freedesktop/rstudio.desktop.in \
--replace-fail "\''${CMAKE_INSTALL_PREFIX}/rstudio" "rstudio"
# set install path of freedesktop files
substituteInPlace src/node/desktop/CMakeLists.txt \
--replace-fail "/usr/share" "$out/share"
'';
yarnOfflineCache = fetchYarnDeps {
src = quartoSrc;
hash = "sha256-9ObJ3fzxPyGVfIgBj4BhCWqkrG1A2JqZsCreJA+1fWQ=";
};
dontYarnInstallDeps = true; # will call manually in preConfigure
npmRoot = "src/node/desktop";
# don't build native modules with node headers
npmFlags = [ "--ignore-scripts" ];
makeCacheWritable = true;
npmDeps = fetchNpmDeps {
name = "rstudio-${version}-npm-deps";
inherit src;
postPatch = "cd ${npmRoot}";
hash = "sha256-HfJsm/UauA5Vdi22WfTJGiI9K979Sw7RYApYdZU0AUs=";
};
preConfigure = ''
# populate the directories used by cmake's FetchContent
mkdir -p build/_deps
cp -r "$extSrcs"/* build/_deps
chmod -R u+w build/_deps
# set up node_modules directory inside quarto so that panmirror can be built
mkdir src/gwt/lib/quarto
cp -r --no-preserve=all ${quartoSrc}/* src/gwt/lib/quarto
pushd src/gwt/lib/quarto
yarnConfigHook
popd
### set up dependencies that will be copied into the result
# note: only the directory names have to match upstream, the actual versions don't
# note: symlinks are preserved
mkdir dependencies/dictionaries
for dict in ${builtins.concatStringsSep " " dictionaries}; do
for i in "$dict/share/hunspell/"*; do
ln -s $i dependencies/dictionaries/
done
done
ln -s ${gwt} dependencies/common/gwtproject
ln -s ${quartoWrapper} dependencies/quarto
# version in dependencies/common/install-mathjax
ln -s ${mathJaxSrc} dependencies/mathjax-27
mkdir -p dependencies/common/node
# node used by cmake
# version in cmake/globals.cmake (RSTUDIO_NODE_VERSION)
ln -s ${nodejs} dependencies/common/node/22.13.1
''
+ lib.optionalString (!server) ''
pushd $npmRoot
# use electron's headers to make node-gyp compile against the electron ABI
export npm_config_nodedir="${electron.headers}"
### override the detected electron version
substituteInPlace node_modules/@electron-forge/core-utils/dist/electron-version.js \
--replace-fail "return version" "return '${electron.version}'"
### create the electron archive to be used by electron-packager
cp -r ${electron.dist} electron-dist
chmod -R u+w electron-dist
pushd electron-dist
zip -0Xqr ../electron.zip .
popd
rm -r electron-dist
# force @electron/packager to use our electron instead of downloading it
substituteInPlace node_modules/@electron/packager/dist/packager.js \
--replace-fail "await this.getElectronZipPath(downloadOpts)" "'$(pwd)/electron.zip'"
# Work around known nan issue for electron_33 and above
# https://github.com/nodejs/nan/issues/978
substituteInPlace node_modules/nan/nan.h \
--replace-fail '#include "nan_scriptorigin.h"' ""
# now that we patched everything, we still have to run the scripts we ignored with --ignore-scripts
npm rebuild
popd
'';
postInstall = ''
mkdir -p $out/bin
''
+ lib.optionalString (server && stdenv.hostPlatform.isLinux) ''
ln -s $out/lib/rstudio/bin/{crash-handler-proxy,postback,r-ldpath,rpostback,rserver,rserver-pam,rsession,rstudio-server} $out/bin
''
+ lib.optionalString (!server && stdenv.hostPlatform.isLinux) ''
# remove unneeded electron files, since we'll wrap the app with our own electron
shopt -s extglob
rm -r $out/lib/rstudio/!(locales|resources|resources.pak)
makeWrapper ${lib.getExe electron} "$out/bin/rstudio" \
--add-flags "$out/lib/rstudio/resources/app/" \
--set-default ELECTRON_FORCE_IS_PACKAGED 1 \
--suffix PATH : ${lib.makeBinPath [ gnumake ]}
ln -s $out/lib/rstudio/resources/app/bin/{diagnostics,rpostback} $out/bin
''
+ lib.optionalString (server && stdenv.hostPlatform.isDarwin) ''
ln -s $out/Applications/RStudio.app/Contents/MacOS/{crash-handler-proxy,postback,r-ldpath,rpostback,rserver,rserver-pam,rsession,rstudio-server} $out/bin
''
+ lib.optionalString (!server && stdenv.hostPlatform.isDarwin) ''
# electron can't find its files if we use a symlink here
makeWrapper $out/Applications/RStudio.app/Contents/MacOS/RStudio $out/bin/rstudio
ln -s $out/Applications/RStudio.app/Contents/Resources/app/bin/{diagnostics,rpostback} $out/bin
'';
passthru = {
inherit server;
tests = lib.optionalAttrs stdenv.hostPlatform.isLinux {
inherit (nixosTests) rstudio-server;
};
};
meta = {
changelog = "https://github.com/rstudio/rstudio/tree/${src.rev}/version/news";
description = "Set of integrated tools for the R language";
homepage = "https://www.rstudio.com/";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [
ciil
cfhammill
tomasajt
];
mainProgram = "rstudio" + lib.optionalString server "-server";
# rstudio-server on darwin is only partially supported by upstream
platforms = lib.platforms.linux ++ lib.optionals (!server) lib.platforms.darwin;
};
}

View File

@@ -0,0 +1,41 @@
diff --git a/src/cpp/core/r_util/REnvironmentPosix.cpp b/src/cpp/core/r_util/REnvironmentPosix.cpp
index a4e964d49d..512707801b 100644
--- a/src/cpp/core/r_util/REnvironmentPosix.cpp
+++ b/src/cpp/core/r_util/REnvironmentPosix.cpp
@@ -108,13 +108,7 @@ FilePath systemDefaultRScript(std::string* pErrMsg)
{
// check fallback paths
std::vector<std::string> rScriptPaths = {
- "/usr/bin/R",
- "/usr/local/bin/R",
- "/opt/local/bin/R",
- #ifdef __APPLE__
- "/opt/homebrew/bin/R",
- "/Library/Frameworks/R.framework/Resources/bin/R",
- #endif
+ "@R@/bin/R"
};
return scanForRScript(rScriptPaths, pErrMsg);
@@ -226,8 +220,7 @@ FilePath systemDefaultRScript(std::string* pErrMsg)
// scan in standard locations as a fallback
std::string scanErrMsg;
std::vector<std::string> rScriptPaths;
- rScriptPaths.push_back("/usr/local/bin/R");
- rScriptPaths.push_back("/usr/bin/R");
+ rScriptPaths.push_back("@R@/bin/R");
FilePath scriptPath = scanForRScript(rScriptPaths, &scanErrMsg);
if (scriptPath.isEmpty())
{
diff --git a/src/node/desktop/src/main/detect-r.ts b/src/node/desktop/src/main/detect-r.ts
index 5b768b7cbf..c0efeac0fe 100644
--- a/src/node/desktop/src/main/detect-r.ts
+++ b/src/node/desktop/src/main/detect-r.ts
@@ -305,6 +305,7 @@ writeLines(sep = "\x1F", c(
}
export function scanForR(): Expected<string> {
+ return ok('@R@/bin/R');
// if the RSTUDIO_WHICH_R environment variable is set, use that
// note that this does not pick up variables set in a user's bash profile, for example
const rstudioWhichR = getenv('RSTUDIO_WHICH_R');

View File

@@ -0,0 +1,42 @@
{
lib,
buildGoModule,
fetchFromGitHub,
makeWrapper,
rsync,
}:
buildGoModule (finalAttrs: {
pname = "rsyncy";
version = "2.1.0";
src = fetchFromGitHub {
owner = "laktak";
repo = "rsyncy";
tag = "v${finalAttrs.version}";
hash = "sha256-sy0aMYT7xrBfXB3YxLGL49jKVnRpWo5k+3mjQNAOagU=";
};
vendorHash = "sha256-vexWkbUQdkWrDJVvu2T4z4hbiCANuW0qLNFNSiTmYtY=";
ldflags = [
"-s"
"-w"
"-X main.appVersion=${finalAttrs.version}"
];
nativeBuildInputs = [ makeWrapper ];
postInstall = ''
wrapProgram $out/bin/rsyncy \
--prefix PATH : "${lib.makeBinPath [ rsync ]}"
'';
meta = {
description = "Progress bar wrapper for rsync";
homepage = "https://github.com/laktak/rsyncy";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ marie ];
mainProgram = "rsyncy";
};
})