欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/

欢迎在 PC 社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper

适配开源地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_RapidSVN

一、为什么选择适配 RapidSVN

RapidSVN 是一款以图形化方式管理 Subversion 工作副本的桌面客户端。它把工作副本树、文件状态、提交、更新、日志和差异查询集中在同一个窗口中。对于仍在维护 SVN 仓库的嵌入式、制造、政企和长期交付项目来说,这类工具的价值并没有因为 Git 普及而消失:许多工程更看重集中式权限、目录级管理和稳定的版本基线,也需要一款不要求用户熟记命令参数的桌面客户端。

HarmonyOS PC 要进入真实的研发与办公场景,除了编辑器、终端和构建工具,也需要覆盖版本管理客户端。选择 RapidSVN,一方面是补充 SVN 图形工具这一块能力;另一方面,这个项目同时涉及传统 C++ 桌面界面、工作副本文件访问、命令行运行时打包、长任务异步执行和应用沙箱权限,能够较完整地检验传统开发工具迁移到鸿蒙 PC 时会遇到的系统边界。

本次适配保留了仓库中的 wxWidgets/C++ 上游代码,在 ohos/ 下增加独立的鸿蒙工程。鸿蒙版本号为 0.13.0-ohos.1,应用包名为 org.rapidsvn.ohos,目标设备类型为 2in1,当前产物只面向 arm64-v8a

二、先确定适配边界:不为 wxWidgets 再造一层桌面兼容环境

RapidSVN 原版建立在 wxWidgets、Subversion C++ 封装和传统桌面进程模型之上。菜单、工具栏、树形工作台、列表控件、对话框以及外部工具调用都默认运行在常规桌面文件系统中。将这些代码直接交给鸿蒙编译器,并不能自然获得 ArkUI 窗口、Stage 生命周期、系统文件授权和 HAP 内的可执行运行时。

因此,鸿蒙侧采用“保留上游源码,重建用户工作流”的策略:界面使用 ArkTS/ArkUI 实现,SVN 操作由 C++ N-API 桥接到随 HAP 安装的 Subversion 运行时。迁移边界如下。

层次原版 RapidSVN鸿蒙侧实现
应用入口桌面进程与 wxWidgets 事件循环Stage 模型 EntryAbility
主界面wxWidgets 菜单、树和列表控件ArkUI PC 工作台
文件访问普通桌面路径系统文件夹选择器、持久授权与应用沙箱
SVN 能力libsvncpp 与本机运行时C++ N-API + HNP 中的 Subversion CLI
长任务桌面线程与进程调用ArkTS 异步封装、退出码和输出回调
分发方式系统安装包及外部依赖HAP 携带 svn.hnp,随应用交付

这不是原 wxWidgets 界面的重新打包,也不是只保留几枚按钮的演示壳。工作副本状态、创建仓库、Checkout、Mkdir、Commit、Update、Info、Log、Diff 和 Export 等操作都有真实的 Native 调用链;与此同时,网络认证、HTTPS 证书、高级合并和完整桌面插件能力仍按未完成处理,不用界面入口代替功能验收。

三、鸿蒙版本的工程结构与运行链路

适配工程放在仓库根目录的 ohos/ 中,ArkTS 负责页面、交互状态和权限,libsvn_napi.so 负责参数校验、异步任务和命令输出,svn.hnp 则提供 ARM64 Subversion 可执行环境。

EntryAbility
    └── ArkUI RapidSVN 工作台
          ├── 工作副本树、状态表、过滤与排序
          ├── Create / Modify / Query 操作面板
          ├── 文件夹选择和授权持久化
          └── ArkTS SVN 动作封装
                └── libsvn_napi.so
                      └── svn.hnp
                            ├── svn / svnadmin / svnlook
                            ├── svnserve / svndumpfilter
                            └── svnsync / svnversion

主要目录如下:

