Git: git9

git9 @ 7c5c8a7e0a33a2c83860dc9dcb2dcf3d6c23b2e4

#!/bin/rc

rfork e

opts=()
args=()

fn cmd_init{
	while(~ $#* 0){
		switch($1){
		case --bare
			opts=(-b)
		case -- 
			# go likes to use these
		case -*
			die unknown command init $*
		case *
			args=($args $1)
		}
		shift
	}
	ls >[1=2]
	git/init $opts $args
}

fn cmd_clone{
	branch=()
	while( ! ~ $#* 0){
		switch($1){
		case -b
			branch=$2
			shift
		case --
			# go likes to use these
		case -*
			die unknown command clone $*
		case *
			args=($args $1)
		}
		shift
	}
	git/clone $opts $args
	if(~ $#branch 1)
		git/branch -n -b $1 origin/$1
}

fn cmd_pull{
	if(~ $1 -*)
		die unknown options for pull $*
	git/pull
}

fn cmd_fetch{
	while(~ $#* 0){
		switch($1){
		case --all
			opts=($opts -a)
		case -f
			opts=($opts -u $2)
			shift
		case --
 			# go likes to use these
		case -*
			die unknown command clone $*
		case *
			args=($args $1)
		}
		shift
	}	
	git/pull -f $opts
}


fn cmd_checkout{
	if(~ $1 -*)
		die unknown command pull $*
	if(~ $#* 0)
		die git checkout branch
	git/branch $b
}

fn cmd_submodule {
	if(test -f .gitmodules)
		die 'submodules unsupported'
}

fn cmd_rev-parse{
	while(~ $1 -*){
		switch($1){
		case --git-dir
			echo $gitroot/.git
			shift
		case --abbrev-ref
			echo `{dcmd git9/branch | sed s@^heads/@@g}
			shift
		case *
			dprint option $opt
		}
		shift
	}
}

fn cmd_show-ref{
	if(~ $1 -*)
		die unknown command pull $*
	filter=cat
	if(~ $#* 0)
		filter=cat
	if not
		filter='-e(^|/)'^$*^'$'
	for(b in `$nl{cd $gitroot/.git/refs/ && walk -f})
		echo `{cat $gitroot/.git/refs/$b} refs/$b 
}

fn cmd_remote{
	if({! ~ $#* 3 && ! ~ $#* 4} || ! ~ $1 add)
		die unimplemented remote cmd $*
	name=$2
	url=$3
	if(~ $3 '--')
		url=$4
	>>$gitroot/.git/config{
		echo '[remote "'$name'"]'
		echo '	url='$url
	}
}

fn cmd_ls-remote{
	if(~ $1 -q)
		shift
	remote=`$nl{git/conf 'remote "'$1'".url'}
	if(~ $#remote 0)
		remote=$1
	git/get -l $remote | awk '/^remote/{print $3"\t"$2}'
}

fn cmd_version{
	echo git version 2.2.0
}


fn usage{
	echo 'git <command> <args>' >[1=2]
	exit usage
}

fn die {
	>[1=2] echo git $_cmdname: $*
	exit $_cmdname: $*
}

_cmdname=$1
if(~ $0 *compat){
	ramfs -m /n/gitcompat
	touch /n/gitcompat/git
	bind $0 /n/gitcompat/git
	path=( /n/gitcompat $path )
	exec rc
}

if(! test -f '/env/fn#cmd_'$1)
	die git $1: commmand not implemented
if(! ~ $1 init && ! ~ $1 clone)
	gitroot=`{git/conf -r} || die repo

echo $* >/tmp/gitlog
cmd_$1 $*(2-)
exit ''