X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-clone-script;h=88e2c1f70686d35e6f2d9070931e40ff3ae7e1a5;hb=12dd6e8cb0643231628d0240fdbb4afdef6629ea;hp=28a93212690e9537e113fcad295f2dd451de7a45;hpb=72347a233e6f3c176059a28f0817de6654ef29c7;p=git.git diff --git a/git-clone-script b/git-clone-script index 28a93212..88e2c1f7 100755 --- a/git-clone-script +++ b/git-clone-script @@ -1,4 +1,103 @@ #!/bin/sh +# +# Copyright (c) 2005, Linus Torvalds +# Copyright (c) 2005, Junio C Hamano +# +# Clone a repository into a different directory that does not yet exist. + +usage() { + echo >&2 "* git clone [-l] [-q] [-u ] " + exit 1 +} + +get_repo_base() { + (cd "$1" && (cd .git ; pwd)) 2> /dev/null +} + +quiet= +use_local=no +upload_pack= +while + case "$#,$1" in + 0,*) break ;; + *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; + *,-q|*,--quiet) quiet=-q ;; + 1,-u|*,--upload-pack) usage ;; + *,-u|*,--upload-pack) + shift + upload_pack="--exec=$2" ;; + *,-*) usage ;; + *) break ;; + esac +do + shift +done + +# Turn the source into an absolute path if +# it is local repo="$1" +local=no +if base=$(get_repo_base "$repo"); then + repo="$base" + local=yes +fi + dir="$2" -mkdir "$dir" && cd "$dir" && git-init-db && git-clone-pack "$repo" +mkdir "$dir" && +D=$( + (cd "$dir" && git-init-db && pwd) +) && +test -d "$D" || usage + +# We do local magic only when the user tells us to. +case "$local,$use_local" in +yes,yes) + ( cd "$repo/objects" ) || { + echo >&2 "-l flag seen but $repo is not local." + exit 1 + } + + # 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 + + 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 + + # Make a duplicate of refs and HEAD pointer + HEAD= + if test -f "$repo/HEAD" + then + HEAD=HEAD + fi + tar Ccf "$repo" - refs $HEAD | tar Cxf "$D/.git" - || exit 1 + exit 0 + ;; +esac + +case "$repo" in +rsync://*) + rsync $quiet -avz --ignore-existing "$repo/objects/" "$D/.git/objects/" && + rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" + ;; +http://*) + echo "Somebody should add http fetch" >&2 + exit 1 + ;; +*) + cd "$D" && case "$upload_pack" in + '') git-clone-pack $quiet "$repo" ;; + *) git-clone-pack $quiet "$upload_pack" "$repo" ;; + esac + ;; +esac