ohos_RapidSVN/
├── librapidsvn/、libsvncpp/、rapidsvn/     # RapidSVN 上游源码
├── README.OpenHarmony_CN.md               # 鸿蒙适配与能力说明
└── ohos/
    ├── AppScope/app.json5                 # 包名、版本、图标
    ├── build-profile.json5                # SDK、产品和签名配置
    ├── hnp/arm64-v8a/svn.hnp              # Subversion ARM64 运行时
    ├── scripts/build-svn-hnp.sh            # 交叉编译与 HNP 打包脚本
    └── entry/src/main/
        ├── ets/                            # Ability、ArkUI 页面与动作封装
        ├── cpp/svn_napi.cpp                # SVN Native 桥接
        └── module.json5                    # 2in1、权限与 HNP 声明

HNP 构建脚本交叉编译 Subversion 1.14.5,并一并处理 APR、APR-util、zlib、SQLite 和 Expat。应用运行时不依赖真机预装 svn,这使安装包和测试环境更可控,也避免“开发机能跑、换一台机器就缺命令”的问题。

四、在真机上跑通一条完整的本地仓库工作流

以下五张图片均为 2026 年 8 月 16 日重新构建并安装当前签名 HAP 后,在 HarmonyOS PC 2in1 真机上实际操作所得。设备截图分辨率为 3120×2080,测试链路使用应用沙箱中的真实仓库和工作副本,依次完成仓库创建、Checkout、目录变更、提交和日志查询。

1. 在应用内创建本地 SVN 仓库

Create 菜单提供 Create repository 入口,操作面板分别接收仓库父目录和仓库名。参数进入 Native 层后调用 svnadmin create,成功时界面底部返回 create completed.。本次测试创建的仓库为 rapidsvn-doc-repo-20260816,不是预先准备的静态演示数据。

在这里插入图片描述

创建仓库与打开工作副本使用不同的数据模型。前者产生带有 confdbhookslocks 等结构的仓库目录,后者才是用户日常修改文件的工作区。界面将两类路径分开输入,避免把仓库物理目录误当成工作副本直接操作。

2. 通过 file 协议 Checkout 到独立工作副本

仓库创建成功后,应用会保留最近一次本地仓库地址,并在 Checkout 面板中预填 file:// URL。用户仍需明确指定目标父目录和工作副本名称,Native 层再执行 Checkout,成功后自动把新目录切换为当前工作副本并刷新状态。

在这里插入图片描述

截图中左侧出现 Working copy 节点和 rapidsvn-doc-wc-20260816,右侧顶部显示实际沙箱路径。空仓库的状态列表为 0 条是预期结果,它同时证明界面打开的是刚刚 Checkout 的工作副本,而不是把仓库目录直接画进树中。

3. 用状态扫描呈现尚未提交的目录变更

随后在 Modify 菜单中两次执行 Mkdir,创建 trunkbranches。界面不是在内存中添加两行,而是由 Subversion 运行时修改工作副本,再通过 svn status --xml --verbose 重新扫描。两个目录的 Revision 为 -1、Status 为 added,对应“已经加入版本控制,但尚未提交”的真实 SVN 状态。

在这里插入图片描述

右侧列表保留 RapidSVN 常见的 Name / Revision / Last Changed / Status / Prop Status 列,View 菜单还可控制 Path、Author、未版本化、未修改、忽略项和冲突项等显示范围。列表中的选择结果会作为 Add、Delete、Revert、Resolve、Info、Log 和 Diff 的目标,根节点则用于工作副本级操作。

4. 提交后用版本号和状态反查结果

Commit 操作要求填写提交说明;本次真机输入 initialize standard repository layout 并提交工作副本根目录。提交完成后应用重新扫描,trunkbranches 的 Revision 都变为 1,Status 从 added 变为 normal,Last Changed 同步显示真机提交日期。

在这里插入图片描述

