main.rs
mod graph;
use graph::PijulGraph;
use clap::{Parser, Subcommand};
use libpijul::Base32;
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "pijul-graph")]
#[command(about = "Pijul repository history visualizer & analyzer", long_about = None)]
struct Cli {
#[arg(short, long, value_name = "PATH", default_value = ".")]
repo: PathBuf,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
/// 時系列順にパッチのカスタムログを表示します
Log,
}
fn main() {
let cli = Cli::parse();
let mut pijul_graph = PijulGraph::new();
if let Err(e) = pijul_graph.load_from_repo(&cli.repo) {
eprintln!("\x1b[31;1mError loading repository:\x1b[0m {}", e);
std::process::exit(1);
}
match cli.command {
Commands::Log => {
// 既存のログ表示(graphから情報を引く形にリファクタ)
let mut nodes: Vec<_> = pijul_graph.graph.node_indices().map(|idx| &pijul_graph.graph[idx]).collect();
nodes.sort_by(|a, b| b.timestamp.cmp(&a.timestamp));
println!("\n\x1b[1m=== Pijul Custom Log (Total: {}) ===\x1b[0m\n", nodes.len());
for node in nodes {
println!("\x1b[38;5;214mChange\x1b[0m \x1b[1m{}\x1b[0m", node.hash.to_base32());
println!("\x1b[32mAuthor:\x1b[0m {}", node.author);
println!("\x1b[34mDate:\x1b[0m {}", node.timestamp);
println!("\n {}\n", node.message);
println!("\x1b[38;5;244m--------------------------------------------------------\x1b[0m");
}
}
}
}