git-pr: accpeted multiple GitHub URL or ID with remote.

This commit is contained in:
spacewander 2019-02-02 12:29:41 +08:00
parent 87b7c959b4
commit f29dad042c
4 changed files with 97 additions and 21 deletions

View file

@ -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

View file

@ -10,10 +10,10 @@
\fBgit\-pr\fR <number> [<remote>]
.
.br
\fBgit\-pr\fR <[remote]:number>
\fBgit\-pr\fR <[remote]:number>\.\.\.
.
.br
\fBgit\-pr\fR <url>
\fBgit\-pr\fR <url>\.\.\.
.
.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

View file

@ -77,8 +77,8 @@
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-pr</code> &lt;number&gt; [&lt;remote&gt;]<br />
<code>git-pr</code> &lt;[remote]:number&gt;<br />
<code>git-pr</code> &lt;url&gt;<br />
<code>git-pr</code> &lt;[remote]:number&gt;...<br />
<code>git-pr</code> &lt;url&gt;...<br />
<code>git-pr clean</code></p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
@ -131,6 +131,21 @@ From https://github.com/tj/git-extras
Switched to branch 'pr/453'
</code></pre>
<p>You could even pull multiple pull requests via the GitHub URL or the ID with remote:</p>
<pre><code>$ git pr upstream:226 upstream:443
$ git pr upstream:443 https://github.com/tj/git-extras/pull/453
</code></pre>
<p>Note that <code>git pr PR-A PR-B</code> is equal to:</p>
<pre><code>$ git pr PR-A
$ git pr PR-B
</code></pre>
<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>
<p>To clean up old branches:</p>
<pre><code>$ git pr clean

View file

@ -4,8 +4,8 @@ git-pr(1) -- Checks out a pull request locally
## SYNOPSIS
`git-pr` &lt;number&gt; [&lt;remote&gt;]<br>
`git-pr` &lt;[remote]:number&gt;<br>
`git-pr` &lt;url&gt;<br>
`git-pr` &lt;[remote]:number&gt;...<br>
`git-pr` &lt;url&gt;...<br>
`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