Currently when specifying the `--depth` option to the 'submodule add'
command, it can only create a shallow submodule clone of the currently
active branch from the cloned repository. If a branch is specified using
the `--branch` option, and the `--depth` option is also specified, the
'submodule add' command will result in an error as the branch will not
be present in the cloned repository. If a repository is shallowly cloned
as a submodule, there is no way to specify that the shallowly cloned
submodule should setup remote-tracking branches.

Added the ability to shallowly clone any branch as a submodule, not just
the current active branch in the cloned repository.
Added support to the 'submodule add' and 'submodule update' commands to
handle `--no-single-branch` option, which is in turn passed to the clone
command in order to setup remote-tracking branches in the shallowly
cloned submodule.

Signed-off-by: Cole Minnaar <cole.minn...@gmail.com>
---
 Documentation/git-submodule.txt |  8 ++++++--
 git-submodule.sh                | 24 ++++++++++++++++++++----
 t/t7400-submodule-basic.sh      | 33 ++++++++++++++++++++++++++++++++-
 3 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 8e6af65..5b913ab 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -10,13 +10,14 @@ SYNOPSIS
 --------
 [verse]
 'git submodule' [--quiet] add [-b <branch>] [-f|--force] [--name <name>]
-             [--reference <repository>] [--depth <depth>] [--] <repository> 
[<path>]
+             [--reference <repository>] [--depth <depth>] [--no-single-branch]
+             [--] <repository> [<path>]
 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] init [--] [<path>...]
 'git submodule' [--quiet] deinit [-f|--force] [--] <path>...
 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
              [-f|--force] [--rebase|--merge] [--reference <repository>]
-             [--depth <depth>] [--recursive] [--] [<path>...]
+             [--depth <depth>] [--recursive] [--no-single-branch] [--] 
[<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
              [commit] [--] [<path>...]
 'git submodule' [--quiet] foreach [--recursive] <command>
@@ -354,6 +355,9 @@ for linkgit:git-clone[1]'s `--reference` and `--shared` 
options carefully.
        clone with a history truncated to the specified number of revisions.
        See linkgit:git-clone[1]
 
+--no-single-branch::
+       This option is valid for add and update commands. Fetch histories near 
the tips
+       of all branches and create remote-tracking branches in the submodule.
 
 <path>...::
        Paths to submodule(s). When specified this will restrict the command
diff --git a/git-submodule.sh b/git-submodule.sh
index 9245abf..9c0c858 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -5,11 +5,11 @@
 # Copyright (c) 2007 Lars Hjemli
 
 dashless=$(basename "$0" | sed -e 's/-/ /')
-USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference 
<repository>] [--] <repository> [<path>]
+USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference 
<repository>] [--depth <depth>] [--no-single-branch] [--] <repository> [<path>]
    or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] init [--] [<path>...]
    or: $dashless [--quiet] deinit [-f|--force] [--] <path>...
-   or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] 
[-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] 
[--recursive] [--] [<path>...]
+   or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] 
[-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] 
[--recursive] [--depth <depth>] [--no-single-branch] [--] [<path>...]
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] 
[commit] [--] [<path>...]
    or: $dashless [--quiet] foreach [--recursive] <command>
    or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
@@ -259,6 +259,13 @@ module_clone()
        url=$3
        reference="$4"
        depth="$5"
+       clone_branch=
+       if test -n "$6"
+       then
+               clone_branch="--branch=$6"
+       fi
+
+       no_single_branch="$7"
        quiet=
        if test -n "$GIT_QUIET"
        then
@@ -282,6 +289,7 @@ module_clone()
                (
                        clear_local_git_env
                        git clone $quiet ${depth:+"$depth"} -n 
${reference:+"$reference"} \
+                               ${clone_branch:+"$clone_branch"} 
${no_single_branch:+"$no_single_branch"} \
                                --separate-git-dir "$gitdir" "$url" "$sm_path"
                ) ||
                die "$(eval_gettext "Clone of '\$url' into submodule path 
'\$sm_path' failed")"
@@ -328,6 +336,7 @@ cmd_add()
 {
        # parse $args after "submodule ... add".
        reference_path=
+       no_single_branch=
        while test $# -ne 0
        do
                case "$1" in
@@ -363,6 +372,9 @@ cmd_add()
                --depth=*)
                        depth=$1
                        ;;
+               --no-single-branch)
+                       no_single_branch="--no-single-branch"
+                       ;;
                --)
                        shift
                        break
@@ -472,7 +484,7 @@ Use -f if you really want to add it." >&2
                                echo "$(eval_gettext "Reactivating local git 
directory for submodule '\$sm_name'.")"
                        fi
                fi
-               module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" 
"$depth" || exit
+               module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" 
"$depth" "$branch" "$no_single_branch" || exit
                (
                        clear_local_git_env
                        cd "$sm_path" &&
@@ -724,6 +736,7 @@ cmd_deinit()
 cmd_update()
 {
        # parse $args after "submodule ... update".
+       no_single_branch=
        while test $# -ne 0
        do
                case "$1" in
@@ -770,6 +783,9 @@ cmd_update()
                --depth=*)
                        depth=$1
                        ;;
+               --no-single-branch)
+                       no_single_branch="--no-single-branch"
+                       ;;
                --)
                        shift
                        break
@@ -834,7 +850,7 @@ Maybe you want to use 'update --init'?")"
 
                if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
                then
-                       module_clone "$sm_path" "$name" "$url" "$reference" 
"$depth" || exit
+                       module_clone "$sm_path" "$name" "$url" "$reference" 
"$depth" "$branch" "$no_single_branch" || exit
                        cloned_modules="$cloned_modules;$name"
                        subsha1=
                else
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index 7c88245..81c05ae 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -136,7 +136,6 @@ test_expect_success 'submodule add --branch' '
        echo "refs/heads/initial" >expect-head &&
        cat <<-\EOF >expect-heads &&
        refs/heads/initial
-       refs/heads/master
        EOF
        >empty &&
 
@@ -982,5 +981,37 @@ test_expect_success 'submodule add clone shallow 
submodule' '
        )
 '
 
+test_expect_success 'submodule add --branch --depth' '
+       (
+               cd addtest2 &&
+               git submodule add -b initial --depth 1 -- file://"$submodurl" 
submod-branch-depth &&
+               test "initial" = "$(git config -f .gitmodules 
submodule.submod-branch-depth.branch)" &&
+               (
+                       cd submod-branch-depth &&
+                       test 1 = $(git log --oneline | wc -l)
+               )
+       )
+'
+
+cat >remote <<\EOF
+  origin/HEAD -> origin/second
+  origin/initial
+  origin/master
+  origin/second
+EOF
+
+test_expect_success 'submodule add --branch --depth --no-single-branch' '
+       (
+               cd addtest2 &&
+               git submodule add -b initial --depth 1 --no-single-branch -- 
file://"$submodurl" submod-branch-depth-all &&
+               test "initial" = "$(git config -f .gitmodules 
submodule.submod-branch-depth-all.branch)" &&
+               (
+                       cd submod-branch-depth-all &&
+                       test 1 = $(git log --oneline | wc -l)
+                       git branch -r >../../remote-out
+               )
+       ) &&
+       test_cmp remote remote-out
+'
 
 test_done
-- 
2.1.0.238.gce1d3a9.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to