diff options
author | Junio C Hamano <junkio@cox.net> | 2005-07-23 17:55:07 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-23 18:28:19 -0700 |
commit | c0a58fbb511028a3500987417376a5cfb2c141da (patch) | |
tree | 3a8ebcf4924a1cc0e595a15dc59bda158a92ca23 /git-clone-dumb-http | |
parent | 61e3ef3620493834ed5997d56d481c171d8bd5ac (diff) | |
download | git-c0a58fbb511028a3500987417376a5cfb2c141da.tar.gz |
[PATCH] Support cloning packed repo from dumb http servers.
Using the information prepared with update-server-info, a truly
dumb http server can allow cloning with this client side
support.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
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" |