shithub: git9

ref: d5e2a8d00b4f769d56e567905c4c6689e803a49e
dir: /branch/

View raw version
#!/bin/rc -e
rfork en
. /bin/git/common.rc

usage='
	git/branch [-cdsu] [-b base] [new]
		-b base   base new branch on "base" (default: current branch)
		-d        delete a branch
		-s        create a branch but stay on current one
'

gitup

stay=()
create=()
delete=()
base=`{awk '$1=="branch"{print $2}' < /mnt/git/ctl}
while(~ $1 -* && ! ~ $1 --){
	switch($1){
	case -c; create=true
	case -s; stay=true
	case -b; shift; base=$1
	case -d; delete=true
	case -u; update=true
	case *
		usage
	}
	shift
}
if(~ $1 --) shift

if(~ $#* 0){
	echo $base
	exit
}

if(! ~ $#* 1)
	usage
if(~ $1 refs/heads/*)
	new=$1
if not if(~ $1 heads/*)
	new=refs/$1
if not
	new=refs/heads/$1

if(! ~ $#delete 0){
	rm -f .git/$new
	exit
}


modified=`$nl{git/query -c HEAD $base | grep '^[^-]' | sed 's/^..//'}
deleted=`$nl{git/query -c HEAD $base | grep '^-' | sed 's/^..//'}

if(! git/walk -q $modified $deleted){
	echo branch update would clobber changes >[1=2]
	exit dirty
}
if(! ~ $#create 0){
	if(! test -e .git/$new){
		echo branch $new: does not exist >[1=2]
		exit noexist
	}
}
if not{
	commit=`{git/query $base}
	st=$status
	if(! ~ $st ''){
		echo could not find branch $base':' $st >[1=2]
		exit notfound
	}
	echo $commit > .git/$new
}


if(! ~ $#stay 0)
	exit

if(! ~ $#modified 0){
	basedir=`{git/query -p $base}
	# Modifications can turn a file into
	# a directory, so we need to walk to
	# check the blobs out correctly.
	for(m in $modified){
		d=`{basename -d $m}
		mkdir -p $d
		mkdir -p .git/index9/tracked/$d
		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