126cc163e2
go bootstrap uses more of git than we supported, so stub in enough that we can bootstrap go.
228 lines
3.3 KiB
Bash
228 lines
3.3 KiB
Bash
#!/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 ''
|