reactive_graph_tooling/tooling/instances/plugins/install/
mod.rs1use crate::tooling::instances::plugins::install::args::InstallPluginsFromRepositoryArgs;
2use crate::tooling::instances::plugins::install::commands::InstallPluginsFromRepositoryCommands;
3use crate::tooling::instances::plugins::install::repositories::std::PLUGINS_REPOSITORY_STD;
4use crate::tooling::releases::args::ReleaseArgs;
5use crate::tooling::releases::release_info::print_release_info;
6use crate::tooling::releases::release_info::print_release_list;
7use crate::tooling::releases::release_tag::RELEASE_TAG_NIGHTLY;
8use crate::tooling::releases::release_tag::ReleaseTag;
9use crate::tooling::releases::update_from_github::update_from_github;
10use crate::tooling::repository::args::RepositoryArgs;
11use anyhow::Result;
12use anyhow::anyhow;
13use self_update::cargo_crate_version;
14use std::fs::File;
15use std::path::Path;
16
17pub mod args;
18pub mod commands;
19pub mod repositories;
20
21pub fn install_plugin(instance_dir: &Path, install_args: InstallPluginsFromRepositoryArgs) -> Result<()> {
22 if let Some(commands) = &install_args.commands {
23 return match commands {
24 InstallPluginsFromRepositoryCommands::Info(release_info_args) => {
25 print_release_info(&install_args.repository, &PLUGINS_REPOSITORY_STD, &install_args.release, release_info_args)
26 }
27 InstallPluginsFromRepositoryCommands::List(release_list_args) => {
28 print_release_list(&install_args.repository, &PLUGINS_REPOSITORY_STD, release_list_args)
29 }
30 };
31 };
32 execute_install(instance_dir, &install_args.repository, &install_args.release)?;
33 println!(
34 "Successfully installed plugins from repository {}/{}",
35 install_args.repository.repository_owner(&PLUGINS_REPOSITORY_STD),
36 install_args.repository.repository_name(&PLUGINS_REPOSITORY_STD),
37 );
38 Ok(())
39}
40
41pub fn execute_install(instance_dir: &Path, repository_args: &RepositoryArgs, release_args: &ReleaseArgs) -> Result<()> {
42 let release_update = update_from_github(repository_args, &PLUGINS_REPOSITORY_STD, release_args)?;
43 let release_tag = ReleaseTag::from(release_args);
44 if release_args.show_output() {
45 println!("Release tag: {}", release_tag);
46 }
47 let release_info = match release_tag {
48 ReleaseTag::Nightly => release_update.get_release_version(RELEASE_TAG_NIGHTLY),
49 ReleaseTag::Latest => release_update.get_latest_release(),
50 ReleaseTag::Current => release_update.get_release_version(cargo_crate_version!()),
51 ReleaseTag::Version(version) => release_update.get_release_version(&version),
52 }?;
53 if release_args.show_output() {
54 println!(
55 "Release:\n Name: {}\n Version: {}\n Date: {}",
56 release_info.name, release_info.version, release_info.date
57 );
58 }
59 let release_asset = release_info.asset_for(&self_update::get_target(), None).ok_or(anyhow!(
60 "Failed to get release asset for release {} (v{}, {})",
61 release_info.name,
62 release_info.version,
63 release_info.date
64 ))?;
65 if release_args.show_output() {
66 println!("Release asset:\n Name: {}\n URL: {}", release_asset.name, release_asset.download_url);
67 }
68 let deploy_path = instance_dir.join("plugins").join("deploy").canonicalize()?;
69 let install_path = deploy_path.join(&release_asset.name);
70 if release_args.show_output() {
71 println!("Install Path: {}", install_path.display());
72 }
73 let install_file = File::create(&install_path)?;
74 if release_args.show_output() {
75 println!("Downloading {} from {} to {}", &release_asset.name, &release_asset.download_url, &deploy_path.display());
76 }
77 self_update::Download::from_url(&release_asset.download_url)
78 .set_header(reqwest::header::ACCEPT, "application/octet-stream".parse()?)
79 .show_progress(release_args.show_download_progress())
80 .download_to(&install_file)?;
81
82 Ok(())
83}