From dff81f7b84c279d7e00fe7a885743605a2ac5b7e Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sun, 2 Aug 2020 00:10:19 +0200 Subject: git-sugpatch: Accept multiple suggestion args; Accept suggestion ID args Add the ability to pass multiple suggestions to the binary. The diffs will appear in the output one after another. Also allow suggestions to be specified by their comment ID instead of their full URL. This uses the Git repo's remote to determine the owner-repo pair. When a URL argument is given, the owner-repo pair is extracted from the URL. It's now possible to call the binary like this: $ git-sugpatch 459692838 \ > https://github.com/teddywing/suggestion-test/pull/1#discussion_r459691747 --- src/bin/git-sugpatch.rs | 59 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 10 deletions(-) (limited to 'src/bin/git-sugpatch.rs') diff --git a/src/bin/git-sugpatch.rs b/src/bin/git-sugpatch.rs index 2a9b348..04b687d 100644 --- a/src/bin/git-sugpatch.rs +++ b/src/bin/git-sugpatch.rs @@ -1,8 +1,10 @@ use std::env; use std::process; -use github_suggestion::{Client, SuggestionUrl}; +use github_suggestion::{Client, Suggestion, SuggestionUrl}; use github_suggestion_cli::config::Config; +use github_suggestion_cli::error::Error; +use github_suggestion_cli::is_suggestion_id; fn main() { @@ -10,19 +12,56 @@ fn main() { let config = Config::get(&args).unwrap(); - if args.len() < 2 { + if config.suggestions.is_empty() { process::exit(111); } - let url: SuggestionUrl = args[1].parse().unwrap(); + let suggestions: Vec> = config.suggestions + .iter() + .map(|s| { + let suggestion = if is_suggestion_id(s)? { + let client = Client::new( + &config.github_token, + &config.owner, + &config.repo, + ).unwrap(); - let client = Client::new( - &config.github_token, - &config.owner, - &config.repo, - ).unwrap(); + client.fetch(&s).unwrap() + } else { + let url: SuggestionUrl = args[1].parse().unwrap(); - let suggestion = client.fetch(&url.comment_id).unwrap(); + let client = Client::new( + &config.github_token, + &url.owner, + &url.repo, + ).unwrap(); - print!("{}", suggestion.diff().unwrap()); + client.fetch(&url.comment_id).unwrap() + }; + + Ok(suggestion) + }) + .collect(); + + let errors: Vec<&Error> = suggestions.iter() + .filter(|r| r.is_err()) + + // We know these `Results` are `Err`s. + .map(|r| r.as_ref().err().unwrap()) + .collect(); + + if !errors.is_empty() { + for error in errors { + eprintln!("error: {}", error); + } + + return; + } + + suggestions + .iter() + + // We've already checked for `Err`s above. + .map(|r| r.as_ref().unwrap()) + .for_each(|s| print!("{}", s.diff().unwrap())); } -- cgit v1.2.3