use crate::{
registry::{redep, Registry},
result::Result,
};
use etc::{Etc, FileSystem};
use std::path::PathBuf;
pub fn exec(mut registry: Registry, path: PathBuf, tag: Option<String>) -> Result<()> {
let mut tags = registry.tag()?;
if tags.is_empty() {
println!("Fetching registry...");
registry.update()?;
tags = registry.tag()?;
}
if let Some(ref tag) = tag {
if !tags.contains(&tag) {
println!(
"Doesn't have tag {} in the registry {}, \
please retry with `sup -p update -t {}`",
&tag, ®istry.config.node.registry, &tag,
);
return Ok(());
} else {
registry.checkout(&tag)?;
println!(
"Switching to tag {} for {}",
&tag,
&path.to_str().unwrap_or(".")
);
}
registry.config.node.tag(tag);
} else {
if let Some(ref tag) = registry.config.node.tag {
if registry.checkout(&tag).is_err() {
println!(
"Doesn't have tag {} in registry {}, \
please retry with `sup -p update -t {}`",
&tag, ®istry.config.node.registry, &tag,
);
println!("failed.");
return Ok(());
}
println!("Update {} with tag {}", path.to_str().unwrap_or("."), &tag);
} else {
println!(
"Use the latest registry without tag for {}",
path.to_str().unwrap_or(".")
);
}
}
if Etc::from(®istry.dir).find("node-template").is_err() {
println!(
"Registry {} doesn't have `node-template`, \
please retry with `sup -p update -t <tag>",
®istry.config.node.registry,
);
println!("failed.");
return Ok(());
}
etc::find_all(&path, "Cargo.toml")?
.iter()
.map(|ct| redep(&ct, ®istry))
.collect::<Result<Vec<_>>>()?;
registry.checkout("master")?;
registry.config.gen(path)?;
println!("ok!");
Ok(())
}