Skip to content
Clone
563bb99
44 lines 2.0 KB Rust
use crate::errors::ImportError;
use super::{
ImportProvider, ProbeInfo, ProbeRequest, api_base, encode_project_path, get_json, http_client,
json_i64, json_string, source_path,
};
pub async fn probe(request: ProbeRequest<'_>) -> Result<ProbeInfo, ImportError> {
let client = http_client(request.config)?;
let base = api_base(ImportProvider::Gitlab, request.base_url, request.config)?;
let (path, fallback_name) = source_path(ImportProvider::Gitlab, request.source)?;
let url = format!(
"{base}/projects/{}?statistics=true",
encode_project_path(&path)
);
let value = get_json(&client, &url, ImportProvider::Gitlab, request.token).await?;
let clone_url = json_string(&value, &["http_url_to_repo"]).ok_or_else(|| {
ImportError::Upstream("source forge did not return a clone url".to_string())
})?;
let owner = json_string(&value, &["namespace", "full_path"])
.or_else(|| json_string(&value, &["namespace", "path"]))
.unwrap_or_else(|| path.split('/').next().unwrap_or_default().to_string());
let visibility = json_string(&value, &["visibility"]).unwrap_or_default();
let has_token = request.token.is_some_and(|token| !token.trim().is_empty());
Ok(ProbeInfo {
provider: ImportProvider::Gitlab,
owner,
name: json_string(&value, &["name"])
.or_else(|| json_string(&value, &["path"]))
.unwrap_or(fallback_name),
clone_url,
default_branch: json_string(&value, &["default_branch"]).unwrap_or_else(|| "main".into()),
is_private: visibility == "private",
description: json_string(&value, &["description"]),
size_bytes: json_i64(&value, &["statistics", "disk_size_bytes"]),
owner_external_id: json_string(&value, &["namespace", "id"]),
owner_avatar_url: json_string(&value, &["namespace", "avatar_url"]),
credential_username: has_token.then(|| {
ImportProvider::Gitlab
.default_credential_username()
.to_string()
}),
})
}