plan9port/bin/codereview
Russ Cox 01463bacd0 codereview: use 'git branch -v' for pending
Change-Id: Ib80b19cf69a15860315b2d7a38baf3b05d693acc
2014-11-17 20:59:15 -05:00

147 lines
3.6 KiB
Bash
Executable file

#!/usr/local/plan9/bin/rc
git=git
show=false
fn gitshow {
echo '%' git $*
git $*
}
if(! ~ $#* 0 && ~ $1 -v) {
git=gitshow
show=true
shift
}
if(~ $#* 0) {
echo 'usage: codereview <command> <args>' >[1=2]
exit usage
}
if(~ $#PLAN9 0) {
PLAN9=/usr/local/plan9
}
if(! test -d $PLAN9/lib/git) {
echo 'codereview: cannot find $PLAN9/lib/git' >[1=2]
exit git
}
if(! test -e $PLAN9/.git/hooks/commit-msg) {
if($show) {
echo '% ln -s ../../lib/git/commit-msg.hook $PLAN9/.git/hooks/commit-msg'
}
ln -s ../../lib/git/commit-msg.hook $PLAN9/.git/hooks/commit-msg
}
switch($1) {
case help
9 man 1 codereview
case pending
shift
if(! ~ $#* 0) {
echo 'usage: codereview pending' >[1=2]
exit usage
}
$git branch -v
case create
shift
if(~ $#* 0) {
echo 'usage: codereview create branchname' >[1=2]
exit usage
}
branch=$1
shift
if(! git branch -l | 9 grep '\* master$' >/dev/null) {
echo 'codereview: create not on master branch; use codereview commit' >[1=2]
exit master
}
if($show) {
echo '% git branch '$branch' && git commit || git branch -d '$branch >[1=2]
}
git branch $branch && git checkout $branch && git commit -a $* || git branch -d $branch
case commit
shift
if(git branch -l | 9 grep '\* master$' >/dev/null) {
echo 'codereview: commit on master branch; use codereview create <branchname>' >[1=2]
exit master
}
if(~ `{git merge-base HEAD HEAD} `{git merge-base HEAD master}) {
# first commit on branch, somehow.
$git commit $*
exit $status
}
$git commit --amend -a $*
exit $status
case upload
if(git branch -l | 9 grep '\* master$' >/dev/null) {
echo 'codereview: upload on master branch' >[1=2]
exit master
}
if(~ `{git merge-base HEAD HEAD} `{git merge-base HEAD master}) {
# no commit on branch
echo 'codereview: no commits yet on this feature branch' >[1=2]
exit commit
}
if(! 9 grep 'machine plan9port-review.googlesource.com' $HOME/.netrc >/dev/null >[2=1]) {
echo 'codereview: warning: cannot find plan9port-review in netrc' >[1=2]
}
if(! git status | 9 grep 'nothing to commit, working directory clean' >/dev/null) {
echo 'codereview: warning: local changes not yet committed' >[1=2]
git status
}
$git push https://plan9port-review.googlesource.com/plan9 HEAD:refs/for/master >[2=1] | 9 sed 's/.*
//'
case sync
shift
if(! ~ $#* 0) {
echo 'usage: codereview sync' >[1=2]
exit usage
}
$git fetch -q
branch=`{git branch -l | 9 sed -n 's/^\* //p'}
if(~ $branch master) {
$git merge -q --ff-only origin/master
exit $status
}
if(~ `{git merge-base HEAD HEAD} `{git merge-base HEAD master}) {
# no commit on branch
git merge -q --ff-only origin/master
exit $status
}
# Exactly this commit in master. Fast-forward from master and delete this branch.
if(git branch -r --contains HEAD | 9 grep '^ *origin/master$' >/dev/null) {
$git checkout -q master
$git merge -q --ff-only origin/master
$git branch -q -d $branch
exit $status
}
changeid=`{git log -n 1 | 9 sed -n 's/^ Change-Id: //p'}
if(~ $#changeid 0) {
echo 'codereview: cannot find change id'
exit changeid
}
if(git log --grep 'Change-Id: '$changeid origin/master | 9 grep . >/dev/null) {
# Something like this got submitted.
$git checkout -q master
$git merge -q --ff-only origin/master
echo 'Change submitted but perhaps not identical to your copy.' >[1=2]
echo 'To remove old copy:' git branch -d $branch >[1=2]
exit 1
}
if(git branch -r --contains master | 9 grep '^ *origin/master$' >/dev/null)
$git branch -f master origin/master
$git rebase -q origin/master
case *
echo 'codereview: unrecognized command '$1 >[1=2]
exit usage
}