ref: e90fb0398fb401f1bd93d49d4986b27cb9deb87e
dir: /clone/
#!/bin/rc
rfork en
nl='
'
if(~ $#* 1){
remote=$1
local=`{basename $1 .git}
}
if not if(~ $#* 2){
remote=$1
local=$2
}
if not{
echo usage: git/clone remote [local] >[1=2]
exit usage
}
if(test -e $local){
echo $local already exists
exit exists
}
fn clone{
mkdir -p $local/.git
mkdir -p $local/.git/objects/pack/
mkdir -p $local/.git/refs/heads/
cd $local
dircp /sys/lib/git/template .git
echo '[remote "origin"]' >> .git/config
echo ' url='$remote >> .git/config
echo ' fetch=+refs/heads/*:refs/remotes/origin/*' >> .git/config
{git/fetch $remote >[2=3] | awk '
/^remote/{
if($2=="HEAD"){
headhash=$3
headref=""
}else{
gsub("^refs/heads", "refs/remotes/origin", $2)
if($2 == "refs/remotes/origin/master" || $3 == headhash)
headref=$2
outfile = ".git/" $2
system("mkdir -p `{basename -d "outfile"}")
print $3 > outfile
close(outfile)
}
}
END{
if(headref != ""){
remote = headref
gsub("^refs/remotes/origin", "refs/heads", headref)
system("mkdir -p `{basename -d .git/" headref"}");
system("cp .git/" remote " .git/" headref)
print "ref: " headref > ".git/HEAD"
}else{
print "warning: detached head "headhash > "/fd/2"
print headhash > ".git/HEAD"
}
}
'} |[3] tr '\x0d' '\x0a'
if(! ~ $status '|')
exit 'clone:' $status
tree=/mnt/git/branch/heads/master/tree
echo checking out repository...
if(test -f .git/refs/remotes/origin/master){
cp .git/refs/remotes/origin/master .git/refs/heads/master
git/fs
@ {builtin cd $tree && tar cif /fd/1 .} | @ {tar xf /fd/0}
if(! ~ $status '')
exit 'checkout:' $status
for(f in `$nl{walk -f $tree | sed 's@^'$tree'/*@@'}){
if(! ~ $#f 0){
idx=.git/index9/tracked/$f
mkdir -p `{basename -d $idx}
walk -eq $f > $idx
}
}
}
if not{
echo no master branch >[1=2]
echo check out your code with git/branch >[1=2]
}
}
@{clone}
st=$status
if(~ $st ''){
echo done.
}
if not{
echo clone failed: $st >[2=1]
echo cleaning up $local >[2=1]
rm -rf $local
}