Merge git://git.kernel.org/pub/scm/gitk/gitk
[gitweb.git] / git-clone.sh
index 9db678beef97db1027389badf29a3ecf60659187..823c74b9139d4a77eb5430674bf0237fb573c14c 100755 (executable)
@@ -9,7 +9,7 @@
 unset CDPATH
 
 usage() {
-       echo >&2 "Usage: $0 [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]"
+       echo >&2 "Usage: $0 [--use-separate-remote] [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [--origin <name>] [-n] <repo> [<dir>]"
        exit 1
 }
 
@@ -45,7 +45,7 @@ Perhaps git-update-server-info needs to be run there?"
                if test -n "$use_separate_remote" &&
                   branch_name=`expr "$name" : 'heads/\(.*\)'`
                then
-                       tname="remotes/$branch_name"
+                       tname="remotes/$origin/$branch_name"
                else
                        tname=$name
                fi
@@ -61,8 +61,9 @@ use File::Path qw(mkpath);
 use File::Basename qw(dirname);
 my $git_dir = $ARGV[0];
 my $use_separate_remote = $ARGV[1];
+my $origin = $ARGV[2];
 
-my $branch_top = ($use_separate_remote ? "remotes" : "heads");
+my $branch_top = ($use_separate_remote ? "remotes/$origin" : "heads");
 my $tag_top = "tags";
 
 sub store {
@@ -97,6 +98,7 @@ close FH;
 '
 
 quiet=
+local=no
 use_local=no
 local_shared=no
 no_checkout=
@@ -120,19 +122,25 @@ while
        *,-q|*,--quiet) quiet=-q ;;
        *,--use-separate-remote)
                use_separate_remote=t ;;
-       1,-o) usage;;
        1,--reference) usage ;;
        *,--reference)
                shift; reference="$1" ;;
        *,--reference=*)
                reference=`expr "$1" : '--reference=\(.*\)'` ;;
-       *,-o)
-               git-check-ref-format "$2" || {
+       *,-o|*,--or|*,--ori|*,--orig|*,--origi|*,--origin)
+               case "$2" in
+               '')
+                   usage ;;
+               */*)
+                   echo >&2 "'$2' is not suitable for an origin name"
+                   exit 1
+               esac
+               git-check-ref-format "heads/$2" || {
                    echo >&2 "'$2' is not suitable for a branch name"
                    exit 1
                }
                test -z "$origin_override" || {
-                   echo >&2 "Do not give more than one -o options."
+                   echo >&2 "Do not give more than one --origin options."
                    exit 1
                }
                origin_override=yes
@@ -149,12 +157,19 @@ do
        shift
 done
 
+repo="$1"
+if test -z "$repo"
+then
+    echo >&2 'you must specify a repository to clone.'
+    exit 1
+fi
+
 # --bare implies --no-checkout
 if test yes = "$bare"
 then
        if test yes = "$origin_override"
        then
-               echo >&2 '--bare and -o $origin options are incompatible.'
+               echo >&2 '--bare and --origin $origin options are incompatible.'
                exit 1
        fi
        if test t = "$use_separate_remote"
@@ -165,20 +180,13 @@ then
        no_checkout=yes
 fi
 
-if test -z "$origin_override$origin"
+if test -z "$origin"
 then
-       if test -n "$use_separate_remote"
-       then
-               origin=remotes/master
-       else
-               origin=heads/origin
-       fi
+       origin=origin
 fi
 
 # 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
@@ -317,7 +325,7 @@ test -d "$GIT_DIR/refs/reference-tmp" && rm -fr "$GIT_DIR/refs/reference-tmp"
 if test -f "$GIT_DIR/CLONE_HEAD"
 then
        # Figure out where the remote HEAD points at.
-       perl -e "$copy_refs" "$GIT_DIR" "$use_separate_remote"
+       perl -e "$copy_refs" "$GIT_DIR" "$use_separate_remote" "$origin"
 fi
 
 cd "$D" || exit
@@ -328,8 +336,18 @@ then
        # Figure out which remote branch HEAD points at.
        case "$use_separate_remote" in
        '')     remote_top=refs/heads ;;
-       *)      remote_top=refs/remotes ;;
+       *)      remote_top="refs/remotes/$origin" ;;
        esac
+
+       # What to use to track the remote primary branch
+       if test -n "$use_separate_remote"
+       then
+               origin_tracking="remotes/$origin/master"
+       else
+               origin_tracking="heads/$origin"
+       fi
+
+       # The name under $remote_top the remote HEAD seems to point at
        head_points_at=$(
                (
                        echo "master"
@@ -349,25 +367,32 @@ then
                done
                )
        )
+
+       # Write out remotes/$origin file.
        case "$head_points_at" in
        ?*)
                mkdir -p "$GIT_DIR/remotes" &&
-               echo >"$GIT_DIR/remotes/origin" \
+               echo >"$GIT_DIR/remotes/$origin" \
                "URL: $repo
-Pull: refs/heads/$head_points_at:refs/$origin" &&
+Pull: refs/heads/$head_points_at:refs/$origin_tracking" &&
                case "$use_separate_remote" in
                t) git-update-ref HEAD "$head_sha1" ;;
-               *) git-update-ref "refs/$origin" $(git-rev-parse HEAD)
+               *) git-update-ref "refs/heads/$origin" $(git-rev-parse HEAD) ;;
                esac &&
-               (cd "$GIT_DIR" && find "$remote_top" -type f -print) |
-               while read ref
+               (cd "$GIT_DIR/$remote_top" && find . -type f -print) |
+               while read dotslref
                do
-                       head=`expr "$ref" : 'refs/\(.*\)'` &&
-                       name=`expr "$ref" : 'refs/[^\/]*/\(.*\)'` &&
+                       name=`expr "$dotslref" : './\(.*\)'` &&
                        test "$head_points_at" = "$name" ||
-                       test "$origin" = "$head" ||
+                       test "$origin" = "$name" ||
                        echo "Pull: refs/heads/${name}:$remote_top/${name}"
-               done >>"$GIT_DIR/remotes/origin"
+               done >>"$GIT_DIR/remotes/$origin" &&
+               case "$use_separate_remote" in
+               t)
+                       rm -f "refs/remotes/$origin/HEAD"
+                       git-symbolic-ref "refs/remotes/$origin/HEAD" \
+                               "refs/remotes/$origin/$head_points_at"
+               esac
        esac
 
        case "$no_checkout" in