mirror of
https://github.com/nodejs/node.git
synced 2025-05-14 23:19:09 +00:00

BUGFIXES * [`27cccfbda`](27cccfbdac
) [#223](https://github.com/npm/cli/pull/223) vulns → vulnerabilities in npm audit output ([@sapegin](https://github.com/sapegin)) * [`d5e865eb7`](d5e865eb79
) [#222](https://github.com/npm/cli/pull/222) [#226](https://github.com/npm/cli/pull/226) install, doctor: don't crash if registry unset ([@dmitrydvorkin](https://github.com/dmitrydvorkin), [@isaacs](https://github.com/isaacs)) * [`5b3890226`](5b38902265
) [#227](https://github.com/npm/cli/pull/227) [npm.community#9167](https://npm.community/t/npm-err-cb-never-called-permission-denied/9167/5) Handle unhandledRejections, tell user what to do when encountering an `EACCES` error in the cache. ([@isaacs](https://github.com/isaacs)) DEPENDENCIES * [`77516df6e`](77516df6ea
) `licensee@7.0.3` ([@isaacs](https://github.com/isaacs)) * [`ceb993590`](ceb993590e
) `query-string@6.8.2` ([@isaacs](https://github.com/isaacs)) * [`4050b9189`](4050b91898
) `hosted-git-info@2.8.2` * [#46](https://github.com/npm/hosted-git-info/issues/46) [#43](https://github.com/npm/hosted-git-info/issues/43) [#47](https://github.com/npm/hosted-git-info/pull/47) [#44](https://github.com/npm/hosted-git-info/pull/44) Add support for GitLab subgroups ([@mterrel](https://github.com/mterrel), [@isaacs](https://github.com/isaacs), [@ybiquitous](https://github.com/ybiquitous)) * [`3b1d629`](https://github.com/npm/hosted-git-info/commit/3b1d629) [#48](https://github.com/npm/hosted-git-info/issues/48) fix http protocol using sshurl by default ([@fengmk2](https://github.com/fengmk2)) * [`5d4a8d7`](https://github.com/npm/hosted-git-info/commit/5d4a8d7) ignore noCommittish on tarball url generation ([@isaacs](https://github.com/isaacs)) * [`1692435`](https://github.com/npm/hosted-git-info/commit/1692435) use gist tarball url that works for anonymous gists ([@isaacs](https://github.com/isaacs)) * [`d5cf830`](d5cf8309be
) Do not allow invalid gist urls ([@isaacs](https://github.com/isaacs)) * [`e518222`](e518222435
) Use LRU cache to prevent unbounded memory consumption ([@iarna](https://github.com/iarna)) PR-URL: https://github.com/nodejs/node/pull/29023 Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
168 lines
4.0 KiB
Bash
Executable File
168 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Land a pull request
|
|
# Creates a PR-### branch, pulls the commits, opens up an interactive rebase to
|
|
# squash, and then annotates the commit with the changelog goobers
|
|
#
|
|
# Usage:
|
|
# pr <url|number> [<upstream remote>=origin]
|
|
|
|
main () {
|
|
if [ "$1" = "finish" ]; then
|
|
shift
|
|
finish "$@"
|
|
return $?
|
|
fi
|
|
|
|
local url="$(prurl "$@")"
|
|
local num=$(basename $url)
|
|
local prpath="${url#git@github.com:}"
|
|
local repo=${prpath%/pull/$num}
|
|
local prweb="https://github.com/$prpath"
|
|
local root="$(prroot "$url")"
|
|
local api="https://api.github.com/repos/${repo}/pulls/${num}"
|
|
local user=$(curl -s $api | json user.login)
|
|
local ref="$(prref "$url" "$root")"
|
|
local curhead="$(git show --no-patch --pretty=%H HEAD)"
|
|
local curbranch="$(git rev-parse --abbrev-ref HEAD)"
|
|
local cleanlines
|
|
IFS=$'\n' cleanlines=($(git status -s -uno))
|
|
if [ ${#cleanlines[@]} -ne 0 ]; then
|
|
echo "working dir not clean" >&2
|
|
IFS=$'\n' echo "${cleanlines[@]}" >&2
|
|
echo "aborting PR merge" >&2
|
|
fi
|
|
|
|
# ok, ready to rock
|
|
branch=PR-$num
|
|
if [ "$curbranch" == "$branch" ]; then
|
|
echo "already on $branch, you're on your own" >&2
|
|
return 1
|
|
fi
|
|
|
|
me=$(git config github.user || git config user.name)
|
|
if [ "$me" == "" ]; then
|
|
echo "run 'git config --add github.user <username>'" >&2
|
|
return 1
|
|
fi
|
|
|
|
exists=$(git show --no-patch --pretty=%H $branch 2>/dev/null)
|
|
if [ "$exists" == "" ]; then
|
|
git fetch origin pull/$num/head:$branch
|
|
git checkout $branch
|
|
else
|
|
git checkout $branch
|
|
git pull --rebase origin pull/$num/head
|
|
fi
|
|
|
|
git rebase -i $curbranch # squash and test
|
|
|
|
if [ $? -eq 0 ]; then
|
|
finish "${curbranch}"
|
|
else
|
|
echo "resolve conflicts and run: $0 finish "'"'${curbranch}'"'
|
|
fi
|
|
}
|
|
|
|
# add the PR-URL to the last commit, after squashing
|
|
finish () {
|
|
if [ $# -eq 0 ]; then
|
|
echo "Usage: $0 finish <branch> (while on a PR-### branch)" >&2
|
|
return 1
|
|
fi
|
|
|
|
local curbranch="$1"
|
|
local ref=$(cat .git/HEAD)
|
|
local prnum
|
|
case $ref in
|
|
"ref: refs/heads/PR-"*)
|
|
prnum=${ref#ref: refs/heads/PR-}
|
|
;;
|
|
*)
|
|
echo "not on the PR-## branch any more!" >&2
|
|
return 1
|
|
;;
|
|
esac
|
|
|
|
local me=$(git config github.user || git config user.name)
|
|
if [ "$me" == "" ]; then
|
|
echo "run 'git config --add github.user <username>'" >&2
|
|
return 1
|
|
fi
|
|
|
|
set -x
|
|
|
|
local url="$(prurl "$prnum")"
|
|
local num=$prnum
|
|
local prpath="${url#git@github.com:}"
|
|
local repo=${prpath%/pull/$num}
|
|
local prweb="https://github.com/$prpath"
|
|
local root="$(prroot "$url")"
|
|
|
|
local api="https://api.github.com/repos/${repo}/pulls/${num}"
|
|
local user=$(curl -s $api | json user.login)
|
|
|
|
local lastmsg="$(git log -1 --pretty=%B)"
|
|
local newmsg="${lastmsg}
|
|
|
|
PR-URL: ${prweb}
|
|
Credit: @${user}
|
|
Close: #${num}
|
|
Reviewed-by: @${me}
|
|
"
|
|
git commit --amend -m "$newmsg"
|
|
git checkout $curbranch
|
|
git merge PR-${prnum} --ff-only
|
|
set +x
|
|
}
|
|
|
|
|
|
prurl () {
|
|
local url="$1"
|
|
if [ "$url" == "" ] && type pbpaste &>/dev/null; then
|
|
url="$(pbpaste)"
|
|
fi
|
|
if [[ "$url" =~ ^[0-9]+$ ]]; then
|
|
local us="$2"
|
|
if [ "$us" == "" ]; then
|
|
us="origin"
|
|
fi
|
|
local num="$url"
|
|
local o="$(git config --get remote.${us}.url)"
|
|
url="${o}"
|
|
url="${url#(git:\/\/|https:\/\/)}"
|
|
url="${url#git@}"
|
|
url="${url#github.com[:\/]}"
|
|
url="${url%.git}"
|
|
url="https://github.com/${url}/pull/$num"
|
|
fi
|
|
url=${url%/commits}
|
|
url=${url%/files}
|
|
url="$(echo $url | perl -p -e 's/#issuecomment-[0-9]+$//g')"
|
|
|
|
local p='^https:\/\/github.com\/[^\/]+\/[^\/]+\/pull\/[0-9]+$'
|
|
if ! [[ "$url" =~ $p ]]; then
|
|
echo "Usage:"
|
|
echo " $0 <pull req url>"
|
|
echo " $0 <pull req number> [<remote name>=origin]"
|
|
type pbpaste &>/dev/null &&
|
|
echo "(will read url/id from clipboard if not specified)"
|
|
exit 1
|
|
fi
|
|
url="${url/https:\/\/github\.com\//git@github.com:}"
|
|
echo "$url"
|
|
}
|
|
|
|
prroot () {
|
|
local url="$1"
|
|
echo "${url/\/pull\/+([0-9])/}"
|
|
}
|
|
|
|
prref () {
|
|
local url="$1"
|
|
local root="$2"
|
|
echo "refs${url:${#root}}/head"
|
|
}
|
|
|
|
main "$@"
|