Initial upload: GitPulse - Developer Productivity Analyzer CLI tool
This commit is contained in:
84
src/cli/mod.rs
Normal file
84
src/cli/mod.rs
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
pub mod analyze;
|
||||||
|
pub mod dashboard;
|
||||||
|
pub mod export;
|
||||||
|
pub mod init;
|
||||||
|
|
||||||
|
use anyhow::{Context, Result};
|
||||||
|
use clap::{Parser, Subcommand};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use crate::commands::analyze::AnalyzeArgs;
|
||||||
|
use crate::commands::export::ExportArgs;
|
||||||
|
use crate::config::Config;
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(name = "gitpulse")]
|
||||||
|
#[command(author, version, about, long_about = None)]
|
||||||
|
#[command(after_help = "For more information, visit https://github.com/gitpulse/gitpulse")]
|
||||||
|
pub struct Cli {
|
||||||
|
#[command(subcommand)]
|
||||||
|
pub command: Commands,
|
||||||
|
|
||||||
|
#[arg(short, long, global = true, value_name = "PATH")]
|
||||||
|
#[arg(help = "Path to git repository (defaults to current directory)")]
|
||||||
|
pub repo: Option<PathBuf>,
|
||||||
|
|
||||||
|
#[arg(short, long, global = true)]
|
||||||
|
#[arg(help = "Enable verbose output")]
|
||||||
|
pub verbose: bool,
|
||||||
|
|
||||||
|
#[arg(short, long, global = true, value_name = "FILE")]
|
||||||
|
#[arg(help = "Path to configuration file")]
|
||||||
|
pub config: Option<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subcommand, Debug)]
|
||||||
|
pub enum Commands {
|
||||||
|
#[command(name = "analyze", alias = "a")]
|
||||||
|
#[command(about = "Analyze git repository and display statistics")]
|
||||||
|
#[command(long_about = "Analyze git repository and display commit frequency, code churn, contributor statistics, and more.")]
|
||||||
|
Analyze(AnalyzeArgs),
|
||||||
|
|
||||||
|
#[command(name = "dashboard", alias = "d")]
|
||||||
|
#[command(about = "Launch interactive terminal dashboard")]
|
||||||
|
#[command(long_about = "Launch an interactive terminal dashboard showing project health, commit trends, and contributor metrics.")]
|
||||||
|
Dashboard {},
|
||||||
|
|
||||||
|
#[command(name = "export", alias = "e")]
|
||||||
|
#[command(about = "Export analysis results to JSON or CSV")]
|
||||||
|
#[command(long_about = "Export analysis results to JSON or CSV format for external processing.")]
|
||||||
|
Export(ExportArgs),
|
||||||
|
|
||||||
|
#[command(name = "init")]
|
||||||
|
#[command(about = "Initialize gitpulse configuration")]
|
||||||
|
#[command(long_about = "Create a default configuration file in the appropriate location.")]
|
||||||
|
Init {},
|
||||||
|
|
||||||
|
#[command(name = "show-config")]
|
||||||
|
#[command(about = "Show current configuration")]
|
||||||
|
#[command(long_about = "Display the current configuration with all effective values.")]
|
||||||
|
ShowConfig {},
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cli {
|
||||||
|
pub fn run(self) -> Result<()> {
|
||||||
|
let config = Config::load(self.config.as_ref())?;
|
||||||
|
|
||||||
|
match self.command {
|
||||||
|
Commands::Analyze(args) => {
|
||||||
|
commands::analyze::run(self.repo, args, &config, self.verbose)
|
||||||
|
}
|
||||||
|
Commands::Dashboard {} => {
|
||||||
|
commands::dashboard::run(self.repo, &config, self.verbose)
|
||||||
|
}
|
||||||
|
Commands::Export(args) => {
|
||||||
|
commands::export::run(self.repo, args, &config, self.verbose)
|
||||||
|
}
|
||||||
|
Commands::Init {} => commands::init::run(&config),
|
||||||
|
Commands::ShowConfig {} => {
|
||||||
|
println!("{:#?}", config);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user