ref: 4fecf55b94bb8a2c8648784fca2e00c85bfe2526
dir: /commit/
#!/bin/rc -e rfork ne . /sys/lib/git/common.rc fn findbranch{ branch=`{git/branch} if(test -e $gitfs/branch/$branch/tree){ refpath=.git/refs/$branch initial=false } if not if(test -e $gitfs/object/$branch/tree){ refpath=.git/HEAD initial=false } if not if(! test -e $gitfs/HEAD/tree){ refpath=.git/refs/$branch initial=true } if not die 'invalid branch:' $branch } # Remove commentary lines. # Remove leading and trailing empty lines. # Combine consecutive empty lines between paragraphs. # Remove trailing spaces from lines. # Ensure there's trailing newline. fn cleanmsg{ awk ' /^[ ]*#/ {next} /^[ ]*$/ {empty = 1; next} wet && empty {printf "\n"} {wet = 1; empty = 0} {sub(/[ ]+$/, ""); print $0} ' } fn editmsg{ if(! test -s $msgfile.tmp){ >$msgfile.tmp { echo '# Author:' $name '<'$email'>' echo '#' for(p in $parents) echo '# parent:' $p git/walk -fAMR $files | subst '^' '# ' echo '#' echo '# Commit message:' } edit=1 } if(! ~ $#edit 0){ giteditor=`{git/conf core.editor} if(~ $#editor 0) editor=$giteditor if(~ $#editor 0) editor=hold $editor $msgfile.tmp } cleanmsg < $msgfile.tmp > $msgfile if(! test -s $msgfile) die 'empty commit message' } fn parents{ if(! ~ $#revise 0) parents=`{cat $gitfs/HEAD/parent} if not if(test -f .git/merge-parents) parents=`{cat .git/merge-parents | sort | uniq} 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} rm -f .git/merge-parents } 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 $f && ! test -e .git/object/$hash/tree/$f) echo R NOQID 0 $f >> .git/INDEX9 if not echo T NOQID 0 $f >> .git/INDEX9 } } fn sigexit{ if(! ~ $#msgfile 0) rm -f $msgfile $msgfile.tmp } gitup flagfmt='m:msg message, r:revise, e:edit'; args='[file ...]' eval `''{aux/getflags $*} || exec aux/usage msgfile=/tmp/git-msg.$pid if(~ $#msg 1) echo $msg >$msgfile.tmp if not if(~ $#revise 1){ msg=1 echo revising commit `{cat $gitfs/HEAD/hash} cat $gitfs/HEAD/msg >$msgfile.tmp } files=() if(test -f .git/merge-parents) files=`$nl{git/query -c `{cat .git/merge-parents} | sed 's/^..//'} if(! ~ $#* 0) files=($files `$nl{git/walk -c `$nl{cleanname -d $gitrel $*}}) if(~ $status '' || ~ $#files 0 && ! test -f .git/merge-parents && ~ $#revise 0) die 'nothing to commit' @{ flag e + whoami findbranch parents editmsg commit update } || die 'could not commit:' $status exit ''