diffstat for rkward-0.8.0 rkward-0.8.0

 changelog                                                               |    7 
 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                                                          |    2 
 4 files changed, 193 insertions(+)

diff -Nru rkward-0.8.0/debian/changelog rkward-0.8.0/debian/changelog
--- rkward-0.8.0/debian/changelog	2025-04-11 05:57:31.000000000 +0300
+++ rkward-0.8.0/debian/changelog	2025-06-30 15:53:42.000000000 +0300
@@ -1,3 +1,10 @@
+rkward (0.8.0-4.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Backport upstream fixes for R 4.5. (Closes: #1103204)
+
+ -- Adrian Bunk <bunk@debian.org>  Mon, 30 Jun 2025 15:53:42 +0300
+
 rkward (0.8.0-4) unstable; urgency=medium
 
   * Team upload.
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@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@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-04-10 21:13:58.000000000 +0300
+++ rkward-0.8.0/debian/patches/series	2025-06-30 15:53:42.000000000 +0300
@@ -1,3 +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
