diff --git a/debian/changelog b/debian/changelog index 2ece0f2..6f05fb4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +spark-store (3.0.3-10) stable; urgency=medium + + * Now also compile dstore patch + + -- shenmo Mon, 17 Jan 2022 00:00:00 +0800 + + spark-store (3.0.3-9) stable; urgency=medium * Support dpkg-buildpackage diff --git a/debian/source/format b/debian/source/format deleted file mode 100644 index 163aaf8..0000000 --- a/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/spark-store-project.pro b/spark-store-project.pro index f57b2f2..59c4d4c 100644 --- a/spark-store-project.pro +++ b/spark-store-project.pro @@ -4,8 +4,10 @@ TEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ + src/spark-dstore-patch \ third-party/QtNetworkService \ src/spark-store.pro + spark-store.depends = third-party/QtNetworkService diff --git a/src/spark-dstore-patch/.qmake.stash b/src/spark-dstore-patch/.qmake.stash new file mode 100644 index 0000000..6cab99c --- /dev/null +++ b/src/spark-dstore-patch/.qmake.stash @@ -0,0 +1,24 @@ +QMAKE_CXX.QT_COMPILER_STDCXX = 201402L +QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 8 +QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3 +QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0 +QMAKE_CXX.COMPILER_MACROS = \ + QT_COMPILER_STDCXX \ + QMAKE_GCC_MAJOR_VERSION \ + QMAKE_GCC_MINOR_VERSION \ + QMAKE_GCC_PATCH_VERSION +QMAKE_CXX.INCDIRS = \ + /usr/include/c++/8 \ + /usr/include/x86_64-linux-gnu/c++/8 \ + /usr/include/c++/8/backward \ + /usr/lib/gcc/x86_64-linux-gnu/8/include \ + /usr/local/include \ + /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed \ + /usr/include/x86_64-linux-gnu \ + /usr/include +QMAKE_CXX.LIBDIRS = \ + /usr/lib/gcc/x86_64-linux-gnu/8 \ + /usr/lib/x86_64-linux-gnu \ + /usr/lib \ + /lib/x86_64-linux-gnu \ + /lib diff --git a/src/spark-dstore-patch/spark-dstore-patch.pro b/src/spark-dstore-patch/spark-dstore-patch.pro new file mode 100644 index 0000000..841f15e --- /dev/null +++ b/src/spark-dstore-patch/spark-dstore-patch.pro @@ -0,0 +1,9 @@ +TARGET = spark-dstore-patch +TEMPLATE += app +QT += widgets +SOURCES += spark-dstore-tool.cpp + +# Default rules for deployment. +qnx: target.path = /tmp/spark-store/bin +else: unix:!android: target.path = /opt/durapps/spark-store/bin +!isEmpty(target.path): INSTALLS += target \ No newline at end of file diff --git a/src/spark-dstore-patch/spark-dstore-tool.cpp b/src/spark-dstore-patch/spark-dstore-tool.cpp new file mode 100644 index 0000000..dbf3881 --- /dev/null +++ b/src/spark-dstore-patch/spark-dstore-tool.cpp @@ -0,0 +1,195 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +QList enumAppInfoList() +{ + QList appInfoList; + QDir apps("/opt/apps"); + auto list = apps.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto &appID : list) { + auto infoPath = apps.absoluteFilePath(appID + "/info"); + QFile infoFile(infoPath); + if (!infoFile.open(QIODevice::ReadOnly)) { + continue; + } + auto doc = QJsonDocument::fromJson(infoFile.readAll()); + appInfoList.push_back(doc.object()); + } + return appInfoList; +} +//这段是去找appid和info,没看懂用来干啥的,在此之后info文件也没再用过 +//可能以后版本的实现会用到,等官方加功能再说 +void linkDir(const QString &source, const QString &target) +{ + auto ensureTargetDir = [](const QString &targetFile) { + QFileInfo t(targetFile); + QDir tDir(t.dir()); + tDir.mkpath("."); + }; + + QDir sourceDir(source); + QDir targetDir(target); + QDirIterator iter(source, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + while (iter.hasNext()) { + auto sourceFile = iter.next(); + auto targetFile = targetDir.absoluteFilePath(sourceDir.relativeFilePath(sourceFile)); + + QFileInfo tfi(targetFile); + // if (tfi.isSymLink() && (tfi.canonicalFilePath() == sourceFile)) { + //这里官方应该是写错了,否则会每触发一次就把所有软链接都删了重新创建一次 + if (tfi.isSymLink() && (tfi.symLinkTarget() == sourceFile)) { + continue; + } else { + QFile::remove(targetFile); + } + + ensureTargetDir(targetFile); + auto ret = symlink(sourceFile.toStdString().c_str(), targetFile.toStdString().c_str()); + if (0 != ret) { + qDebug() << "link failed" << sourceFile << "=>" << targetFile << ret; + } + } +} + +//reset Dynamic library rpath +void setRpath(const QString &file, const QString &path) +{ + if (!QFileInfo::exists(path)) + return; + QProcess p; + auto cmd = "patchelf " + file + " --set-rpath " + path; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); +} + +QString getGlic() +{ + //get arch & glibc + QProcess p; + auto cmd = "gcc -dumpmachine"; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); + return p.readAll(); +} + +void linkApp(const QJsonObject &app) +{ + auto appID = app.value("appid").toString(); + auto appEntriesDir = QDir("/opt/apps/" + appID + "/entries"); + auto appLibsDir = QDir("/opt/apps/" + appID + "/files/lib"); + auto autoStartDir = QDir(appEntriesDir.absoluteFilePath("autostart")); + + bool autoStart = app.value("permissions").toObject().value("autostart").toBool(); + if (autoStart) { + linkDir(appEntriesDir.absoluteFilePath("autostart"), "/etc/xdg/autostart"); + } + + // link application + auto sysShareDir = QDir("/usr/share"); + linkDir(appEntriesDir.absoluteFilePath("applications"), sysShareDir.absoluteFilePath("applications")); + linkDir(appEntriesDir.absoluteFilePath("icons"), sysShareDir.absoluteFilePath("icons")); + linkDir(appEntriesDir.absoluteFilePath("mime"), sysShareDir.absoluteFilePath("mime")); + linkDir(appEntriesDir.absoluteFilePath("glib-2.0"), sysShareDir.absoluteFilePath("glib-2.0")); + linkDir(appEntriesDir.absoluteFilePath("services"), sysShareDir.absoluteFilePath("dbus-1/services")); + linkDir(appEntriesDir.absoluteFilePath("GConf"), sysShareDir.absoluteFilePath("GConf")); + linkDir(appEntriesDir.absoluteFilePath("help"), sysShareDir.absoluteFilePath("help")); + linkDir(appEntriesDir.absoluteFilePath("locale"), sysShareDir.absoluteFilePath("locale")); + linkDir(appEntriesDir.absoluteFilePath("fcitx"), sysShareDir.absoluteFilePath("fcitx")); + linkDir(appEntriesDir.absoluteFilePath("polkit"), sysShareDir.absoluteFilePath("polkit-1")); + linkDir(appEntriesDir.absoluteFilePath("fonts/conf"), "/etc/fonts/conf.d"); + linkDir(appEntriesDir.absoluteFilePath("fonts/files"), sysShareDir.absoluteFilePath("fonts")); + + +//原来会导致Gtk相关应用翻译缺失,补足了 + + + auto pluginDir = QDir(appEntriesDir.absoluteFilePath("plugins")); + if (pluginDir.exists()) { + QString arch = getGlic(); + // if (pluginDir.exists()) { + // QDirIterator iter(pluginDir.absolutePath(), QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + // while (iter.hasNext()) { + // auto sourceFile = iter.next(); + // setRpath(sourceFile, appLibsDir.absolutePath()); //set rpath + // } + // } + + linkDir(appEntriesDir.absoluteFilePath("plugins/fcitx"), "/usr/lib/" + arch + "/fcitx"); + linkDir(appEntriesDir.absoluteFilePath("plugins/browser"), "/usr/lib/mozilla/plugins"); + } +} + +void cleanLink() +{ + auto cleanDirBrokenLink = [](const QString &dir) { + QProcess p; + auto cmd = "find " + dir + " -xtype l -delete"; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); + }; + + QString arch = getGlic(); + auto sysShareDir = QDir("/usr/share"); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("applications")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("icons")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("mime/packages")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("glib-2.0")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("dbus-1/services")); + cleanDirBrokenLink("/etc/xdg/autostart"); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("fcitx")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("help")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("locale")); + cleanDirBrokenLink("/usr/lib/" + arch + "/fcitx"); + cleanDirBrokenLink("/usr/lib/mozilla/plugins"); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("polkit-1/actions")); + cleanDirBrokenLink(sysShareDir.absoluteFilePath("fonts")); + cleanDirBrokenLink("/etc/fonts/conf.d"); +} + +void update() +{ + QProcess p; + auto cmd = "glib-compile-schemas /usr/share/glib-2.0/schemas/"; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); + + cmd = "update-icon-caches /usr/share/icons/*"; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); + + cmd = "update-desktop-database -q"; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); + + cmd = "update-mime-database -V /usr/share/mime"; + p.start("bash", QStringList {"-c", cmd}); + p.waitForFinished(); + + +} + + + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + + cleanLink(); + + for (auto &a : enumAppInfoList()) { + linkApp(a); + } + qInfo()<<"Spark dstore patch (c) The Spark Project 2022-Now. Modified from deepin-app-store-tool"; + + // trigger + update(); + + return 0; +} diff --git a/src/spark-store.pro b/src/spark-store.pro index 3fb0f0e..676372b 100644 --- a/src/spark-store.pro +++ b/src/spark-store.pro @@ -29,7 +29,7 @@ CONFIG += c++11 link_pkgconfig PKGCONFIG += dtkcore dtkgui dtkwidget libnotify # 禁止输出 qWarning / qDebug 信息 -CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT +#CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT SOURCES += \ appitem.cpp \ diff --git a/tool/spark-dstore-patch b/tool/spark-dstore-patch deleted file mode 100755 index 8914f4c..0000000 Binary files a/tool/spark-dstore-patch and /dev/null differ