reactive_graph_tooling/tooling/instances/plugins/install/
mod.rs

1use 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}