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]"
+}

Reply via email to