forked from mirrors/kingfisher
Added support for Gitea
This commit is contained in:
parent
5c70fdc8e5
commit
6a974907ee
24 changed files with 865 additions and 15 deletions
96
src/cli/commands/gitea.rs
Normal file
96
src/cli/commands/gitea.rs
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
use clap::{Args, Subcommand, ValueEnum, ValueHint};
|
||||
use strum_macros::Display;
|
||||
use url::Url;
|
||||
|
||||
use crate::cli::commands::output::OutputArgs;
|
||||
|
||||
use super::github::GitHubOutputFormat;
|
||||
|
||||
/// Top-level Gitea command group
|
||||
#[derive(Args, Debug)]
|
||||
pub struct GiteaArgs {
|
||||
#[command(subcommand)]
|
||||
pub command: GiteaCommand,
|
||||
|
||||
/// Override Gitea API URL (e.g. self-hosted)
|
||||
#[arg(global = true, long, default_value = "https://gitea.com/api/v1/", value_hint = ValueHint::Url)]
|
||||
pub gitea_api_url: Url,
|
||||
}
|
||||
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum GiteaCommand {
|
||||
/// Interact with Gitea repositories
|
||||
#[command(subcommand)]
|
||||
Repos(GiteaReposCommand),
|
||||
}
|
||||
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum GiteaReposCommand {
|
||||
/// List repositories for a user or organization
|
||||
List(GiteaReposListArgs),
|
||||
}
|
||||
|
||||
/// `kingfisher gitea repos`
|
||||
#[derive(Args, Debug, Clone)]
|
||||
pub struct GiteaReposListArgs {
|
||||
#[command(flatten)]
|
||||
pub repo_specifiers: GiteaRepoSpecifiers,
|
||||
|
||||
#[command(flatten)]
|
||||
pub output_args: OutputArgs<GiteaOutputFormat>,
|
||||
}
|
||||
|
||||
/// Options for selecting Gitea repos
|
||||
#[derive(Args, Debug, Clone)]
|
||||
pub struct GiteaRepoSpecifiers {
|
||||
/// Repositories belonging to these users
|
||||
#[arg(long, alias = "gitea-user")]
|
||||
pub user: Vec<String>,
|
||||
|
||||
/// Repositories belonging to these organizations
|
||||
#[arg(long, alias = "org", alias = "gitea-organization", alias = "gitea-org")]
|
||||
pub organization: Vec<String>,
|
||||
|
||||
/// Skip repositories when enumerating Gitea users or organizations (format: owner/repo)
|
||||
#[arg(long = "gitea-exclude", alias = "gitea-exclude-repo", value_name = "OWNER/REPO")]
|
||||
pub exclude_repos: Vec<String>,
|
||||
|
||||
/// Repositories for all organizations accessible to the authenticated user
|
||||
#[arg(long, alias = "all-gitea-organizations", alias = "all-gitea-orgs")]
|
||||
pub all_organizations: bool,
|
||||
|
||||
/// Filter by repository type
|
||||
#[arg(long, default_value_t = GiteaRepoType::Source, alias = "gitea-repo-type")]
|
||||
pub repo_type: GiteaRepoType,
|
||||
}
|
||||
|
||||
impl GiteaRepoSpecifiers {
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.user.is_empty() && self.organization.is_empty() && !self.all_organizations
|
||||
}
|
||||
}
|
||||
|
||||
/// Gitea repository type filter
|
||||
#[derive(Copy, Clone, Debug, Display, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
|
||||
#[strum(serialize_all = "kebab-case")]
|
||||
pub enum GiteaRepoType {
|
||||
/// Only source repositories (not forks)
|
||||
Source,
|
||||
/// Only fork repositories
|
||||
#[value(alias = "forks")]
|
||||
Fork,
|
||||
/// Include all repositories
|
||||
All,
|
||||
}
|
||||
|
||||
pub type GiteaOutputFormat = GitHubOutputFormat;
|
||||
|
||||
impl From<GiteaRepoType> for crate::gitea::RepoType {
|
||||
fn from(val: GiteaRepoType) -> Self {
|
||||
match val {
|
||||
GiteaRepoType::Source => crate::gitea::RepoType::Source,
|
||||
GiteaRepoType::Fork => crate::gitea::RepoType::Fork,
|
||||
GiteaRepoType::All => crate::gitea::RepoType::All,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ use url::Url;
|
|||
use crate::{
|
||||
cli::commands::{
|
||||
bitbucket::{BitbucketAuthArgs, BitbucketRepoType},
|
||||
gitea::GiteaRepoType,
|
||||
github::{GitCloneMode, GitHistoryMode, GitHubRepoType},
|
||||
gitlab::GitLabRepoType,
|
||||
},
|
||||
|
|
@ -24,12 +25,15 @@ pub struct InputSpecifierArgs {
|
|||
"github_organization",
|
||||
"gitlab_user",
|
||||
"gitlab_group",
|
||||
"gitea_user",
|
||||
"gitea_organization",
|
||||
"bitbucket_user",
|
||||
"bitbucket_workspace",
|
||||
"bitbucket_project",
|
||||
"git_url",
|
||||
"all_github_organizations",
|
||||
"all_gitlab_groups",
|
||||
"all_gitea_organizations",
|
||||
"all_bitbucket_workspaces",
|
||||
"jira_url",
|
||||
"confluence_url",
|
||||
|
|
@ -112,6 +116,35 @@ pub struct InputSpecifierArgs {
|
|||
#[arg(long, alias = "include-subgroups")]
|
||||
pub gitlab_include_subgroups: bool,
|
||||
|
||||
// Gitea Options
|
||||
/// Scan repositories belonging to the specified Gitea user
|
||||
#[arg(long)]
|
||||
pub gitea_user: Vec<String>,
|
||||
|
||||
/// Scan repositories belonging to the specified Gitea organization
|
||||
#[arg(long, alias = "gitea-org")]
|
||||
pub gitea_organization: Vec<String>,
|
||||
|
||||
/// Skip repositories when enumerating Gitea users or organizations (format: owner/repo)
|
||||
#[arg(long = "gitea-exclude", alias = "gitea-exclude-repo", value_name = "OWNER/REPO")]
|
||||
pub gitea_exclude: Vec<String>,
|
||||
|
||||
/// Scan repositories from all accessible Gitea organizations (requires KF_GITEA_TOKEN)
|
||||
#[arg(long, alias = "all-gitea-orgs")]
|
||||
pub all_gitea_organizations: bool,
|
||||
|
||||
/// Use the specified URL for Gitea API access (e.g. for self-hosted instances)
|
||||
#[arg(
|
||||
long,
|
||||
alias="gitea-api-url",
|
||||
default_value = "https://gitea.com/api/v1/",
|
||||
value_hint = ValueHint::Url
|
||||
)]
|
||||
pub gitea_api_url: Url,
|
||||
|
||||
#[arg(long, default_value_t = GiteaRepoType::Source)]
|
||||
pub gitea_repo_type: GiteaRepoType,
|
||||
|
||||
// Bitbucket Options
|
||||
/// Scan repositories belonging to the specified Bitbucket users
|
||||
#[arg(long)]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
pub mod bitbucket;
|
||||
pub mod gitea;
|
||||
pub mod github;
|
||||
pub mod gitlab;
|
||||
pub mod inputs;
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@ use sysinfo::{MemoryRefreshKind, RefreshKind, System};
|
|||
use tracing::Level;
|
||||
|
||||
use crate::cli::commands::{
|
||||
bitbucket::BitbucketArgs, github::GitHubArgs, gitlab::GitLabArgs, rules::RulesArgs,
|
||||
scan::ScanArgs,
|
||||
bitbucket::BitbucketArgs, gitea::GiteaArgs, github::GitHubArgs, gitlab::GitLabArgs,
|
||||
rules::RulesArgs, scan::ScanArgs,
|
||||
};
|
||||
|
||||
#[deny(missing_docs)]
|
||||
|
|
@ -69,6 +69,10 @@ pub enum Command {
|
|||
#[command(name = "gitlab")]
|
||||
GitLab(GitLabArgs),
|
||||
|
||||
/// Interact with the Gitea API
|
||||
#[command(name = "gitea")]
|
||||
Gitea(GiteaArgs),
|
||||
|
||||
/// Interact with the Bitbucket API
|
||||
#[command(name = "bitbucket")]
|
||||
Bitbucket(BitbucketArgs),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue