diff --git a/src/backends/sage/CMakeLists.txt b/src/backends/sage/CMakeLists.txt --- a/src/backends/sage/CMakeLists.txt +++ b/src/backends/sage/CMakeLists.txt @@ -29,3 +29,9 @@ endif() install(FILES cantor_sage.knsrc DESTINATION ${KDE_INSTALL_CONFDIR}) + +install( + FILES cantor-execsage + PERMISSIONS WORLD_READ OWNER_WRITE WORLD_EXECUTE + DESTINATION ${KDE_INSTALL_DATADIR}/cantor/sagebackend +) diff --git a/src/backends/sage/cantor-execsage b/src/backends/sage/cantor-execsage new file mode 100644 --- /dev/null +++ b/src/backends/sage/cantor-execsage @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +ROOT="$($1 --root)" + +if [[ -f $ROOT"/bin/sage-env" ]]; then + . "$ROOT/bin/sage-env" >&2 +elif [[ -f $ROOT"/src/bin/sage-env" ]]; then + . "$ROOT/src/bin/sage-env" >&2 +else + exit 1 # We have a problem +fi + +exec sage-ipython -i --simple-prompt \ No newline at end of file diff --git a/src/backends/sage/sagebackend.cpp b/src/backends/sage/sagebackend.cpp --- a/src/backends/sage/sagebackend.cpp +++ b/src/backends/sage/sagebackend.cpp @@ -58,7 +58,7 @@ QString SageBackend::version() const { - return QLatin1String("Undefined"); + return QLatin1String("8.1 and 8.2"); } Cantor::Session* SageBackend::createSession() diff --git a/src/backends/sage/sagesession.cpp b/src/backends/sage/sagesession.cpp --- a/src/backends/sage/sagesession.cpp +++ b/src/backends/sage/sagesession.cpp @@ -116,7 +116,11 @@ emit loginStarted(); m_process=new KPtyProcess(this); - m_process->setProgram(SageSettings::self()->path().toLocalFile()); + + const QString& sageExecFile = SageSettings::self()->path().toLocalFile(); + const QString& sageStartScript = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QLatin1String("cantor/sagebackend/cantor-execsage")); + m_process->setProgram(sageStartScript, QStringList(sageExecFile)); + m_process->setOutputChannelMode(KProcess::SeparateChannels); m_process->setPtyChannels(KPtyProcess::AllChannels); m_process->pty()->setEcho(false); @@ -213,7 +217,20 @@ m_sageVersion=SageSession::VersionInfo(major, minor); - if(m_sageVersion<=SageSession::VersionInfo(5, 7)) + // After the update ipython5 somewhere around Sage 7.6, Cantor stopped working with Sage. + // To fix this, we start Sage via a help wrapper that makes ipythong using simple prompt. + // This method works starting with Sage 8.1" + // Versions lower than 8.1 are not supported because of https://github.com/ipython/ipython/issues/9816 + if(m_sageVersion <= SageSession::VersionInfo(8, 0) && m_sageVersion >= SageSession::VersionInfo(7,4)) + { + const QString message = i18n( + "Sage version %1.%2 is unsupported. Please update your installation "\ + "to the supported versions to make it work with Cantor.", major, minor); + KMessageBox::error(nullptr, message, i18n("Cantor")); + interrupt(); + logout(); + } + else if(m_sageVersion<=SageSession::VersionInfo(5, 7)) { qDebug()<<"using an old version of sage: "<