#!/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() { TYPE=$1 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 push $GERRITURL HEAD:refs/$TYPE/$BRANCH } case "$1" in help|--help|"") echo "Usage: ./logerrit subcommand [options]" echo "simple and basic tool to interact with LibreOffice gerrit" echo "subcommands:" echo " setup walking you though your gerrit setup" echo " test test your gerrit setup" echo 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 " submit-draft [BRANCH] submit your change as draft" echo " resubmit-draft [BRANCH] create a new Change-Id and submit your change as draft" echo " (yes, this modifies your last commit)" echo " (yes, this modifies your last commit)" echo " nextchange [BRANCH] reset branch to the remote to start with the next change" echo "Note: drafts are only visibly to yourself and those that you explicitly add as reviewers." echo 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 echo "advanced users should consider using git review instead:" echo "http://wiki.documentfoundation.org/Development/GitReview" exit ;; setup) cd $(dirname $(readlink -f $0)) echo "Please go to https://gerrit.libreoffice.org/ and:" echo "- press the 'register' button in the top right corner" echo "- after login set yourself a username (its recommended to use your IRC-nick)" echo "- upload your public ssh-key." echo echo "Note that you need to register additional email addresses, if you want to" echo "commit from them. Additional emails must be confirmed with repling to the" echo "invitation mail it sends you." echo read -p 'Which user name did you choose? ' GERRITUSER echo echo "Please now add the following to your ~/.ssh/config, creating the file if needed:" echo echo "Host logerrit" echo " IdentityFile ~/.ssh/id_rsa" echo " User $GERRIUSER" echo " Port 29418" echo " HostName gerrit.libreoffice.org" echo "Host gerrit.libreoffice.org" echo " IdentityFile ~/.ssh/id_rsa" echo " User $GERRIUSER" echo " Port 29418" echo " HostName gerrit.libreoffice.org" echo echo "To see if your setup was successful, run './logerrit test' then." # a good place to make sure the hooks are set up ./g -z ;; 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 'for' $2 ;; resubmit) git log -1 --pretty=%B | grep -v ^Change-Id: | git commit --amend -F - submit 'for' $2 ;; submit-draft) submit drafts $2 ;; resubmit-draft) git log -1 --pretty=%B | grep -v ^Change-Id: | git commit --amend -F - submit drafts $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