aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeddy Wing2020-08-02 00:10:19 +0200
committerTeddy Wing2020-08-02 00:18:47 +0200
commitdff81f7b84c279d7e00fe7a885743605a2ac5b7e (patch)
treeb65441e5efa1155cb33134f3645980610a1e0db5
parent166a85b3f3796ce9dce91004b0b99eed10443e3a (diff)
downloadgit-suggestion-dff81f7b84c279d7e00fe7a885743605a2ac5b7e.tar.bz2
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
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml1
-rw-r--r--src/arg.rs8
-rw-r--r--src/bin/git-sugpatch.rs59
-rw-r--r--src/error.rs9
-rw-r--r--src/lib.rs6
6 files changed, 74 insertions, 10 deletions
diff --git a/Cargo.lock b/Cargo.lock
index ff0c5d0..4be1b47 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -288,6 +288,7 @@ dependencies = [
"getopts",
"git2",
"github-suggestion",
+ "regex",
"thiserror",
"url",
]
diff --git a/Cargo.toml b/Cargo.toml
index cd03ae8..d0ce530 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,6 +6,7 @@ edition = "2018"
[dependencies]
getopts = "0.2.21"
git2 = "0.13.8"
+regex = "1.3.9"
thiserror = "1.0.20"
url = "2.1.1"
diff --git a/src/arg.rs b/src/arg.rs
new file mode 100644
index 0000000..eaea67b
--- /dev/null
+++ b/src/arg.rs
@@ -0,0 +1,8 @@
+use regex::{self, Regex};
+
+
+pub fn is_suggestion_id(s: &str) -> Result<bool, regex::Error> {
+ let re = Regex::new(r"^\d+$")?;
+
+ Ok(re.is_match(s))
+}
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<Result<Suggestion, Error>> = 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()));
}
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..c857bd2
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,9 @@
+use regex;
+use thiserror::Error;
+
+
+#[derive(Debug, Error)]
+pub enum Error {
+ #[error("Unable to parse regex")]
+ Regex(#[from] regex::Error),
+}
diff --git a/src/lib.rs b/src/lib.rs
index 494c389..0a8ab13 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,5 +1,11 @@
#![warn(rust_2018_idioms)]
pub mod config;
+pub mod error;
pub(crate) mod owner_repo;
+
+mod arg;
+
+
+pub use arg::is_suggestion_id;