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

Install latest version when binary installing #726

Merged
merged 4 commits into from
Sep 26, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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