这里没有只依赖命令返回一句“成功”。对于版本管理工具,可靠的结果口径应当包括退出码、命令输出和提交后的工作副本状态。适配版在异步回调结束后触发状态刷新,因此列表展示的是磁盘与 SVN 元数据的最新结果。

5. 从仓库日志核对提交内容

最后从 Query 菜单执行 Show log。底部 Output / Log 面板返回 revision 1、变更路径 /branches/trunk,并显示刚才输入的提交说明。日志查询针对工作副本对应的仓库相对路径执行,即使工作副本处于较旧 revision,也能查询仓库端已有历史。

在这里插入图片描述

至此,一条最小但完整的 SVN 主线已经闭环:创建仓库,Checkout 工作副本,产生版本化变更,提交,再从日志反查仓库历史。五个画面之间的数据前后相接,而不是彼此独立的功能展示。

五、适配过程中最棘手的几个问题

难点一:桌面 GUI 与业务调用长期耦合

RapidSVN 原版并非“界面层调用几个独立函数”这么简单。wxWidgets 事件、列表模型、对话框参数、工作副本节点和 libsvncpp 对象生命周期共同组成原有桌面架构。若逐个替换控件,迁移代码会长期卡在不完整的事件模型中。鸿蒙版本先按创建、打开、状态、修改、查询五类工作流划分接口,再让 ArkUI 与 Native 只通过类型明确的异步方法通信,才把平台差异控制在可维护的边界内。

难点二:Subversion 不只是一个可执行文件

svn 二进制复制进工程并不足以完成运行时交付。Subversion 依赖 APR、APR-util、SQLite、Expat 和 zlib,还要考虑目标 ABI、动态库搜索路径、命令入口以及 HAP 安装后的实际位置。项目使用脚本统一交叉编译依赖,并用 HNP 为 svnsvnadminsvnlooksvnservesvndumpfiltersvnsyncsvnversion 建立启动入口,最终在打包阶段把 svn.hnp 注入 HAP。

难点三:文件夹授权必须覆盖冷启动恢复

传统桌面程序拿到绝对路径后通常可以长期复用,鸿蒙应用则必须尊重文件选择与沙箱权限。适配层通过系统文件夹选择器获取目录,并调用文件共享接口持久化授权;应用再次启动时重新激活权限。若只解决“当前页面能读取”,最近工作副本、Checkout 目标和 Export 目录都会在冷启动后失去实际意义。

难点四:异步操作不能丢失退出码和上下文

Update、Commit、Checkout 或大工作副本状态扫描都不应阻塞 UI。Native 接口将命令放到异步任务中执行,并把 exitCode 与完整输出一起返回 ArkTS。界面在任务进行中维护 busy 状态,结束后根据操作类型刷新列表或输出区。仅捕获 stdout 会漏掉大量 SVN 错误信息,仅根据输出文本猜测成功与否也不可靠,因此退出码是所有操作统一的判定依据。

难点五:状态列表要符合 SVN 语义

SVN 文件状态并不是“修改/未修改”两个值。未版本化、增加、删除、冲突、忽略、属性变化以及目录本身都有不同语义。鸿蒙版本使用 XML 状态输出解析路径、revision、author、last changed、文本状态和属性状态,再根据 View 选项过滤与排序。此次真机测试中,Mkdir 后的 added / revision -1 与 Commit 后的 normal / revision 1 正好验证了这套状态转换。

难点六:本地闭环完成,不代表网络仓库已经完成

当前 HNP 构建明确使用 --without-serf,因此不能把本地 file:// 验收结果扩大解释为 HTTPS、代理、证书信任和企业认证都已经可用。网络仓库还涉及 serf/OpenSSL、凭据安全存储、证书确认对话框和失败重试,这些需要单独实现与验收。把边界写清楚,后续维护者才不会在错误的能力假设上继续开发。

六、构建、安装与启动

