diff options
Diffstat (limited to 'crates/shirabe/src/util/git.rs')
| -rw-r--r-- | crates/shirabe/src/util/git.rs | 84 |
1 files changed, 51 insertions, 33 deletions
diff --git a/crates/shirabe/src/util/git.rs b/crates/shirabe/src/util/git.rs index e14ff05f..31771e6c 100644 --- a/crates/shirabe/src/util/git.rs +++ b/crates/shirabe/src/util/git.rs @@ -14,12 +14,11 @@ use crate::util::ProcessExecutor; use crate::util::Url; use crate::util::{AuthHelper, StoreAuth}; use indexmap::IndexMap; -use shirabe_pcre::{Preg, PregMatches}; use shirabe_php_shim::{ - AnyThrowable, CmpOp, InvalidArgumentException, PHP_EOL, PhpMixed, RuntimeException, array_map, - clearstatcache, explode, implode, in_array_loose, in_array_strict, is_dir, php_regex, - preg_quote, rawurldecode, rawurlencode, str_replace_array, strlen, strpos, substr, trim, - version_compare, + AnyThrowable, CmpOp, InvalidArgumentException, PHP_EOL, PhpMixed, PregMatches, + RuntimeException, array_map, clearstatcache, explode, implode, in_array_loose, in_array_strict, + is_dir, php_regex, preg_match2, preg_quote, preg_replace, rawurldecode, rawurlencode, + str_replace_array, strlen, strpos, substr, trim, version_compare, }; use std::sync::Mutex; @@ -110,7 +109,7 @@ impl Git { map.insert("%url%".to_string(), url.to_string()); map.insert( "%sanitizedUrl%".to_string(), - Preg::replace(php_regex!(r"{://([^@]+?):(.+?)@}"), "://", url), + preg_replace(php_regex!(r"{://([^@]+?):(.+?)@}"), "://", url), ); array_map( @@ -210,7 +209,7 @@ impl Git { status }; - if Preg::is_match(php_regex!(r"{^ssh://[^@]+@[^:]+:[^0-9]+}"), url) { + if preg_match2(php_regex!(r"{^ssh://[^@]+@[^:]+:[^0-9]+}"), url, 0).is_some() { return Err(InvalidArgumentException::new(format!( "The source URL {} is invalid, ssh URLs should have a port number after \":\".\nUse ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.", url @@ -226,9 +225,10 @@ impl Git { &mut output, cwd, )?; - if let Some(m) = Preg::is_match3( + if let Some(m) = preg_match2( php_regex!(r"{^(?:composer|origin)\s+https?://(.+):(.+)@([^/]+)}im"), &output, + 0, ) { let m3 = m.get(3).unwrap_or_default().to_string(); if !self.io.has_authentication(&m3) { @@ -244,12 +244,13 @@ impl Git { let protocols = self.config.borrow_mut().get("github-protocols"); // public github, autoswitch protocols // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups - if let Some(m) = Preg::is_match3( + if let Some(m) = preg_match2( format!( "{{^(?:https?|git)://{}/(.*)}}", Self::get_github_domains_regex(&self.config.borrow()) ), url, + 0, ) { let mut messages: Vec<String> = vec![]; let protocols_list: Vec<String> = match &protocols { @@ -280,7 +281,7 @@ impl Git { messages.push(format!( "- {}\n{}", proto_url, - Preg::replace(r"#^#m", " ", self.process.borrow().get_error_output()) + preg_replace(r"#^#m", " ", self.process.borrow().get_error_output()) )); if initial_clone && let Some(ref orig) = orig_cwd { @@ -311,19 +312,22 @@ impl Git { .collect(), _ => vec![], }; - let bypass_ssh_for_github = Preg::is_match( + let bypass_ssh_for_github = preg_match2( format!( "{{^git@{}:(.+?)\\.git$}}i", Self::get_github_domains_regex(&self.config.borrow()) ), url, - ) && !in_array_strict( - "ssh".to_string(), - &protocols_list - .iter() - .map(|s| PhpMixed::String(s.clone())) - .collect::<Vec<_>>(), - ); + 0, + ) + .is_some() + && !in_array_strict( + "ssh".to_string(), + &protocols_list + .iter() + .map(|s| PhpMixed::String(s.clone())) + .collect::<Vec<_>>(), + ); let mut auth: Option<IndexMap<String, Option<String>>> = None; let mut credentials: Vec<String> = vec![]; @@ -338,20 +342,22 @@ impl Git { let mut error_msg = self.process.borrow().get_error_output().to_string(); // private github repository without ssh key access, try https with auth // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups - let github_matched = Preg::is_match3( + let github_matched = preg_match2( format!( "{{^git@{}:(.+?)\\.git$}}i", Self::get_github_domains_regex(&self.config.borrow()) ), url, + 0, ) .or_else(|| { - Preg::is_match3( + preg_match2( format!( "{{^https?://{}/(.*?)(?:\\.git)?$}}i", Self::get_github_domains_regex(&self.config.borrow()) ), url, + 0, ) }); if let Some(m) = github_matched { @@ -404,12 +410,18 @@ impl Git { credentials = vec![rawurlencode(&username), rawurlencode(&password)]; error_msg = self.process.borrow().get_error_output().to_string(); } - } else if let Some(m) = Preg::is_match3( + } else if let Some(m) = preg_match2( php_regex!(r"{^(https?)://(bitbucket\.org)/(.*?)(?:\.git)?$}i"), url, + 0, ) - .or_else(|| Preg::is_match3(php_regex!(r"{^(git)@(bitbucket\.org):(.+?\.git)$}i"), url)) - { + .or_else(|| { + preg_match2( + php_regex!(r"{^(git)@(bitbucket\.org):(.+?\.git)$}i"), + url, + 0, + ) + }) { // bitbucket either through oauth or app password, with fallback to ssh. let mut bitbucket_util = Bitbucket::new( self.io.clone(), @@ -546,20 +558,22 @@ impl Git { } error_msg = self.process.borrow().get_error_output().to_string(); - } else if let Some(m) = Preg::is_match3( + } else if let Some(m) = preg_match2( format!( "{{^(git)@{}:(.+?\\.git)$}}i", Self::get_gitlab_domains_regex(&self.config.borrow()) ), url, + 0, ) .or_else(|| { - Preg::is_match3( + preg_match2( format!( "{{^(https?)://{}/(.*)}}i", Self::get_gitlab_domains_regex(&self.config.borrow()) ), url, + 0, ) }) { let mut m1 = m.get(1).unwrap_or_default().to_string(); @@ -914,10 +928,10 @@ impl Git { pretty_version: Option<&str>, ) -> anyhow::Result<bool> { if self.check_ref_is_in_mirror(dir, r#ref)? { - if Preg::is_match(php_regex!(r"{^[a-f0-9]{40}$}"), r#ref) + if preg_match2(php_regex!(r"{^[a-f0-9]{40}$}"), r#ref, 0).is_some() && let Some(pretty_version) = pretty_version { - let branch = Preg::replace( + let branch = preg_replace( php_regex!(r"{(?:^dev-|(?:\.x)?-dev$)}i"), "", pretty_version, @@ -948,15 +962,19 @@ impl Git { // this can occur if a git tag gets created *after* the reference is already put into the cache, as the ref check above will then not sync the new tags // see https://github.com/composer/composer/discussions/11002 if branches.is_some() - && !Preg::is_match( + && preg_match2( format!(r"{{^[\s*]*v?{}$}}m", preg_quote(&branch, None)), branches.as_deref().unwrap_or(""), + 0, ) + .is_none() && tags.is_some() - && !Preg::is_match( + && preg_match2( format!(r"{{^[\s*]*{}$}}m", preg_quote(&branch, None)), tags.as_deref().unwrap_or(""), + 0, ) + .is_none() { self.sync_mirror(url, dir)?; } @@ -1042,7 +1060,7 @@ impl Git { } // Filter out "commit <hash>" lines for older git versions - Preg::replace(php_regex!(r"{^commit [a-f0-9]{40}\n?}m"), "", output) + preg_replace(php_regex!(r"{^commit [a-f0-9]{40}\n?}m"), "", output) } fn check_ref_is_in_mirror(&mut self, dir: &str, r#ref: &str) -> anyhow::Result<bool> { @@ -1081,7 +1099,7 @@ impl Git { } fn get_authentication_failure<'u>(&self, url: &'u str) -> Option<PregMatches<'u>> { - let m = Preg::is_match3(php_regex!(r"{^(https?://)([^/]+)(.*)$}i"), url)?; + let m = preg_match2(php_regex!(r"{^(https?://)([^/]+)(.*)$}i"), url, 0)?; let auth_failures = [ "fatal: Authentication failed", @@ -1164,7 +1182,7 @@ impl Git { .split_lines(output_mixed.as_string().unwrap_or("")); for line in lines { if let Some(matches) = - Preg::is_match3(php_regex!(r"{^\s*HEAD branch:\s(.+)\s*$}m"), &line) + preg_match2(php_regex!(r"{^\s*HEAD branch:\s(.+)\s*$}m"), &line, 0) { return Ok(Some(matches.get(1).unwrap_or_default().to_string())); } @@ -1285,7 +1303,7 @@ impl Git { ); if exit_code == 0 && let Some(matches) = - Preg::is_match3(php_regex!(r"/^git version (\d+(?:\.\d+)+)/m"), &output) + preg_match2(php_regex!(r"/^git version (\d+(?:\.\d+)+)/m"), &output, 0) { *version = Some(matches.get(1).map(str::to_string)); } |
