shithub: git9

ref: 45001b2700f817cc4a3609574031437040de393e
dir: /compat/

View raw version
#!/bin/rc

rfork e

opts=()
args=()
nl='
'

fn cmd_init{
	while(! ~ $#* 0){
		switch($1){
		case --bare
			# ignore
		case -- 
			# go likes to use these
		case -*
			die unknown command init $*
		case *
			args=($args $1)
		}
		shift
	}
	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 *
			die unknown 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_rev-parse{
	switch($1){
	case --git-dir
		echo `{git/conf -r}^/.git
	case *
		die 'unknown rev-parse '$*
	}
}

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_log{
	count=()
	format=''
	while(~ $1 -*){
		switch($1){
		case --format
			format=$2
			shift
		case '--format='*
			format=`{echo $1 | sed 's/--format=//g'}
		case -n
			count=-n$2
			shift
		case -n*
			count=$1
		case *
			dprint option $opt
		}
		shift
	}
	@{cd $gitroot && git/fs}
	switch($format){
	case ''
		git/log $count
	case '%H:%ct'
		for(c in `{git/log -s $count| awk '{print $1}'})
			echo $c:`{mtime $gitroot/.git/fs/object/$c/msg}
	case '%h %cd'
		for(c in `{git/log -s $count| awk '{print $1}'})
			echo $c `{date `{mtime $gitroot/.git/fs/object/$c/msg}}
	}

}

fn cmd_show{
	cmd_log -n1 $*
}

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 cmd_status{
	echo
}

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(~ $#gitcompatdebug 1)
	echo running  $* >>/tmp/gitlog

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

if(~ $#gitcompatdebug 1)
	cmd_$1 $*(2-) | tee >>/tmp/gitlog
if not
	cmd_$1 $*(2-)
exit ''