Documentation: --cherry-pick
[gitweb.git] / git-clone.sh
index 171099674d1d89f5017dc77787c1fbff96154743..513b574d13858f1a81e6f66251890d81bf0e55ce 100755 (executable)
@@ -42,6 +42,7 @@ clone_dumb_http () {
        http_fetch "$1/info/refs" "$clone_tmp/refs" ||
                die "Cannot get remote repository information.
 Perhaps git-update-server-info needs to be run there?"
+       test "z$quiet" = z && v=-v || v=
        while read sha1 refname
        do
                name=`expr "z$refname" : 'zrefs/\(.*\)'` &&
@@ -59,7 +60,7 @@ Perhaps git-update-server-info needs to be run there?"
                else
                        tname=$name
                fi
-               git-http-fetch -v -a -w "$tname" "$name" "$1/" || exit 1
+               git-http-fetch $v -a -w "$tname" "$name" "$1" || exit 1
        done <"$clone_tmp/refs"
        rm -fr "$clone_tmp"
        http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" ||
@@ -79,6 +80,8 @@ origin=
 origin_override=
 use_separate_remote=t
 depth=
+no_progress=
+test -t 1 || no_progress=--no-progress
 while
        case "$#,$1" in
        0,*) break ;;
@@ -178,46 +181,32 @@ esac && export GIT_DIR && git-init ${template+"$template"} || usage
 
 if test -n "$reference"
 then
+       ref_git=
        if test -d "$reference"
        then
                if test -d "$reference/.git/objects"
                then
-                       reference="$reference/.git"
+                       ref_git="$reference/.git"
+               elif test -d "$reference/objects"
+               then
+                       ref_git="$reference"
                fi
-               reference=$(cd "$reference" && pwd)
-               echo "$reference/objects" >"$GIT_DIR/objects/info/alternates"
-               (cd "$reference" && tar cf - refs) |
-               (cd "$GIT_DIR/refs" &&
-                mkdir reference-tmp &&
-                cd reference-tmp &&
-                tar xf - &&
-                find refs ! -type d -print |
-                while read ref
-                do
-                       if test -h "$ref"
-                       then
-                               # Old-style symbolic link ref.  Not likely
-                               # to appear under refs/ but we might as well
-                               # deal with them.
-                               :
-                       elif test -f "$ref"
-                       then
-                               point=$(cat "$ref") &&
-                                       case "$point" in
-                                       'ref: '*) ;;
-                                       *) continue ;;
-                                       esac
-                       fi
-                       # The above makes true ref to 'continue' and
-                       # we will come here when we are looking at
-                       # symbolic link ref or a textual symref (or
-                       # garbage, like fifo).
-                       # The true ref pointed at by it is enough to
-                       # ensure that we do not fetch objects reachable
-                       # from it.
-                       rm -f "$ref"
-                done
-               )
+       fi
+       if test -n "$ref_git"
+       then
+               ref_git=$(cd "$ref_git" && pwd)
+               echo "$ref_git/objects" >"$GIT_DIR/objects/info/alternates"
+               (
+                       GIT_DIR="$ref_git" git for-each-ref \
+                               --format='%(objectname) %(*objectname)'
+               ) |
+               while read a b
+               do
+                       test -z "$a" ||
+                       git update-ref "refs/reference-tmp/$a" "$a"
+                       test -z "$b" ||
+                       git update-ref "refs/reference-tmp/$b" "$b"
+               done
        else
                die "reference repository '$reference' is not a local directory."
        fi
@@ -304,8 +293,8 @@ yes,yes)
                ;;
        *)
                case "$upload_pack" in
-               '') git-fetch-pack --all -k $quiet $depth "$repo" ;;
-               *) git-fetch-pack --all -k $quiet "$upload_pack" $depth "$repo" ;;
+               '') git-fetch-pack --all -k $quiet $depth $no_progress "$repo";;
+               *) git-fetch-pack --all -k $quiet "$upload_pack" $depth $no_progress "$repo" ;;
                esac >"$GIT_DIR/CLONE_HEAD" ||
                        die "fetch-pack from '$repo' failed."
                ;;
@@ -407,7 +396,7 @@ then
 
        case "$no_checkout" in
        '')
-               test "z$quiet" = z && v=-v || v=
+               test "z$quiet" = z -a "z$no_progress" = z && v=-v || v=
                git-read-tree -m -u $v HEAD HEAD
        esac
 fi