Control: tags 1103204 + patch Control: tags 1103204 + pending Dear maintainer,
I've prepared an NMU for rkward (versioned as 0.8.0-4.1) and uploaded it to DELAYED/7. Please feel free to tell me if I should cancel it. cu Adrian
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 <b...@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.friedrichsme...@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.friedrichsme...@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