pub fn parse(porcelain: &str) -> Result<Vec<Blame>, ParseError>Expand description
Parses the output of git blame command in the porcelain format.
the output must be generated using the --line-porcelain option.
Examples found in repository?
examples/demo.rs (line 31)
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}