[PATCH] Update documentation for git-get-tar-commit-id
[git.git] / git-clone-script
index 60dc2a9..0848a5d 100755 (executable)
@@ -6,7 +6,7 @@
 # Clone a repository into a different directory that does not yet exist.
 
 usage() {
-       echo >&2 "* git clone [-l] [-q] [-u <upload-pack>] <repo> <dir>"
+       echo >&2 "* git clone [-l [-s]] [-q] [-u <upload-pack>] <repo> <dir>"
        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"