From f29dad042cc3c057b6820b910f36d63d28606558 Mon Sep 17 00:00:00 2001 From: spacewander Date: Sat, 2 Feb 2019 12:29:41 +0800 Subject: [PATCH] git-pr: accpeted multiple GitHub URL or ID with remote. --- bin/git-pr | 47 ++++++++++++++++++++++++++++++++--------------- man/git-pr.1 | 35 +++++++++++++++++++++++++++++++++-- man/git-pr.html | 19 +++++++++++++++++-- man/git-pr.md | 17 +++++++++++++++-- 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/bin/git-pr b/bin/git-pr index f09bb3a..3d5daad 100755 --- a/bin/git-pr +++ b/bin/git-pr @@ -11,28 +11,45 @@ pull() { git config --local --replace branch.$branch.remote $remote; } +pull_pr_if_matched() { + if [[ $1 =~ ^(.*):([0-9]+)|(https?://[^/]+/.+)/pull/([0-9]+).*$ ]]; then + if [[ -n ${BASH_REMATCH[2]} ]]; then + remote="${BASH_REMATCH[1]:-origin}" + id="${BASH_REMATCH[2]}" + else + remote="${BASH_REMATCH[3]}.git" + id="${BASH_REMATCH[4]}" + fi + + branch=pr/$id + pull "$remote" "$id" "$branch" + return $? + fi + + echo "$1 doesn't match the pr id pattern." + return 1 +} + +test -z "$1" && echo "pr number required." 1>&2 && exit 1 + if test "$1" = "clean"; then git for-each-ref refs/heads/pr/* --format='%(refname)' | while read ref; do git branch -D ${ref#refs/heads/} done - exit 0 -elif [[ $1 =~ ^(.*):([0-9]+)|(https?://[^/]+/.+)/pull/([0-9]+).*$ ]]; then - if [[ -n ${BASH_REMATCH[2]} ]]; then - remote="${BASH_REMATCH[1]:-origin}" - id="${BASH_REMATCH[2]}" - else - remote="${BASH_REMATCH[3]}.git" - id="${BASH_REMATCH[4]}" - fi - - branch=pr/$id - pull "$remote" "$id" "$branch" - -else - test -z $1 && echo "pr number required." 1>&2 && exit 1 +elif [[ "$1" =~ ^[0-9]+$ ]]; then remote=${2:-origin} id=$1 branch=pr/$id pull "$remote" "$id" "$branch" + +else + rc=1 + while [ "$1" != "" ]; do + pull_pr_if_matched "$1" + rc=$? + shift + done + + exit "$rc" fi diff --git a/man/git-pr.1 b/man/git-pr.1 index 2ed3a90..1a5fba9 100644 --- a/man/git-pr.1 +++ b/man/git-pr.1 @@ -10,10 +10,10 @@ \fBgit\-pr\fR [] . .br -\fBgit\-pr\fR <[remote]:number> +\fBgit\-pr\fR <[remote]:number>\.\.\. . .br -\fBgit\-pr\fR +\fBgit\-pr\fR \.\.\. . .br \fBgit\-pr clean\fR @@ -99,6 +99,37 @@ Switched to branch \'pr/453\' .IP "" 0 . .P +You could even pull multiple pull requests via the GitHub URL or the ID with remote: +. +.IP "" 4 +. +.nf + +$ git pr upstream:226 upstream:443 +$ git pr upstream:443 https://github\.com/tj/git\-extras/pull/453 +. +.fi +. +.IP "" 0 +. +.P +Note that \fBgit pr PR\-A PR\-B\fR is equal to: +. +.IP "" 4 +. +.nf + +$ git pr PR\-A +$ git pr PR\-B +. +.fi +. +.IP "" 0 +. +.P +Therefore, if one of the pull request is failed to pull, this command will still go ahead and pull the others\. The final exit code will be decided by the result of the final pulling\. +. +.P To clean up old branches: . .IP "" 4 diff --git a/man/git-pr.html b/man/git-pr.html index be1dedd..38fde1e 100644 --- a/man/git-pr.html +++ b/man/git-pr.html @@ -77,8 +77,8 @@

SYNOPSIS

git-pr <number> [<remote>]
-git-pr <[remote]:number>
-git-pr <url>
+git-pr <[remote]:number>...
+git-pr <url>...
git-pr clean

DESCRIPTION

@@ -131,6 +131,21 @@ From https://github.com/tj/git-extras Switched to branch 'pr/453' +

You could even pull multiple pull requests via the GitHub URL or the ID with remote:

+ +
$ git pr upstream:226 upstream:443
+$ git pr upstream:443 https://github.com/tj/git-extras/pull/453
+
+ +

Note that git pr PR-A PR-B is equal to:

+ +
$ git pr PR-A
+$ git pr PR-B
+
+ +

Therefore, if one of the pull request is failed to pull, this command will still go ahead and pull +the others. The final exit code will be decided by the result of the final pulling.

+

To clean up old branches:

$ git pr clean
diff --git a/man/git-pr.md b/man/git-pr.md
index be2e823..00adf87 100644
--- a/man/git-pr.md
+++ b/man/git-pr.md
@@ -4,8 +4,8 @@ git-pr(1) -- Checks out a pull request locally
 ## SYNOPSIS
 
 `git-pr` <number> [<remote>]
-`git-pr` <[remote]:number>
-`git-pr` <url>
+`git-pr` <[remote]:number>...
+`git-pr` <url>...
`git-pr clean` ## DESCRIPTION @@ -54,6 +54,19 @@ You can also checkout a pull request based on a GitHub URL: * [new ref] refs/pull/453/head -> pr/453 Switched to branch 'pr/453' +You could even pull multiple pull requests via the GitHub URL or the ID with remote: + + $ git pr upstream:226 upstream:443 + $ git pr upstream:443 https://github.com/tj/git-extras/pull/453 + +Note that `git pr PR-A PR-B` is equal to: + + $ git pr PR-A + $ git pr PR-B + +Therefore, if one of the pull request is failed to pull, this command will still go ahead and pull +the others. The final exit code will be decided by the result of the final pulling. + To clean up old branches: $ git pr clean