diff options
Diffstat (limited to 'git-clone-script')
-rwxr-xr-x | git-clone-script | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/git-clone-script b/git-clone-script index f988b8c9c7..0848a5d7a7 100755 --- a/git-clone-script +++ b/git-clone-script @@ -14,6 +14,47 @@ get_repo_base() { (cd "$1" && (cd .git ; pwd)) 2> /dev/null } +if [ -n "$GIT_SSL_NO_VERIFY" ]; then + curl_extra_args="-k" +fi + +http_fetch () { + # $1 = Remote, $2 = Local + curl -nsf $curl_extra_args "$1" >"$2" +} + +clone_dumb_http () { + # $1 - remote, $2 - local + cd "$2" && + clone_tmp='.git/clone-tmp' && + mkdir -p "$clone_tmp" || exit 1 + http_fetch "$1/info/refs" "$clone_tmp/refs" && + http_fetch "$1/objects/info/packs" "$clone_tmp/packs" || { + echo >&2 "Cannot get remote repository information. +Perhaps git-update-server-info needs to be run there?" + exit 1; + } + while read type name + do + case "$type" in + P) ;; + *) continue ;; + esac && + + idx=`expr "$name" : '\(.*\)\.pack'`.idx + http_fetch "$1/objects/pack/$name" ".git/objects/pack/$name" && + http_fetch "$1/objects/pack/$idx" ".git/objects/pack/$idx" && + git-verify-pack ".git/objects/pack/$idx" || exit 1 + done <"$clone_tmp/packs" + + while read sha1 refname + do + name=`expr "$refname" : 'refs/\(.*\)'` && + git-http-pull -v -a -w "$name" "$name" "$1/" || exit 1 + done <"$clone_tmp/refs" + rm -fr "$clone_tmp" +} + quiet= use_local=no local_shared=no @@ -104,17 +145,7 @@ yes,yes) rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" ;; http://*) - git-clone-dumb-http "$repo" "$D" - case "$?" in - 2) - echo "Somebody should define smarter http server protocol" >&2 - exit 1 - ;; - 0) - ;; - *) - exit - esac + clone_dumb_http "$repo" "$D" ;; *) cd "$D" && case "$upload_pack" in |