ref: f4da816bf3faa3aca914af1a48c93b3c5b7f8892
dir: /commit/
#!/bin/rc -e
rfork ne
. /sys/lib/git/common.rc
usage='
git/commit files...
'
fn whoami{
name=`{git/conf user.name}
email=`{git/conf user.email}
if(test -f /adm/keys.who){
if(~ $name '')
name=`{awk -F'|' '$1=="'$user'" {x=$3} END{print x}' </adm/keys.who}
if(~ $email '')
email=`{awk -F'|' '$1=="'$user'" {x=$5} END{print x}' </adm/keys.who}
}
if(~ $name '')
name=glenda
if(~ $email '')
email=glenda@9front.local
}
fn findbranch{
branch=`{awk '$1=="branch"{print $2}' < /mnt/git/ctl}
if(test -e /mnt/git/branch/$branch/tree){
refpath=.git/refs/$branch
initial=false
}
if not if(test -e /mnt/git/object/$branch/tree){
refpath=.git/HEAD
initial=false
}
if not if(! test -e /mnt/git/HEAD/tree){
refpath=.git/refs/$branch
initial=true
}
if not
die 'invalid branch:' $branch
}
fn editmsg{
>$msgfile.tmp {
echo '# Author:' $name '<'$email'>'
echo '#'
for(p in $parents)
echo '# parent:' $p
git/walk -fAMR $files | sed 's/^/# /g'
echo '#'
echo '# Commit message:'
}
giteditor=`{git/conf core.editor}
if(~ $#editor 0)
editor=$giteditor
if(~ $#editor 0)
editor=hold
$editor $msgfile.tmp
if(~ `{grep -v '^[ ]*($|#.*$)' $msgfile.tmp | wc -l} 0)
die 'empty commit message'
grep -v '^[ ]*#' < $msgfile.tmp > $msgfile
}
fn parents{
if(test -f .git/index9/merge-parents)
parents=`{cat .git/index9/merge-parents}
if not if(~ $initial true)
parents=()
if not
parents=`{git/query $branch}
}
fn commit{
msg=`"{cat $msgfile}
if(! ~ $#parents 0)
pflags='-p'^$parents
hash=`{git/save -n $"name -e $"email -m $"msg $pflags $files || die $status}
}
fn update{
mkdir -p `{basename -d $refpath}
# Paranoia: let's not mangle the repo.
if(~ $#hash 0)
die 'botched commit'
echo $branch: $hash
echo $hash > $refpath
for(f in $files){
if(test -e .git/index9/removed/$f || ! test -e $f){
rm -f .git/index9/removed/$f
rm -f .git/index9/tracked/$f
}
if not{
mkdir -p `{basename -d $f}
walk -eq $f > .git/index9/tracked/$f
}
}
}
fn sigexit{
rm -f $msgfile $msgfile.tmp
rm -f .git/index9/merge-parents
}
gitup
msgfile=/tmp/git-msg.$pid
mkdir -p .git/refs
if(~ $#* 0)
usage
files=`{git/walk -c `{cleanname $gitrel/$*}}
if(~ $status '' || ~ $#files 0)
die 'nothing to commit' $status
@{
flag e +
whoami
findbranch
parents
editmsg
commit
update
} || die 'could not commit:' $status