Skip to content

fix(linglong): add apps/share path to XDG_DATA_DIRS - #598

Merged
wyu71 merged 1 commit into
linuxdeepin:masterfrom
wyu71:master
Mar 18, 2026
Merged

fix(linglong): add apps/share path to XDG_DATA_DIRS#598
wyu71 merged 1 commit into
linuxdeepin:masterfrom
wyu71:master

Conversation

@wyu71

@wyu71 wyu71 commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

Add /run/host/rootfs/var/lib/linglong/entries/apps/share to XDG_DATA_DIRS for searching help manuals in linglong apps directory.

在 XDG_DATA_DIRS 中添加玲珑 apps 目录,支持搜索玲珑应用帮助手册。

Log: 添加玲珑 apps 目录到 XDG_DATA_DIRS
PMS: BUG-353341
Influence: 玲珑环境下可搜索 entries/apps/share 目录中的帮助手册。

@wyu71
wyu71 force-pushed the master branch 6 times, most recently from 3140b10 to 67ed018 Compare March 18, 2026 04:34
Add /run/host/rootfs/var/lib/linglong/entries/apps/share to
XDG_DATA_DIRS for searching help manuals in linglong apps directory.

在 XDG_DATA_DIRS 中添加玲珑 apps 目录,支持搜索玲珑应用帮助手册。

Log: 添加玲珑 apps 目录到 XDG_DATA_DIRS
PMS: BUG-353341
Influence: 玲珑环境下可搜索 entries/apps/share 目录中的帮助手册。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

这段代码的 diff 主要改进了对 LINGLONG_APPID 环境变量的检测以及 XDG_DATA_DIRS 环境变量的处理逻辑,特别是在 Linglong(玲珑)容器环境下的路径处理。以下是从语法逻辑、代码质量、代码性能和代码安全四个方面的详细审查和改进意见:

1. 语法逻辑

  • 改进点:代码逻辑从简单的字符串拼接改为了列表操作。先读取现有环境变量,解析为列表,去重后添加新路径,最后再合并写回。
  • 评价:逻辑更加严密。原代码直接 append 字符串,如果 XDG_DATA_DIRS 原本为空或格式异常,可能会导致路径分隔符错误(例如缺少冒号)。新代码通过 splitjoin 处理,格式更规范。
  • 潜在风险:代码中有一个 UTF-8 校验逻辑:if (paths.toUtf8() != rawEnv)。这在大多数情况下是好的,但如果原始环境变量包含合法的本地编码(非UTF-8)路径,程序会直接忽略原有路径并只使用新路径。这可能会导致在旧系统或特殊配置下找不到某些文件。建议评估是否必须严格校验 UTF-8,或者使用 QString::fromLocal8Bit 作为回退。

2. 代码质量

  • 改进点
    • 引入了常量 ENV_LINGLONG_APPIDENV_XDG_DATA_DIRS,避免了魔法字符串的重复出现,提高了可维护性。
    • 引入了 LINGLONG_EXTRA_PATHS 常量列表,并使用了 QStringLiteral,这在 C++ 中是一个很好的实践,可以减少构造 QString 的开销。
    • 日志级别从 qDebug() 调整为 qInfo()qWarning(),更符合日志规范。
  • 评价:代码可读性和可维护性有显著提升。变量命名清晰,结构分层合理。
  • 建议
    • 可以考虑将处理路径的逻辑提取为一个独立的辅助函数(例如 updateXdgDataDirs),保持 main 函数的简洁。

3. 代码性能

  • 改进点:使用了 QStringLiteral 宏来包装静态字符串,这避免了程序启动时多次进行从 const char*QString 的隐式转换和内存分配。
  • 评价:在启动阶段(main 函数),减少不必要的字符串转换和内存分配对提升应用启动速度是有帮助的。
  • 潜在问题
    • pathList.contains(extraPath)QStringListcontains 操作时间复杂度是 O(n)。如果 pathList 很长(虽然环境变量通常不会特别长),或者 LINGLONG_EXTRA_PATHS 列表变长,这会有轻微的性能损耗。考虑到这是启动时的一次性操作,目前的性能损耗可以忽略不计,无需过度优化。
    • QString::fromUtf8(rawEnv):对于环境变量这种通常较短的字符串,性能影响不大。

