Skip to content

fix(shared): 前回の展開物を残したまま上書き展開しない - #2466

Merged
hal-shu-sato merged 1 commit into
mainfrom
fix/unzip-clean-target
Aug 29, 2026
Merged

fix(shared): 前回の展開物を残したまま上書き展開しない#2466
hal-shu-sato merged 1 commit into
mainfrom
fix/unzip-clean-target

Conversation

@hal-shu-sato

Copy link
Copy Markdown
Member

base は fix/package-id-path-escape(#2465)です。 理由は下記。#2465 をマージすると自動で main へリターゲットされ、CI が回り直します。

内容

unziptargetPath を消さずに overwrite: 'a' で展開します。overwrite はアーカイブに在るものを上書きするだけなので、旧バージョンにしか無かったファイルは残り続けます。

targetPath は同じパッケージ(Data/package/{id})・同じアーカイブ名で再利用されるため、残骸は次のインストールに持ち込まれます。

install() がファイル単位でコピーする通常経路は列挙されたものしか拾いませんが、

  • isDirectory のエントリ(実データに 55 件)
  • isProgram(展開結果を丸ごとコピー)

は subtree ごと持っていくので、作者が削除したファイルが AviUtl 側へ再配置されます

なぜ #2465 の上に積むのか

この変更は remove() を新しく足します。targetPath が関門を通っていない状態でこれを入れると、「書ける」より取り返しのつかない「消せる」を無検証のパスに対して行うことになります。

#2465targetPathresolveInside を通るようになるので、消す対象が必ず基点の内側にあることが保証されます。順序を逆にできません。

代償

展開に失敗すると前回の展開物も失われます。アーカイブは Data/{core,package}/archive に残っているのでやり直せます。

「壊れた新しい展開物」と「古い展開物が混ざった状態」なら前者のほうが扱いやすい、という判断です。

テスト

前回の展開物を残さない を追加しました。展開先に旧バージョンのファイル(ルート直下とサブディレクトリの両方)を置いてから展開し、消えていることを確認します。修正前は落ちます。


調査と文面の作成に Claude Code を使用しています。

unzip は targetPath を消さずに overwrite: 'a' で展開する。overwrite は
アーカイブに在るものを上書きするだけなので、旧バージョンにしか無かった
ファイルは残り続ける。

targetPath は同じパッケージ(Data/package/{id})・同じアーカイブ名で
再利用されるため、残骸は次のインストールに持ち込まれる。install() が
ファイル単位でコピーする通常経路は列挙されたものしか拾わないが、
isDirectory のエントリと isProgram(展開結果を丸ごとコピー)は
subtree ごと持っていくので、削除されたはずのファイルが AviUtl 側へ
再配置される。

展開前に消す。targetPath は resolveInside を通しているので、消す対象は
必ず基点の内側にある(この PR を #2465 の上に積んでいるのはそのため。
関門を通っていない状態で remove を足すと、書き込みより危険な操作を
無検証のパスに対して行うことになる)。

代償として、展開に失敗すると前回の展開物も失われる。アーカイブは
Data/{core,package}/archive に残っているのでやり直せる。
Base automatically changed from fix/package-id-path-escape to main August 29, 2026 18:46
@hal-shu-sato
hal-shu-sato merged commit 6f00bb8 into main Aug 29, 2026
9 checks passed
@hal-shu-sato
hal-shu-sato deleted the fix/unzip-clean-target branch August 29, 2026 18:46
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.

1 participant