When a submodule is clone, clone it width the --depth flag. This is useful
when the submodule(s) are huge and you're not really interested in anything
but the latest commit.

Tests are added and to make --depth work the path for test "setup a submodule
tree" had to be modified. Also did some indent adjustments to conform to the
rest of the testfile on "submodule update can handle symbolic links in pwd".

Signed-off-by: Fredrik Gustafsson <iv...@iveqy.com>
---

I neither have an opinion about what word to use. --depth is more
consistent and easier to code. But also eaiser to be confused about.

Here is a --clone-depth version of the patch. Nothing else is changed.
Please take the one thats most suited.

 Documentation/git-submodule.txt | 13 +++++++++++--
 git-submodule.sh                | 24 +++++++++++++++++++++---
 t/t7400-submodule-basic.sh      | 18 ++++++++++++++++++
 t/t7406-submodule-update.sh     | 28 ++++++++++++++++++++--------
 4 files changed, 70 insertions(+), 13 deletions(-)

diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index e576713..41b9610 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -10,12 +10,12 @@ SYNOPSIS
 --------
 [verse]
 'git submodule' [--quiet] add [-b <branch>] [-f|--force] [--name <name>]
-             [--reference <repository>] [--] <repository> [<path>]
+             [--reference <repository>] [--clone-depth <depth>] [--] 
<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] [--reference <repository>]
+             [-f|--force] [--rebase] [--reference <repository>] [--clone-depth 
<depth>]
              [--merge] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
              [commit] [--] [<path>...]
@@ -328,6 +328,15 @@ for linkgit:git-clone[1]'s `--reference` and `--shared` 
options carefully.
        only in the submodules of the current repo, but also
        in any nested submodules inside those submodules (and so on).
 
+--clone-depth::
+       This option is valid for add and update commands. Create a 'shallow'
+       clone with a history truncated to the specified number of revisions.
+       A shallow repository has a number of limitations (you cannot clone
+       or fetch from it, nor push from nor into it), but is adequate if
+       you are only interested in the recent history of a large project
+       with a long history.
+
+
 <path>...::
        Paths to submodule(s). When specified this will restrict the command
        to only operate on the submodules found at the specified paths.
diff --git a/git-submodule.sh b/git-submodule.sh
index 79bfaac..0a949d1 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -32,6 +32,7 @@ nofetch=
 update=
 prefix=
 custom_name=
+clone_depth=
 
 # The function takes at most 2 arguments. The first argument is the
 # URL that navigates to the submodule origin repo. When relative, this URL
@@ -211,6 +212,7 @@ module_clone()
        name=$2
        url=$3
        reference="$4"
+       clone_depth=$5
        quiet=
        if test -n "$GIT_QUIET"
        then
@@ -234,7 +236,7 @@ module_clone()
                (
                        clear_local_git_env
                        git clone $quiet -n ${reference:+"$reference"} \
-                               --separate-git-dir "$gitdir" "$url" "$sm_path"
+                               --separate-git-dir "$gitdir" $clone_depth 
"$url" "$sm_path"
                ) ||
                die "$(eval_gettext "Clone of '\$url' into submodule path 
'\$sm_path' failed")"
        fi
@@ -309,6 +311,14 @@ cmd_add()
                        custom_name=$2
                        shift
                        ;;
+               --clone-depth)
+                       case "$2" in '') usage ;; esac
+                       clone_depth="--depth=$2"
+                       shift
+                       ;;
+               --clone-depth=*)
+                       clone_depth="$(echo $1 | sed -e 's/^--clone/-/')"
+                       ;;
                --)
                        shift
                        break
@@ -405,7 +415,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" || 
exit
+               module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" 
"$clone_depth" || exit
                (
                        clear_local_git_env
                        cd "$sm_path" &&
@@ -676,6 +686,14 @@ cmd_update()
                --checkout)
                        update="checkout"
                        ;;
+               --clone-depth)
+                       case "$2" in '') usage ;; esac
+                       clone_depth="--depth=$2"
+                       shift
+                       ;;
+               --clone-depth=*)
+                       clone_depth="$(echo $1 | sed -e 's/^--clone/-/')"
+                       ;;
                --)
                        shift
                        break
@@ -735,7 +753,7 @@ Maybe you want to use 'update --init'?")"
 
                if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
                then
-                       module_clone "$sm_path" "$name" "$url" "$reference" || 
exit
+                       module_clone "$sm_path" "$name" "$url" "$reference" 
"$clone_depth" || exit
                        cloned_modules="$cloned_modules;$name"
                        subsha1=
                else
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index f47cc7b..7a44059 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -868,4 +868,22 @@ test_expect_success 'submodule deinit fails when submodule 
has a .git directory
        test -n "$(git config --get-regexp "submodule\.example\.")"
 '
 
+test_expect_success 'submodule add clone shallow submodule' '
+       mkdir super &&
+       pwd=$(pwd)
+       (
+               cd super &&
+               git init &&
+               git submodule add --clone-depth=1 file://"$pwd"/example2 
submodule &&
+               (
+                       cd submodule &&
+                       if test $(git log --oneline | wc -l) != 1
+                       then
+                               exit 1
+                       fi
+               )
+       )
+'
+
+
 test_done
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index a4ffea0..d52df37 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -31,8 +31,9 @@ test_expect_success 'setup a submodule tree' '
        git clone super rebasing &&
        git clone super merging &&
        git clone super none &&
+       pwd=$(pwd)
        (cd super &&
-        git submodule add ../submodule submodule &&
+        git submodule add file:///"$pwd"/submodule submodule &&
         test_tick &&
         git commit -m "submodule" &&
         git submodule init submodule
@@ -685,14 +686,25 @@ test_expect_success 'submodule update properly revives a 
moved submodule' '
 test_expect_success SYMLINKS 'submodule update can handle symbolic links in 
pwd' '
        mkdir -p linked/dir &&
        ln -s linked/dir linkto &&
-       (
-               cd linkto &&
-               git clone "$TRASH_DIRECTORY"/super_update_r2 super &&
-               (
-                       cd super &&
-                       git submodule update --init --recursive
-               )
+       (cd linkto &&
+        git clone "$TRASH_DIRECTORY"/super_update_r2 super &&
+        (cd super &&
+         git submodule update --init --recursive
+        )
        )
 '
 
+test_expect_success 'submodule update clone shallow submodule' '
+       git clone cloned super3 &&
+       (cd super3 &&
+        git submodule init &&
+        git submodule update --clone-depth=3 &&
+        (cd submodule &&
+         if test $(git log --oneline | wc -l) != 1
+         then
+          exit 1
+         fi
+        )
+       )
+'
 test_done
-- 
1.8.3.1.489.gbc4ad7e.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