#!/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 *
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 ''
|