GIT 1.0.4
[gitweb.git] / git-clone.sh
index c27a913b1ddf1474df4300dc68bebeeb06f145f1..280cc2e81e98c5fe69e8528ca97069dd0b0e59f5 100755 (executable)
@@ -9,7 +9,7 @@
 unset CDPATH
 
 usage() {
-       echo >&2 "* git clone [-l [-s]] [-q] [-u <upload-pack>] [-n] <repo> <dir>"
+       echo >&2 "Usage: $0 [-l [-s]] [-q] [-u <upload-pack>] [-n] <repo> [<dir>]"
        exit 1
 }
 
@@ -23,7 +23,7 @@ fi
 
 http_fetch () {
        # $1 = Remote, $2 = Local
-       curl -nsf $curl_extra_args "$1" >"$2"
+       curl -nsfL $curl_extra_args "$1" >"$2"
 }
 
 clone_dumb_http () {
@@ -73,7 +73,7 @@ while
        *,-n) no_checkout=yes ;;
        *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;;
         *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) 
-          local_shared=yes ;;
+          local_shared=yes; use_local=yes ;;
        *,-q|*,--quiet) quiet=-q ;;
        1,-u|1,--upload-pack) usage ;;
        *,-u|*,--upload-pack)
@@ -96,7 +96,10 @@ if base=$(get_repo_base "$repo"); then
 fi
 
 dir="$2"
-mkdir "$dir" &&
+# Try using "humanish" part of source repo if user didn't specify one
+[ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g')
+[ -e "$dir" ] && echo "$dir already exists." && usage
+mkdir -p "$dir" &&
 D=$(
        (cd "$dir" && git-init-db && pwd)
 ) &&
@@ -126,8 +129,7 @@ yes,yes)
            fi &&
            rm -f "$D/.git/objects/sample" &&
            cd "$repo" &&
-           find objects -type f -print |
-           cpio -puamd$l "$D/.git/" || exit 1
+           find objects -depth -print | cpio -puamd$l "$D/.git/" || exit 1
            ;;
        yes)
            mkdir -p "$D/.git/objects/info"
@@ -164,7 +166,7 @@ yes,yes)
                        rm -f "$D/.git/TMP_ALT"
                if test -f "$D/.git/TMP_ALT"
                then
-                   ( cd $D &&
+                   ( cd "$D" &&
                      . git-parse-remote &&
                      resolve_alternates "$repo" <"./.git/TMP_ALT" ) |
                    while read alt
@@ -186,13 +188,16 @@ yes,yes)
                cd "$D" && case "$upload_pack" in
                '') git-clone-pack $quiet "$repo" ;;
                *) git-clone-pack $quiet "$upload_pack" "$repo" ;;
-               esac
+               esac || {
+                       echo >&2 "clone-pack from '$repo' failed."
+                       exit 1
+               }
                ;;
        esac
        ;;
 esac
 
-cd $D || exit
+cd "$D" || exit
 
 if test -f ".git/HEAD"
 then
@@ -203,8 +208,16 @@ then
                mkdir -p .git/remotes &&
                echo >.git/remotes/origin \
                "URL: $repo
-Pull: $head_points_at:origin"
-               cp ".git/refs/heads/$head_points_at" .git/refs/heads/origin
+Pull: $head_points_at:origin" &&
+               cp ".git/refs/heads/$head_points_at" .git/refs/heads/origin &&
+               find .git/refs/heads -type f -print |
+               while read ref
+               do
+                       head=`expr "$ref" : '.git/refs/heads/\(.*\)'` &&
+                       test "$head_points_at" = "$head" ||
+                       test "origin" = "$head" ||
+                       echo "Pull: ${head}:${head}"
+               done >>.git/remotes/origin
        esac
 
        case "$no_checkout" in