Skip to content

refactor: Remove Qt dependencies from the utils#1556

Closed
reddevillg wants to merge 1 commit into
OpenAtom-Linyaps:masterfrom
reddevillg:remove_qt_1
Closed

refactor: Remove Qt dependencies from the utils#1556
reddevillg wants to merge 1 commit into
OpenAtom-Linyaps:masterfrom
reddevillg:remove_qt_1

Conversation

@reddevillg

Copy link
Copy Markdown
Collaborator

Changes:

  • Reimplement linglong::utils::Cmd.
  • Add unit tests for the new Cmd implementation and file operations.
  • Use thred-safe errorString instead of strerror.
  • submodules only affects git kind source.
  • Remove unused code.

@deepin-ci-robot

Copy link
Copy Markdown
Collaborator

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: reddevillg

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

@reddevillg reddevillg closed this Jan 15, 2026
@reddevillg reddevillg reopened this Jan 15, 2026
@codecov

codecov Bot commented Jan 15, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 43.98734% with 177 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
libs/utils/src/linglong/utils/cmd.cpp 56.88% 41 Missing and 31 partials ⚠️
libs/utils/src/linglong/utils/file.cpp 24.00% 7 Missing and 12 partials ⚠️
...s/linglong/src/linglong/package/layer_packager.cpp 21.05% 4 Missing and 11 partials ⚠️
libs/linglong/src/linglong/repo/ostree_repo.cpp 15.38% 11 Missing ⚠️
libs/utils/src/linglong/utils/overlayfs.cpp 0.00% 10 Missing ⚠️
libs/linglong/src/linglong/package/uab_file.cpp 52.94% 6 Missing and 2 partials ⚠️
libs/utils/src/linglong/utils/env.cpp 57.89% 3 Missing and 5 partials ⚠️
libs/utils/src/linglong/utils/namespace.cpp 0.00% 8 Missing ⚠️
libs/utils/src/linglong/utils/filelock.cpp 16.66% 5 Missing ⚠️
...ps/ll-driver-detect/src/nvidia_driver_detector.cpp 0.00% 2 Missing and 2 partials ⚠️
... and 8 more
Files with missing lines Coverage Δ
...s/linglong/src/linglong/builder/source_fetcher.cpp 71.15% <100.00%> (+1.15%) ⬆️
...ibs/linglong/src/linglong/builder/source_fetcher.h 100.00% <100.00%> (ø)
libs/utils/src/linglong/utils/error/error.cpp 100.00% <100.00%> (ø)
libs/utils/src/linglong/utils/error/error.h 41.34% <ø> (ø)
apps/ll-cli/src/main.cpp 0.00% <0.00%> (ø)
apps/ll-driver-detect/src/main.cpp 0.00% <0.00%> (ø)
libs/linglong/src/linglong/package/layer_file.cpp 29.09% <0.00%> (ø)
libs/linglong/src/linglong/cli/cli.cpp 1.00% <0.00%> (+<0.01%) ⬆️
...g/src/linglong/package_manager/package_manager.cpp 1.38% <0.00%> (ø)
...ibs/linglong/src/linglong/package/uab_packager.cpp 0.00% <0.00%> (ø)
... and 12 more
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Changes:
- Reimplement `linglong::utils::Cmd`.
- Add unit tests for the new `Cmd` implementation and file operations.
- Use thred-safe errorString instead of strerror.
- submodules only affects git kind source.
- Remove unused code.

Signed-off-by: reddevillg <reddevillg@gmail.com>
@deepin-ci-robot

Copy link
Copy Markdown
Collaborator

deepin pr auto review

Git Diff 代码审查报告

概述

本次代码变更主要涉及命令执行工具的重构,从基于 Qt 的实现 (QProcess) 转换为使用原生 Linux 系统调用 (fork, execvpe, pipe, epoll) 的实现。同时,相关工具类和测试代码也进行了相应调整。

主要变更点

  1. 命令执行工具重构

    • linglong/utils/command/cmd.{h,cpp} 迁移到 linglong/utils/cmd.{h,cpp}
    • QProcess 实现转换为原生 Linux 系统调用实现
    • QStringList 参数改为 std::vector<std::string>
    • QString 返回值改为 std::string 返回值
  2. 环境变量处理

    • linglong/utils/command/env.{h,cpp} 迁移到 linglong/utils/env.{h,cpp}
    • 移除了 getUserEnv 函数
    • 保留了 EnvironmentVariableGuard
  3. 错误处理改进

    • 添加了 errorString 函数统一处理系统错误信息
    • 替换了多处 ::strerror(errno)errorString(errno)
  4. 文件操作增强

    • 添加了 concatFile 函数用于文件拼接
    • 改进了 readFilewriteFile 的实现
  5. 测试代码更新

    • 更新了单元测试以适配新的 API
    • 删除了旧的 command_mock.h,改用 GMock 框架

详细审查

1. 命令执行工具重构 (linglong/utils/cmd.cpp)

优点:

  • 使用原生 Linux 系统调用减少了 Qt 依赖
  • 使用 epoll 实现高效的 I/O 多路复用
  • 支持通过 toStdin 方法向子进程写入数据
  • 更好的环境变量处理方式
  • 使用 finally 模式确保资源释放

