self_update
provides updaters for updating rust executables in-place from various release
distribution backends.
shell
self_update = "0.4"
Update (replace) the current executable with the latest release downloaded
from https://api.github.com/repos/jaemk/self_update/releases/latest
```rust
fn update() -> Result<(), Box<::std::error::Error>> {
let target = selfupdate::gettarget()?;
let status = selfupdate::backends::github::Update::configure()?
.repoowner("jaemk")
.reponame("selfupdate")
.target(&target)
.binname("selfupdateexample")
.showdownloadprogress(true)
.currentversion(cargocrateversion!())
.build()?
.update()?;
println!("Update status: {}
!", status.version());
Ok(())
}
```
Run the above example to see self_update
in action: cargo run --example github
Separate utilities are also exposed:
```rust extern crate self_update;
fn update() -> Result<(), Box<::std::error::Error>> { let target = selfupdate::gettarget()?; let releases = selfupdate::backends::github::ReleaseList::configure() .repoowner("jaemk") .reponame("selfupdate") .with_target(&target) .build()? .fetch()?; println!("found releases:"); println!("{:#?}\n", releases);
// get the first available release
let asset = releases[0]
.asset_for(&target).unwrap();
let tmp_dir = self_update::TempDir::new_in(::std::env::current_dir()?, "self_update")?;
let tmp_tarball_path = tmp_dir.path().join(&asset.name);
let tmp_tarball = ::std::fs::File::open(&tmp_tarball_path)?;
self_update::Download::from_url(&asset.download_url)
.download_to(&tmp_tarball)?;
self_update::Extract::from_source(&tmp_tarball_path)
.archive(self_update::ArchiveKind::Tar)
.encoding(self_update::EncodingKind::Gz)
.extract_into(&tmp_dir.path())?;
let tmp_file = tmp_dir.path().join("replacement_tmp");
let bin_name = "self_update_bin";
let bin_path = tmp_dir.path().join(bin_name);
self_update::Move::from_source(&bin_path)
.replace_using_temp(&tmp_file)
.to_dest(&::std::env::current_exe()?)?;
Ok(())
} ```
License: MIT