aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/util')
-rw-r--r--crates/shirabe/src/util/auth_helper.rs3
-rw-r--r--crates/shirabe/src/util/bitbucket.rs2
-rw-r--r--crates/shirabe/src/util/composer_mirror.rs47
-rw-r--r--crates/shirabe/src/util/config_validator.rs4
-rw-r--r--crates/shirabe/src/util/error_handler.rs8
-rw-r--r--crates/shirabe/src/util/filesystem.rs2
-rw-r--r--crates/shirabe/src/util/forgejo.rs20
-rw-r--r--crates/shirabe/src/util/forgejo_url.rs18
-rw-r--r--crates/shirabe/src/util/github.rs3
-rw-r--r--crates/shirabe/src/util/gitlab.rs2
-rw-r--r--crates/shirabe/src/util/http/curl_downloader.rs26
-rw-r--r--crates/shirabe/src/util/http/curl_response.rs8
-rw-r--r--crates/shirabe/src/util/http/proxy_item.rs18
-rw-r--r--crates/shirabe/src/util/http/proxy_manager.rs4
-rw-r--r--crates/shirabe/src/util/http/request_proxy.rs1
-rw-r--r--crates/shirabe/src/util/http/response.rs9
-rw-r--r--crates/shirabe/src/util/http_downloader.rs11
-rw-r--r--crates/shirabe/src/util/no_proxy_pattern.rs2
-rw-r--r--crates/shirabe/src/util/package_info.rs4
-rw-r--r--crates/shirabe/src/util/package_sorter.rs8
-rw-r--r--crates/shirabe/src/util/platform.rs27
-rw-r--r--crates/shirabe/src/util/process_executor.rs4
-rw-r--r--crates/shirabe/src/util/remote_filesystem.rs26
-rw-r--r--crates/shirabe/src/util/svn.rs6
-rw-r--r--crates/shirabe/src/util/sync_helper.rs21
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(())
}