commit: 57ac3f5b89eb8bf2177479e2e9fbaf96ee68b125
Author: Nicolas PARLANT <nicolas.parlant <AT> parhuet <DOT> fr>
AuthorDate: Fri May 2 16:33:58 2025 +0000
Commit: Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun May 4 06:07:15 2025 +0000
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=57ac3f5b
net-p2p/rtorrent: add 0.15.3
deps/iuse :
add opt lua support, 5.{3,4} for 64-bit integer
add dev-cpp/nlohmann_json (unbundled)
use myeconfargs array
arch :
due to dev-cpp/nlohmann_json, drop hppa, mips, sparc
due to net-libs/libtorrent, drop arm, arm64, riscv
using a system-json flag with p.mask to switch on bundled version
to avoid unkeywording would be nonsense.
Package moving to cxx-17 by default, some pending bugs should be fixed.
Bug: https://bugs.gentoo.org/946551
Signed-off-by: Nicolas PARLANT <nicolas.parlant <AT> parhuet.fr>
Part-of: https://github.com/gentoo/gentoo/pull/41912
Signed-off-by: Sam James <sam <AT> gentoo.org>
net-p2p/rtorrent/Manifest | 1 +
.../files/rtorrent-0.15.3-rtorrentlua.patch | 52 ++++++++++
.../files/rtorrent-0.15.3-struct_xmlrpc.patch | 102 +++++++++++++++++++
.../files/rtorrent-0.15.3-unbundle_json.patch | 17 ++++
net-p2p/rtorrent/rtorrent-0.15.3.ebuild | 110 +++++++++++++++++++++
5 files changed, 282 insertions(+)
diff --git a/net-p2p/rtorrent/Manifest b/net-p2p/rtorrent/Manifest
index 7f5e8e4731b2..102bfa61025f 100644
--- a/net-p2p/rtorrent/Manifest
+++ b/net-p2p/rtorrent/Manifest
@@ -1,3 +1,4 @@
DIST rtorrent-0.10.0.tar.gz 402931 BLAKE2B
3e11dafeb54fd1435176829c1dc45a9d5ad3bcbfc22a5a3738f3767891adad351d41ae2b40a859ab1bee600250833edd43507558cfdb0fdc51c4381b7336bdb2
SHA512
9c1ca99cd84e5a0984cffd48e37c9f78f66e867cd4df9b1ba0d6060fe447e1c0dd0083328de699fa7011f2b6dd6a22ac569756f24fde074401d8d9a8a11eb636
DIST rtorrent-0.9.8.tar.gz 647523 BLAKE2B
3562ed03dee3baa4a702d20c7c91b9248d9de0f25d1f8cd182863101f293a0ef13cb49164e4d16b25e72a4fbe1cc1a2fbde176d3068c749edbcb2287ef260b2b
SHA512
016685948d0290694ab9635ae218c7acd876e6d45bea1bdba3a29c545e64f5d824c5e2f6693a4c2e9200196177881d54f312d72e0a19742bd74a03bd19ca05c7
DIST rtorrent-0.15.1.tar.gz 688056 BLAKE2B
0fd0b3748e1ec13935fa900434ad5d54c6062ea48c5f8cb320d0a30cb318c09f80347ca665c61a7745770c965eee5e1cfa7e96968a2468ad06711b80be5d6e92
SHA512
e5c713601ecb0c4536b64d98ca53261db35980b04a3f274d12f51467b021d77768e7f6a2004a33a76a99f7d96e0a2c3de4605fd7ee186ba05a7c16aa96b97ea5
+DIST rtorrent-0.15.3.tar.gz 858703 BLAKE2B
9684141b9785a38ba609783aa5d294fb09f777f73beddf7d683531ad79c3fd09ed9b0a6118ef4f87678c5343d660bdd7a5ab18f5ec8e05a2c71a06588576579c
SHA512
060319e0e4a5563c29d21b41e369e14e37bf5cc949c60cf482432c4cadda82151e0c5fef8f8082fd765b777b758676907eed070840117cac30565406717cf77c
diff --git a/net-p2p/rtorrent/files/rtorrent-0.15.3-rtorrentlua.patch
b/net-p2p/rtorrent/files/rtorrent-0.15.3-rtorrentlua.patch
new file mode 100644
index 000000000000..d31c4f60072d
--- /dev/null
+++ b/net-p2p/rtorrent/files/rtorrent-0.15.3-rtorrentlua.patch
@@ -0,0 +1,52 @@
+add missing rtorrent.lua in tarball
+diff --git a/rtorrent.lua b/rtorrent.lua
+new file mode 100644
+index 0000000..5bad750
+--- /dev/null
++++ b/rtorrent.lua
+@@ -0,0 +1,42 @@
++-- the "rtorrent" table is passed in by the C++ code, modify and
++-- return it for loading.
++local args = {...}
++local rtorrent = args[1]
++
++-- Autocall
++-- Allows syntax like `rtorrent.autocall.system.hostname()`
++local mt = {}
++function mt.__call (t, ...)
++ name = table.concat(rawget(t, "__namestack"), ".")
++ success, ret = pcall(rtorrent.call, name, ...)
++ if not success then error(name..": "..ret, 2) end
++ return ret
++end
++function mt.__index (t, key)
++ ns = rawget(t, "__namestack") or {}
++ table.insert(ns, key)
++ return setmetatable({__namestack=ns}, mt)
++end
++rtorrent["autocall"] = setmetatable({}, mt)
++
++-- Autocall-config Same as autocall, but passes an empty first target
++-- implicitly, for syntax like
`rtorrent.autocall_config.session.directory.set("/tmp/")`
++local mt = {}
++function mt.__call (t, ...)
++ name = table.concat(rawget(t, "__namestack"), ".")
++ success, ret = pcall(rtorrent.call, name, "", ...)
++ if not success then error(name..": "..ret, 2) end
++ return ret
++end
++function mt.__index (t, key)
++ ns = rawget(t, "__namestack")
++ if ns == nil then
++ if _G[key] ~= nil then return _G[key] end
++ ns = {}
++ end
++ table.insert(ns, key)
++ return setmetatable({__namestack=ns}, mt)
++end
++rtorrent["autocall_config"] = setmetatable({}, mt)
++
++return rtorrent
+--
+2.49.0
+
diff --git a/net-p2p/rtorrent/files/rtorrent-0.15.3-struct_xmlrpc.patch
b/net-p2p/rtorrent/files/rtorrent-0.15.3-struct_xmlrpc.patch
new file mode 100644
index 000000000000..47acb3b10dff
--- /dev/null
+++ b/net-p2p/rtorrent/files/rtorrent-0.15.3-struct_xmlrpc.patch
@@ -0,0 +1,102 @@
+http:////github.com/rakshasa/rtorrent/pull/1463.patch
+From 57240d94336a2560f9f3713598446c361c4efabb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jorge=20Israel=20Pe=C3=B1a?= <[email protected]>
+Date: Thu, 1 May 2025 16:56:33 +0200
+Subject: [PATCH] Wrap fault struct in value
+
+---
+ src/rpc/rpc_manager.cc | 2 +-
+ src/rpc/xmlrpc_tinyxml2.cc | 2 ++
+ test/rpc/xmlrpc_test.cc | 18 +++++++++---------
+ 3 files changed, 12 insertions(+), 10 deletions(-)
+
+diff --git a/src/rpc/rpc_manager.cc b/src/rpc/rpc_manager.cc
+index 620857113..7419f8b55 100644
+--- a/src/rpc/rpc_manager.cc
++++ b/src/rpc/rpc_manager.cc
+@@ -105,7 +105,7 @@ RpcManager::process(RPCType type, const char* in_buffer,
uint32_t length, slot_r
+ return m_xmlrpc.process(in_buffer, length, callback);
+
+ } else {
+- const std::string response = "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>XML-RPC
not supported</string></value></member></struct></fault></methodResponse>";
++ const std::string response = "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>XML-RPC
not
supported</string></value></member></struct></value></fault></methodResponse>";
+ return callback(response.c_str(), response.size());
+ }
+ break;
+diff --git a/src/rpc/xmlrpc_tinyxml2.cc b/src/rpc/xmlrpc_tinyxml2.cc
+index 8be742958..8f2468f2d 100644
+--- a/src/rpc/xmlrpc_tinyxml2.cc
++++ b/src/rpc/xmlrpc_tinyxml2.cc
+@@ -313,6 +313,7 @@ print_xmlrpc_fault(int faultCode, std::string faultString,
tinyxml2::XMLPrinter*
+
+ printer->OpenElement("methodResponse", true);
+ printer->OpenElement("fault", true);
++ printer->OpenElement("value", true);
+ printer->OpenElement("struct", true);
+
+ printer->OpenElement("member", true);
+@@ -340,6 +341,7 @@ print_xmlrpc_fault(int faultCode, std::string faultString,
tinyxml2::XMLPrinter*
+ printer->CloseElement(true);
+ printer->CloseElement(true);
+ printer->CloseElement(true);
++ printer->CloseElement(true);
+ }
+
+ bool
+diff --git a/test/rpc/xmlrpc_test.cc b/test/rpc/xmlrpc_test.cc
+index 1bfdeadcd..220512d73 100644
+--- a/test/rpc/xmlrpc_test.cc
++++ b/test/rpc/xmlrpc_test.cc
+@@ -67,35 +67,35 @@ std::vector<std::tuple<std::string, std::string,
std::string>> basic_requests =
+
+ std::make_tuple("Invalid - missing method",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>no_such_method</methodName><params><param><value><i8>41</i8></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-506</i8></value></member><member><name>faultString</name><value><string>method
'no_such_method' not
defined</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-506</i8></value></member><member><name>faultString</name><value><string>method
'no_such_method' not
defined</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - i8 target",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><i8>41</i8></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-500</i8></value></member><member><name>faultString</name><value><string>invalid
parameters: target must be a
string</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-500</i8></value></member><member><name>faultString</name><value><string>invalid
parameters: target must be a
string</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - empty int tag",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><string></string></value></param><param><value><i8/></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse empty
integer</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse empty
integer</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - empty int text",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><string></string></value></param><param><value><i8></i8></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse empty
integer</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse empty
integer</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - broken XML",
+
"thodCall><methodName>test_a</methodName><params><param><value><i8>41</i8></value></param></params></method",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-503</i8></value></member><member><name>faultString</name><value><string>Error=XML_ERROR_PARSING_ELEMENT
ErrorID=6 (0x6) Line number=1: XMLElement
name=method</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-503</i8></value></member><member><name>faultString</name><value><string>Error=XML_ERROR_PARSING_ELEMENT
ErrorID=6 (0x6) Line number=1: XMLElement
name=method</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - non-integer i8",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><i8>string
value</i8></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse integer
value</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse integer
value</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - float i8",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><i8>3.14</i8></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse integer
value</string></value></member></struct></fault></methodResponse>"),
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unable
to parse integer
value</string></value></member></struct></value></fault></methodResponse>"),
+
+ std::make_tuple("Invalid - non-boolean boolean",
+ "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><boolean>string
value</boolean></value></param></params></methodCall>",
+- "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unknown
boolean value: string
value</string></value></member></struct></fault></methodResponse>")
++ "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-501</i8></value></member><member><name>faultString</name><value><string>unknown
boolean value: string
value</string></value></member></struct></value></fault></methodResponse>")
+ };
+
+ void
+@@ -134,7 +134,7 @@ XmlrpcTest::test_invalid_utf8() {
+ void
+ XmlrpcTest::test_size_limit() {
+ std::string input = "<?xml
version=\"1.0\"?><methodCall><methodName>xmlrpc_reflect</methodName><params><param><value><string></string></value></param><param><value><string>\xc3\x28</string></value></param></params></methodCall>";
+- std::string expected = "<?xml
version=\"1.0\"?><methodResponse><fault><struct><member><name>faultCode</name><value><i8>-509</i8></value></member><member><name>faultString</name><value><string>Content
size exceeds maximum XML-RPC
limit</string></value></member></struct></fault></methodResponse>";
++ std::string expected = "<?xml
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i8>-509</i8></value></member><member><name>faultString</name><value><string>Content
size exceeds maximum XML-RPC
limit</string></value></member></struct></value></fault></methodResponse>";
+ std::string output;
+ m_xmlrpc.set_size_limit(1);
+ m_xmlrpc.process(input.c_str(), input.size(), [&output](const char* c,
uint32_t l){ output.append(c, l); return true;});
diff --git a/net-p2p/rtorrent/files/rtorrent-0.15.3-unbundle_json.patch
b/net-p2p/rtorrent/files/rtorrent-0.15.3-unbundle_json.patch
new file mode 100644
index 000000000000..1e0d114a03be
--- /dev/null
+++ b/net-p2p/rtorrent/files/rtorrent-0.15.3-unbundle_json.patch
@@ -0,0 +1,17 @@
+diff --git a/src/rpc/jsonrpc.cc b/src/rpc/jsonrpc.cc
+index a9fad26..df9c44a 100644
+--- a/src/rpc/jsonrpc.cc
++++ b/src/rpc/jsonrpc.cc
+@@ -6,11 +6,11 @@
+ #include <string>
+ #include <torrent/common.h>
+ #include <torrent/torrent.h>
++#include <nlohmann/json.hpp>
+
+ #include "rpc/rpc_manager.h"
+ #include "rpc/command.h"
+ #include "rpc/command_map.h"
+-#include "rpc/nlohmann/json.h"
+ #include "rpc/parse_commands.h"
+ #include "torrent/exceptions.h"
+ #include "torrent/object.h"
diff --git a/net-p2p/rtorrent/rtorrent-0.15.3.ebuild
b/net-p2p/rtorrent/rtorrent-0.15.3.ebuild
new file mode 100644
index 000000000000..882301e9e9a6
--- /dev/null
+++ b/net-p2p/rtorrent/rtorrent-0.15.3.ebuild
@@ -0,0 +1,110 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# require 64-bit integer
+LUA_COMPAT=( lua5-{3,4} )
+
+inherit autotools linux-info lua-single systemd
+
+DESCRIPTION="BitTorrent Client using libtorrent"
+HOMEPAGE="https://rakshasa.github.io/rtorrent/"
+SRC_URI="https://github.com/rakshasa/rtorrent/releases/download/v${PV}/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~ppc ~ppc64 ~x86 ~amd64-linux ~x86-linux ~ppc-macos
~x64-macos ~x64-solaris"
+IUSE="debug lua selinux test tinyxml2 xmlrpc"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="
+ lua? ( ${LUA_REQUIRED_USE} )
+ tinyxml2? ( !xmlrpc )
+"
+
+COMMON_DEPEND="
+ ~net-libs/libtorrent-${PV}
+ net-misc/curl
+ sys-libs/ncurses:0=
+ lua? ( ${LUA_DEPS} )
+ xmlrpc? ( dev-libs/xmlrpc-c:= )
+"
+DEPEND="${COMMON_DEPEND}
+ dev-cpp/nlohmann_json
+"
+RDEPEND="${COMMON_DEPEND}
+ selinux? ( sec-policy/selinux-rtorrent )
+"
+BDEPEND="
+ virtual/pkgconfig
+ test? ( dev-util/cppunit )
+"
+
+DOCS=( doc/rtorrent.rc )
+
+PATCHES=(
+ "${FILESDIR}"/${PN}-0.15.3-unbundle_json.patch
+ # from upstream. To be removed in next release
+ "${FILESDIR}"/${PN}-0.15.3-struct_xmlrpc.patch
+ # missing rtorrent.lua in tarball
+ "${FILESDIR}"/${PN}-0.15.3-rtorrentlua.patch
+)
+
+pkg_setup() {
+ if ! linux_config_exists || ! linux_chkconfig_present IPV6; then
+ ewarn "rtorrent will not start without IPv6 support in your
kernel"
+ ewarn "without further configuration. Please set bind=0.0.0.0
or"
+ ewarn "similar in your rtorrent.rc"
+ ewarn "Upstream bug:
https://github.com/rakshasa/rtorrent/issues/732"
+ fi
+ use lua && lua-single_pkg_setup
+}
+
+src_prepare() {
+ default
+
+ # use system-json
+ rm -r src/rpc/nlohmann || die
+
+ # https://github.com/rakshasa/rtorrent/issues/332
+ cp "${FILESDIR}"/rtorrent.1 "${S}"/doc/ || die
+
+ if [[ ${CHOST} != *-darwin* ]]; then
+ # syslibroot is only for macos, change to sysroot for others
+ sed -i 's/Wl,-syslibroot,/Wl,--sysroot,/'
"${S}/scripts/common.m4" || die
+ fi
+
+ eautoreconf
+}
+
+src_configure() {
+ # configure needs bash or script bombs out on some null shift, bug
#291229
+ export CONFIG_SHELL=${BASH}
+
+ local myeconfargs=(
+ $(use_enable debug)
+ $(use_with lua)
+ $(usev xmlrpc --with-xmlrpc-c)
+ $(usev tinyxml2 --with-xmlrpc-tinyxml2)
+ )
+
+ use lua && myeconfargs+=(
+ LUA_INCLUDE="-I$(lua_get_include_dir)"
+ )
+
+ econf "${myeconfargs[@]}"
+}
+
+src_install() {
+ default
+ doman doc/rtorrent.1
+
+ if use lua; then
+ insinto $(lua_get_lmod_dir)
+ doins ${PN}.lua
+ fi
+
+ newinitd "${FILESDIR}/rtorrent-r1.init" rtorrent
+ newconfd "${FILESDIR}/rtorrentd.conf" rtorrent
+ systemd_newunit "${FILESDIR}/rtorrentd_at-r1.service"
"[email protected]"
+}