| #!/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) |
| 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 " <any other gerrit command>" |
| 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 |