Skip to content

整合包文件替换方式

bbaa edited this page Jul 24, 2022 · 4 revisions

代码参见 HMCLCore/org.jackhuang.hmcl.mod.ModpackInstallTask

由于不是git,所以不考虑合并用户修改和整合包作者修改的情况(比如Mod配置文件)。

整合包的任意一个文件的变化有如下10种情况:

  • 如果旧版本整合包内应有这个文件
    • 如果新版本整合包内应有这个文件
      • 实际被用户删除了
        • 不变(玩家不需要这个文件,如果整合包必需这个文件,造成的崩溃由玩家自行修复)
      • 实际被用户修改了
        • 不变(比如Mod配置文件,应当保留玩家的修改)
      • 文件完好
        • 替换
    • 如果新版本整合包内没有这个文件
      • 实际被用户删除了
        • 不变(玩家正好删除了需要删除的文件)
      • 实际被用户修改了
        • 删除(虽然文件被玩家修改了,但是新整合包不再需要此文件)
      • 文件完好
        • 删除
  • 如果旧版本整合包内没有这个文件
    • 如果新版本整合包内应有这个文件
      • 实际没有这个文件
        • 添加
      • 用户添加了和整合包相同的文件
        • 不变
      • 用户添加了和整合包不同的文件
        • 替换(以整合包配置为准,比如同名的Mod文件但哈希值不同)
    • 如果新版本整合包内没有这个文件
      • 不变

整合同类情况后,代码的逻辑为:

  • 对于新整合包内有的文件
    • 旧整合包内没有,则添加或覆盖
    • 旧整合包内有这个文件
      • 实际没有这个文件(被用户删除),则不变
      • 实际有这个文件,但哈希值和旧整合包内的不一致,则不变
      • 实际有这个文件,且哈希值和旧整合包内的一致,则替换
  • 对于新整合包内没有的文件
    • 旧整合包内有这个文件
      • 删除