t / t7407-submodule-foreach.shon commit git submodule foreach: Add --recursive to recurse into nested submodules (15fc56a)
   1#!/bin/sh
   2#
   3# Copyright (c) 2009 Johan Herland
   4#
   5
   6test_description='Test "git submodule foreach"
   7
   8This test verifies that "git submodule foreach" correctly visits all submodules
   9that are currently checked out.
  10'
  11
  12. ./test-lib.sh
  13
  14
  15test_expect_success 'setup a submodule tree' '
  16        echo file > file &&
  17        git add file &&
  18        test_tick &&
  19        git commit -m upstream
  20        git clone . super &&
  21        git clone super submodule &&
  22        (
  23                cd super &&
  24                git submodule add ../submodule sub1 &&
  25                git submodule add ../submodule sub2 &&
  26                git submodule add ../submodule sub3 &&
  27                git config -f .gitmodules --rename-section \
  28                        submodule.sub1 submodule.foo1 &&
  29                git config -f .gitmodules --rename-section \
  30                        submodule.sub2 submodule.foo2 &&
  31                git config -f .gitmodules --rename-section \
  32                        submodule.sub3 submodule.foo3 &&
  33                git add .gitmodules
  34                test_tick &&
  35                git commit -m "submodules" &&
  36                git submodule init sub1 &&
  37                git submodule init sub2 &&
  38                git submodule init sub3
  39        ) &&
  40        (
  41                cd submodule &&
  42                echo different > file &&
  43                git add file &&
  44                test_tick &&
  45                git commit -m "different"
  46        ) &&
  47        (
  48                cd super &&
  49                (
  50                        cd sub3 &&
  51                        git pull
  52                ) &&
  53                git add sub3 &&
  54                test_tick &&
  55                git commit -m "update sub3"
  56        )
  57'
  58
  59sub1sha1=$(cd super/sub1 && git rev-parse HEAD)
  60sub3sha1=$(cd super/sub3 && git rev-parse HEAD)
  61
  62cat > expect <<EOF
  63Entering 'sub1'
  64foo1-sub1-$sub1sha1
  65Entering 'sub3'
  66foo3-sub3-$sub3sha1
  67EOF
  68
  69test_expect_success 'test basic "submodule foreach" usage' '
  70        git clone super clone &&
  71        (
  72                cd clone &&
  73                git submodule update --init -- sub1 sub3 &&
  74                git submodule foreach "echo \$name-\$path-\$sha1" > ../actual
  75        ) &&
  76        test_cmp expect actual
  77'
  78
  79test_expect_success 'setup nested submodules' '
  80        git clone submodule nested1 &&
  81        git clone submodule nested2 &&
  82        git clone submodule nested3 &&
  83        (
  84                cd nested3 &&
  85                git submodule add ../submodule submodule &&
  86                test_tick &&
  87                git commit -m "submodule" &&
  88                git submodule init submodule
  89        ) &&
  90        (
  91                cd nested2 &&
  92                git submodule add ../nested3 nested3 &&
  93                test_tick &&
  94                git commit -m "nested3" &&
  95                git submodule init nested3
  96        ) &&
  97        (
  98                cd nested1 &&
  99                git submodule add ../nested2 nested2 &&
 100                test_tick &&
 101                git commit -m "nested2" &&
 102                git submodule init nested2
 103        ) &&
 104        (
 105                cd super &&
 106                git submodule add ../nested1 nested1 &&
 107                test_tick &&
 108                git commit -m "nested1" &&
 109                git submodule init nested1
 110        )
 111'
 112
 113test_expect_success 'use "submodule foreach" to checkout 2nd level submodule' '
 114        git clone super clone2 &&
 115        (
 116                cd clone2 &&
 117                test ! -d sub1/.git &&
 118                test ! -d sub2/.git &&
 119                test ! -d sub3/.git &&
 120                test ! -d nested1/.git &&
 121                git submodule update --init &&
 122                test -d sub1/.git &&
 123                test -d sub2/.git &&
 124                test -d sub3/.git &&
 125                test -d nested1/.git &&
 126                test ! -d nested1/nested2/.git &&
 127                git submodule foreach "git submodule update --init" &&
 128                test -d nested1/nested2/.git &&
 129                test ! -d nested1/nested2/nested3/.git
 130        )
 131'
 132
 133test_expect_success 'use "foreach --recursive" to checkout all submodules' '
 134        (
 135                cd clone2 &&
 136                git submodule foreach --recursive "git submodule update --init" &&
 137                test -d nested1/nested2/nested3/.git &&
 138                test -d nested1/nested2/nested3/submodule/.git
 139        )
 140'
 141
 142cat > expect <<EOF
 143Entering 'nested1'
 144Entering 'nested1/nested2'
 145Entering 'nested1/nested2/nested3'
 146Entering 'nested1/nested2/nested3/submodule'
 147Entering 'sub1'
 148Entering 'sub2'
 149Entering 'sub3'
 150EOF
 151
 152test_expect_success 'test messages from "foreach --recursive"' '
 153        (
 154                cd clone2 &&
 155                git submodule foreach --recursive "true" > ../actual
 156        ) &&
 157        test_cmp expect actual
 158'
 159
 160cat > expect <<EOF
 161nested1-nested1
 162nested2-nested2
 163nested3-nested3
 164submodule-submodule
 165foo1-sub1
 166foo2-sub2
 167foo3-sub3
 168EOF
 169
 170test_expect_success 'test "foreach --quiet --recursive"' '
 171        (
 172                cd clone2 &&
 173                git submodule foreach -q --recursive "echo \$name-\$path" > ../actual
 174        ) &&
 175        test_cmp expect actual
 176'
 177
 178test_done