diff --git a/files/git-tools.sh b/files/git-tools.sh new file mode 100755 index 0000000..25dc1a1 --- /dev/null +++ b/files/git-tools.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +if [ -z "${1}" ]; then + echo "Command not specified" + exit 1 +fi + +function import_gpg_key +{ + username="${1}" + echo "Importing GPG key for ${username}" + f=`mktemp` + curl -s https://api.github.com/users/${username}/gpg_keys -o ${f} + keyid="`jq -r '.[0].key_id' ${f}`" + jq -r '.[0].raw_key' ${f}| gpg --import + fpr=`gpg -k ${keyid}|grep -E '[A-F0-9]{40}'` + gpg --quick-lsign-key ${fpr} + rm -f ${f} +} + +function mergepullrequest +{ + echo "Merging PR ${1}" + curbranch=$(git status|head -1|cut -d\ -f3-) + + upstream="v0.6" + + git pull --all + git checkout -B upstream-$upstream --track upstream/"$upstream" + git fetch upstream pull/"$1"/head:"$1" + git merge --verify-signatures --ff-only -m "Merge PR $1 into $upstream" "$1" + #git checkout -B $curbranch --track origin/$curbranch + git checkout -B "$curbranch" +} + +function rebase_open_prs +{ + pulljs=$(mktemp) + username=$(git remote get-url origin| sed -E 'sx.*[:/](.+)/PyBitmessage(.git)?x\1x') + echo "My user name is $username" + head="$(curl -s https://api.github.com/repos/Bitmessage/PyBitmessage/branches/v0.6 | jq ".commit.sha"|cut -d\" -f2)" + echo "head is $head" + curl -s https://api.github.com/repos/Bitmessage/PyBitmessage/pulls -o "$pulljs" + pulls=$(jq ".[] | select(.user.login == \"$username\").number" < "$pulljs") + git pull --all --no-commit + for pr in $pulls; do + echo -n "PR $pr is mine, " + parent="$(jq ".[] | select(.number == $pr).base.sha" < "$pulljs"|cut -d\" -f2)" + if [ "$parent" != "$head" ]; then + echo -n "not up to date, " + branch="$(jq ".[] | select(.number == $pr).head.ref" < "$pulljs"|cut -d\" -f2)" + echo -n "rebasing branch $branch, " + git checkout -B "$branch" --track "origin/$branch" + if ! git rebase upstream/v0.6; then + echo "failed, skipping" + continue + fi + echo "success, pushing" + git push --force origin -u "$branch:$branch" + else + echo "up to date" + fi + done + rm -f "$pulljs" +} + +function push_upstream +{ + git push upstream -u upstream-v0.6:v0.6 +} + +case "${1}" in + "mergepullrequest") + if [ -z "${2}" ]; then + echo "No PR# specified, here is a list:" + curl -s https://api.github.com/repos/Bitmessage/PyBitmessage/pulls -s | jq '.[] | .number, .title' | paste - - + exit 1 + fi + mergepullrequest "${2}" + ;; + "importgpgkey") + if [ -z "${2}" ]; then + echo "No username specified, here is a list from recent PRs:" + curl -s https://api.github.com/repos/Bitmessage/PyBitmessage/pulls -s | jq '.[].user.login' | sort -u + exit 1 + fi + import_gpg_key "${2}" + ;; + "rebase") + rebase_open_prs + ;; + "pushupstream") + push_upstream + ;; +esac