当前工程的 target SDK 与 compatible SDK 都是 5.0.5(17)。使用 DevEco Studio 时直接打开仓库中的 ohos/,为 org.rapidsvn.ohos 配置与目标设备匹配的签名,然后选择 entry 模块和 default product 构建。

命令行构建如下:

cd ohos

DEVECO_SDK_HOME=/Applications/DevEco-Studio.app/Contents/sdk \
HOS_SDK_HOME=/Applications/DevEco-Studio.app/Contents/sdk \
/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw \
  assembleHap --mode module -p module=entry@default -p product=default

签名产物位于:

ohos/entry/build/default/outputs/default/entry-default-signed.hap

本文真机验证前重新执行了 Native、ArkTS、HNP 注入、HAP 打包和签名任务,构建结果为 BUILD SUCCESSFUL;签名 HAP 约 14 MB,SHA-256 为:

2c2f041d97c3dffdf80cce25bfbcd466d2c1273b4bf8134460f7055c3e0f239b

连接 HarmonyOS PC 后安装与启动:

HDC=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/toolchains/hdc

"$HDC" list targets
"$HDC" install -r ohos/entry/build/default/outputs/default/entry-default-signed.hap
"$HDC" shell aa start -a EntryAbility -b org.rapidsvn.ohos -m entry -W

若更换开发机或设备,需要重新生成与包名、证书和目标设备匹配的签名材料;仓库中的本机签名路径不应作为可移植配置使用。

七、当前能力与明确边界

当前版本已经接入的主要能力包括:

  • HAP 构建、签名、安装和 2in1 窗口启动;
  • 系统文件夹选择、工作副本打开和目录授权持久化;
  • 本地仓库创建与 file:// Checkout;
  • 工作副本状态扫描、目录进入、排序和常用视图过滤;
  • Mkdir、Add、Delete、Revert、Resolve、Cleanup 等工作副本操作;
  • Commit、Update、Info、Log、Diff 和 Export;
  • 输出区逐行显示、退出码回传与操作结束后的状态刷新。

其中,本文这一轮重新安装后的真机实测重点覆盖本地仓库创建、Checkout、Mkdir、状态刷新、Commit 与 Log;其余能力的验证记录随工程保存在 ohos/reports/ 中。

尚不能按完整适配口径交付的部分包括:

  • HTTPS/SSL、代理、认证和证书信任管理;
  • 远程网络仓库的完整兼容性验收;
  • Merge、Switch、Upgrade、Annotate/Blame、Properties 等高级流程;
  • Rename、Move、Copy 与外部 Diff/Merge 工具配置;
  • 原 wxWidgets 版的全部列表列、虚拟 LogList、书签管理和细粒度桌面交互;
  • 对正在运行的 SVN 子进程进行可靠取消的完整 Stop 机制。

因此,当前版本更准确的定位是“RapidSVN HarmonyOS PC 本地工作副本版”。它已经能够承担本地仓库和日常工作副本的核心操作,但还不是原桌面版全部能力的等价复制。

八、总结

RapidSVN 的适配说明,版本管理客户端的迁移远不止重画一个窗口。工作副本路径是否长期有效、SVN 运行时是否随包交付、异步任务是否保留退出码、状态是否符合版本控制语义,以及提交后能否从仓库日志反查结果,这些细节共同决定应用能否真正使用。

本项目用 Stage 模型和 ArkUI 重建 RapidSVN 风格工作台,通过 C++ N-API 收敛参数、任务与输出,再以 HNP 携带 Subversion ARM64 运行时。真机上的五个连续画面验证了从创建仓库到查询提交历史的完整数据链,说明当前版本已经越过“能安装、能显示”的阶段。

对于其他传统 C/C++ 开发工具,这次实践也提供了一条可复用的路线:保留上游源码和能力边界,优先重建高频用户闭环;把第三方运行时变成可随应用交付、可复现构建的产物;最后用真机文件、真实状态和可反查结果完成验收。只有这一整条链路成立,适配才具有后续维护和实际使用的基础。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