X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-clone-script;h=f988b8c9c79fbb9ec9c3cad556cb4c9d51984475;hb=7e011c40bc6c7dbd48b033fb16c861b1166f808c;hp=5a241fb25e40759a4db21ac3862a848955bc0847;hpb=167a4a3308f4a1606e268c2204c98d6999046ae0;p=git.git diff --git a/git-clone-script b/git-clone-script index 5a241fb2..f988b8c9 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] " + echo >&2 "* git clone [-l [-s]] [-q] [-u ] " exit 1 } @@ -16,11 +16,19 @@ get_repo_base() { quiet= use_local=no +local_shared=no +upload_pack= while case "$#,$1" in 0,*) break ;; - *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; + *,-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) + shift + upload_pack="--exec=$1" ;; *,-*) usage ;; *) break ;; esac @@ -48,27 +56,38 @@ test -d "$D" || usage 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. - 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" && - cp -r$l "$repo/objects" "$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= @@ -77,20 +96,39 @@ yes,yes) 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" && git-clone-pack $quiet "$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://*) + 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 + '') git-clone-pack $quiet "$repo" ;; + *) git-clone-pack $quiet "$upload_pack" "$repo" ;; + esac + ;; + esac ;; esac + +# Update origin. +mkdir -p "$D/.git/remotes/" && +rm -f "$D/.git/remotes/origin" && +echo >"$D/.git/remotes/origin" \ +"URL: $repo +Pull: master:origin"