#!/bin/sh #GERRITHOST=gerrit.libreoffice.org GERRITHOST=logerrit GERRITURL=ssh://$GERRITHOST/core get_SHA_for_change() { SHA=`ssh ${GERRITHOST?} gerrit query --all-approvals change:$1|grep ref|tail -1|cut -d: -f2` } get_REVISION_for_change() { REVISION=`ssh ${GERRITHOST?} gerrit query --all-approvals change:$1|grep revision|tail -1|cut -d: -f2` } ask_tristate() { case $1 in [yY] | [yY][Ee][Ss] | [+] ) ANSWER=y ;; [nN] | [n|N][O|o] | [-] ) ANSWER=n ;; [] ) ANSWER= ;; * ) echo "Please answer with either +,-,y,n,yes,no or the empty string." exit 1 ;; esac } submit() { BRANCH=$1 if test -z "$BRANCH" then BRANCH=`git symbolic-ref HEAD 2> /dev/null` BRANCH="${BRANCH##refs/heads/}" if test -z "$BRANCH" then echo "no branch specified, and could not guess the current branch" exit 1 fi echo "no branch specified, guessing current branch $BRANCH" fi git push $GERRITURL HEAD:refs/for/$BRANCH } case "$1" in help|--help) echo "Usage: ./logerrit subcommand [options]" echo "simple and basic tool to interact with LibreOffice gerrit" echo "subcommands:" echo " test test your gerrit setup" echo " --- for submitters:" echo " submit [BRANCH] submit your change for review" echo " resubmit [BRANCH] create a new Change-Id and submit your change for review" echo " (yes, this modifies your last commit)" echo " nextchange [BRANCH] reset branch to the remote to start with the next change" echo " --- for reviewers:" echo " checkout CHANGEID checkout the changes for review" echo " pull CHANGEID pull (and merge) the changes on current branch" echo " cherry-pick CHANGEID cherry-pick the change on current branch" echo " patch CHANGEID show the change as a patch" echo " review [CHANGEID] interactively review a change (current one if no changeid given)" echo " query .... query for changes for review on project core" echo " " echo "advanced users should consider using git review instead:" echo "http://wiki.documentfoundation.org/Development/GitReview" exit ;; test) if test -n "`ssh $GERRITHOST 2>&1|grep \"Welcome to Gerrit Code Review\"`" then echo "Your gerrit setup was successful!" else echo "There seems to be trouble." echo "please have the output of: ssh -vvvv logerrit" echo "at hand when looking for help." fi ;; submit) submit $2 ;; resubmit) git log -1 --pretty=%B | grep -v ^Change-Id: | git commit --amend -F - submit $2 ;; nextchange) if test -n "`git status -s -uno`" then echo "You have uncommitted changes. Please commit or stash these:" git status exit 1 fi CHANGEID=`git log --format=format:%b -1 HEAD|grep Change-Id|cut -d: -f2|tr -d \ ` if test -z "$CHANGEID" then CHANGEID="NOCHANGEID" fi BACKUPBRANCH=backup/$CHANGEID-`date +%F-%H%M%S` git branch $BACKUPBRANCH echo "current state backed up as $BACKUPBRANCH" BRANCH=$2 if test -z "$BRANCH" then BRANCH=`git symbolic-ref HEAD 2> /dev/null` BRANCH="${BRANCH##refs/heads/}" if test -z "$BRANCH" then echo "no branch specified, and could not guess the current branch" exit 1 fi echo "no branch specified, guessing current branch $BRANCH" fi git reset --hard remotes/origin/$BRANCH ;; review) CHANGEID=$2 if test -z "$CHANGEID" then CHANGEID=`git log --format=format:%b -1 HEAD|grep Change-Id|cut -d: -f2` if test -z "$CHANGEID" then echo "could not find a Change-Id in your last commit, sorry" exit 1 fi echo "no Change-Id given on the command line, reviewing change$CHANGEID" fi MESSAGEREQ="" read -p 'was the change verified to build successfully (+) or found not to build (-) or none of that ()? ' VERIFIED ask_tristate $VERIFIED case "$ANSWER" in "y") VERIFIEDFLAG=--verified=+1 ;; "n") VERIFIEDFLAG="--verified=-1" MESSAGEREQ="$MESSAGEREQ and explain why you could not verify this" ;; *) VERIFIEDFLAG="--verified=0" ;; esac read -p 'is the code looking good (+), bad (-) or none of that ()? ' CODEREVIEW ask_tristate $CODEREVIEW SUBMITFLAG="" case "$ANSWER" in "y") read -p 'do you approve the change (+) too, or prefer someone else to do that ()? ' CODEREVIEW ask_tristate $CODEREVIEW case "$ANSWER" in "y") CODEREVIEWFLAG="--code-review=2" SUBMITFLAG="--submit" ;; "n") CODEREVIEWFLAG="--code-review=1" ;; *) CODEREVIEWFLAG="--code-review=1" ;; esac ;; "n") read -p 'do you still allow the change to go in () or not (-)? ' CODEREVIEW ask_tristate $CODEREVIEW case "$ANSWER" in "y") CODEREVIEWFLAG="--code-review=-1" MESSAGEREQ="$MESSAGEREQ and explain why you have reservations about the code" ;; "n") CODEREVIEWFLAG="--code-review=-2" MESSAGEREQ="$MESSAGEREQ and explain why you want to block this" ;; *) CODEREVIEWFLAG="--code-review=-1" MESSAGEREQ="$MESSAGEREQ and explain why you have reservations about the code" ;; esac ;; *) ;; esac read -p "please type a friendly comment$MESSAGEREQ: " MESSAGE get_REVISION_for_change $CHANGEID ssh ${GERRITHOST?} gerrit review -m \"$MESSAGE\" $VERIFIEDFLAG $CODEREVIEWFLAG $SUBMITFLAG $REVISION ;; checkout) get_SHA_for_change $2 git fetch $GERRITURL $SHA && git checkout FETCH_HEAD ;; pull) get_SHA_for_change $2 git pull $GERRITURL $SHA ;; cherry-pick) get_SHA_for_change $2 git fetch $GERRITURL $SHA && git cherry-pick FETCH_HEAD ;; patch) get_SHA_for_change $2 git fetch $GERRITURL $SHA && git format-patch -1 --stdout FETCH_HEAD ;; query) shift ssh ${GERRITHOST?} gerrit query project:core $@ ;; *) ssh ${GERRITHOST?} gerrit $@ ;; esac