X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-clone-script;h=88e2c1f70686d35e6f2d9070931e40ff3ae7e1a5;hb=7d80694af1a68ee1915e36bad9b26fa9fe054f06;hp=4f80ade21cdd1ff82ddc2d3b9ba730a45952bc66;hpb=e27a56a676a1524036add6067948c647d3093ce8;p=git.git diff --git a/git-clone-script b/git-clone-script index 4f80ade2..88e2c1f7 100755 --- a/git-clone-script +++ b/git-clone-script @@ -6,15 +6,26 @@ # Clone a repository into a different directory that does not yet exist. usage() { - echo >&2 "* git clone [-l] " + 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 @@ -22,7 +33,15 @@ 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" && D=$( @@ -31,14 +50,11 @@ D=$( test -d "$D" || usage # We do local magic only when the user tells us to. -case "$use_local" in -yes) +case "$local,$use_local" in +yes,yes) ( cd "$repo/objects" ) || { - repo="$repo/.git" - ( cd "$repo/objects" ) || { - echo >&2 "-l flag seen but $repo is not local." - exit 1 - } + echo >&2 "-l flag seen but $repo is not local." + exit 1 } # See if we can hardlink and drop "l" if not. @@ -54,7 +70,9 @@ yes) l=l fi && rm -f "$D/.git/objects/sample" && - cp -r$l "$repo/objects" "$D/.git/" || exit 1 + cd "$repo" && + find objects -type f -print | + cpio -puamd$l "$D/.git/" || exit 1 # Make a duplicate of refs and HEAD pointer HEAD= @@ -67,4 +85,19 @@ yes) ;; esac -cd "$D" && git clone-pack "$repo" +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