Add proxy setting for install command. Fix #408
This commit is contained in:
		
							parent
							
								
									99f048fcd7
								
							
						
					
					
						commit
						8f8d5f2f1c
					
				
							
								
								
									
										16
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/main.rs
									
									
									
									
									
								
							|  | @ -97,7 +97,9 @@ fn main() { | ||||||
|                 .help("(Optional) Link to GitHub repository") |                 .help("(Optional) Link to GitHub repository") | ||||||
|                 .required(false) |                 .required(false) | ||||||
|                 .default_value("hub"), |                 .default_value("hub"), | ||||||
|         ); |         ) | ||||||
|  |         .arg(Arg::with_name("proxy").help("Use a proxy, should be used as --proxy=https://proxy:1234") | ||||||
|  |             .required(false).long("proxy").takes_value(true)); | ||||||
| 
 | 
 | ||||||
|     let uninstall_subcommand = SubCommand::with_name("uninstall") |     let uninstall_subcommand = SubCommand::with_name("uninstall") | ||||||
|         .about("Remove an installed package. Equivalent to 'espanso package uninstall'") |         .about("Remove an installed package. Equivalent to 'espanso package uninstall'") | ||||||
|  | @ -1096,6 +1098,14 @@ fn install_main(_config_set: ConfigSet, matches: &ArgMatches) { | ||||||
|         repository = repository.trim_end_matches(".git") |         repository = repository.trim_end_matches(".git") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     let proxy = match matches.value_of("proxy") { | ||||||
|  |         Some(proxy) => { | ||||||
|  |             println!("Using proxy: {}", proxy); | ||||||
|  |             Some(proxy.to_string()) | ||||||
|  |         } | ||||||
|  |         None => {None} | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     let package_resolver = Box::new(ZipPackageResolver::new()); |     let package_resolver = Box::new(ZipPackageResolver::new()); | ||||||
| 
 | 
 | ||||||
|     let allow_external: bool = if matches.is_present("external") { |     let allow_external: bool = if matches.is_present("external") { | ||||||
|  | @ -1131,7 +1141,7 @@ fn install_main(_config_set: ConfigSet, matches: &ArgMatches) { | ||||||
|             println!("Using cached package index, run 'espanso package refresh' to update it.") |             println!("Using cached package index, run 'espanso package refresh' to update it.") | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         package_manager.install_package(package_name, allow_external) |         package_manager.install_package(package_name, allow_external, proxy) | ||||||
|     } else { |     } else { | ||||||
|         // Make sure the repo is a valid github url
 |         // Make sure the repo is a valid github url
 | ||||||
|         lazy_static! { |         lazy_static! { | ||||||
|  | @ -1147,7 +1157,7 @@ fn install_main(_config_set: ConfigSet, matches: &ArgMatches) { | ||||||
|         if !allow_external { |         if !allow_external { | ||||||
|             Ok(InstallResult::BlockedExternalPackage(repository.to_owned())) |             Ok(InstallResult::BlockedExternalPackage(repository.to_owned())) | ||||||
|         } else { |         } else { | ||||||
|             package_manager.install_package_from_repo(package_name, repository) |             package_manager.install_package_from_repo(package_name, repository, proxy) | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -264,12 +264,13 @@ impl super::PackageManager for DefaultPackageManager { | ||||||
|         &self, |         &self, | ||||||
|         name: &str, |         name: &str, | ||||||
|         allow_external: bool, |         allow_external: bool, | ||||||
|  |         proxy: Option<String>, | ||||||
|     ) -> Result<InstallResult, Box<dyn Error>> { |     ) -> Result<InstallResult, Box<dyn Error>> { | ||||||
|         let package = self.get_package(name); |         let package = self.get_package(name); | ||||||
|         match package { |         match package { | ||||||
|             Some(package) => { |             Some(package) => { | ||||||
|                 if package.is_core || allow_external { |                 if package.is_core || allow_external { | ||||||
|                     self.install_package_from_repo(name, &package.repo) |                     self.install_package_from_repo(name, &package.repo, proxy) | ||||||
|                 } else { |                 } else { | ||||||
|                     Ok(BlockedExternalPackage(package.original_repo)) |                     Ok(BlockedExternalPackage(package.original_repo)) | ||||||
|                 } |                 } | ||||||
|  | @ -282,6 +283,7 @@ impl super::PackageManager for DefaultPackageManager { | ||||||
|         &self, |         &self, | ||||||
|         name: &str, |         name: &str, | ||||||
|         repo_url: &str, |         repo_url: &str, | ||||||
|  |         proxy: Option<String>, | ||||||
|     ) -> Result<InstallResult, Box<dyn Error>> { |     ) -> Result<InstallResult, Box<dyn Error>> { | ||||||
|         // Check if package is already installed
 |         // Check if package is already installed
 | ||||||
|         let packages = self.list_local_packages_names(); |         let packages = self.list_local_packages_names(); | ||||||
|  | @ -294,7 +296,7 @@ impl super::PackageManager for DefaultPackageManager { | ||||||
|             .package_resolver |             .package_resolver | ||||||
|             .as_ref() |             .as_ref() | ||||||
|             .unwrap() |             .unwrap() | ||||||
|             .clone_repo_to_temp(repo_url)?; |             .clone_repo_to_temp(repo_url, proxy)?; | ||||||
| 
 | 
 | ||||||
|         let temp_package_dir = temp_dir.path().join(name); |         let temp_package_dir = temp_dir.path().join(name); | ||||||
|         if !temp_package_dir.exists() { |         if !temp_package_dir.exists() { | ||||||
|  | @ -532,7 +534,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("doesnotexist", false) |                 .install_package("doesnotexist", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             NotFoundInIndex |             NotFoundInIndex | ||||||
|         ); |         ); | ||||||
|  | @ -548,7 +550,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("italian-accents", false) |                 .install_package("italian-accents", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             AlreadyInstalled |             AlreadyInstalled | ||||||
|         ); |         ); | ||||||
|  | @ -563,7 +565,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("dummy-package", false) |                 .install_package("dummy-package", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             Installed |             Installed | ||||||
|         ); |         ); | ||||||
|  | @ -589,7 +591,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("not-existing", false) |                 .install_package("not-existing", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             NotFoundInRepo |             NotFoundInRepo | ||||||
|         ); |         ); | ||||||
|  | @ -604,7 +606,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("dummy-package2", false) |                 .install_package("dummy-package2", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             MissingPackageVersion |             MissingPackageVersion | ||||||
|         ); |         ); | ||||||
|  | @ -619,7 +621,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("dummy-package3", false) |                 .install_package("dummy-package3", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             UnableToParsePackageInfo |             UnableToParsePackageInfo | ||||||
|         ); |         ); | ||||||
|  | @ -634,7 +636,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("dummy-package4", false) |                 .install_package("dummy-package4", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             UnableToParsePackageInfo |             UnableToParsePackageInfo | ||||||
|         ); |         ); | ||||||
|  | @ -649,7 +651,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             temp.package_manager |             temp.package_manager | ||||||
|                 .install_package("dummy-package", false) |                 .install_package("dummy-package", false, None) | ||||||
|                 .unwrap(), |                 .unwrap(), | ||||||
|             Installed |             Installed | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|  | @ -1,33 +0,0 @@ | ||||||
| use tempfile::TempDir; |  | ||||||
| use std::error::Error; |  | ||||||
| use git2::Repository; |  | ||||||
| use super::PackageResolver; |  | ||||||
| 
 |  | ||||||
| pub struct GitPackageResolver; |  | ||||||
| 
 |  | ||||||
| impl GitPackageResolver { |  | ||||||
|     pub fn new() -> GitPackageResolver { |  | ||||||
|         return GitPackageResolver{}; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl super::PackageResolver for GitPackageResolver { |  | ||||||
|     fn clone_repo_to_temp(&self, repo_url: &str) -> Result<TempDir, Box<dyn Error>> { |  | ||||||
|         let temp_dir = TempDir::new()?; |  | ||||||
|         let _repo = Repository::clone(repo_url, temp_dir.path())?; |  | ||||||
|         Ok(temp_dir) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[cfg(test)] |  | ||||||
| mod tests { |  | ||||||
|     use super::*; |  | ||||||
|     use tempfile::{TempDir, NamedTempFile}; |  | ||||||
| 
 |  | ||||||
|     #[test] |  | ||||||
|     fn test_clone_temp_repository() { |  | ||||||
|         let resolver = GitPackageResolver::new(); |  | ||||||
|         let cloned_dir = resolver.clone_repo_to_temp("https://github.com/federico-terzi/espanso-hub-core").unwrap(); |  | ||||||
|         assert!(cloned_dir.path().join("LICENSE").exists()); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -34,11 +34,13 @@ pub trait PackageManager { | ||||||
|         &self, |         &self, | ||||||
|         name: &str, |         name: &str, | ||||||
|         allow_external: bool, |         allow_external: bool, | ||||||
|  |         proxy: Option<String>, | ||||||
|     ) -> Result<InstallResult, Box<dyn Error>>; |     ) -> Result<InstallResult, Box<dyn Error>>; | ||||||
|     fn install_package_from_repo( |     fn install_package_from_repo( | ||||||
|         &self, |         &self, | ||||||
|         name: &str, |         name: &str, | ||||||
|         repo_url: &str, |         repo_url: &str, | ||||||
|  |         proxy: Option<String>, | ||||||
|     ) -> Result<InstallResult, Box<dyn Error>>; |     ) -> Result<InstallResult, Box<dyn Error>>; | ||||||
| 
 | 
 | ||||||
|     fn remove_package(&self, name: &str) -> Result<RemoveResult, Box<dyn Error>>; |     fn remove_package(&self, name: &str) -> Result<RemoveResult, Box<dyn Error>>; | ||||||
|  | @ -47,7 +49,7 @@ pub trait PackageManager { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub trait PackageResolver { | pub trait PackageResolver { | ||||||
|     fn clone_repo_to_temp(&self, repo_url: &str) -> Result<TempDir, Box<dyn Error>>; |     fn clone_repo_to_temp(&self, repo_url: &str, proxy: Option<String>) -> Result<TempDir, Box<dyn Error>>; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] | #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] | ||||||
|  |  | ||||||
|  | @ -13,13 +13,22 @@ impl ZipPackageResolver { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl super::PackageResolver for ZipPackageResolver { | impl super::PackageResolver for ZipPackageResolver { | ||||||
|     fn clone_repo_to_temp(&self, repo_url: &str) -> Result<TempDir, Box<dyn Error>> { |     fn clone_repo_to_temp(&self, repo_url: &str, proxy: Option<String>) -> Result<TempDir, Box<dyn Error>> { | ||||||
|         let temp_dir = TempDir::new()?; |         let temp_dir = TempDir::new()?; | ||||||
| 
 | 
 | ||||||
|         let zip_url = repo_url.to_owned() + "/archive/master.zip"; |         let zip_url = repo_url.to_owned() + "/archive/master.zip"; | ||||||
| 
 | 
 | ||||||
|  |         let mut client = reqwest::Client::builder(); | ||||||
|  | 
 | ||||||
|  |         if let Some(proxy) = proxy { | ||||||
|  |             let proxy = reqwest::Proxy::https(&proxy).expect("unable to setup https proxy"); | ||||||
|  |             client = client.proxy(proxy); | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let client = client.build().expect("unable to create http client"); | ||||||
|  | 
 | ||||||
|         // Download the archive from GitHub
 |         // Download the archive from GitHub
 | ||||||
|         let mut response = reqwest::get(&zip_url)?; |         let mut response = client.get(&zip_url).send()?; | ||||||
| 
 | 
 | ||||||
|         // Extract zip file
 |         // Extract zip file
 | ||||||
|         let mut buffer = Vec::new(); |         let mut buffer = Vec::new(); | ||||||
|  | @ -90,7 +99,7 @@ mod tests { | ||||||
|     fn test_clone_temp_repository() { |     fn test_clone_temp_repository() { | ||||||
|         let resolver = ZipPackageResolver::new(); |         let resolver = ZipPackageResolver::new(); | ||||||
|         let cloned_dir = resolver |         let cloned_dir = resolver | ||||||
|             .clone_repo_to_temp("https://github.com/federico-terzi/espanso-hub-core") |             .clone_repo_to_temp("https://github.com/federico-terzi/espanso-hub-core", None) | ||||||
|             .unwrap(); |             .unwrap(); | ||||||
|         assert!(cloned_dir.path().join("LICENSE").exists()); |         assert!(cloned_dir.path().join("LICENSE").exists()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user