diff options
Diffstat (limited to 'tools/patchbot')
| -rwxr-xr-x | tools/patchbot/bin/git-grab | 49 | ||||
| -rwxr-xr-x | tools/patchbot/bin/git-submit | 64 | ||||
| -rw-r--r-- | tools/patchbot/lib/patchbot-setup.sh | 61 | ||||
| -rw-r--r-- | tools/patchbot/setup-path.bat | 2 | ||||
| -rw-r--r-- | tools/patchbot/setup-path.sh | 3 |
5 files changed, 179 insertions, 0 deletions
diff --git a/tools/patchbot/bin/git-grab b/tools/patchbot/bin/git-grab new file mode 100755 index 0000000..8dedc4f --- /dev/null +++ b/tools/patchbot/bin/git-grab @@ -0,0 +1,49 @@ +#!/bin/sh +# This file is dedicated to the public domain. + +set -e # windows git doesn't seem to like flags in the shebang!? + +usage() { + printf 'usage: git grab [-p projectid] patchset\n' >&2 + exit 1 +} + +while getopts ":p:" arg; do + case "$arg" in + p) projectid="$OPTARG" ;; + *) usage ;; + esac +done +shift $((OPTIND - 1)) + +if [ $# != 1 ]; then usage; fi +patchset="$1" + +. "`dirname "$0"`/../lib/patchbot-setup.sh" + +doreq() { + flags="-sL" + if [ -n "$token" ]; then flags="-sLHAuthorization: Bearer $token"; fi + "$curl" -XGET "$flags" \ + -H"User-Agent patchbot-client v3" \ + --url-query "projectid=$projectid" \ + --url-query "patchset=$patchset" \ + -w"%{response_code}" \ + -o "$gitdir/PatchBot.$patchset.tmp" \ + "$server/grab" || : +} +dumpresponse() { + printf "Server returned HTTP status $httpcode.\nResponse:\n" >&2 + < "$gitdir/PatchBot.$patchset.tmp" sed 's/^/| /' >&2 # indent it! + rm "$gitdir/PatchBot.$patchset.tmp" +} + +# if we don't have a token we can try an anonymous grab first. if the project +# doesn't allow it we'll get a 401 and can then do the auth setup prompt. +httpcode="`doreq`" +if [ "$httpcode" = 401 ]; then dumpresponse; setupauth; doreq; fi +if [ "$httpcode" != 200 ]; then dumpresponse; exit 2; fi +< "$gitdir/PatchBot.$patchset.tmp" git am --keep-cr +rm "$gitdir/PatchBot.$patchset.tmp" + +# vi: sw=4 ts=4 noet tw=80 cc=80 diff --git a/tools/patchbot/bin/git-submit b/tools/patchbot/bin/git-submit new file mode 100755 index 0000000..70c2efc --- /dev/null +++ b/tools/patchbot/bin/git-submit @@ -0,0 +1,64 @@ +#!/bin/sh +# This file is dedicated to the public domain. + +set -e # windows git doesn't seem to like flags in the shebang!? + +usage() { + printf 'usage: git submit [-p projectid] description [range]\n' >&2 + exit 1 +} + +while getopts ":p:" arg; do + case "$arg" in + p) projectid="$OPTARG" ;; + *) usage ;; + esac +done +shift $((OPTIND - 1)) + +if [ $# -lt 1 -o $# -gt 2 ]; then usage; fi +description="$1" + +. "`dirname "$0"`/../lib/patchbot-setup.sh" + +range="${2:-"$remote_branch"}" + +git format-patch --histogram --stdout "$range" > "$gitdir/PatchBot.req.tmp" + +rmtmp() { + rm -f "$gitdir/PatchBot.req.tmp" "$gitdir/PatchBot.resp.tmp" +} + +doreq() { + "$curl" -sLXPOST -H"Authorization: Bearer $token" \ + -H"Content-Type: application/mbox" \ + -H"User-Agent: patchbot-client v3" \ + --data-binary @"$gitdir/PatchBot.req.tmp" - \ + --url-query "projectid=$projectid" \ + --url-query "description=$description" \ + -o "$gitdir/PatchBot.resp.tmp" \ + "$server/submit" >&2 +} +dumpresponse() { + printf "Server returned HTTP status $httpcode.\nResponse:\n" >&2 + < "$gitdir/PatchBot.resp.tmp" sed 's/^/| /' >&2 # indent it! +} + +# server doesn't allow anonymous submits. make sure we have a token first. +if [ -z "$token" ]; then + printf "error: submitting to PatchBot requires an auth token\n">&2 + setupauth; +fi +httpcode="`doreq`" +if [ "$httpcode" != 200 ]; then + dumpresponse + rmtmp + exit 2 +else + # just cat the response directly, it should be a brief message intended for + # direct display, containing the patchset number. + cat "$gitdir/PatchBot.resp.tmp" + rmtmp +fi + +# vi: sw=4 ts=4 noet tw=80 cc=80 diff --git a/tools/patchbot/lib/patchbot-setup.sh b/tools/patchbot/lib/patchbot-setup.sh new file mode 100644 index 0000000..029502d --- /dev/null +++ b/tools/patchbot/lib/patchbot-setup.sh @@ -0,0 +1,61 @@ +# This file is dedicated to the public domain. + +this_project=sst + +case "`uname`" in + *_NT*) + # make sure we use windows curl because Git's bundled curl might be + # really old + curl="$SYSTEMROOT/System32/curl.exe" + tokendir="$LOCALAPPDATA/PatchBot" + devtty="&0" ;; # /dev/tty doesn't seem to work even with Git's MSYS Bash + *) + curl=curl + # this isn't technically guaranteed to be installed + if ! command -v curl >/dev/null 2>&1; then + printf "patchbot-setup: fatal: curl is not installed\n" >&2 + exit 2 + fi + tokendir="${XDG_STATE_HOME:-~/.local/state}/patchbot" + devtty=/dev/tty ;; +esac + +urltofilename() { + _str="$1" + _ret="" + while [ -n "$_str" ]; do + _next="${_str#?}" + case "$_str" in + [a-z0-0\.,\-+=@\$]*) _ret="$_ret${_str%"$_next"}" ;; + _*) _ret="${_ret}__" ;; + *) _ret="$_ret`printf '_%02x' "'$_str"`" ;; + esac + _str="$_next" + done + echo "$_ret" +} + +gitdir="`git rev-parse --git-dir`" + +token="" +server="`git config --default "https://patchbot.mikes.software" PatchBot.server`" +: "${projectid:="`git config --default $this_project PatchBot.projectid`"}" +remote_branch="`git config --default origin/master PatchBot.remoteBranch`" +tokenfile="$tokendir/token_`urltofilename "$server"`" +if [ -f "$tokenfile" ]; then token="`cat "$tokenfile"`"; fi + +setupauth() { + printf "NOTE: PatchBot auth setup currently has to be done manually.\n" >&2 + printf "Get yourself a token via the Tecknoledgy Committy, and paste it here:\n" >&2 + printf "> " >&2 + eval "read -r token <$devtty" # have to eval for &0 to work + if [ -z "$token" ]; then + printf "No token provided, exiting\n" >&2; + exit 1; + fi + mkdir -p "$tokendir" + printf '%s\n' "$token" > "$tokenfile" + printf 'Note: saved token to %s - please DO NOT share this!\n' "$tokenfile" >&2 +} + +# vi: sw=4 ts=4 noet tw=80 cc=80 diff --git a/tools/patchbot/setup-path.bat b/tools/patchbot/setup-path.bat new file mode 100644 index 0000000..b57f351 --- /dev/null +++ b/tools/patchbot/setup-path.bat @@ -0,0 +1,2 @@ +:: This file is dedicated to the public domain.
+@set Path=%~dp0bin;%Path%
diff --git a/tools/patchbot/setup-path.sh b/tools/patchbot/setup-path.sh new file mode 100644 index 0000000..caaad79 --- /dev/null +++ b/tools/patchbot/setup-path.sh @@ -0,0 +1,3 @@ +# This file is dedicated to the public domain. +PATH="`realpath "$(dirname "$0")"`/bin:$PATH" +export PATH |
