X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone-script;h=0848a5d7a7d12cb60673a5d1a8e3e328a31dbd35;hb=760b6634461ded0a9f09e86388c0ad7500641f1e;hp=60dc2a9d8854fd08c708d4a75f1c887d1d724b9f;hpb=c0a58fbb511028a3500987417376a5cfb2c141da;p=git.git diff --git a/git-clone-script b/git-clone-script index 60dc2a9d..0848a5d7 100755 --- a/git-clone-script +++ b/git-clone-script @@ -6,7 +6,7 @@ # Clone a repository into a different directory that does not yet exist. usage() { - echo >&2 "* git clone [-l] [-q] [-u ] " + echo >&2 "* git clone [-l [-s]] [-q] [-u ] " exit 1 } @@ -14,13 +14,57 @@ 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 upload_pack= while case "$#,$1" in 0,*) break ;; *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; + *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) + local_shared=yes ;; *,-q|*,--quiet) quiet=-q ;; 1,-u|1,--upload-pack) usage ;; *,-u|*,--upload-pack) @@ -57,22 +101,34 @@ yes,yes) exit 1 } - # See if we can hardlink and drop "l" if not. - sample_file=$(cd "$repo" && \ - find objects -type f -print | sed -e 1q) + case "$local_shared" in + no) + # See if we can hardlink and drop "l" if not. + sample_file=$(cd "$repo" && \ + find objects -type f -print | sed -e 1q) - # objects directory should not be empty since we are cloning! - test -f "$repo/$sample_file" || exit + # objects directory should not be empty since we are cloning! + test -f "$repo/$sample_file" || exit - l= - if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null - then - l=l - fi && - rm -f "$D/.git/objects/sample" && - cd "$repo" && - find objects -type f -print | - cpio -puamd$l "$D/.git/" || exit 1 + l= + if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null + then + l=l + fi && + rm -f "$D/.git/objects/sample" && + cd "$repo" && + find objects -type f -print | + cpio -puamd$l "$D/.git/" || exit 1 + ;; + yes) + mkdir -p "$D/.git/objects/info" + { + test -f "$repo/objects/info/alternates" && + cat "$repo/objects/info/alternates"; + echo "$repo/objects" + } >"$D/.git/objects/info/alternates" + ;; + esac # Make a duplicate of refs and HEAD pointer HEAD= @@ -89,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 @@ -112,6 +158,8 @@ yes,yes) esac # Update origin. -mkdir -p "$D/.git/branches/" && -rm -f "$D/.git/branches/origin" && -echo "$repo" >"$D/.git/branches/origin" +mkdir -p "$D/.git/remotes/" && +rm -f "$D/.git/remotes/origin" && +echo >"$D/.git/remotes/origin" \ +"URL: $repo +Pull: master:origin"