• Bug#1109894: unblock: rkward/0.8.0-4.2 (pre-approval)

    From Jochen Sprickerhof@21:1/5 to All on Sun Jul 27 14:10:01 2025
    XPost: linux.debian.devel.release

    Hi Santiago,

    I am not part of the release team.

    An alternative option would be to revert src:r-base in unstable to the
    version in testing to comply with the freeze policy [1]. Please use the +really convention in such a case [2].

    [1] https://release.debian.org/testing/freeze_policy.html#hard
    [2] https://www.debian.org/doc/debian-policy/ch-controlfields.html#epochs-should-be-used-sparingly

    Cheers Jochen

    * Santiago Vila <[email protected]> [2025-07-25 21:37]:
    Package: release.debian.org
    Severity: normal
    X-Debbugs-Cc: [email protected], [email protected], [email protected] >Control: affects -1 + src:rkward
    User: [email protected]
    Usertags: unblock

    Please unblock package rkward (pre-approval)

    [ Reason ]
    This should fix #1103204 and *also* allow the package to propagate to testing.

    [ Impact ]
    The package in testing currently FTBFS.

    [ Tests ]
    Version 0.8.0-4.1 has been in unstable for 25 days, and there are no
    real code changes from 0.8.0-4.1 to 0.8.0-4.2.

    [ Risks ]
    Low risk. We are merely changing the overly strict depends line
    so that the package can enter testing.

    [ Checklist ]
    [X] all changes are documented in the d/changelog
    [X] I reviewed all changes and I approve them
    [X] attach debdiff against the package in testing

    [ Other info ]
    This NMU upload was prepared by Dirk Eddelbuettel. I'm helping
    him to fix the package by filing this report and doing the
    final upload. We will wait for approval before upload.

    The usual maintainers (in x-debbugs-Cc) are more than welcome to take
    over and upload 0.8.0-5 instead, but they should show up before
    the final upload.

    unblock rkward/0.8.0-4.2

    diff --git a/debian/.gitattributes b/debian/.gitattributes
    deleted file mode 100644
    index 6a03163..0000000
    --- a/debian/.gitattributes
    +++ /dev/null
    @@ -1 +0,0 @@
    -changelog merge=dpkg-mergechangelogs
    diff --git a/debian/changelog b/debian/changelog
    index eb916ca..9d4b492 100644
    --- a/debian/changelog
    +++ b/debian/changelog
    @@ -1,3 +1,18 @@
    +rkward (0.8.0-4.2) unstable; urgency=medium
    +
    + * Non-maintainer upload.
    + * debian/control: Set depends to (hardcoded) 'r-base-core (>= 4.5.0-3)' to >+ permit transition to testing for upcoming release.
    +
    + -- Dirk Eddelbuettel <[email protected]> Fri, 25 Jul 2025 12:17:47 -0500
    +
    +rkward (0.8.0-4.1) unstable; urgency=medium
    +
    + * Non-maintainer upload.
    + * Backport upstream fixes for R 4.5. (Closes: #1103204)
    +
    + -- Adrian Bunk <[email protected]> Mon, 30 Jun 2025 15:53:42 +0300
    +
    rkward (0.8.0-4) unstable; urgency=medium

    * Team upload.
    diff --git a/debian/control b/debian/control
    index eb68c50..187172f 100644
    --- a/debian/control
    +++ b/debian/control
    @@ -42,7 +42,7 @@ Package: rkward
    Architecture: any
    Depends: rkward-data (= ${source:Version}),
    ${misc:Depends},
    - ${rvers},
    + r-base-core (>= 4.5.0-3),
    ${rapivers},
    ${rgraphicsenginevers},
    ${shlibs:Depends}
    diff --git a/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch b/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch
    new file mode 100644
    index 0000000..b70b7e1
    --- /dev/null
    +++ b/debian/patches/0001-Adjust-to-the-removal-of-Rf_addTaskCallback-in-R-dev.patch
    @@ -0,0 +1,145 @@
    +From 9fc53972f94bcc6e22ba0ffc2bd246cdee1bf119 Mon Sep 17 00:00:00 2001 >+From: Thomas Friedrichsmeier <[email protected]>
    +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 --git a/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch b/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch
    new file mode 100644
    index 0000000..82ed346
    --- /dev/null
    +++ b/debian/patches/0002-Adjust-to-hiding-for-R_checkActivityEx-in-R-devel-fo.patch
    @@ -0,0 +1,39 @@
    +From 51b0b0bf5a15d742f20922713018125036df9aa3 Mon Sep 17 00:00:00 2001 >+From: Thomas Friedrichsmeier <[email protected]>
    +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 --git a/debian/patches/series b/debian/patches/series
    index c115b3f..6dda6d9 100644
    --- a/debian/patches/series
    +++ b/debian/patches/series
    @@ -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


    -----BEGIN PGP SIGNATURE-----

    iQIzBAEBCgAdFiEEc7KZy9TurdzAF+h6W//cwljmlDMFAmiGFGQACgkQW//cwljm lDOI4xAAlayrdUtHrer4M0zd2J+Mb7Q/KC6FoNXaYKSO1Pz6hlP81hBOs8XtKY9A 0GhIlAApteDpBvzJfWrJZlql1QF+ApOzo6MJKHmQL2PQ1IVOK067W6eKmp8KEoMT Qo4HyVXMYiCwH1Ia2Y5Cks85srfKwgoC78kEx5vi6ZVZwbguZE/0tlpWaQgZZn4m oYeRlkXrsrvDPWt09r8Iix0PaAaYveiH62KnOMe7vnWyJJ9S6Rd3hHVfPgxhdHrW XyxWK51XNGp1smWVGl+hGfZIx6wzQx33GR+OZfZbpN2KvpJ1d3q886jv4AK3AE3u Yb4t4H+r1GGtOX9XVQ+3e4tJFzFnzxyln9P501h03jWhj2CGWX0lFDTIJ45jpNuB Tc6+Gj2WfLKry6BTC05odM4AaHKboVvGSNqeh5tdLKqYJ/BqOpTrF7l/jx/htdsA xLJrRyJLfjdKAxzdadhNq9AU8UB8hZkLdPhwkCT+Xf+9MIbbL1o+QdWryLWnptu5 a08UcLJUwdToHyyazFig4s8So+9eCKdDcYaM2XDANu6Wk1ZzFx0NQNg31BFcVF0w aEFpjkGX+hP+P3UfEwrvR9k1SCdKkII4Wd+qtxjzR+VBQMxpV3mniEm0rtEcNCVy YKp+SkFf6lmawM1LXrfm9vAfMBIkv5TwYtoI/ae7nzS5ze+ES2U=
    =hUxE
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Santiago Vila@21:1/5 to Jochen Sprickerhof on Sun Jul 27 15:00:01 2025
    XPost: linux.debian.devel.release

    On Sun, Jul 27, 2025 at 01:58:32PM +0200, Jochen Sprickerhof wrote:
    Hi Santiago,

    I am not part of the release team.

    An alternative option would be to revert src:r-base in unstable to the version in testing to comply with the freeze policy [1]. Please use the +really convention in such a case [2].

    [1] https://release.debian.org/testing/freeze_policy.html#hard
    [2] https://www.debian.org/doc/debian-policy/ch-controlfields.html#epochs-should-be-used-sparingly

    We already considered that. The r-base package has a lot of reverse-dependencies,
    but rkward is a leaf package. At this point of the release cycle, updating rkward seems a lot less risky option than re-uploading r-base again.

    (Also: I'm not the r-base maintainer, I just joined efforts with Dirk to
    try to salvage rkward).

    Thanks.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)