use std::path::Path;
use std::sync::Arc;
use url::Url;
use crate::dependency::DependencyName;
use crate::resolver::DependencyScope;
use crate::resolver::error::ResolverError;
use crate::resolver::policy::ResolverPolicy;
use crate::resolver::versions::RemoteRefs;
pub(crate) struct GitFetcher {
policy: Arc<ResolverPolicy>,
}
impl GitFetcher {
pub fn new(policy: Arc<ResolverPolicy>) -> Self {
Self { policy }
}
pub fn list_tags(
&self,
dep: &DependencyName,
url: &Url,
scope: DependencyScope,
) -> Result<RemoteRefs, ResolverError> {
self.policy.check_git_url(dep, url, scope)?;
let net = self.policy.git_policy(scope);
crate::resolver::versions::discover_remote_tags(
url,
net.max_advertised_refs,
self.policy.credential_mode(scope, url.host_str()),
)
.map_err(ResolverError::from)
}
pub fn list_branches(
&self,
dep: &DependencyName,
url: &Url,
scope: DependencyScope,
) -> Result<RemoteRefs, ResolverError> {
self.policy.check_git_url(dep, url, scope)?;
let net = self.policy.git_policy(scope);
crate::resolver::versions::discover_remote_branches(
url,
net.max_advertised_refs,
self.policy.credential_mode(scope, url.host_str()),
)
.map_err(ResolverError::from)
}
pub fn ensure_materialized(
&self,
dep: &DependencyName,
url: &Url,
commit: &str,
paths: &[&str],
scope: DependencyScope,
leaf: &Path,
) -> Result<(), ResolverError> {
self.policy.check_git_url(dep, url, scope)?;
crate::resolver::git::ensure_materialized(
leaf,
url,
commit,
paths.iter().copied(),
self.policy.credential_mode(scope, url.host_str()),
self.policy.max_materialized_files,
self.policy.max_materialized_bytes,
)?;
Ok(())
}
}