[Pkg-kde-extras] Bug#1110100: trixie-pu: package rkward/0.8.0-4.1~deb13u1

Adrian Bunk bunk at debian.org
Tue Jul 29 20:42:56 BST 2025


Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: rkward at packages.debian.org
Control: affects -1 + src:rkward
User: release.debian.org at packages.debian.org
Usertags: pu

rkward started to FTBFS when R 4.5.0 entered unstable and trixie
relatively late, and cannot migrate due to R 4.5.1 now being
unmigratable in unstable.

Rebuilding the package in trixie is the easy solution.

The unrelated older change of using the system kdsingleapplication
instead of a vendored version is also included, it's in general
desirable for security support and has been in unstable for over
3 months without problems reported.

The additional Standards-Version and debian/copyright updates
shouldn't be problematic.
-------------- next part --------------
diffstat for rkward-0.8.0 rkward-0.8.0

 changelog                                                                   |   26 +
 control                                                                     |    3 
 copyright                                                                   |   11 
 patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch     |  145 ++++++++++
 patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch     |   39 ++
 patches/series                                                              |    3 
 patches/upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch |   57 +++
 7 files changed, 272 insertions(+), 12 deletions(-)

diff -Nru rkward-0.8.0/debian/changelog rkward-0.8.0/debian/changelog
--- rkward-0.8.0/debian/changelog	2025-02-11 21:12:08.000000000 +0200
+++ rkward-0.8.0/debian/changelog	2025-07-29 17:20:42.000000000 +0300
@@ -1,3 +1,29 @@
+rkward (0.8.0-4.1~deb13u1) trixie; urgency=medium
+
+  * Non-maintainer upload.
+  * Rebuild for trixie.
+
+ -- Adrian Bunk <bunk at debian.org>  Tue, 29 Jul 2025 17:20:42 +0300
+
+rkward (0.8.0-4.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Backport upstream fixes for R 4.5. (Closes: #1103204)
+
+ -- Adrian Bunk <bunk at debian.org>  Mon, 30 Jun 2025 15:53:42 +0300
+
+rkward (0.8.0-4) unstable; urgency=medium
+
+  * Team upload.
+  * Bump Standards-Version to 4.7.2, no changes required.
+  * Simplify GPL license text in debian/copyright.
+  * Use the system version of kdsingleapplication:
+    - backport upstream commit 997c8a7280fe0f99a29465f67b56fd001cdac4e1; patch
+      upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch
+    - add the libkdsingleapplication-qt6-dev build dependency
+
+ -- Pino Toscano <pino at debian.org>  Fri, 11 Apr 2025 04:57:31 +0200
+
 rkward (0.8.0-3) unstable; urgency=medium
 
   * Team upload.
diff -Nru rkward-0.8.0/debian/control rkward-0.8.0/debian/control
--- rkward-0.8.0/debian/control	2025-02-06 11:32:37.000000000 +0200
+++ rkward-0.8.0/debian/control	2025-04-10 21:16:25.000000000 +0300
@@ -13,6 +13,7 @@
                qt6-5compat-dev (>= 6.6.0~),
                qt6-declarative-dev (>= 6.6.0~),
                qt6-webengine-dev (>= 6.6.0~),
+               libkdsingleapplication-qt6-dev (>= 1.1.0~),
                libkf6archive-dev (>= 6.0.0~),
                libkf6breezeicons-dev (>= 6.0.0~),
                libkf6config-dev (>= 6.0.0~),
@@ -31,7 +32,7 @@
                qt6-svg-plugins <!nocheck>,
                xauth <!nocheck>,
                xvfb <!nocheck>,
-Standards-Version: 4.7.0
+Standards-Version: 4.7.2
 Vcs-Browser: https://salsa.debian.org/qt-kde-team/extras/rkward
 Vcs-Git: https://salsa.debian.org/qt-kde-team/extras/rkward.git
 Homepage: https://rkward.kde.org
diff -Nru rkward-0.8.0/debian/copyright rkward-0.8.0/debian/copyright
--- rkward-0.8.0/debian/copyright	2025-02-05 14:10:41.000000000 +0200
+++ rkward-0.8.0/debian/copyright	2025-04-10 17:31:41.000000000 +0300
@@ -18,17 +18,6 @@
  version 2 of the License, or (at your option) any later
  version.
  .
- This program is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied
- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE.  See the GNU General Public License for more
- details.
- .
- You should have received a copy of the GNU General Public
- License along with this package; if not, write to the Free
- Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- Boston, MA  02110-1301 USA
- .
  On Debian systems, the full text of the GNU General Public
  License version 2 can be found in the file
  `/usr/share/common-licenses/GPL-2'.
diff -Nru rkward-0.8.0/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch rkward-0.8.0/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch
--- rkward-0.8.0/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch	1970-01-01 02:00:00.000000000 +0200
+++ rkward-0.8.0/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch	2025-06-30 15:44:28.000000000 +0300
@@ -0,0 +1,145 @@
+From 9fc53972f94bcc6e22ba0ffc2bd246cdee1bf119 Mon Sep 17 00:00:00 2001
+From: Thomas Friedrichsmeier <thomas.friedrichsmeier at kdemail.net>
+Date: Sun, 28 Jul 2024 15:51:08 +0200
+Subject: Adjust to the removal of Rf_addTaskCallback() in R (devel) 4.5
+
+---
+ rkward/autotests/core_test.cpp | 28 ++++++++++++++++++++
+ rkward/rbackend/rkrapi.h       |  1 -
+ rkward/rbackend/rkrbackend.cpp | 47 +++++-----------------------------
+ 3 files changed, 35 insertions(+), 41 deletions(-)
+
+diff --git a/rkward/autotests/core_test.cpp b/rkward/autotests/core_test.cpp
+index a3514ff61..e8daf14e7 100644
+--- a/rkward/autotests/core_test.cpp
++++ b/rkward/autotests/core_test.cpp
+@@ -303,6 +303,34 @@ private Q_SLOTS:
+ 		cleanGlobalenv();
+ 	}
+ 
++	void userCommandTest() {
++		// Two commands submitted on one user line should both be run
++		runCommandWithTimeout(new RCommand("print('first'); print('second')", RCommand::User), nullptr, [](RCommand *command) {
++			QVERIFY(!command->failed());
++			QVERIFY(command->fullOutput().contains("first"));
++			QVERIFY(command->fullOutput().contains("second"));
++		});
++		// Also, of course for commands on separate lines:
++		runCommandWithTimeout(new RCommand("print('first')\nprint('second')", RCommand::User), nullptr, [](RCommand *command) {
++			QVERIFY(!command->failed());
++			QVERIFY(command->fullOutput().contains("first"));
++			QVERIFY(command->fullOutput().contains("second"));
++		});
++		// or multi-line commands:
++		runCommandWithTimeout(new RCommand("{ print('first')\nprint('second') }", RCommand::User), nullptr, [](RCommand *command) {
++			QVERIFY(!command->failed());
++			QVERIFY(command->fullOutput().contains("first"));
++			QVERIFY(command->fullOutput().contains("second"));
++		});
++		// However, if a partial command fails, the next part should not get parsed:
++		runCommandWithTimeout(new RCommand("stop('first'); print('second')", RCommand::User), nullptr, [](RCommand *command) {
++			QVERIFY(command->failed());
++			QVERIFY(command->fullOutput().contains("first"));
++			QVERIFY(!command->fullOutput().contains("second"));
++		});
++		// TODO: verify that calls to readline() and browser() are handled, correctly
++	}
++
+ 	void commandOrderAndOutputTest() {
+ 		// commands shall run in the order 1, 3, 2, 5, 4, but also, of course, all different types of output shall be captured
+ 		QStringList output;
+diff --git a/rkward/rbackend/rkrapi.h b/rkward/rbackend/rkrapi.h
+index cb68aa4ad..643ac8983 100644
+--- a/rkward/rbackend/rkrapi.h
++++ b/rkward/rbackend/rkrapi.h
+@@ -228,7 +228,6 @@ IMPORT_R_API(Rf_GetOption);
+ IMPORT_R_API(Rf_GetOption1);
+ IMPORT_R_API(Rf_KillAllDevices);
+ IMPORT_R_API(Rf_ScalarInteger);
+-IMPORT_R_API(Rf_addTaskCallback);
+ IMPORT_R_API(Rf_allocList);
+ IMPORT_R_API(Rf_allocVector);
+ IMPORT_R_API(Rf_asChar);
+diff --git a/rkward/rbackend/rkrbackend.cpp b/rkward/rbackend/rkrbackend.cpp
+index 6130f18c1..5eea2bd20 100644
+--- a/rkward/rbackend/rkrbackend.cpp
++++ b/rkward/rbackend/rkrbackend.cpp
+@@ -133,38 +133,6 @@ void RKRBackend::clearPendingInterrupt () {
+ extern SEXP RKWard_RData_Tag;
+ 
+ // ############## R Standard callback overrides BEGIN ####################
+-Rboolean RKToplevelStatementFinishedCallback (SEXP expr, SEXP value, Rboolean succeeded, Rboolean visible, void *) {
+-	RK_TRACE (RBACKEND);
+-	Q_UNUSED (expr);
+-	Q_UNUSED (value);
+-	Q_UNUSED (visible);
+-
+-	if ((RKRBackend::repl_status.eval_depth == 0) && (!RKRBackend::repl_status.browser_context)) {		// Yes, toplevel-handlers _do_ get called in a browser context!
+-		RK_ASSERT (RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::UserCommandRunning);
+-		if (succeeded) {
+-			RKRBackend::repl_status.user_command_successful_up_to = RKRBackend::repl_status.user_command_parsed_up_to;
+-			if (RKRBackend::repl_status.user_command_completely_transmitted) {
+-				RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::NoUserCommand;
+-				RKRBackend::this_pointer->commandFinished ();
+-			} else RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::UserCommandTransmitted;
+-		} else {
+-			// well, this point of code is never reached with R up to 2.12.0. Instead failed user commands are handled in doError().
+-			RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::UserCommandFailed;
+-		}
+-	}
+-	
+-	return (Rboolean) true;
+-}
+-
+-void RKInsertToplevelStatementFinishedCallback (void *) {
+-	RK_TRACE (RBACKEND);
+-
+-	if (RKRBackend::this_pointer->r_running) {
+-		int pos;
+-		RFn::Rf_addTaskCallback(&RKToplevelStatementFinishedCallback, nullptr, &RKInsertToplevelStatementFinishedCallback, "_rkward_main_callback", &pos);
+-	}
+-}
+-
+ void RKTransmitNextUserCommandChunk (unsigned char* buf, int buflen) {
+ 	RK_TRACE (RBACKEND);
+ 
+@@ -284,7 +252,7 @@ int RReadConsole (const char* prompt, unsigned char* buf, int buflen, int hist)
+ 				// This can mean three different things:
+ 				// 1) User called readline ()
+ 				// 2) User called browser ()
+-				// 3) R jumped us back to toplevel behind our backs.
++				// 3) The user command has finished (successfully or not)
+ 				// Let's find out, which one it is.
+ 				if (hist && (RKRBackend::default_global_context != ROb(R_GlobalContext))) {
+ 					break;	// this looks like a call to browser(). Will be handled below.
+@@ -296,13 +264,13 @@ int RReadConsole (const char* prompt, unsigned char* buf, int buflen, int hist)
+ 					n_frames = dummy->intVector ().at (0);
+ 				}
+ 				// What the ??? Why does this simple version always return 0?
+-				//int n_frames = RKRSupport::SEXPToInt (RKRSupport::callSimpleFun0 (RFn::Rf_install ("sys.nframe"), ROb(R_GlobalEnv)));
++				//int n_frames = RKRSupport::SEXPToInt (RKRSupport::callSimpleFun0 (RFn::Rf_install ("sys.nframe"), ROb(R_GlobalEnv);
+ 				if (n_frames < 1) {
+-					// No active frames? This can't be a call to readline(), then, so probably R jumped us back to toplevel, behind our backs.
+-					// For safety, let's reset and start over.
+-					RKRBackend::this_pointer->current_command->status |= RCommand::Failed | RCommand::ErrorOther;
+-					RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::ReplIterationKilled;
+-					RFn::Rf_error("");	// to discard the buffer
++					// No active frames? This can't be a call to readline(), so the previous command must have finished.
++					if (RKRBackend::repl_status.user_command_completely_transmitted) {
++						RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::NoUserCommand;
++						RKRBackend::this_pointer->commandFinished ();
++					} else RKRBackend::repl_status.user_command_status = RKRBackend::RKReplStatus::UserCommandTransmitted;
+ 				} else {
+ 					// A call to readline(). Will be handled below
+ 					break;
+@@ -1108,7 +1076,6 @@ bool RKRBackend::startR () {
+ 	RFn::R_registerRoutines(RFn::R_getEmbeddingDllInfo(), nullptr, callMethods, nullptr, nullptr);
+ 
+ 	connectCallbacks();
+-	RKInsertToplevelStatementFinishedCallback(nullptr);
+ 	RKREventLoop::setRKEventHandler(doPendingPriorityCommands);
+ 	default_global_context = ROb(R_GlobalContext);
+ #ifdef Q_OS_WIN
+-- 
+2.30.2
+
diff -Nru rkward-0.8.0/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch rkward-0.8.0/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch
--- rkward-0.8.0/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch	1970-01-01 02:00:00.000000000 +0200
+++ rkward-0.8.0/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch	2025-06-30 15:44:28.000000000 +0300
@@ -0,0 +1,39 @@
+From 51b0b0bf5a15d742f20922713018125036df9aa3 Mon Sep 17 00:00:00 2001
+From: Thomas Friedrichsmeier <thomas.friedrichsmeier at kdemail.net>
+Date: Mon, 29 Jul 2024 14:58:22 +0200
+Subject: Adjust to hiding for R_checkActivityEx in R-devel (for R 4.5)
+
+---
+ rkward/rbackend/rkrapi.h         | 2 +-
+ rkward/rbackend/rkreventloop.cpp | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/rkward/rbackend/rkrapi.h b/rkward/rbackend/rkrapi.h
+index 643ac8983..e72f817e2 100644
+--- a/rkward/rbackend/rkrapi.h
++++ b/rkward/rbackend/rkrapi.h
+@@ -323,7 +323,7 @@ IMPORT_R_API(ptr_R_WriteConsoleEx);
+ 
+ IMPORT_R_API(R_InputHandlers);
+ IMPORT_R_API(R_PolledEvents);
+-IMPORT_R_API(R_checkActivityEx);
++IMPORT_R_API(R_checkActivity);
+ IMPORT_R_API(R_runHandlers);
+ IMPORT_R_API(addInputHandler);
+ 
+diff --git a/rkward/rbackend/rkreventloop.cpp b/rkward/rbackend/rkreventloop.cpp
+index 8671cc725..19a510479 100644
+--- a/rkward/rbackend/rkreventloop.cpp
++++ b/rkward/rbackend/rkreventloop.cpp
+@@ -19,7 +19,7 @@ static void processX11EventsWorker (void *) {
+ #ifndef Q_OS_WIN
+ 	for (;;) {
+ 		fd_set *what;
+-		what = RFn::R_checkActivityEx(ROb(R_wait_usec) > 0 ? ROb(R_wait_usec) : 50, 1, RK_doIntr);
++		what = RFn::R_checkActivity(ROb(R_wait_usec) > 0 ? ROb(R_wait_usec) : 50, 1);
+ 		RFn::R_runHandlers(ROb(R_InputHandlers), what);
+ 		if (!what) break;
+ 	}
+-- 
+2.30.2
+
diff -Nru rkward-0.8.0/debian/patches/series rkward-0.8.0/debian/patches/series
--- rkward-0.8.0/debian/patches/series	2025-02-06 11:37:02.000000000 +0200
+++ rkward-0.8.0/debian/patches/series	2025-06-30 15:53:42.000000000 +0300
@@ -1,2 +1,5 @@
 upstream_Also-set-file-modes-when-creating-reproducible-archi.patch
+upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch
 tests-disable-encodingtest.diff
+0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch
+0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch
diff -Nru rkward-0.8.0/debian/patches/upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch rkward-0.8.0/debian/patches/upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch
--- rkward-0.8.0/debian/patches/upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch	1970-01-01 02:00:00.000000000 +0200
+++ rkward-0.8.0/debian/patches/upstream_Make-it-possible-to-build-against-system-kdsingleapp.patch	2025-04-10 21:13:58.000000000 +0300
@@ -0,0 +1,57 @@
+From 997c8a7280fe0f99a29465f67b56fd001cdac4e1 Mon Sep 17 00:00:00 2001
+From: Andreas Sturmlechner <asturm at gentoo.org>
+Date: Mon, 22 Jul 2024 22:20:26 +0200
+Subject: [PATCH] Make it possible to build against system kdsingleapplication
+
+Bundling must be avoided wherever possible.
+
+Signed-off-by: Andreas Sturmlechner <asturm at gentoo.org>
+---
+ CMakeLists.txt  | 10 +++++++++-
+ rkward/main.cpp |  2 +-
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 3b9833164..1af6cd172 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -26,6 +26,15 @@ FIND_PACKAGE(Qt6 6.6 CONFIG REQUIRED COMPONENTS Widgets Core Xml Network Qml Pri
+ FIND_PACKAGE(KF6 6.0.0 REQUIRED COMPONENTS CoreAddons DocTools I18n XmlGui TextEditor WidgetsAddons Parts Config Notifications WindowSystem Archive BreezeIcons OPTIONAL_COMPONENTS Crash)
+ FIND_PACKAGE(Gettext REQUIRED)
+ 
++FIND_PACKAGE(KDSingleApplication-qt6 1.1.0 QUIET)
++if(KDSingleApplication-qt6_FOUND)
++  message(STATUS "Using system KDSingleApplication")
++else()
++  message(STATUS "Using bundled KDSingleApplication")
++  add_subdirectory(3rdparty/KDSingleApplication)
++  add_definitions(-DKDSINGLEAPPLICATION_STATIC_BUILD)
++endif()
++
+ IF(FORCE_PRETTY_MAKEFILE)
+ 	SET(CMAKE_VERBOSE_MAKEFILE OFF)
+ ENDIF(FORCE_PRETTY_MAKEFILE)
+@@ -37,7 +46,6 @@ remove_definitions(-DQT_NO_CAST_FROM_ASCII) # TODO remove to compley to KDECompi
+ #uncomment the line below to save ~250-350kB in object size
+ #ADD_DEFINITIONS(-DRKWARD_NO_TRACE)
+ 
+-ADD_SUBDIRECTORY(3rdparty/KDSingleApplication)
+ ADD_SUBDIRECTORY(rkward)
+ ADD_SUBDIRECTORY(doc)
+ ADD_SUBDIRECTORY(tests)
+diff --git a/rkward/main.cpp b/rkward/main.cpp
+index 2804e99d8..df959ba82 100644
+--- a/rkward/main.cpp
++++ b/rkward/main.cpp
+@@ -72,7 +72,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
+ #include "rbackend/rksessionvars.h"
+ #include "windows/rkdebugmessagewindow.h"
+ #include "misc/rkcommonfunctions.h"
+-#include "../3rdparty/KDSingleApplication/kdsingleapplication.h"
++#include "kdsingleapplication.h"
+ #include "misc/rkcommandlineargs.h"
+ 
+ #ifdef Q_OS_WIN
+-- 
+2.47.2
+


More information about the pkg-kde-extras mailing list