Skip to content
This repository has been archived by the owner on Aug 3, 2023. It is now read-only.

Commit

Permalink
Merge pull request #726 from cloudflare/avery/cargo-generate-bug
Browse files Browse the repository at this point in the history
Install latest version when binary installing
  • Loading branch information
ashleygwilliams authored Sep 26, 2019
2 parents 4a7b322 + b2db45a commit 4e15e2c
Showing 1 changed file with 47 additions and 7 deletions.
54 changes: 47 additions & 7 deletions src/install/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use which::which;

use std::env;
use std::path::Path;
use std::process::Command;

use lazy_static::lazy_static;

Expand All @@ -18,7 +19,7 @@ lazy_static! {
}

pub fn install(tool_name: &str, owner: &str) -> Result<Download, failure::Error> {
if let Some(download) = tool_exists(tool_name) {
if let Some(download) = tool_exists(tool_name)? {
return Ok(download);
}

Expand All @@ -38,7 +39,7 @@ pub fn install_artifact(
owner: &str,
version: &str,
) -> Result<Download, failure::Error> {
if let Some(download) = tool_exists(tool_name) {
if let Some(download) = tool_exists(tool_name)? {
return Ok(download);
}

Expand All @@ -51,14 +52,53 @@ pub fn install_artifact(
}
}

fn tool_exists(tool_name: &str) -> Option<Download> {
fn tool_exists(tool_name: &str) -> Result<Option<Download>, failure::Error> {
if let Ok(path) = which(tool_name) {
log::debug!("found global {} binary at: {}", tool_name, path.display());
let no_parent_msg = format!("{} There is no path parent", emoji::WARN);
Some(Download::at(path.parent().expect(&no_parent_msg)))
} else {
None
log::debug!("found global {} binary at: {}", tool_name, path.display());
if !tool_needs_update(tool_name, &path)? {
return Ok(Some(Download::at(path.parent().expect(&no_parent_msg))));
}
}

Ok(None)
}

fn tool_needs_update(tool_name: &str, path: &Path) -> Result<bool, failure::Error> {
let no_version_msg = format!("failed to find version for {}", tool_name);

let tool_version_output = Command::new(path.as_os_str())
.arg("--version")
.output()
.expect(&no_version_msg);

if !tool_version_output.status.success() {
let error = String::from_utf8_lossy(&tool_version_output.stderr);
log::debug!("could not find version for {}\n{}", tool_name, error);
return Ok(true);
}

let installed_tool_version = String::from_utf8_lossy(&tool_version_output.stdout);
let installed_tool_version = match installed_tool_version.split_whitespace().last() {
None => return Ok(true),
Some(v) => v,
};
let latest_tool_version = get_latest_version(tool_name)?;
if installed_tool_version == latest_tool_version {
log::debug!(
"installed {} version {} is up to date",
tool_name,
installed_tool_version
);
return Ok(false);
}
log::info!(
"installed {} version {} is out of date with latest version {}",
tool_name,
installed_tool_version,
latest_tool_version
);
Ok(true)
}

fn download_prebuilt(
Expand Down

0 comments on commit 4e15e2c

Please sign in to comment.