ref: 99c05d231cb6f47987777d8f6e0b434a0262871d
dir: /branch/
#!/bin/rc -e
rfork en
. /sys/lib/git/common.rc
gitup
flagfmt='a:listall, b:baseref ref, d:delete, n:newbr, s:stay'
args='[branch]'
eval `''{aux/getflags $*} || exec aux/usage
modified=()
deleted=()
if(~ $#* 0){
if(~ $#listall 0)
awk '$1=="branch"{print $2}' < /mnt/git/ctl
if not
cd .git/refs/ && walk -f heads remotes
exit
}
if(! ~ $#* 1)
exec aux/usage
branch=$1
if(~ $branch refs/heads/*)
new=$name
if not if(~ $branch heads/*)
new=refs/$branch
if not
new=refs/heads/$branch
if (~ $#baseref 1)
base=`{git/query $baseref} || exit 'bad base'
if not if(test -e .git/$new)
base=`{git/query $new}
if not
base=`{git/query HEAD}
modified=`$nl{git/query -c HEAD $base | grep '^[^-]' | subst '^..'}
deleted=`$nl{git/query -c HEAD $base | grep '^-' | subst '^..'}
if(! ~ $#modified 0 || ! ~ $#deleted 0){
if(! git/walk -q $modified $deleted){
git/walk -fRMA $modified $deleted
die 'uncommited changes would be clobbered'
}
}
if(~ $delete 1){
rm -f .git/$new
echo 'deleted branch' $new
exit
}
if(~ $#newbr 0){
if(! test -e .git/$new)
die could not find branch $branch
if(! ~ $#baseref 0)
die update would clobber $branch with $baseref
}
commit=`{git/query $base} || die 'branch does not exist:' $base
echo updating $new to $commit
echo $commit > .git/$new
if(! ~ $#stay 0)
exit
if(! ~ $#modified 0){
basedir=`{git/query -p $base}
for(m in $modified){
d=`{basename -d $m}
mkdir -p $d
mkdir -p .git/index9/tracked/$d
# Modifications can turn a file into
# a directory, or vice versa, so we
# need to delete and copy the files
# over. If we're checking out a
a=`{test -f $m && echo file || echo dir}
b=`{test -f $basedir/tree/$m && echo file || echo dir}
if(! ~ $a $b){
rm -rf $m
rm -rf .git/index9/tracked/$m
}
if(test -f $basedir/tree/$m){
cp $basedir/tree/$m $m
walk -eq $m > .git/index9/tracked/$m
}
}
}
if(! ~ $#deleted 0){
rm -f $deleted
rm -f .git/index9/tracked/$deleted
}
echo ref: $new > .git/HEAD
exit ''