Glen Choo | 961b130 | 2022-01-28 16:04:45 -0800 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='git branch submodule tests' |
| 4 | |
| 5 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| 6 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| 7 | |
| 8 | . ./test-lib.sh |
| 9 | . "$TEST_DIRECTORY"/lib-rebase.sh |
| 10 | |
| 11 | pwd=$(pwd) |
| 12 | |
| 13 | # Creates a clean test environment in "pwd" by copying the repo setup |
| 14 | # from test_dirs. |
| 15 | reset_test () { |
| 16 | rm -fr super && |
| 17 | rm -fr sub-sub-upstream && |
| 18 | rm -fr sub-upstream && |
| 19 | cp -r test_dirs/* . |
| 20 | } |
| 21 | |
| 22 | # Tests that the expected branch does not exist |
| 23 | test_no_branch () { |
| 24 | DIR=$1 && |
| 25 | BRANCH_NAME=$2 && |
| 26 | test_must_fail git -C "$DIR" rev-parse "$BRANCH_NAME" 2>err && |
| 27 | grep "ambiguous argument .$BRANCH_NAME." err |
| 28 | } |
| 29 | |
| 30 | test_expect_success 'setup superproject and submodule' ' |
Taylor Blau | e175fb5 | 2022-09-30 16:47:00 -0400 | [diff] [blame] | 31 | git config --global protocol.file.allow always && |
Glen Choo | 961b130 | 2022-01-28 16:04:45 -0800 | [diff] [blame] | 32 | mkdir test_dirs && |
| 33 | ( |
| 34 | cd test_dirs && |
| 35 | git init super && |
| 36 | test_commit -C super foo && |
| 37 | git init sub-sub-upstream && |
| 38 | test_commit -C sub-sub-upstream foo && |
| 39 | git init sub-upstream && |
| 40 | # Submodule in a submodule |
| 41 | git -C sub-upstream submodule add "${pwd}/test_dirs/sub-sub-upstream" sub-sub && |
| 42 | git -C sub-upstream commit -m "add submodule" && |
| 43 | # Regular submodule |
| 44 | git -C super submodule add "${pwd}/test_dirs/sub-upstream" sub && |
| 45 | # Submodule in a subdirectory |
| 46 | git -C super submodule add "${pwd}/test_dirs/sub-sub-upstream" second/sub && |
| 47 | git -C super commit -m "add submodule" && |
| 48 | git -C super config submodule.propagateBranches true && |
| 49 | git -C super/sub submodule update --init |
| 50 | ) && |
| 51 | reset_test |
| 52 | ' |
| 53 | |
| 54 | # Test the argument parsing |
| 55 | test_expect_success '--recurse-submodules should create branches' ' |
| 56 | test_when_finished "reset_test" && |
| 57 | ( |
| 58 | cd super && |
| 59 | git branch --recurse-submodules branch-a && |
| 60 | git rev-parse branch-a && |
| 61 | git -C sub rev-parse branch-a && |
| 62 | git -C sub/sub-sub rev-parse branch-a && |
| 63 | git -C second/sub rev-parse branch-a |
| 64 | ) |
| 65 | ' |
| 66 | |
| 67 | test_expect_success '--recurse-submodules should die if submodule.propagateBranches is false' ' |
| 68 | test_when_finished "reset_test" && |
| 69 | ( |
| 70 | cd super && |
| 71 | echo "fatal: branch with --recurse-submodules can only be used if submodule.propagateBranches is enabled" >expected && |
| 72 | test_must_fail git -c submodule.propagateBranches=false branch --recurse-submodules branch-a 2>actual && |
| 73 | test_cmp expected actual |
| 74 | ) |
| 75 | ' |
| 76 | |
| 77 | test_expect_success '--recurse-submodules should fail when not creating branches' ' |
| 78 | test_when_finished "reset_test" && |
| 79 | ( |
| 80 | cd super && |
| 81 | git branch --recurse-submodules branch-a && |
| 82 | echo "fatal: --recurse-submodules can only be used to create branches" >expected && |
| 83 | test_must_fail git branch --recurse-submodules -D branch-a 2>actual && |
| 84 | test_cmp expected actual && |
| 85 | # Assert that the branches were not deleted |
| 86 | git rev-parse branch-a && |
| 87 | git -C sub rev-parse branch-a |
| 88 | ) |
| 89 | ' |
| 90 | |
| 91 | test_expect_success 'should respect submodule.recurse when creating branches' ' |
| 92 | test_when_finished "reset_test" && |
| 93 | ( |
| 94 | cd super && |
| 95 | git -c submodule.recurse=true branch branch-a && |
| 96 | git rev-parse branch-a && |
| 97 | git -C sub rev-parse branch-a |
| 98 | ) |
| 99 | ' |
| 100 | |
| 101 | test_expect_success 'should ignore submodule.recurse when not creating branches' ' |
| 102 | test_when_finished "reset_test" && |
| 103 | ( |
| 104 | cd super && |
| 105 | git branch --recurse-submodules branch-a && |
| 106 | git -c submodule.recurse=true branch -D branch-a && |
| 107 | test_no_branch . branch-a && |
| 108 | git -C sub rev-parse branch-a |
| 109 | ) |
| 110 | ' |
| 111 | |
| 112 | # Test branch creation behavior |
| 113 | test_expect_success 'should create branches based off commit id in superproject' ' |
| 114 | test_when_finished "reset_test" && |
| 115 | ( |
| 116 | cd super && |
| 117 | git branch --recurse-submodules branch-a && |
| 118 | git checkout --recurse-submodules branch-a && |
| 119 | git -C sub rev-parse HEAD >expected && |
| 120 | # Move the tip of sub:branch-a so that it no longer matches the commit in super:branch-a |
| 121 | git -C sub checkout branch-a && |
| 122 | test_commit -C sub bar && |
| 123 | # Create a new branch-b branch with start-point=branch-a |
| 124 | git branch --recurse-submodules branch-b branch-a && |
| 125 | git rev-parse branch-b && |
| 126 | git -C sub rev-parse branch-b >actual && |
| 127 | # Assert that the commit id of sub:second-branch matches super:branch-a and not sub:branch-a |
| 128 | test_cmp expected actual |
| 129 | ) |
| 130 | ' |
| 131 | |
| 132 | test_expect_success 'should not create any branches if branch is not valid for all repos' ' |
| 133 | test_when_finished "reset_test" && |
| 134 | ( |
| 135 | cd super && |
| 136 | git -C sub branch branch-a && |
| 137 | test_must_fail git branch --recurse-submodules branch-a 2>actual && |
| 138 | test_no_branch . branch-a && |
Junio C Hamano | 5cc9522 | 2022-02-18 13:53:29 -0800 | [diff] [blame] | 139 | grep "submodule .sub.: fatal: a branch named .branch-a. already exists" actual |
Glen Choo | 961b130 | 2022-01-28 16:04:45 -0800 | [diff] [blame] | 140 | ) |
| 141 | ' |
| 142 | |
| 143 | test_expect_success 'should create branches if branch exists and --force is given' ' |
| 144 | test_when_finished "reset_test" && |
| 145 | ( |
| 146 | cd super && |
| 147 | git -C sub rev-parse HEAD >expected && |
| 148 | test_commit -C sub baz && |
| 149 | # branch-a in sub now points to a newer commit. |
| 150 | git -C sub branch branch-a HEAD && |
| 151 | git -C sub rev-parse branch-a >actual-old-branch-a && |
| 152 | git branch --recurse-submodules --force branch-a && |
| 153 | git rev-parse branch-a && |
| 154 | git -C sub rev-parse branch-a >actual-new-branch-a && |
| 155 | test_cmp expected actual-new-branch-a && |
| 156 | # assert that branch --force actually moved the sub |
| 157 | # branch |
| 158 | ! test_cmp expected actual-old-branch-a |
| 159 | ) |
| 160 | ' |
| 161 | |
| 162 | test_expect_success 'should create branch when submodule is not in HEAD:.gitmodules' ' |
| 163 | test_when_finished "reset_test" && |
| 164 | ( |
| 165 | cd super && |
| 166 | git branch branch-a && |
| 167 | git checkout -b branch-b && |
| 168 | git submodule add ../sub-upstream sub2 && |
| 169 | git -C sub2 submodule update --init && |
| 170 | # branch-b now has a committed submodule not in branch-a |
| 171 | git commit -m "add second submodule" && |
| 172 | git checkout branch-a && |
| 173 | git branch --recurse-submodules branch-c branch-b && |
| 174 | git checkout --recurse-submodules branch-c && |
| 175 | git -C sub2 rev-parse branch-c && |
| 176 | git -C sub2/sub-sub rev-parse branch-c |
| 177 | ) |
| 178 | ' |
| 179 | |
| 180 | test_expect_success 'should not create branches in inactive submodules' ' |
| 181 | test_when_finished "reset_test" && |
| 182 | test_config -C super submodule.sub.active false && |
| 183 | ( |
| 184 | cd super && |
| 185 | git branch --recurse-submodules branch-a && |
| 186 | git rev-parse branch-a && |
| 187 | test_no_branch sub branch-a |
| 188 | ) |
| 189 | ' |
| 190 | |
| 191 | test_expect_success 'should set up tracking of local branches with track=always' ' |
| 192 | test_when_finished "reset_test" && |
| 193 | ( |
| 194 | cd super && |
| 195 | git -c branch.autoSetupMerge=always branch --recurse-submodules branch-a main && |
| 196 | git -C sub rev-parse main && |
| 197 | test_cmp_config -C sub . branch.branch-a.remote && |
| 198 | test_cmp_config -C sub refs/heads/main branch.branch-a.merge |
| 199 | ) |
| 200 | ' |
| 201 | |
| 202 | test_expect_success 'should set up tracking of local branches with explicit track' ' |
| 203 | test_when_finished "reset_test" && |
| 204 | ( |
| 205 | cd super && |
| 206 | git branch --track --recurse-submodules branch-a main && |
| 207 | git -C sub rev-parse main && |
| 208 | test_cmp_config -C sub . branch.branch-a.remote && |
| 209 | test_cmp_config -C sub refs/heads/main branch.branch-a.merge |
| 210 | ) |
| 211 | ' |
| 212 | |
| 213 | test_expect_success 'should not set up unnecessary tracking of local branches' ' |
| 214 | test_when_finished "reset_test" && |
| 215 | ( |
| 216 | cd super && |
| 217 | git branch --recurse-submodules branch-a main && |
| 218 | git -C sub rev-parse main && |
| 219 | test_cmp_config -C sub "" --default "" branch.branch-a.remote && |
| 220 | test_cmp_config -C sub "" --default "" branch.branch-a.merge |
| 221 | ) |
| 222 | ' |
| 223 | |
| 224 | reset_remote_test () { |
| 225 | rm -fr super-clone && |
| 226 | reset_test |
| 227 | } |
| 228 | |
| 229 | test_expect_success 'setup tests with remotes' ' |
| 230 | ( |
| 231 | cd test_dirs && |
| 232 | ( |
| 233 | cd super && |
| 234 | git branch branch-a && |
| 235 | git checkout -b branch-b && |
| 236 | git submodule add ../sub-upstream sub2 && |
| 237 | # branch-b now has a committed submodule not in branch-a |
| 238 | git commit -m "add second submodule" |
| 239 | ) && |
| 240 | git clone --branch main --recurse-submodules super super-clone && |
| 241 | git -C super-clone config submodule.propagateBranches true |
| 242 | ) && |
| 243 | reset_remote_test |
| 244 | ' |
| 245 | |
| 246 | test_expect_success 'should get fatal error upon branch creation when submodule is not in .git/modules' ' |
| 247 | test_when_finished "reset_remote_test" && |
| 248 | ( |
| 249 | cd super-clone && |
| 250 | # This should succeed because super-clone has sub in .git/modules |
| 251 | git branch --recurse-submodules branch-a origin/branch-a && |
| 252 | # This should fail because super-clone does not have sub2 .git/modules |
| 253 | test_must_fail git branch --recurse-submodules branch-b origin/branch-b 2>actual && |
| 254 | grep "fatal: submodule .sub2.: unable to find submodule" actual && |
| 255 | test_no_branch . branch-b && |
| 256 | test_no_branch sub branch-b && |
| 257 | # User can fix themselves by initializing the submodule |
| 258 | git checkout origin/branch-b && |
| 259 | git submodule update --init --recursive && |
| 260 | git branch --recurse-submodules branch-b origin/branch-b |
| 261 | ) |
| 262 | ' |
| 263 | |
Glen Choo | 75388bf | 2022-03-29 20:01:16 +0000 | [diff] [blame] | 264 | test_expect_success 'should set up tracking of remote-tracking branches by default' ' |
Glen Choo | 961b130 | 2022-01-28 16:04:45 -0800 | [diff] [blame] | 265 | test_when_finished "reset_remote_test" && |
| 266 | ( |
| 267 | cd super-clone && |
| 268 | git branch --recurse-submodules branch-a origin/branch-a && |
| 269 | test_cmp_config origin branch.branch-a.remote && |
| 270 | test_cmp_config refs/heads/branch-a branch.branch-a.merge && |
| 271 | # "origin/branch-a" does not exist for "sub", but it matches the refspec |
| 272 | # so tracking should be set up |
| 273 | test_cmp_config -C sub origin branch.branch-a.remote && |
| 274 | test_cmp_config -C sub refs/heads/branch-a branch.branch-a.merge && |
| 275 | test_cmp_config -C sub/sub-sub origin branch.branch-a.remote && |
| 276 | test_cmp_config -C sub/sub-sub refs/heads/branch-a branch.branch-a.merge |
| 277 | ) |
| 278 | ' |
| 279 | |
| 280 | test_expect_success 'should not fail when unable to set up tracking in submodule' ' |
| 281 | test_when_finished "reset_remote_test" && |
| 282 | ( |
| 283 | cd super-clone && |
| 284 | git remote rename origin ex-origin && |
| 285 | git branch --recurse-submodules branch-a ex-origin/branch-a && |
| 286 | test_cmp_config ex-origin branch.branch-a.remote && |
| 287 | test_cmp_config refs/heads/branch-a branch.branch-a.merge && |
| 288 | test_cmp_config -C sub "" --default "" branch.branch-a.remote && |
| 289 | test_cmp_config -C sub "" --default "" branch.branch-a.merge |
| 290 | ) |
| 291 | ' |
| 292 | |
Glen Choo | 75388bf | 2022-03-29 20:01:16 +0000 | [diff] [blame] | 293 | test_expect_success '--track=inherit should set up tracking correctly' ' |
| 294 | test_when_finished "reset_remote_test" && |
| 295 | ( |
| 296 | cd super-clone && |
| 297 | git branch --recurse-submodules branch-a origin/branch-a && |
| 298 | # Set this manually instead of using branch --set-upstream-to |
| 299 | # to circumvent the "nonexistent upstream" check. |
| 300 | git -C sub config branch.branch-a.remote origin && |
| 301 | git -C sub config branch.branch-a.merge refs/heads/sub-branch-a && |
| 302 | git -C sub/sub-sub config branch.branch-a.remote other && |
| 303 | git -C sub/sub-sub config branch.branch-a.merge refs/heads/sub-sub-branch-a && |
| 304 | |
| 305 | git branch --recurse-submodules --track=inherit branch-b branch-a && |
| 306 | test_cmp_config origin branch.branch-b.remote && |
| 307 | test_cmp_config refs/heads/branch-a branch.branch-b.merge && |
| 308 | test_cmp_config -C sub origin branch.branch-b.remote && |
| 309 | test_cmp_config -C sub refs/heads/sub-branch-a branch.branch-b.merge && |
| 310 | test_cmp_config -C sub/sub-sub other branch.branch-b.remote && |
| 311 | test_cmp_config -C sub/sub-sub refs/heads/sub-sub-branch-a branch.branch-b.merge |
| 312 | ) |
| 313 | ' |
| 314 | |
| 315 | test_expect_success '--no-track should not set up tracking' ' |
| 316 | test_when_finished "reset_remote_test" && |
| 317 | ( |
| 318 | cd super-clone && |
| 319 | git branch --recurse-submodules --no-track branch-a origin/branch-a && |
| 320 | test_cmp_config "" --default "" branch.branch-a.remote && |
| 321 | test_cmp_config "" --default "" branch.branch-a.merge && |
| 322 | test_cmp_config -C sub "" --default "" branch.branch-a.remote && |
| 323 | test_cmp_config -C sub "" --default "" branch.branch-a.merge && |
| 324 | test_cmp_config -C sub/sub-sub "" --default "" branch.branch-a.remote && |
| 325 | test_cmp_config -C sub/sub-sub "" --default "" branch.branch-a.merge |
| 326 | ) |
| 327 | ' |
| 328 | |
Glen Choo | 961b130 | 2022-01-28 16:04:45 -0800 | [diff] [blame] | 329 | test_done |