diff options
Diffstat (limited to 'crates/shirabe/src/util')
25 files changed, 176 insertions, 108 deletions
diff --git a/crates/shirabe/src/util/auth_helper.rs b/crates/shirabe/src/util/auth_helper.rs index 33d0b54..384d7af 100644 --- a/crates/shirabe/src/util/auth_helper.rs +++ b/crates/shirabe/src/util/auth_helper.rs @@ -157,8 +157,7 @@ impl AuthHelper { "GitHub API token requires SSO authorization. Authorize this token at {}\n", sso_url, ); - self.io - .write_error(PhpMixed::String(message), true, io_interface::NORMAL); + self.io.write_error3(&message, true, io_interface::NORMAL); if !self.io.is_interactive() { return Err(TransportException::new( format!("Could not authenticate against {}", origin), diff --git a/crates/shirabe/src/util/bitbucket.rs b/crates/shirabe/src/util/bitbucket.rs index c6aa874..ca9aabd 100644 --- a/crates/shirabe/src/util/bitbucket.rs +++ b/crates/shirabe/src/util/bitbucket.rs @@ -36,7 +36,7 @@ impl Bitbucket { let process = process.unwrap_or_else(|| ProcessExecutor::new(&*io)); let http_downloader = match http_downloader { Some(h) => h, - None => Factory::create_http_downloader(&*io, &config)?, + None => Factory::create_http_downloader(&*io, &config, IndexMap::new())?, }; Ok(Self { io, diff --git a/crates/shirabe/src/util/composer_mirror.rs b/crates/shirabe/src/util/composer_mirror.rs index 0743e9f..d70af94 100644 --- a/crates/shirabe/src/util/composer_mirror.rs +++ b/crates/shirabe/src/util/composer_mirror.rs @@ -1,6 +1,6 @@ //! ref: composer/src/Composer/Util/ComposerMirror.php -use shirabe_external_packages::composer::pcre::preg::Preg; +use shirabe_external_packages::composer::pcre::preg::{CaptureKey, Preg}; use shirabe_php_shim::hash; pub struct ComposerMirror; @@ -15,7 +15,7 @@ impl ComposerMirror { pretty_version: Option<&str>, ) -> String { let reference = reference.map(|r| { - if Preg::is_match(r"^([a-f0-9]*|%reference%)$", r) { + if Preg::is_match(r"^([a-f0-9]*|%reference%)$", r).unwrap_or(false) { r.to_string() } else { hash("md5", r) @@ -53,17 +53,46 @@ impl ComposerMirror { url: &str, r#type: Option<&str>, ) -> String { - let normalized_url = if let Some(m) = Preg::match_( + let mut gh_matches: indexmap::IndexMap<CaptureKey, String> = indexmap::IndexMap::new(); + let mut bb_matches: indexmap::IndexMap<CaptureKey, String> = indexmap::IndexMap::new(); + let normalized_url = if Preg::match3( r"^(?:(?:https?|git)://github\.com/|git@github\.com:)([^/]+)/(.+?)(?:\.git)?$", url, - ) { - format!("gh-{}/{}", m[1], m[2]) - } else if let Some(m) = - Preg::match_(r"^https://bitbucket\.org/([^/]+)/(.+?)(?:\.git)?/?$", url) + Some(&mut gh_matches), + ) + .unwrap_or(false) { - format!("bb-{}/{}", m[1], m[2]) + format!( + "gh-{}/{}", + gh_matches + .get(&CaptureKey::ByIndex(1)) + .cloned() + .unwrap_or_default(), + gh_matches + .get(&CaptureKey::ByIndex(2)) + .cloned() + .unwrap_or_default(), + ) + } else if Preg::match3( + r"^https://bitbucket\.org/([^/]+)/(.+?)(?:\.git)?/?$", + url, + Some(&mut bb_matches), + ) + .unwrap_or(false) + { + format!( + "bb-{}/{}", + bb_matches + .get(&CaptureKey::ByIndex(1)) + .cloned() + .unwrap_or_default(), + bb_matches + .get(&CaptureKey::ByIndex(2)) + .cloned() + .unwrap_or_default(), + ) } else { - Preg::replace(r"[^a-z0-9_.-]", "-", url.trim_matches('/')) + Preg::replace(r"[^a-z0-9_.-]", "-", url.trim_matches('/')).unwrap_or_default() }; ["%package%", "%normalizedUrl%", "%type%"] diff --git a/crates/shirabe/src/util/config_validator.rs b/crates/shirabe/src/util/config_validator.rs index cbba32b..972191a 100644 --- a/crates/shirabe/src/util/config_validator.rs +++ b/crates/shirabe/src/util/config_validator.rs @@ -39,7 +39,9 @@ impl ConfigValidator { let mut lax_valid = false; let mut manifest: Option<IndexMap<String, PhpMixed>> = None; - let json = JsonFile::new(file.to_string(), None, Some(&*self.io)); + // TODO(phase-b): io type mismatch (&dyn IOInterface vs Box<dyn IOInterface>) + let json = + JsonFile::new(file.to_string(), None, None).expect("config file path is always local"); let schema_result: anyhow::Result<()> = (|| -> anyhow::Result<()> { manifest = Some(json.read()?); json.validate_schema(Some(JsonFile::LAX_SCHEMA))?; diff --git a/crates/shirabe/src/util/error_handler.rs b/crates/shirabe/src/util/error_handler.rs index aff263e..d531658 100644 --- a/crates/shirabe/src/util/error_handler.rs +++ b/crates/shirabe/src/util/error_handler.rs @@ -65,12 +65,12 @@ impl ErrorHandler { }); } - let io_guard = io().lock().unwrap(); + let mut io_guard = io().lock().unwrap(); if io_guard.is_some() { let has_shown = *HAS_SHOWN_DEPRECATION_NOTICE.lock().unwrap(); if has_shown > 0 && !io_guard.as_ref().unwrap().is_verbose() { if has_shown == 1 { - io_guard.as_ref().unwrap().write_error("<warning>More deprecation notices were hidden, run again with `-v` to show them.</warning>"); + io_guard.as_mut().unwrap().write_error("<warning>More deprecation notices were hidden, run again with `-v` to show them.</warning>"); *HAS_SHOWN_DEPRECATION_NOTICE.lock().unwrap() = 2; } return Ok(true); @@ -95,8 +95,8 @@ impl ErrorHandler { } fn output_warning(message: &str, output_even_without_io: bool) { - let io_guard = io().lock().unwrap(); - if let Some(ref io) = *io_guard { + let mut io_guard = io().lock().unwrap(); + if let Some(io) = io_guard.as_mut() { io.write_error(&format!("<warning>{}</warning>", message)); if io.is_verbose() { io.write_error("<warning>Stack trace:</warning>"); diff --git a/crates/shirabe/src/util/filesystem.rs b/crates/shirabe/src/util/filesystem.rs index 6ca20cc..ce2abf8 100644 --- a/crates/shirabe/src/util/filesystem.rs +++ b/crates/shirabe/src/util/filesystem.rs @@ -834,7 +834,7 @@ impl Filesystem { return false; } - let cwd = Platform::get_cwd(); + let cwd = Platform::get_cwd(false).unwrap_or_default(); let relative_path = self.find_shortest_path(link, target, false, false); chdir(&dirname(link)); diff --git a/crates/shirabe/src/util/forgejo.rs b/crates/shirabe/src/util/forgejo.rs index 15081fc..3aaff91 100644 --- a/crates/shirabe/src/util/forgejo.rs +++ b/crates/shirabe/src/util/forgejo.rs @@ -29,18 +29,18 @@ impl Forgejo { message: Option<&str>, ) -> anyhow::Result<Result<bool, TransportException>> { if let Some(message) = message { - self.io.write_error(message, true, io_interface::NORMAL); + self.io.write_error3(message, true, io_interface::NORMAL); } let url = format!("https://{}/user/settings/applications", origin_url); - self.io.write_error( + self.io.write_error3( "Setup a personal access token with repository:read permissions on:", true, io_interface::NORMAL, ); - self.io.write_error(&url, true, io_interface::NORMAL); + self.io.write_error3(&url, true, io_interface::NORMAL); let local_auth_config = self.config.get_local_auth_config_source(); - self.io.write_error( + self.io.write_error3( &format!( "Tokens will be stored in plain text in \"{}\" for future use by Composer.", local_auth_config @@ -52,7 +52,7 @@ impl Forgejo { true, io_interface::NORMAL, ); - self.io.write_error( + self.io.write_error3( "For additional information, check https://getcomposer.org/doc/articles/authentication-for-private-packages.md#forgejo-token", true, io_interface::NORMAL, @@ -78,13 +78,13 @@ impl Forgejo { origin_url ); if token.is_empty() || username.is_empty() { - self.io.write_error( + self.io.write_error3( "<warning>No username/token given, aborting.</warning>", true, io_interface::NORMAL, ); self.io - .write_error(&add_token_manually, true, io_interface::NORMAL); + .write_error3(&add_token_manually, true, io_interface::NORMAL); return Ok(Ok(false)); } @@ -101,13 +101,13 @@ impl Forgejo { Ok(_) => {} Err(e) => { if [403, 401, 404].contains(&e.get_code()) { - self.io.write_error( + self.io.write_error3( "<error>Invalid access token provided.</error>", true, io_interface::NORMAL, ); self.io - .write_error(&add_token_manually, true, io_interface::NORMAL); + .write_error3(&add_token_manually, true, io_interface::NORMAL); return Ok(Ok(false)); } @@ -136,7 +136,7 @@ impl Forgejo { }, ); - self.io.write_error( + self.io.write_error3( "<info>Token stored successfully.</info>", true, io_interface::NORMAL, diff --git a/crates/shirabe/src/util/forgejo_url.rs b/crates/shirabe/src/util/forgejo_url.rs index 3b42f13..5fdaab7 100644 --- a/crates/shirabe/src/util/forgejo_url.rs +++ b/crates/shirabe/src/util/forgejo_url.rs @@ -4,6 +4,7 @@ use anyhow::Result; use shirabe_external_packages::composer::pcre::preg::Preg; use shirabe_php_shim::InvalidArgumentException; +#[derive(Debug)] pub struct ForgejoUrl { pub owner: String, pub repository: String, @@ -37,7 +38,22 @@ impl ForgejoUrl { pub fn try_from(repo_url: Option<&str>) -> Option<Self> { let repo_url = repo_url?; - let m = Preg::match_(Self::URL_REGEX, repo_url)?; + let mut matches: indexmap::IndexMap< + shirabe_external_packages::composer::pcre::preg::CaptureKey, + String, + > = indexmap::IndexMap::new(); + if !Preg::match3(Self::URL_REGEX, repo_url, Some(&mut matches)).unwrap_or(false) { + return None; + } + use shirabe_external_packages::composer::pcre::preg::CaptureKey; + let m: Vec<String> = (0..5) + .map(|i| { + matches + .get(&CaptureKey::ByIndex(i)) + .cloned() + .unwrap_or_default() + }) + .collect(); let origin_url = if !m[1].is_empty() { m[1].clone() diff --git a/crates/shirabe/src/util/github.rs b/crates/shirabe/src/util/github.rs index c04873f..5fa88a6 100644 --- a/crates/shirabe/src/util/github.rs +++ b/crates/shirabe/src/util/github.rs @@ -1,6 +1,7 @@ //! ref: composer/src/Composer/Util/GitHub.php use crate::io::io_interface; +use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::preg::Preg; use shirabe_php_shim::{PhpMixed, date, stripos, strtolower}; @@ -32,7 +33,7 @@ impl GitHub { let process = process.unwrap_or_else(|| ProcessExecutor::new(&*io)); let http_downloader = match http_downloader { Some(h) => h, - None => Factory::create_http_downloader(&*io, &config)?, + None => Factory::create_http_downloader(&*io, &config, IndexMap::new())?, }; Ok(Self { io, diff --git a/crates/shirabe/src/util/gitlab.rs b/crates/shirabe/src/util/gitlab.rs index 7788ed8..191e69d 100644 --- a/crates/shirabe/src/util/gitlab.rs +++ b/crates/shirabe/src/util/gitlab.rs @@ -30,7 +30,7 @@ impl GitLab { let process = process.unwrap_or_else(|| ProcessExecutor::new(&*io)); let http_downloader = match http_downloader { Some(h) => h, - None => Factory::create_http_downloader(&*io, &config)?, + None => Factory::create_http_downloader(&*io, &config, IndexMap::new())?, }; Ok(Self { io, diff --git a/crates/shirabe/src/util/http/curl_downloader.rs b/crates/shirabe/src/util/http/curl_downloader.rs index e4d8b78..d335b8b 100644 --- a/crates/shirabe/src/util/http/curl_downloader.rs +++ b/crates/shirabe/src/util/http/curl_downloader.rs @@ -689,7 +689,7 @@ impl CurlDownloader { if_modified )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); } @@ -836,7 +836,7 @@ impl CurlDownloader { .to_string(), ), true, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); } @@ -922,7 +922,7 @@ impl CurlDownloader { errno )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); self.restart_job_with_delay( &job, @@ -954,7 +954,7 @@ impl CurlDownloader { errno )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); let mut attrs: IndexMap<String, PhpMixed> = IndexMap::new(); attrs.insert( @@ -1068,7 +1068,10 @@ impl CurlDownloader { status_code, headers.clone().unwrap_or_default(), contents.as_string().map(|s| s.to_string()), - progress.clone(), + progress + .iter() + .map(|(k, v)| (k.clone(), (**v).clone())) + .collect(), )); self.io.write_error( PhpMixed::String(format!( @@ -1082,7 +1085,7 @@ impl CurlDownloader { ) )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); } else { let max_file_size: Option<i64> = job @@ -1141,7 +1144,10 @@ impl CurlDownloader { status_code, headers.clone().unwrap_or_default(), contents.as_string().map(|s| s.to_string()), - progress.clone(), + progress + .iter() + .map(|(k, v)| (k.clone(), (**v).clone())) + .collect(), )); self.io.write_error( PhpMixed::String(format!( @@ -1155,7 +1161,7 @@ impl CurlDownloader { ) )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); } fclose(job.get("bodyHandle").cloned().unwrap_or(PhpMixed::Null)); @@ -1304,7 +1310,7 @@ impl CurlDownloader { sc )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); let mut attrs: IndexMap<String, PhpMixed> = IndexMap::new(); attrs.insert( @@ -1608,7 +1614,7 @@ impl CurlDownloader { ], )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); return Ok(Ok(target_url)); diff --git a/crates/shirabe/src/util/http/curl_response.rs b/crates/shirabe/src/util/http/curl_response.rs index 3c4f923..c6f5d77 100644 --- a/crates/shirabe/src/util/http/curl_response.rs +++ b/crates/shirabe/src/util/http/curl_response.rs @@ -18,10 +18,10 @@ impl CurlResponse { headers: Vec<String>, body: Option<String>, curl_info: IndexMap<String, PhpMixed>, - ) -> Self { - Self { - inner: Response::new(request, code, headers, body), - curl_info, + ) -> anyhow::Result<Result<Self, shirabe_php_shim::LogicException>> { + match Response::new(request, code, headers, body)? { + Ok(inner) => Ok(Ok(Self { inner, curl_info })), + Err(e) => Ok(Err(e)), } } diff --git a/crates/shirabe/src/util/http/proxy_item.rs b/crates/shirabe/src/util/http/proxy_item.rs index 0e30c44..db71476 100644 --- a/crates/shirabe/src/util/http/proxy_item.rs +++ b/crates/shirabe/src/util/http/proxy_item.rs @@ -132,28 +132,22 @@ impl ProxyItem { } pub fn to_request_proxy(&self, scheme: String) -> RequestProxy { - let mut http_options: IndexMap<String, Box<PhpMixed>> = IndexMap::new(); + let mut http_options: IndexMap<String, PhpMixed> = IndexMap::new(); http_options.insert( "proxy".to_string(), - Box::new(PhpMixed::String(self.options_proxy.clone())), + PhpMixed::String(self.options_proxy.clone()), ); if let Some(ref auth) = self.options_auth { - http_options.insert( - "header".to_string(), - Box::new(PhpMixed::String(auth.clone())), - ); + http_options.insert("header".to_string(), PhpMixed::String(auth.clone())); } if scheme == "http" { - http_options.insert( - "request_fulluri".to_string(), - Box::new(PhpMixed::Bool(true)), - ); + http_options.insert("request_fulluri".to_string(), PhpMixed::Bool(true)); } - let mut options: IndexMap<String, Box<PhpMixed>> = IndexMap::new(); - options.insert("http".to_string(), Box::new(PhpMixed::Array(http_options))); + let mut options: IndexMap<String, IndexMap<String, PhpMixed>> = IndexMap::new(); + options.insert("http".to_string(), http_options); RequestProxy::new( Some(self.url.clone()), diff --git a/crates/shirabe/src/util/http/proxy_manager.rs b/crates/shirabe/src/util/http/proxy_manager.rs index e2838e6..5ed8269 100644 --- a/crates/shirabe/src/util/http/proxy_manager.rs +++ b/crates/shirabe/src/util/http/proxy_manager.rs @@ -67,7 +67,7 @@ impl ProxyManager { return Ok(RequestProxy::no_proxy()); } - Ok(proxy.unwrap().to_request_proxy(&scheme)) + Ok(proxy.unwrap().to_request_proxy(scheme)) } fn get_proxy_for_scheme(&self, scheme: &str) -> Option<&ProxyItem> { @@ -102,7 +102,7 @@ impl ProxyManager { let (env, _name) = Self::get_proxy_env("no_proxy"); if let Some(env) = env { - self.no_proxy_handler = Some(NoProxyPattern::new(env)); + self.no_proxy_handler = Some(NoProxyPattern::new(&env)); } Ok(()) diff --git a/crates/shirabe/src/util/http/request_proxy.rs b/crates/shirabe/src/util/http/request_proxy.rs index 5bbf5ce..a85e283 100644 --- a/crates/shirabe/src/util/http/request_proxy.rs +++ b/crates/shirabe/src/util/http/request_proxy.rs @@ -55,6 +55,7 @@ impl RequestProxy { return Err(TransportException::new( "Cannot use an HTTPS proxy. PHP >= 7.3 and cUrl >= 7.52.0 are required." .to_string(), + 0, )); } diff --git a/crates/shirabe/src/util/http/response.rs b/crates/shirabe/src/util/http/response.rs index 6a60540..cf238c7 100644 --- a/crates/shirabe/src/util/http/response.rs +++ b/crates/shirabe/src/util/http/response.rs @@ -88,4 +88,13 @@ impl Response { } value } + + // TODO(phase-b): historical helpers used in composer_repository — provide stubs. + pub fn from_php_mixed(_data: PhpMixed) -> Self { + todo!() + } + + pub fn new_fake(_body: Option<String>) -> Self { + todo!() + } } diff --git a/crates/shirabe/src/util/http_downloader.rs b/crates/shirabe/src/util/http_downloader.rs index 34f0642..97b1f6e 100644 --- a/crates/shirabe/src/util/http_downloader.rs +++ b/crates/shirabe/src/util/http_downloader.rs @@ -148,7 +148,7 @@ impl HttpDownloader { 1, min( 50, - max_jobs_env.as_string().unwrap_or("0").parse().unwrap_or(0), + max_jobs_env.as_deref().unwrap_or("0").parse().unwrap_or(0), ), ); } @@ -372,9 +372,10 @@ impl HttpDownloader { }); let canceler: Box<dyn Fn()> = Box::new(|| { // PHP canceler logic — TODO(phase-b) - let _ = IrrecoverableDownloadException { - inner: TransportException::new("Download canceled".to_string(), 0), - }; + let _ = IrrecoverableDownloadException(shirabe_php_shim::RuntimeException { + message: "Download canceled".to_string(), + code: 0, + }); let _ = Url::sanitize(""); }); let _ = (resolver, canceler); @@ -684,7 +685,7 @@ impl HttpDownloader { if false != strpos(e_as_transport.get_message(), "Resolving timed out").is_some() || false != strpos(e_as_transport.get_message(), "Could not resolve host").is_some() { - Silencer::suppress(); + Silencer::suppress(None); let mut ctx_options: IndexMap<String, PhpMixed> = IndexMap::new(); let mut ssl_map: IndexMap<String, Box<PhpMixed>> = IndexMap::new(); ssl_map.insert("verify_peer".to_string(), Box::new(PhpMixed::Bool(false))); diff --git a/crates/shirabe/src/util/no_proxy_pattern.rs b/crates/shirabe/src/util/no_proxy_pattern.rs index 7fbfd0f..2b593c3 100644 --- a/crates/shirabe/src/util/no_proxy_pattern.rs +++ b/crates/shirabe/src/util/no_proxy_pattern.rs @@ -40,7 +40,7 @@ impl NoProxyPattern { /// @param string $pattern NO_PROXY pattern pub fn new(pattern: &str) -> Self { // PHP: Preg::split('{[\s,]+}', $pattern, -1, PREG_SPLIT_NO_EMPTY) - let host_names = Preg::split(r"{[\s,]+}", pattern); + let host_names = Preg::split(r"{[\s,]+}", pattern).unwrap_or_default(); let noproxy = host_names.is_empty() || host_names[0] == "*"; Self { host_names, diff --git a/crates/shirabe/src/util/package_info.rs b/crates/shirabe/src/util/package_info.rs index 1046f0e..d8d93ef 100644 --- a/crates/shirabe/src/util/package_info.rs +++ b/crates/shirabe/src/util/package_info.rs @@ -16,14 +16,14 @@ impl PackageInfo { } } - package.get_source_url() + package.get_source_url().map(|s| s.to_string()) } pub fn get_view_source_or_homepage_url(package: &dyn PackageInterface) -> Option<String> { let url = Self::get_view_source_url(package).or_else(|| { package .as_complete_package_interface() - .and_then(|complete| complete.get_homepage()) + .and_then(|complete| complete.get_homepage().map(|s| s.to_string())) }); if url.as_deref() == Some("") { diff --git a/crates/shirabe/src/util/package_sorter.rs b/crates/shirabe/src/util/package_sorter.rs index 2f38910..a2728b5 100644 --- a/crates/shirabe/src/util/package_sorter.rs +++ b/crates/shirabe/src/util/package_sorter.rs @@ -36,7 +36,7 @@ impl PackageSorter { pub fn sort_packages_alphabetically( mut packages: Vec<Box<dyn PackageInterface>>, ) -> Vec<Box<dyn PackageInterface>> { - packages.sort_by_key(|p| p.get_name()); + packages.sort_by_key(|p| p.get_name().to_string()); packages } @@ -48,9 +48,9 @@ impl PackageSorter { for package in &packages { let mut links: IndexMap<String, Link> = package.get_requires(); - // TODO: check for RootAliasPackage as well - if let Some(root_package) = (package.as_any() as &dyn Any).downcast_ref::<RootPackage>() - { + // TODO(phase-b): check for RootAliasPackage as well; PackageInterface lacks as_any + let root_package: Option<&RootPackage> = None; + if let Some(root_package) = root_package { links.extend(root_package.get_dev_requires()); } for link in links.values() { diff --git a/crates/shirabe/src/util/platform.rs b/crates/shirabe/src/util/platform.rs index 96e564f..1f684d8 100644 --- a/crates/shirabe/src/util/platform.rs +++ b/crates/shirabe/src/util/platform.rs @@ -92,7 +92,8 @@ impl Platform { /// Parses tildes and environment variables in paths. pub fn expand_path(path: &str) -> String { - if Preg::is_match(r"#^~[\\/]#", path) { + use shirabe_external_packages::composer::pcre::preg::CaptureKey; + if Preg::is_match(r"#^~[\\/]#", path).unwrap_or(false) { return format!( "{}{}", Self::get_user_directory().unwrap(), @@ -102,35 +103,41 @@ impl Platform { Preg::replace_callback( r"#^(\$|(?P<percent>%))(?P<var>\w++)(?(percent)%)(?P<path>.*)#", - |matches| -> String { + |matches: &indexmap::IndexMap<CaptureKey, String>| -> String { + let var = matches + .get(&CaptureKey::ByName("var".to_string())) + .map(|s| s.as_str()) + .unwrap_or(""); + let path_part = matches + .get(&CaptureKey::ByName("path".to_string())) + .map(|s| s.as_str()) + .unwrap_or(""); // Treat HOME as an alias for USERPROFILE on Windows for legacy reasons - if Platform::is_windows() - && matches.get("var").map(|s| s.as_str()).unwrap_or("") == "HOME" - { + if Platform::is_windows() && var == "HOME" { if Platform::get_env("HOME").is_some() { return format!( "{}{}", Platform::get_env("HOME").unwrap_or_default(), - matches.get("path").map(|s| s.as_str()).unwrap_or(""), + path_part, ); } return format!( "{}{}", Platform::get_env("USERPROFILE").unwrap_or_default(), - matches.get("path").map(|s| s.as_str()).unwrap_or(""), + path_part, ); } format!( "{}{}", - Platform::get_env(matches.get("var").map(|s| s.as_str()).unwrap_or("")) - .unwrap_or_default(), - matches.get("path").map(|s| s.as_str()).unwrap_or(""), + Platform::get_env(var).unwrap_or_default(), + path_part, ) }, path, ) + .unwrap_or_default() } /// @throws \RuntimeException If the user home could not reliably be determined diff --git a/crates/shirabe/src/util/process_executor.rs b/crates/shirabe/src/util/process_executor.rs index 6351a73..ed1958d 100644 --- a/crates/shirabe/src/util/process_executor.rs +++ b/crates/shirabe/src/util/process_executor.rs @@ -118,7 +118,7 @@ impl ProcessExecutor { /// runs a process on the commandline in TTY mode pub fn execute_tty(&mut self, command: PhpMixed, cwd: Option<&str>) -> Result<i64> { - if Platform::is_tty() { + if Platform::is_tty(None) { return self.do_execute(command, cwd, true, None); } @@ -448,7 +448,7 @@ impl ProcessExecutor { 1, min( 50, - max_jobs_env.as_string().unwrap_or("0").parse().unwrap_or(0), + max_jobs_env.as_deref().unwrap_or("0").parse().unwrap_or(0), ), ); } else { diff --git a/crates/shirabe/src/util/remote_filesystem.rs b/crates/shirabe/src/util/remote_filesystem.rs index 0674df4..d2658fe 100644 --- a/crates/shirabe/src/util/remote_filesystem.rs +++ b/crates/shirabe/src/util/remote_filesystem.rs @@ -263,7 +263,7 @@ impl RemoteFilesystem { using_proxy )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); if (!Preg::is_match("{^http://(repo\\.)?packagist\\.org/p/}", &file_url).unwrap_or(false) @@ -277,7 +277,7 @@ impl RemoteFilesystem { self.io.write_error( PhpMixed::String("Downloading (<comment>connecting...</comment>)".to_string()), false, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); } @@ -352,7 +352,7 @@ impl RemoteFilesystem { base64_encode(result.as_deref().unwrap_or("")) )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); return Err(anyhow::anyhow!(e)); @@ -398,7 +398,7 @@ impl RemoteFilesystem { self.io.write_error( PhpMixed::String("".to_string()), true, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); self.io.write_error( PhpMixed::List(vec![ @@ -409,7 +409,7 @@ impl RemoteFilesystem { )), ]), true, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); return self.get( @@ -498,7 +498,7 @@ impl RemoteFilesystem { PhpMixed::String("Downloading (<error>failed</error>)".to_string()), false, None, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); } @@ -533,7 +533,7 @@ impl RemoteFilesystem { )), false, None, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); } @@ -565,7 +565,7 @@ impl RemoteFilesystem { )), ]), true, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); return self.get( @@ -643,7 +643,7 @@ impl RemoteFilesystem { self.io.write_error( PhpMixed::String("".to_string()), true, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); self.io.write_error( PhpMixed::List(vec![ @@ -654,7 +654,7 @@ impl RemoteFilesystem { )), ]), true, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); return self.get( @@ -778,7 +778,7 @@ impl RemoteFilesystem { )), false, None, - <dyn IOInterface>::NORMAL, + crate::io::io_interface::NORMAL, ); } } @@ -947,7 +947,7 @@ impl RemoteFilesystem { self.io.write_error( PhpMixed::String("".to_string()), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); self.io.write_error( PhpMixed::String(sprintf( @@ -958,7 +958,7 @@ impl RemoteFilesystem { ], )), true, - <dyn IOInterface>::DEBUG, + crate::io::io_interface::DEBUG, ); additional_options.insert("redirects".to_string(), PhpMixed::Int(self.redirects)); diff --git a/crates/shirabe/src/util/svn.rs b/crates/shirabe/src/util/svn.rs index b312ec3..955e28c 100644 --- a/crates/shirabe/src/util/svn.rs +++ b/crates/shirabe/src/util/svn.rs @@ -211,11 +211,11 @@ impl Svn { .into()); } - self.io.write_error( - PhpMixed::String(format!( + self.io.write_error3( + &format!( "The Subversion server ({}) requested credentials:", self.url, - )), + ), true, io_interface::NORMAL, ); diff --git a/crates/shirabe/src/util/sync_helper.rs b/crates/shirabe/src/util/sync_helper.rs index 1be9075..22e4f1f 100644 --- a/crates/shirabe/src/util/sync_helper.rs +++ b/crates/shirabe/src/util/sync_helper.rs @@ -9,7 +9,7 @@ use shirabe_external_packages::react::promise::promise_interface::PromiseInterfa pub enum DownloaderOrManager<'a> { Interface(&'a dyn DownloaderInterface), - Manager(&'a DownloadManager), + Manager(&'a std::rc::Rc<std::cell::RefCell<DownloadManager>>), } impl<'a> DownloaderOrManager<'a> { @@ -21,7 +21,7 @@ impl<'a> DownloaderOrManager<'a> { ) -> Box<dyn PromiseInterface> { match self { Self::Interface(d) => d.download(package, path, prev_package), - Self::Manager(d) => d.download(package, path, prev_package), + Self::Manager(d) => d.borrow().download(package, path, prev_package), } } @@ -34,14 +34,14 @@ impl<'a> DownloaderOrManager<'a> { ) -> Box<dyn PromiseInterface> { match self { Self::Interface(d) => d.prepare(r#type, package, path, prev_package), - Self::Manager(d) => d.prepare(r#type, package, path, prev_package), + Self::Manager(d) => d.borrow().prepare(r#type, package, path, prev_package), } } fn install(&self, package: &dyn PackageInterface, path: &str) -> Box<dyn PromiseInterface> { match self { Self::Interface(d) => d.install(package, path), - Self::Manager(d) => d.install(package, path), + Self::Manager(d) => d.borrow().install(package, path), } } @@ -53,7 +53,7 @@ impl<'a> DownloaderOrManager<'a> { ) -> Box<dyn PromiseInterface> { match self { Self::Interface(d) => d.update(package, prev_package, path), - Self::Manager(d) => d.update(package, prev_package, path), + Self::Manager(d) => d.borrow().update(package, prev_package, path), } } @@ -66,7 +66,7 @@ impl<'a> DownloaderOrManager<'a> { ) -> Box<dyn PromiseInterface> { match self { Self::Interface(d) => d.cleanup(r#type, package, path, prev_package), - Self::Manager(d) => d.cleanup(r#type, package, path, prev_package), + Self::Manager(d) => d.borrow().cleanup(r#type, package, path, prev_package), } } } @@ -75,7 +75,7 @@ pub struct SyncHelper; impl SyncHelper { pub fn download_and_install_package_sync( - r#loop: &Loop, + r#loop: &std::rc::Rc<std::cell::RefCell<Loop>>, downloader: DownloaderOrManager<'_>, path: String, package: &dyn PackageInterface, @@ -121,9 +121,12 @@ impl SyncHelper { Ok(()) } - pub fn r#await(r#loop: &Loop, promise: Option<Box<dyn PromiseInterface>>) -> Result<()> { + pub fn r#await( + r#loop: &std::rc::Rc<std::cell::RefCell<Loop>>, + promise: Option<Box<dyn PromiseInterface>>, + ) -> Result<()> { if let Some(promise) = promise { - r#loop.wait(vec![promise]); + r#loop.borrow_mut().wait(vec![promise], None)?; } Ok(()) } |
