PageRenderTime 56ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/t/t7407-submodule-foreach.sh

https://gitlab.com/0072016/0072016-K-V-
Shell | 382 lines | 343 code | 35 blank | 4 comment | 11 complexity | 89fa2546b9bcdf9f2ebc72712ef39384 MD5 | raw file
  1. #!/bin/sh
  2. #
  3. # Copyright (c) 2009 Johan Herland
  4. #
  5. test_description='Test "git submodule foreach"
  6. This test verifies that "git submodule foreach" correctly visits all submodules
  7. that are currently checked out.
  8. '
  9. . ./test-lib.sh
  10. test_expect_success 'setup a submodule tree' '
  11. echo file > file &&
  12. git add file &&
  13. test_tick &&
  14. git commit -m upstream &&
  15. git clone . super &&
  16. git clone super submodule &&
  17. (
  18. cd super &&
  19. git submodule add ../submodule sub1 &&
  20. git submodule add ../submodule sub2 &&
  21. git submodule add ../submodule sub3 &&
  22. git config -f .gitmodules --rename-section \
  23. submodule.sub1 submodule.foo1 &&
  24. git config -f .gitmodules --rename-section \
  25. submodule.sub2 submodule.foo2 &&
  26. git config -f .gitmodules --rename-section \
  27. submodule.sub3 submodule.foo3 &&
  28. git add .gitmodules &&
  29. test_tick &&
  30. git commit -m "submodules" &&
  31. git submodule init sub1 &&
  32. git submodule init sub2 &&
  33. git submodule init sub3
  34. ) &&
  35. (
  36. cd submodule &&
  37. echo different > file &&
  38. git add file &&
  39. test_tick &&
  40. git commit -m "different"
  41. ) &&
  42. (
  43. cd super &&
  44. (
  45. cd sub3 &&
  46. git pull
  47. ) &&
  48. git add sub3 &&
  49. test_tick &&
  50. git commit -m "update sub3"
  51. )
  52. '
  53. sub1sha1=$(cd super/sub1 && git rev-parse HEAD)
  54. sub3sha1=$(cd super/sub3 && git rev-parse HEAD)
  55. pwd=$(pwd)
  56. cat > expect <<EOF
  57. Entering 'sub1'
  58. $pwd/clone-foo1-sub1-$sub1sha1
  59. Entering 'sub3'
  60. $pwd/clone-foo3-sub3-$sub3sha1
  61. EOF
  62. test_expect_success 'test basic "submodule foreach" usage' '
  63. git clone super clone &&
  64. (
  65. cd clone &&
  66. git submodule update --init -- sub1 sub3 &&
  67. git submodule foreach "echo \$toplevel-\$name-\$path-\$sha1" > ../actual &&
  68. git config foo.bar zar &&
  69. git submodule foreach "git config --file \"\$toplevel/.git/config\" foo.bar"
  70. ) &&
  71. test_i18ncmp expect actual
  72. '
  73. cat >expect <<EOF
  74. Entering '../sub1'
  75. $pwd/clone-foo1-../sub1-$sub1sha1
  76. Entering '../sub3'
  77. $pwd/clone-foo3-../sub3-$sub3sha1
  78. EOF
  79. test_expect_success 'test "submodule foreach" from subdirectory' '
  80. mkdir clone/sub &&
  81. (
  82. cd clone/sub &&
  83. git submodule foreach "echo \$toplevel-\$name-\$sm_path-\$sha1" >../../actual
  84. ) &&
  85. test_i18ncmp expect actual
  86. '
  87. test_expect_success 'setup nested submodules' '
  88. git clone submodule nested1 &&
  89. git clone submodule nested2 &&
  90. git clone submodule nested3 &&
  91. (
  92. cd nested3 &&
  93. git submodule add ../submodule submodule &&
  94. test_tick &&
  95. git commit -m "submodule" &&
  96. git submodule init submodule
  97. ) &&
  98. (
  99. cd nested2 &&
  100. git submodule add ../nested3 nested3 &&
  101. test_tick &&
  102. git commit -m "nested3" &&
  103. git submodule init nested3
  104. ) &&
  105. (
  106. cd nested1 &&
  107. git submodule add ../nested2 nested2 &&
  108. test_tick &&
  109. git commit -m "nested2" &&
  110. git submodule init nested2
  111. ) &&
  112. (
  113. cd super &&
  114. git submodule add ../nested1 nested1 &&
  115. test_tick &&
  116. git commit -m "nested1" &&
  117. git submodule init nested1
  118. )
  119. '
  120. test_expect_success 'use "submodule foreach" to checkout 2nd level submodule' '
  121. git clone super clone2 &&
  122. (
  123. cd clone2 &&
  124. test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
  125. test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
  126. test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
  127. test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
  128. git submodule update --init &&
  129. git rev-parse --resolve-git-dir sub1/.git &&
  130. git rev-parse --resolve-git-dir sub2/.git &&
  131. git rev-parse --resolve-git-dir sub3/.git &&
  132. git rev-parse --resolve-git-dir nested1/.git &&
  133. test_must_fail git rev-parse --resolve-git-dir nested1/nested2/.git &&
  134. git submodule foreach "git submodule update --init" &&
  135. git rev-parse --resolve-git-dir nested1/nested2/.git &&
  136. test_must_fail git rev-parse --resolve-git-dir nested1/nested2/nested3/.git
  137. )
  138. '
  139. test_expect_success 'use "foreach --recursive" to checkout all submodules' '
  140. (
  141. cd clone2 &&
  142. git submodule foreach --recursive "git submodule update --init" &&
  143. git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
  144. git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
  145. )
  146. '
  147. cat > expect <<EOF
  148. Entering 'nested1'
  149. Entering 'nested1/nested2'
  150. Entering 'nested1/nested2/nested3'
  151. Entering 'nested1/nested2/nested3/submodule'
  152. Entering 'sub1'
  153. Entering 'sub2'
  154. Entering 'sub3'
  155. EOF
  156. test_expect_success 'test messages from "foreach --recursive"' '
  157. (
  158. cd clone2 &&
  159. git submodule foreach --recursive "true" > ../actual
  160. ) &&
  161. test_i18ncmp expect actual
  162. '
  163. cat > expect <<EOF
  164. Entering '../nested1'
  165. Entering '../nested1/nested2'
  166. Entering '../nested1/nested2/nested3'
  167. Entering '../nested1/nested2/nested3/submodule'
  168. Entering '../sub1'
  169. Entering '../sub2'
  170. Entering '../sub3'
  171. EOF
  172. test_expect_success 'test messages from "foreach --recursive" from subdirectory' '
  173. (
  174. cd clone2 &&
  175. mkdir untracked &&
  176. cd untracked &&
  177. git submodule foreach --recursive >../../actual
  178. ) &&
  179. test_i18ncmp expect actual
  180. '
  181. cat > expect <<EOF
  182. nested1-nested1
  183. nested2-nested2
  184. nested3-nested3
  185. submodule-submodule
  186. foo1-sub1
  187. foo2-sub2
  188. foo3-sub3
  189. EOF
  190. test_expect_success 'test "foreach --quiet --recursive"' '
  191. (
  192. cd clone2 &&
  193. git submodule foreach -q --recursive "echo \$name-\$path" > ../actual
  194. ) &&
  195. test_cmp expect actual
  196. '
  197. test_expect_success 'use "update --recursive" to checkout all submodules' '
  198. git clone super clone3 &&
  199. (
  200. cd clone3 &&
  201. test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
  202. test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
  203. test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
  204. test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
  205. git submodule update --init --recursive &&
  206. git rev-parse --resolve-git-dir sub1/.git &&
  207. git rev-parse --resolve-git-dir sub2/.git &&
  208. git rev-parse --resolve-git-dir sub3/.git &&
  209. git rev-parse --resolve-git-dir nested1/.git &&
  210. git rev-parse --resolve-git-dir nested1/nested2/.git &&
  211. git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
  212. git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
  213. )
  214. '
  215. nested1sha1=$(cd clone3/nested1 && git rev-parse HEAD)
  216. nested2sha1=$(cd clone3/nested1/nested2 && git rev-parse HEAD)
  217. nested3sha1=$(cd clone3/nested1/nested2/nested3 && git rev-parse HEAD)
  218. submodulesha1=$(cd clone3/nested1/nested2/nested3/submodule && git rev-parse HEAD)
  219. sub1sha1=$(cd clone3/sub1 && git rev-parse HEAD)
  220. sub2sha1=$(cd clone3/sub2 && git rev-parse HEAD)
  221. sub3sha1=$(cd clone3/sub3 && git rev-parse HEAD)
  222. sub1sha1_short=$(cd clone3/sub1 && git rev-parse --short HEAD)
  223. sub2sha1_short=$(cd clone3/sub2 && git rev-parse --short HEAD)
  224. cat > expect <<EOF
  225. $nested1sha1 nested1 (heads/master)
  226. $nested2sha1 nested1/nested2 (heads/master)
  227. $nested3sha1 nested1/nested2/nested3 (heads/master)
  228. $submodulesha1 nested1/nested2/nested3/submodule (heads/master)
  229. $sub1sha1 sub1 ($sub1sha1_short)
  230. $sub2sha1 sub2 ($sub2sha1_short)
  231. $sub3sha1 sub3 (heads/master)
  232. EOF
  233. test_expect_success 'test "status --recursive"' '
  234. (
  235. cd clone3 &&
  236. git submodule status --recursive > ../actual
  237. ) &&
  238. test_cmp expect actual
  239. '
  240. cat > expect <<EOF
  241. $nested1sha1 nested1 (heads/master)
  242. +$nested2sha1 nested1/nested2 (file2~1)
  243. $nested3sha1 nested1/nested2/nested3 (heads/master)
  244. $submodulesha1 nested1/nested2/nested3/submodule (heads/master)
  245. EOF
  246. test_expect_success 'ensure "status --cached --recursive" preserves the --cached flag' '
  247. (
  248. cd clone3 &&
  249. (
  250. cd nested1/nested2 &&
  251. test_commit file2
  252. ) &&
  253. git submodule status --cached --recursive -- nested1 > ../actual
  254. ) &&
  255. test_cmp expect actual
  256. '
  257. nested2sha1=$(git -C clone3/nested1/nested2 rev-parse HEAD)
  258. cat > expect <<EOF
  259. $nested1sha1 ../nested1 (heads/master)
  260. +$nested2sha1 ../nested1/nested2 (file2)
  261. $nested3sha1 ../nested1/nested2/nested3 (heads/master)
  262. $submodulesha1 ../nested1/nested2/nested3/submodule (heads/master)
  263. $sub1sha1 ../sub1 ($sub1sha1_short)
  264. $sub2sha1 ../sub2 ($sub2sha1_short)
  265. $sub3sha1 ../sub3 (heads/master)
  266. EOF
  267. test_expect_success 'test "status --recursive" from sub directory' '
  268. (
  269. cd clone3 &&
  270. mkdir tmp && cd tmp &&
  271. git submodule status --recursive > ../../actual
  272. ) &&
  273. test_cmp expect actual
  274. '
  275. test_expect_success 'use "git clone --recursive" to checkout all submodules' '
  276. git clone --recursive super clone4 &&
  277. (
  278. cd clone4 &&
  279. git rev-parse --resolve-git-dir .git &&
  280. git rev-parse --resolve-git-dir sub1/.git &&
  281. git rev-parse --resolve-git-dir sub2/.git &&
  282. git rev-parse --resolve-git-dir sub3/.git &&
  283. git rev-parse --resolve-git-dir nested1/.git &&
  284. git rev-parse --resolve-git-dir nested1/nested2/.git &&
  285. git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
  286. git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
  287. )
  288. '
  289. test_expect_success 'test "update --recursive" with a flag with spaces' '
  290. git clone super "common objects" &&
  291. git clone super clone5 &&
  292. (
  293. cd clone5 &&
  294. test_must_fail git rev-parse --resolve-git-dir d nested1/.git &&
  295. git submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" &&
  296. git rev-parse --resolve-git-dir nested1/.git &&
  297. git rev-parse --resolve-git-dir nested1/nested2/.git &&
  298. git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
  299. test -f .git/modules/nested1/objects/info/alternates &&
  300. test -f .git/modules/nested1/modules/nested2/objects/info/alternates &&
  301. test -f .git/modules/nested1/modules/nested2/modules/nested3/objects/info/alternates
  302. )
  303. '
  304. test_expect_success 'use "update --recursive nested1" to checkout all submodules rooted in nested1' '
  305. git clone super clone6 &&
  306. (
  307. cd clone6 &&
  308. test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
  309. test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
  310. test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
  311. test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
  312. git submodule update --init --recursive -- nested1 &&
  313. test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
  314. test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
  315. test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
  316. git rev-parse --resolve-git-dir nested1/.git &&
  317. git rev-parse --resolve-git-dir nested1/nested2/.git &&
  318. git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
  319. git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
  320. )
  321. '
  322. test_expect_success 'command passed to foreach retains notion of stdin' '
  323. (
  324. cd super &&
  325. git submodule foreach echo success >../expected &&
  326. yes | git submodule foreach "read y && test \"x\$y\" = xy && echo success" >../actual
  327. ) &&
  328. test_cmp expected actual
  329. '
  330. test_expect_success 'command passed to foreach --recursive retains notion of stdin' '
  331. (
  332. cd clone2 &&
  333. git submodule foreach --recursive echo success >../expected &&
  334. yes | git submodule foreach --recursive "read y && test \"x\$y\" = xy && echo success" >../actual
  335. ) &&
  336. test_cmp expected actual
  337. '
  338. test_expect_success 'multi-argument command passed to foreach is not shell-evaluated twice' '
  339. (
  340. cd super &&
  341. git submodule foreach "echo \\\"quoted\\\"" > ../expected &&
  342. git submodule foreach echo \"quoted\" > ../actual
  343. ) &&
  344. test_cmp expected actual
  345. '
  346. test_done