ref: 22383ae54cfeb178b150dc9417b0d773cc72c434
dir: /pull/
#!/bin/rc -e
rfork en
. /sys/lib/git/common.rc
usage='
git/pull [-u upstream] [-b branch]
-b work with branch "branch"
-f fetch updates without checking out
-i display incoming commits
-u pull from "upstream" (default "origin")
'
fn update{
branch=$1
upstream=$2
url=$3
dir=$4
{git/fetch -b $branch -u $upstream $url >[2=3] || die $status} | awk '
/^remote/{
if($2=="HEAD")
next
ref=$2
hash=$3
gsub("^refs/heads", "refs/remotes/'$upstream'", ref)
outfile = ".git/"ref
system("mkdir -p `{basename -d "outfile"}");
print hash > outfile;
close(outfile);
}
' |[3] tr '\x0d' '\x0a'
}
gitup
branch=refs/`{git/branch}
remote=()
incoming=()
checkout='true'
upstream=origin
while(~ $1 -*){
switch($1){
case -u
upstream=$2
remote=`{git/conf 'remote "'upstream'".url'}
if(~ $#remote 0){
upstream=SOMEONE
remote=$2
}
shift
case -b
branch=$2
shift
case -f
checkout=()
case -i
incoming=true
case *
usage
}
shift
}
if(! ~ $#* 0)
usage
if(~ $#remote 0)
remote=`{git/conf 'remote "'$upstream'".url'}
if(~ $#remote 0)
die 'no remote to pull from'
update $branch $upstream $remote
if (~ $#checkout 0)
exit
local=`{git/branch}
remote=`{git/branch | sed 's@^(refs/)?heads@remotes/'$upstream'@'}
# we have local commits, but the remote hasn't changed.
# in this case, we want to keep the local commits untouched.
if(~ `{git/query HEAD $remote @} `{git/query $remote}){
echo 'up to date' >[1=2]
exit
}
# The remote repository and our HEAD have diverged: we
# need to merge.
if(! ~ `{git/query HEAD $remote @} `{git/query HEAD})
die 'remote diverged:' $remote
# The remote is directly ahead of the local, and we have
# no local commits that need merging.
echo $remote':' `{git/query $local} '=>' `{git/query $remote} >[1=2]
if(! ~ $#incoming 0)
git/log -q $local'..'$remote
git/branch -c -b $remote $local