class

Update::Installer

Inherits Reference < Object

取得した実行ファイルを次の起動で使えるようにする(issue #10 第 2 段階)。

実行中の exe は上書きできないが、リネームはできる。この性質だけを使う。 走っている実行ファイルを .old へ退避し、取っておいた .new を元の場所へ移す。 exe のパスが変わらないため、SteamVR へ登録したマニフェストの binary_path_windows は書き換えなくてよい。

取得と置き換えを分けてあるのは、置き換えが失敗すると起動しない exe が残る操作だからである。 常駐している間は取得と検証までを行い、置き換えは起動シーケンスの先頭で行う。

Constants

BUFFER_SIZE = 64 * 1024

読み出しの単位。

Log = ::Log.for("update")

Constructors

new(repository : Repository, running_version : String, executable_path : String, staged_path : String, previous_path : String)
Source

Instance methods

apply(record : Staged) : Bool

実行ファイルを置き換える。

退避に成功した後で移動に失敗したら、退避したものを戻す。 戻せなければ正規のパスに実行ファイルが無い状態が残るため、 通常の失敗とは別の例外にして呼び出し側へ伝える。 そちらでは取得しておいたものを捨ててはならない。復旧の材料になる。

Source
discard

取得しておいたものを消す。

片方ずつ消す。まとめて 1 つの rescue で括ると、先の 1 つが消せなかったときに もう片方を試さないまま抜ける。両方が残ると staged の照合をまた通り、 取り直しを案内した直後から同じものが適用できてしまう。

Source
discard_incomplete

片方だけ残った取得を片付ける。

取得の最中に終了すると、書きかけの実行ファイルだけが残る。 記録は取得が終わってから書くためである。 そのままでは最大で MAX_ASSET_SIZE 分の書きかけが次の取得まで居座る。

呼ぶのは起動時だけとする。取得の最中に呼ぶと、 書いている途中のものを消すことになる。

Source
discard_previous

退避しておいた古い実行ファイルを消す。

置き換えた直後は、その exe がまだ走っているため消せない。 次の起動で消す。消せなくても常駐は続ける。次の機会にまた試す。

Source
download(release : Release) : Bool

リリースのアセットを取り、記録と一緒に残す。

アセットを持たないリリースでは何もせず偽を返す。 手で作った安定版に exe を添え忘れた場合がこれにあたり、 そのときは利用者にリリースページから取ってもらう。

Source
metadata_path

取得したものに添える記録の置き場所。

Source
previous_path
Source
staged(channel : String) : Staged | Nil

取得済みで、今のチャンネルに合い、記録と照合の通る実行ファイル。無ければ nil を返す。

合わないものはその場で捨てる。残しておいても次の起動でまた同じ照合に落ちるだけであり、 取り直しの機会を与えたほうがよい。

Source
staged_path
Source

Nested types