Add option to install packages from repositories outside the HUB. Fix #55
This commit is contained in:
		
							parent
							
								
									d7204775ac
								
							
						
					
					
						commit
						e0bdace3f2
					
				
							
								
								
									
										80
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								src/main.rs
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -31,6 +31,7 @@ use std::time::Duration;
 | 
			
		|||
use std::process::{Command, Stdio};
 | 
			
		||||
use notify::{RecommendedWatcher, Watcher, RecursiveMode, DebouncedEvent};
 | 
			
		||||
use std::sync::mpsc::channel;
 | 
			
		||||
use regex::Regex;
 | 
			
		||||
 | 
			
		||||
use clap::{App, Arg, ArgMatches, SubCommand, AppSettings};
 | 
			
		||||
use fs2::FileExt;
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +84,12 @@ fn main() {
 | 
			
		|||
            .takes_value(false)
 | 
			
		||||
            .help("Allow installing packages from non-verified repositories."))
 | 
			
		||||
        .arg(Arg::with_name("package_name")
 | 
			
		||||
            .help("Package name"));
 | 
			
		||||
            .help("Package name"))
 | 
			
		||||
        .arg(Arg::with_name("repository_url")
 | 
			
		||||
            .help("(Optional) Link to GitHub repository")
 | 
			
		||||
            .required(false)
 | 
			
		||||
            .default_value("hub")
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    let uninstall_subcommand = SubCommand::with_name("uninstall")
 | 
			
		||||
        .about("Remove an installed package. Equivalent to 'espanso package uninstall'")
 | 
			
		||||
| 
						 | 
				
			
			@ -903,6 +909,8 @@ fn install_main(_config_set: ConfigSet, matches: &ArgMatches) {
 | 
			
		|||
        exit(1);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let repository = matches.value_of("repository_url").unwrap_or("hub");
 | 
			
		||||
 | 
			
		||||
    let package_resolver= Box::new(ZipPackageResolver::new());
 | 
			
		||||
 | 
			
		||||
    let allow_external: bool = if matches.is_present("external") {
 | 
			
		||||
| 
						 | 
				
			
			@ -914,31 +922,50 @@ fn install_main(_config_set: ConfigSet, matches: &ArgMatches) {
 | 
			
		|||
 | 
			
		||||
    let mut package_manager = DefaultPackageManager::new_default(Some(package_resolver));
 | 
			
		||||
 | 
			
		||||
    if package_manager.is_index_outdated() {
 | 
			
		||||
        println!("Updating package index...");
 | 
			
		||||
        let res = package_manager.update_index(false);
 | 
			
		||||
    let res = if repository == "hub" { // Installation from the Hub
 | 
			
		||||
        if package_manager.is_index_outdated() {
 | 
			
		||||
            println!("Updating package index...");
 | 
			
		||||
            let res = package_manager.update_index(false);
 | 
			
		||||
 | 
			
		||||
        match res {
 | 
			
		||||
            Ok(update_result) => {
 | 
			
		||||
                match update_result {
 | 
			
		||||
                    UpdateResult::NotOutdated => {
 | 
			
		||||
                        eprintln!("Index was already up to date");
 | 
			
		||||
                    },
 | 
			
		||||
                    UpdateResult::Updated => {
 | 
			
		||||
                        println!("Index updated!");
 | 
			
		||||
                    },
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            Err(e) => {
 | 
			
		||||
                eprintln!("{}", e);
 | 
			
		||||
                exit(2);
 | 
			
		||||
            },
 | 
			
		||||
            match res {
 | 
			
		||||
                Ok(update_result) => {
 | 
			
		||||
                    match update_result {
 | 
			
		||||
                        UpdateResult::NotOutdated => {
 | 
			
		||||
                            eprintln!("Index was already up to date");
 | 
			
		||||
                        },
 | 
			
		||||
                        UpdateResult::Updated => {
 | 
			
		||||
                            println!("Index updated!");
 | 
			
		||||
                        },
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                Err(e) => {
 | 
			
		||||
                    eprintln!("{}", e);
 | 
			
		||||
                    exit(2);
 | 
			
		||||
                },
 | 
			
		||||
            }
 | 
			
		||||
        }else{
 | 
			
		||||
            println!("Using cached package index, run 'espanso package refresh' to update it.")
 | 
			
		||||
        }
 | 
			
		||||
    }else{
 | 
			
		||||
        println!("Using cached package index, run 'espanso package refresh' to update it.")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let res = package_manager.install_package(package_name, allow_external);
 | 
			
		||||
        package_manager.install_package(package_name, allow_external)
 | 
			
		||||
    }else{
 | 
			
		||||
        // Make sure the repo is a valid github url
 | 
			
		||||
        lazy_static! {
 | 
			
		||||
            static ref GITHUB_REGEX: Regex = Regex::new(r#"https://github\.com/\S*/\S*"#).unwrap();
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if !GITHUB_REGEX.is_match(repository) {
 | 
			
		||||
            eprintln!("repository url is not valid, it should be an HTTPS GitHub url in the following format:");
 | 
			
		||||
            eprintln!("https://github.com/user/repo");
 | 
			
		||||
            exit(3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if !allow_external {
 | 
			
		||||
            Ok(InstallResult::BlockedExternalPackage(repository.to_owned()))
 | 
			
		||||
        }else{
 | 
			
		||||
            package_manager.install_package_from_repo(package_name, repository)
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    match res {
 | 
			
		||||
        Ok(install_result) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -971,7 +998,12 @@ fn install_main(_config_set: ConfigSet, matches: &ArgMatches) {
 | 
			
		|||
                    eprintln!("if you trust the source or you verified the contents of the package");
 | 
			
		||||
                    eprintln!("by checking out the repository listed above.");
 | 
			
		||||
                    eprintln!();
 | 
			
		||||
                    eprintln!("espanso install {} --external", package_name);
 | 
			
		||||
 | 
			
		||||
                    if repository == "hub" {
 | 
			
		||||
                        eprintln!("espanso install {} --external", package_name);
 | 
			
		||||
                    }else{
 | 
			
		||||
                        eprintln!("espanso install {} {} --external", package_name, repository);
 | 
			
		||||
                    }
 | 
			
		||||
                    eprintln!();
 | 
			
		||||
                }
 | 
			
		||||
                InstallResult::Installed => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user