From e1ca898854db2742ec2cac492ecd94af792be947 Mon Sep 17 00:00:00 2001 From: myml Date: Fri, 13 Dec 2024 15:22:23 +0800 Subject: [PATCH 1/3] fix: old version of ll-cli cannot export the new package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 旧版本玲珑不支持遍历entries/share目录中的软链接, 为保持兼容, 构建应用后不在entries/share目录创建软链接, 而是复制文件 --- .../src/linglong/builder/linglong_builder.cpp | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/libs/linglong/src/linglong/builder/linglong_builder.cpp b/libs/linglong/src/linglong/builder/linglong_builder.cpp index d42452833..e61572dfe 100644 --- a/libs/linglong/src/linglong/builder/linglong_builder.cpp +++ b/libs/linglong/src/linglong/builder/linglong_builder.cpp @@ -940,6 +940,7 @@ set -e qDebug() << "generate entries"; if (this->project.package.kind != "runtime") { + // 仅导出名单中的目录,以避免意外文件影响系统功能 const QStringList exportPaths = { "share/applications", // Copy desktop files "share/mime", // Copy MIME Type files @@ -971,18 +972,19 @@ set -e if (!binaryFiles.exists(path)) { continue; } - - const QString dest = QString("../../files/%1").arg(path); - + // appdata是旧版本的metainfo if (path == "share/appdata") { - if (!QFile::link(dest, binaryEntries.absoluteFilePath("share/metainfo"))) { + auto ret = copyDir(binaryFiles.absoluteFilePath(path), + binaryEntries.filePath("share/metainfo")); + if (!ret.has_value()) { qWarning() << "link binary entries share to files share/" << path << "failed"; } continue; } - - if (!QFile::link(dest, binaryEntries.absoluteFilePath(path))) { + auto ret = + copyDir(binaryFiles.absoluteFilePath(path), binaryEntries.absoluteFilePath(path)); + if (!ret.has_value()) { qWarning() << "link binary entries " << path << "to files share: failed"; continue; } @@ -1346,10 +1348,12 @@ utils::error::Result Builder::run(const QStringList &modules, .mounts = {}, }; - auto baseRef = pullDependency(QString::fromStdString(this->project.base), - this->repo, - "binary", - this->buildOptions.skipPullDepend); + auto fuzzyBase = package::FuzzyReference::parse(QString::fromStdString(this->project.base)); + if (!fuzzyBase) { + return LINGLONG_ERR(fuzzyBase); + } + auto baseRef = + this->repo.clearReference(*fuzzyBase, { .forceRemote = false, .fallbackToRemote = false }); if (!baseRef) { return LINGLONG_ERR(baseRef); } From 758bbc93b8091c841858644ce5e610c76a31a773 Mon Sep 17 00:00:00 2001 From: myml Date: Tue, 10 Dec 2024 16:13:34 +0800 Subject: [PATCH 2/3] fix: incorrect official website display in the DTK About dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dtk的关于对话框中显示的网址信息是从系统文件中读取的, 需要将宿主机的文件挂载到容器中, 才能正常显示 Bug: https://pms.uniontech.com/bug-view-282565.html --- apps/generators/90-legacy/src/main.cpp | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/generators/90-legacy/src/main.cpp b/apps/generators/90-legacy/src/main.cpp index 76fcb9c69..978f67e51 100644 --- a/apps/generators/90-legacy/src/main.cpp +++ b/apps/generators/90-legacy/src/main.cpp @@ -6,6 +6,9 @@ #include #include +#include +#include +#include int main() { @@ -117,7 +120,34 @@ int main() }); } } - + // randomize mount points to avoid path dependency. + auto now = std::chrono::system_clock::now(); + auto t = std::chrono::duration_cast(now.time_since_epoch()).count(); + auto shareDir = std::filesystem::path("/run/linglong/usr/share_" + std::to_string(t)); + // add mount points to XDG_DATA_DIRS + std::vector env = content["process"]["env"]; + // 查找是否存在XDG_DATA_DIRS开头的环境变量,如果存在追加到尾部,不存在则添加 + auto it = std::find_if(env.begin(), env.end(), [](const std::string &var) { + return var.find("XDG_DATA_DIRS=") == 0; + }); + if (it != env.end()) { + // 如果存在,追加到尾部 + *it += ":" + shareDir.string(); + } else { + // 如果不存在,添加到末尾 + env.push_back("XDG_DATA_DIRS=" + shareDir.string()); + } + std::error_code ec; + // mount for dtk + if (std::filesystem::exists("/usr/share/deepin/distribution.info", ec)) { + mounts.push_back({ + { "destination", shareDir / "deepin/distribution.info" }, + { "options", nlohmann::json::array({ "nodev", "nosuid", "mode=0644" }) }, + { "source", "/usr/share/deepin/distribution.info" }, + { "type", "bind" }, + }); + } + content["process"]["env"] = env; std::cout << content.dump() << std::endl; return 0; } From aedb9e643b9b629ccab219df8889c65b7404a60d Mon Sep 17 00:00:00 2001 From: kamiyadm Date: Tue, 26 Nov 2024 20:59:58 +0800 Subject: [PATCH 3/3] refactor: no need to pullDependency during ll-builder run - Log: --- .../src/linglong/builder/linglong_builder.cpp | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/libs/linglong/src/linglong/builder/linglong_builder.cpp b/libs/linglong/src/linglong/builder/linglong_builder.cpp index e61572dfe..0bbcf3983 100644 --- a/libs/linglong/src/linglong/builder/linglong_builder.cpp +++ b/libs/linglong/src/linglong/builder/linglong_builder.cpp @@ -1357,37 +1357,32 @@ utils::error::Result Builder::run(const QStringList &modules, if (!baseRef) { return LINGLONG_ERR(baseRef); } + auto baseDir = + debug ? this->repo.getMergedModuleDir(*baseRef) : this->repo.getLayerDir(*baseRef, "binary"); + if (!baseDir) { + return LINGLONG_ERR(baseDir); + } + options.baseDir = *baseDir; if (this->project.runtime) { - auto ref = pullDependency(QString::fromStdString(*this->project.runtime), - this->repo, - "binary", - this->buildOptions.skipPullDepend); - if (!ref) { - return LINGLONG_ERR(ref); - } - auto ret = this->repo.mergeModules(); - if (!ret.has_value()) { - return ret; + auto fuzzyRuntime = + package::FuzzyReference::parse(QString::fromStdString(this->project.runtime.value())); + if (!fuzzyRuntime) { + return LINGLONG_ERR(fuzzyRuntime); } - auto dir = - debug ? this->repo.getMergedModuleDir(*ref) : this->repo.getLayerDir(*ref, "binary"); - if (!dir) { - return LINGLONG_ERR(dir); + auto runtimeRef = + this->repo.clearReference(*fuzzyRuntime, + { .forceRemote = false, .fallbackToRemote = false }); + if (!runtimeRef) { + return LINGLONG_ERR(runtimeRef); } - options.runtimeDir = QDir(dir->absolutePath()); - } else { - auto ret = this->repo.mergeModules(); - if (!ret.has_value()) { - return ret; + auto runtimeDir = debug ? this->repo.getMergedModuleDir(*runtimeRef) + : this->repo.getLayerDir(*runtimeRef, "binary"); + if (!runtimeDir) { + return LINGLONG_ERR(runtimeDir); } + options.runtimeDir = *runtimeDir; } - auto baseDir = - debug ? this->repo.getMergedModuleDir(*baseRef) : this->repo.getLayerDir(*baseRef, "binary"); - if (!baseDir) { - return LINGLONG_ERR(baseDir); - } - options.baseDir = QDir(baseDir->absolutePath()); utils::error::Result curDir; // mergedDir 会自动在释放时删除临时目录,所以要用变量保留住