4. 代码安全

  • 改进点:增加了对环境变量内容的校验(UTF-8 有效性检查)。
  • 评价
    • 防止了无效 UTF-8 字符导致的后续解析崩溃或异常行为,增强了程序的健壮性。
    • 使用 Qt::SkipEmptyParts 防止了空路径段(如连续的冒号 ::)导致的无效条目。
  • 建议
    • 路径注入风险:虽然代码处理了环境变量,但 LINGLONG_EXTRA_PATHS 是硬编码的,相对安全。如果未来这些路径可能来自外部配置文件,需要严格校验路径合法性,防止路径遍历攻击。
    • 环境变量篡改:程序依赖环境变量判断是否处于 Linglong 环境。如果攻击者能设置 LINGLONG_APPID,虽然主要后果是改变了搜索路径,但需评估这是否会导致加载了非预期的资源文件。

总结与改进建议代码

总体来说,这是一次高质量的代码重构。为了进一步完善,建议做以下微调:

  1. 优化 UTF-8 校验逻辑,增加对本地编码的兼容性尝试。
  2. 使用 QSet 进行路径去重,虽然数据量小影响不大,但语义上更准确(虽然会破坏顺序,但在路径列表中顺序通常不影响查找)。

修改建议代码片段:

    // ... (前文代码)

    bool isLinglong = qEnvironmentVariableIsSet(ENV_LINGLONG_APPID);
    if (isLinglong) {
        qInfo() << "Linglong environment detected";

        QByteArray rawEnv = qgetenv(ENV_XDG_DATA_DIRS);
        QStringList pathList;

        if (!rawEnv.isEmpty()) {
            QString paths = QString::fromUtf8(rawEnv);
            // 改进:如果 UTF-8 转换失败,尝试使用本地编码作为回退,而不是直接丢弃
            if (paths.toUtf8() != rawEnv) {
                qWarning() << "XDG_DATA_DIRS contains invalid UTF-8, trying local encoding.";
                paths = QString::fromLocal8Bit(rawEnv);
            }
            
            // 只有在转换后的字符串非空时才进行分割
            if (!paths.isEmpty()) {
                pathList = paths.split(':', Qt::SkipEmptyParts);
            }
        }

        // 改进:使用 QSet 去重,然后再转回 QStringList(如果路径顺序不重要)
        // 或者保持原样,因为 QStringList::contains 对于少量数据足够快
        QSet<QString> pathSet = pathList.toSet();
        
        // 添加新路径,QSet::insert 会自动处理重复
        for (const QString &extraPath : LINGLONG_EXTRA_PATHS) {
            pathSet.insert(extraPath);
        }

        // 转回列表并合并
        // 注意:Set 是无序的,如果对路径顺序有严格要求(例如优先级),请保持原有的 QStringList + contains 逻辑
        pathList = pathSet.values();

        if (!pathList.isEmpty()) {
            qputenv(ENV_XDG_DATA_DIRS, pathList.join(':').toUtf8());
        } else {
            // 如果列表为空(例如 rawEnv 为空且转换失败),至少写入 Linglong 的默认路径
             qputenv(ENV_XDG_DATA_DIRS, LINGLONG_EXTRA_PATHS.join(':').toUtf8());
        }
    }
    
    // ... (后文代码)

注意:关于 QSet 的使用,如果 XDG_DATA_DIRS 中路径的顺序决定了搜索优先级(前面的优先),那么使用 QSet 会打乱这个顺序。在这种情况下,原有的 QStringList 配合 contains 检查是更好的选择,尽管代码稍长。鉴于原代码逻辑是追加路径,保持原有列表逻辑是更稳妥的选择。因此,最稳妥的改进仅在于增强编码兼容性,如下:

        if (!rawEnv.isEmpty()) {
            QString paths = QString::fromUtf8(rawEnv);
            if (paths.toUtf8() != rawEnv) {
                qWarning() << "XDG_DATA_DIRS contains invalid UTF-8, trying local encoding.";
                paths = QString::fromLocal8Bit(rawEnv);
            }
            if (!paths.isEmpty()) {
                pathList = paths.split(':', Qt::SkipEmptyParts);
            }
        }
        
        // 保持原有的 QStringList 逻辑以保证顺序
        for (const QString &extraPath : LINGLONG_EXTRA_PATHS) {
            if (!pathList.contains(extraPath)) {
                pathList.append(extraPath);
            }
        }
        
        // 确保即使 pathList 为空(极端情况),也能写入 Linglong 路径
        if (pathList.isEmpty()) {
             pathList = LINGLONG_EXTRA_PATHS;
        }
        
        qputenv(ENV_XDG_DATA_DIRS, pathList.join(':').toUtf8());

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: lzwind, wyu71

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@wyu71
wyu71 merged commit d62dce7 into linuxdeepin:master Mar 18, 2026
16 of 18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants