self_update

Build status Build Status crates.io:clin docs

self_update provides updaters for updating rust executables in-place from various release distribution backends.

shell self_update = "0.4"

Usage

Update (replace) the current executable with the latest release downloaded from https://api.github.com/repos/jaemk/self_update/releases/latest. Note, the trust project provides a nice setup for producing release-builds via CI (travis/appveyor).

```rust

[macrouse] extern crate selfupdate;

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(Some(self_update::Compression::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