diff options
Diffstat (limited to 'git-clone-dumb-http')
-rwxr-xr-x | git-clone-dumb-http | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/git-clone-dumb-http b/git-clone-dumb-http new file mode 100755 index 0000000000..8203c67626 --- /dev/null +++ b/git-clone-dumb-http @@ -0,0 +1,51 @@ +#!/bin/sh +# +# Copyright (c) 2005, Junio C Hamano +# +# Called by git-clone-script +# Exits 2 when the remote site does not support dumb server protocol. + +# Usage: git-clone-dumb-http <remote-repo> <local-dir> + +R=${1?"remote repository"} D=${2?"local directory"} + +if [ -n "$GIT_SSL_NO_VERIFY" ]; then + curl_extra_args="-k" +fi +http_fetch () { + # $1 = Remote, $2 = Local + curl -ns $curl_extra_args "$1" >"$2" +} + +cd "$D" && +clone_tmp=".git/clone-tmp" && +mkdir -p "$clone_tmp" || exit 1 +trap "rm -rf .git/clone-tmp" 0 1 2 3 15 + +http_fetch "$R/info/refs" "$clone_tmp/refs" && +http_fetch "$R/objects/info/packs" "$clone_tmp/packs" || exit 2 + +# We do not have to worry about rev-cache when cloning. +# http_fetch "$R/info/rev-cache" "$clone_tmp/rev-cache" + +# Clone packs +while read type name +do + case "$type" in + P) ;; + *) continue ;; + esac && + + idx=`expr "$name" : '\(.*\)\.pack'`.idx + http_fetch "$R/objects/pack/$name" ".git/objects/pack/$name" && + http_fetch "$R/objects/pack/$idx" ".git/objects/pack/$idx" && + git-verify-pack ".git/objects/pack/$idx" || exit 1 + +done <"$clone_tmp/packs" + +# Then clone refs. +while read sha1 refname +do + name=`expr "$refname" : 'refs/\(.*\)'` && + git-http-pull -v -a -w "$name" "$name" "$R/" || exit 1 +done <"$clone_tmp/refs" |