t / t7407-submodule-foreach.shon commit Merge branch 'hg/maint-attr-fix' (b7d0da8)
   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_expect_success 'use "update --recursive" to checkout all submodules' '
 179        git clone super clone3 &&
 180        (
 181                cd clone3 &&
 182                test ! -d sub1/.git &&
 183                test ! -d sub2/.git &&
 184                test ! -d sub3/.git &&
 185                test ! -d nested1/.git &&
 186                git submodule update --init --recursive &&
 187                test -d sub1/.git &&
 188                test -d sub2/.git &&
 189                test -d sub3/.git &&
 190                test -d nested1/.git &&
 191                test -d nested1/nested2/.git &&
 192                test -d nested1/nested2/nested3/.git &&
 193                test -d nested1/nested2/nested3/submodule/.git
 194        )
 195'
 196
 197nested1sha1=$(cd clone3/nested1 && git rev-parse HEAD)
 198nested2sha1=$(cd clone3/nested1/nested2 && git rev-parse HEAD)
 199nested3sha1=$(cd clone3/nested1/nested2/nested3 && git rev-parse HEAD)
 200submodulesha1=$(cd clone3/nested1/nested2/nested3/submodule && git rev-parse HEAD)
 201sub1sha1=$(cd clone3/sub1 && git rev-parse HEAD)
 202sub2sha1=$(cd clone3/sub2 && git rev-parse HEAD)
 203sub3sha1=$(cd clone3/sub3 && git rev-parse HEAD)
 204sub1sha1_short=$(cd clone3/sub1 && git rev-parse --short HEAD)
 205sub2sha1_short=$(cd clone3/sub2 && git rev-parse --short HEAD)
 206
 207cat > expect <<EOF
 208 $nested1sha1 nested1 (heads/master)
 209 $nested2sha1 nested1/nested2 (heads/master)
 210 $nested3sha1 nested1/nested2/nested3 (heads/master)
 211 $submodulesha1 nested1/nested2/nested3/submodule (heads/master)
 212 $sub1sha1 sub1 ($sub1sha1_short)
 213 $sub2sha1 sub2 ($sub2sha1_short)
 214 $sub3sha1 sub3 (heads/master)
 215EOF
 216
 217test_expect_success 'test "status --recursive"' '
 218        (
 219                cd clone3 &&
 220                git submodule status --recursive > ../actual
 221        ) &&
 222        test_cmp expect actual
 223'
 224
 225test_expect_success 'use "git clone --recursive" to checkout all submodules' '
 226        git clone --recursive super clone4 &&
 227        test -d clone4/.git &&
 228        test -d clone4/sub1/.git &&
 229        test -d clone4/sub2/.git &&
 230        test -d clone4/sub3/.git &&
 231        test -d clone4/nested1/.git &&
 232        test -d clone4/nested1/nested2/.git &&
 233        test -d clone4/nested1/nested2/nested3/.git &&
 234        test -d clone4/nested1/nested2/nested3/submodule/.git
 235'
 236
 237test_done