From: Junio C Hamano Date: Sun, 24 Jul 2005 00:55:07 +0000 (-0700) Subject: [PATCH] Support cloning packed repo from dumb http servers. X-Git-Tag: v0.99.2~12 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=c0a58fbb511028a3500987417376a5cfb2c141da;p=git.git [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 Signed-off-by: Linus Torvalds --- diff --git a/Makefile b/Makefile index 6933ae35e..f87225d59 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ SCRIPTS=git git-apply-patch-script git-merge-one-file-script git-prune-script \ gitk git-cherry git-rebase-script git-relink-script git-repack-script \ git-format-patch-script git-sh-setup-script git-push-script \ git-branch-script git-parse-remote git-verify-tag-script \ - git-ls-remote-script + git-ls-remote-script git-clone-dumb-http PROG= git-update-cache git-diff-files git-init-db git-write-tree \ git-read-tree git-commit-tree git-cat-file git-fsck-cache \ diff --git a/git-clone-dumb-http b/git-clone-dumb-http new file mode 100755 index 000000000..8203c6762 --- /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 + +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" diff --git a/git-clone-script b/git-clone-script index a808c02f1..60dc2a9d8 100755 --- a/git-clone-script +++ b/git-clone-script @@ -89,8 +89,17 @@ yes,yes) rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" ;; http://*) - echo "Somebody should add http fetch" >&2 - exit 1 + git-clone-dumb-http "$repo" "$D" + case "$?" in + 2) + echo "Somebody should define smarter http server protocol" >&2 + exit 1 + ;; + 0) + ;; + *) + exit + esac ;; *) cd "$D" && case "$upload_pack" in