demo/
demo.rs

1//!
2//! git-blame-parser example
3//!
4
5fn main() {
6    let args: Vec<String> = std::env::args().collect();
7    if args.len() < 2 {
8        eprintln!("Error: missing args <FILE_PATH>");
9        std::process::exit(1);
10    }
11
12    let filepath = std::path::PathBuf::from(args[1].clone());
13    if !filepath.is_file() {
14        eprintln!("Error: invalid file path");
15        std::process::exit(1);
16    }
17
18    let output = std::process::Command::new("git")
19        .args(["blame", "--line-porcelain"])
20        .arg(filepath)
21        .output()
22        .unwrap();
23
24    if !output.status.success() {
25        let err = String::from_utf8_lossy(&output.stderr);
26        eprintln!("Error: {err}");
27        std::process::exit(1);
28    }
29
30    let raw_blame = String::from_utf8_lossy(&output.stdout);
31    let blames = match git_blame_parser::parse(&raw_blame) {
32        Ok(blames) => blames,
33        Err(e) => {
34            eprintln!("Error: {e}");
35            std::process::exit(1);
36        }
37    };
38
39    for blame in blames.iter() {
40        println!(
41            "* {}: {:0>4} by {} {}",
42            blame.short_commit(),
43            blame.original_line_no,
44            blame.author,
45            blame.author_mail
46        );
47        println!("summary: {}", blame.summary);
48        println!("content: `{}`", blame.content);
49        println!();
50    }
51}