feat: Initial commit
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
.secret.toml
|
||||||
Generated
+2794
File diff suppressed because it is too large
Load Diff
+17
@@ -0,0 +1,17 @@
|
|||||||
|
[package]
|
||||||
|
name = "workshop"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bollard = "0.18.1"
|
||||||
|
config = "0.14.1"
|
||||||
|
lazy_static = "1.5.0"
|
||||||
|
url = "2.5.4"
|
||||||
|
gitea-sdk = "0.5.0"
|
||||||
|
octocrab = "0.43.0"
|
||||||
|
tokio = { version = "1.43.0", features = ["full"] }
|
||||||
|
serde_json = "1.0.139"
|
||||||
|
serde = "1.0.218"
|
||||||
|
log = "*"
|
||||||
|
env_logger = "*"
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
use gitea_sdk::Client;
|
||||||
|
use log::warn;
|
||||||
|
use url::Url;
|
||||||
|
pub async fn language_analyze(repo: String, gitea_token: String) -> Result<(), String> {
|
||||||
|
let repo_url = Url::parse(repo.as_str());
|
||||||
|
if repo_url.is_err() {
|
||||||
|
warn!("Invalid gitea repository URL");
|
||||||
|
return Err("Invalid gitea repository URL".to_string());
|
||||||
|
}
|
||||||
|
let repo_url = repo_url.unwrap();
|
||||||
|
let repo_proto = repo_url.scheme();
|
||||||
|
let repo_host = repo_url.host_str().unwrap();
|
||||||
|
let mut repo_path = repo_url.path();
|
||||||
|
if repo_path.ends_with(".git") {
|
||||||
|
// 处理.git后缀
|
||||||
|
repo_path = repo_path.strip_suffix(".git").unwrap();
|
||||||
|
}
|
||||||
|
let gitea_instance = Client::new(
|
||||||
|
format!("{}://{}", repo_proto, repo_host),
|
||||||
|
gitea_sdk::Auth::Token(gitea_token),
|
||||||
|
);
|
||||||
|
let repo_lang: serde_json::Value = gitea_instance
|
||||||
|
.get(format!("repos{}/languages", repo_path))
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.json()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
// dbg!(&repo_lang);
|
||||||
|
if repo_lang["message"].is_string() {
|
||||||
|
warn!(
|
||||||
|
"Gitea API returned errors: {}",
|
||||||
|
repo_lang["message"].as_str().unwrap()
|
||||||
|
);
|
||||||
|
return Err(format!(
|
||||||
|
"Gitea API returned errors: {}",
|
||||||
|
repo_lang["message"].as_str().unwrap()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
use super::language_analyze;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_gitea_language_analyze() {
|
||||||
|
// let repo = "https://gitea.cattysteve.top/pig2014/GalaxyMusicHall_CTP_Backend";
|
||||||
|
let repo = "https://gitea.cattysteve.top/pig2014/buildcat_renpy";
|
||||||
|
language_analyze(repo.to_string(), "".to_string())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[should_panic(expected = "Gitea API returned errors: The target couldn't be found.")]
|
||||||
|
async fn test_gitea_language_analyze_nonexistent() {
|
||||||
|
let repo = "https://gitea.cattysteve.top/pig2014/GalaxyMusicHall_CTP_Backend";
|
||||||
|
language_analyze(repo.to_string(), "".to_string())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
use log::warn;
|
||||||
|
use octocrab::GitHubError;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::{error::Error, sync::Arc};
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct RepoLanguage {
|
||||||
|
#[serde(flatten)]
|
||||||
|
name: String,
|
||||||
|
size: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn language_analyze(repo: String, github_token: Option<String>) -> Result<(), String> {
|
||||||
|
let repo_url = Url::parse(repo.as_str());
|
||||||
|
if repo_url.is_err() {
|
||||||
|
warn!("Invalid github repository URL");
|
||||||
|
return Err("Invalid github repository URL".to_string());
|
||||||
|
}
|
||||||
|
let repo_url = repo_url.unwrap();
|
||||||
|
let repo_host = repo_url.host_str().unwrap();
|
||||||
|
if repo_host != "github.com" {
|
||||||
|
warn!("Not a GitHub repository");
|
||||||
|
return Err(format!("Unsupported host: {}", repo_host));
|
||||||
|
}
|
||||||
|
let mut repo_path = repo_url.path();
|
||||||
|
if repo_path.ends_with(".git") {
|
||||||
|
// 处理.git后缀
|
||||||
|
repo_path = repo_path.strip_suffix(".git").unwrap();
|
||||||
|
};
|
||||||
|
|
||||||
|
let github_instance = octocrab::instance();
|
||||||
|
let github_instance = if github_token.is_some() {
|
||||||
|
Arc::new(
|
||||||
|
github_instance
|
||||||
|
.user_access_token(github_token.unwrap())
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
github_instance
|
||||||
|
};
|
||||||
|
let repo_lang = github_instance
|
||||||
|
.get::<serde_json::Value, String, ()>(format!("/repos{}/languages", repo_path), None::<&()>)
|
||||||
|
.await;
|
||||||
|
if repo_lang.is_err() {
|
||||||
|
match repo_lang.unwrap_err() {
|
||||||
|
octocrab::Error::GitHub {
|
||||||
|
source: error,
|
||||||
|
backtrace: _,
|
||||||
|
} => {
|
||||||
|
// dbg!(error.message);
|
||||||
|
warn!("Failed to fetch language information: {}", error.message);
|
||||||
|
return Err(format!(
|
||||||
|
"Failed to fetch language information: {}",
|
||||||
|
error.message
|
||||||
|
));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
warn!("Failed to fetch language information");
|
||||||
|
return Err("Failed to fetch language information".to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let repo_lang = repo_lang.unwrap();
|
||||||
|
dbg!(repo_lang);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
use super::language_analyze;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_github_language_analyze_success() {
|
||||||
|
let repo = "https://github.com/mono/SkiaSharp";
|
||||||
|
language_analyze(repo.to_string(), None).await.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[should_panic]
|
||||||
|
async fn test_github_language_analyze_nonexistent() {
|
||||||
|
let repo = "https://github.com/nonexistant/bass";
|
||||||
|
language_analyze(repo.to_string(), None).await.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
mod ingredient {
|
||||||
|
pub mod gitea;
|
||||||
|
pub mod github;
|
||||||
|
}
|
||||||
|
use bollard::{API_DEFAULT_VERSION, Docker};
|
||||||
|
use config::Config;
|
||||||
|
use env_logger;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref CONFIG: Config = Config::builder()
|
||||||
|
.add_source(config::File::with_name("settings.toml"))
|
||||||
|
.add_source(config::File::with_name(".secret.toml"))
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
env_logger::init();
|
||||||
|
let docker_host = CONFIG.get_string("DOCKER_HOST").unwrap_or(String::new());
|
||||||
|
let docker_connection_timeout = CONFIG.get_int("DOCKER_CONNECTION_TIMEOUT").unwrap_or(10);
|
||||||
|
if docker_host.is_empty() {
|
||||||
|
Docker::connect_with_local_defaults().unwrap();
|
||||||
|
} else {
|
||||||
|
Docker::connect_with_http(
|
||||||
|
&docker_host,
|
||||||
|
docker_connection_timeout as u64,
|
||||||
|
API_DEFAULT_VERSION,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
println!("Good!");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user