潜在问题:

  1. 错误处理不够全面:

    if (dup2(stdoutPipe[1], STDOUT_FILENO) == -1 || dup2(stdinPipe[0], STDIN_FILENO) == -1) {
        exit(1);
    }

    在子进程中直接调用 exit(1) 而不记录错误信息,不利于调试。建议至少在退出前尝试将错误信息写入某个文件或管道。

  2. 信号处理缺失:
    代码中没有处理信号(如 SIGCHLD)的机制,可能导致在某些情况下子进程状态无法正确获取。

  3. 环境变量处理可能效率不高:

    for (char **env = environ; *env != nullptr; ++env) {
        envStrings.emplace_back(*env);
    }

    每次执行命令都会复制整个环境变量,对于频繁执行命令的场景可能影响性能。

  4. 资源泄漏风险:
    在子进程中,如果 execvpe 成功,之前的 close 调用会自动关闭文件描述符。但如果 execvpe 失败,子进程直接 exit(1),没有关闭所有打开的文件描述符。

建议:

  1. 在子进程失败时,尝试将错误信息写入管道,父进程可以读取并报告更详细的错误。
  2. 考虑添加信号处理机制,确保子进程状态能正确获取。
  3. 对于频繁执行命令的场景,可以考虑缓存环境变量。
  4. 在子进程中添加更全面的错误处理和资源清理。

2. 环境变量处理 (linglong/utils/env.cpp)

优点:

  • 保留了 RAII 风格的 EnvironmentVariableGuard
  • 使用 LogE 替代 qCritical 统一日志记录

潜在问题:

  1. 删除了 getUserEnv 函数:
    该函数用于获取特定环境变量,删除后需要确认是否有其他代码依赖此功能。

  2. 错误处理不够完善:

    if (::setenv(m_variableName.c_str(), newValue.c_str(), 1) != 0) {
        LogE("Failed to set environment variable {}: {}", m_variableName, strerror(errno));
    }

    记录错误但继续执行,可能导致后续操作失败。建议考虑抛出异常或返回错误码。

建议:

  1. 确认 getUserEnv 的删除不会影响其他功能,如有需要可以重新实现。
  2. 考虑改进错误处理机制,例如返回错误码或抛出异常。

3. 文件操作增强 (linglong/utils/file.cpp)

优点:

  • 添加了 concatFile 函数用于文件拼接
  • 使用 std::filesystem::path 替代字符串路径,提高类型安全性
  • 改进了错误处理,使用 errorString 统一错误信息格式

潜在问题:

  1. concatFile 函数的边界情况处理:

    if (std::filesystem::exists(target, ec) && std::filesystem::equivalent(source, target, ec)) {
        return LINGLONG_ERR("source and target are the same file", ec);
    }

    只检查了源文件和目标文件是否相同,但没有检查目标文件是否可写。如果目标文件只读,后续操作会失败。

  2. 大文件处理:
    使用 ofs << ifs.rdbuf() 一次性读取整个源文件,对于大文件可能导致内存问题。建议分块处理。

建议:

  1. concatFile 函数中添加目标文件可写性检查。
  2. 考虑分块处理大文件,避免一次性加载到内存。

4. 错误处理改进 (linglong/utils/error/error.h)

优点:

  • 添加了 errorString 函数统一处理系统错误信息
  • 替换了多处 ::strerror(errno)errorString(errno),提高了代码一致性

潜在问题:

  1. 线程安全性:
    std::system_category().message(err) 的实现可能不是线程安全的,特别是在多线程环境中同时调用时。

建议:

  1. 考虑使用线程安全的错误信息获取方式,例如使用 strerror_rstrerror_l

5. 测试代码更新 (linglong/tests/ll-tests/src/linglong/utils/cmd_test.cpp)

优点:

  • 使用 GMock 框架替代了自定义的 Mock 类
  • 添加了全面的测试用例,包括基本命令执行、环境变量设置、标准输入处理等
  • 测试了边界情况,如不存在的命令、大输入数据等

潜在问题:

  1. 测试覆盖度:
    虽然添加了基本测试,但没有测试并发执行命令的场景,这在实际应用中可能出现问题。

  2. 错误处理测试:
    没有测试命令执行失败时的错误信息是否正确返回。

建议:

  1. 添加并发执行命令的测试用例。
  2. 添加命令执行失败时的错误信息测试。

总体评价

这次重构将命令执行工具从基于 Qt 的实现转换为原生 Linux 系统调用实现,减少了 Qt 依赖,提高了性能。代码整体质量较高,使用了现代 C++ 特性和 RAII 模式,错误处理也较为完善。

主要改进点:

  1. 减少了 Qt 依赖,提高了代码的可移植性
  2. 使用 epoll 实现高效的 I/O 多路复用
  3. 统一了错误处理方式
  4. 添加了新的文件操作功能

主要问题:

  1. 子进程错误处理不够完善
  2. 缺少信号处理机制
  3. 大文件处理可能导致内存问题
  4. 测试覆盖度可以进一步提高

建议优先处理的问题

  1. 子进程错误处理:在子进程失败时,尝试将错误信息写入管道,父进程可以读取并报告更详细的错误。
  2. 大文件处理:在 concatFile 函数中分块处理大文件,避免一次性加载到内存。
  3. 测试覆盖度:添加并发执行命令和错误处理的测试用例。
  4. 环境变量处理:考虑缓存环境变量以提高性能,或确认 getUserEnv 的删除不会影响其他功能。

结论

这次重构整体上是成功的,提高了代码的性能和可维护性,减少了外部依赖。但仍有一些细节问题需要处理,特别是在错误处理、资源管理和测试覆盖度方面。建议在合并前处理上述提到的主要问题,以提高代码的健壮性和可靠性。

@reddevillg reddevillg closed this Jan 15, 2026
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.

2 participants