ref: d5e2a8d00b4f769d56e567905c4c6689e803a49e
dir: /pull/
#!/bin/rc -e
rfork en
. /bin/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
fetch=`"{git/fetch -b $branch -u $upstream $url |[2] tr '\x0d' '\x0a'}
st=$status
if(! ~ $st ''){
echo fetch failed: $st
exit $st
}
echo $"fetch | 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);
}
'
}
gitup
branch=refs/`{git/branch}
remote=()
incoming=()
checkout='true'
upstream=origin
while(~ $1 -*){
switch($1){
case -u
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){
echo 'no idea from where to pull'
exit upstream
}
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}){
echo git/merge $remote '# diverged' >[1=2]
exit merge
}
# The remote is directly ahead of the local, and we have
# no local commits that need merging.
echo $local':' `{git/query $local} '=>' `{git/query $remote} >[1=2]
if(! ~ $#incoming 0)
git/log -q $local'..'$remote
git/branch -u -b $remote $local