Git fork
at reftables-rust 425 lines 10 kB view raw
1#!/bin/sh 2 3test_description='git p4 submit failure handling' 4 5. ./lib-git-p4.sh 6 7test_expect_success 'start p4d' ' 8 start_p4d 9' 10 11test_expect_success 'init depot' ' 12 ( 13 cd "$cli" && 14 p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i && 15 echo line1 >file1 && 16 p4 add file1 && 17 p4 submit -d "line1 in file1" 18 ) 19' 20 21test_expect_success 'conflict on one commit' ' 22 test_when_finished cleanup_git && 23 git p4 clone --dest="$git" //depot && 24 ( 25 cd "$cli" && 26 p4 open file1 && 27 echo line2 >>file1 && 28 p4 submit -d "line2 in file1" 29 ) && 30 ( 31 # now this commit should cause a conflict 32 cd "$git" && 33 git config git-p4.skipSubmitEdit true && 34 echo line3 >>file1 && 35 git add file1 && 36 git commit -m "line3 in file1 will conflict" && 37 test_expect_code 1 git p4 submit >out && 38 test_grep "No commits applied" out 39 ) 40' 41 42test_expect_success 'conflict on second of two commits' ' 43 test_when_finished cleanup_git && 44 git p4 clone --dest="$git" //depot && 45 ( 46 cd "$cli" && 47 p4 open file1 && 48 echo line3 >>file1 && 49 p4 submit -d "line3 in file1" 50 ) && 51 ( 52 cd "$git" && 53 git config git-p4.skipSubmitEdit true && 54 # this commit is okay 55 test_commit "first_commit_okay" && 56 # now this submit should cause a conflict 57 echo line4 >>file1 && 58 git add file1 && 59 git commit -m "line4 in file1 will conflict" && 60 test_expect_code 1 git p4 submit >out && 61 test_grep "Applied only the commits" out 62 ) 63' 64 65test_expect_success 'conflict on first of two commits, skip' ' 66 test_when_finished cleanup_git && 67 git p4 clone --dest="$git" //depot && 68 ( 69 cd "$cli" && 70 p4 open file1 && 71 echo line4 >>file1 && 72 p4 submit -d "line4 in file1" 73 ) && 74 ( 75 cd "$git" && 76 git config git-p4.skipSubmitEdit true && 77 # this submit should cause a conflict 78 echo line5 >>file1 && 79 git add file1 && 80 git commit -m "line5 in file1 will conflict" && 81 # but this commit is okay 82 test_commit "okay_commit_after_skip" && 83 echo s | test_expect_code 1 git p4 submit >out && 84 test_grep "Applied only the commits" out 85 ) 86' 87 88test_expect_success 'conflict on first of two commits, quit' ' 89 test_when_finished cleanup_git && 90 git p4 clone --dest="$git" //depot && 91 ( 92 cd "$cli" && 93 p4 open file1 && 94 echo line7 >>file1 && 95 p4 submit -d "line7 in file1" 96 ) && 97 ( 98 cd "$git" && 99 git config git-p4.skipSubmitEdit true && 100 # this submit should cause a conflict 101 echo line8 >>file1 && 102 git add file1 && 103 git commit -m "line8 in file1 will conflict" && 104 # but this commit is okay 105 test_commit "okay_commit_after_quit" && 106 echo q | test_expect_code 1 git p4 submit >out && 107 test_grep "No commits applied" out 108 ) 109' 110 111test_expect_success 'conflict cli and config options' ' 112 test_when_finished cleanup_git && 113 git p4 clone --dest="$git" //depot && 114 ( 115 cd "$git" && 116 git p4 submit --conflict=ask && 117 git p4 submit --conflict=skip && 118 git p4 submit --conflict=quit && 119 test_expect_code 2 git p4 submit --conflict=foo && 120 test_expect_code 2 git p4 submit --conflict && 121 git config git-p4.conflict foo && 122 test_expect_code 1 git p4 submit && 123 git config --unset git-p4.conflict && 124 git p4 submit 125 ) 126' 127 128test_expect_success 'conflict on first of two commits, --conflict=skip' ' 129 test_when_finished cleanup_git && 130 git p4 clone --dest="$git" //depot && 131 ( 132 cd "$cli" && 133 p4 open file1 && 134 echo line9 >>file1 && 135 p4 submit -d "line9 in file1" 136 ) && 137 ( 138 cd "$git" && 139 git config git-p4.skipSubmitEdit true && 140 # this submit should cause a conflict 141 echo line10 >>file1 && 142 git add file1 && 143 git commit -m "line10 in file1 will conflict" && 144 # but this commit is okay 145 test_commit "okay_commit_after_auto_skip" && 146 test_expect_code 1 git p4 submit --conflict=skip >out && 147 test_grep "Applied only the commits" out 148 ) 149' 150 151test_expect_success 'conflict on first of two commits, --conflict=quit' ' 152 test_when_finished cleanup_git && 153 git p4 clone --dest="$git" //depot && 154 ( 155 cd "$cli" && 156 p4 open file1 && 157 echo line11 >>file1 && 158 p4 submit -d "line11 in file1" 159 ) && 160 ( 161 cd "$git" && 162 git config git-p4.skipSubmitEdit true && 163 # this submit should cause a conflict 164 echo line12 >>file1 && 165 git add file1 && 166 git commit -m "line12 in file1 will conflict" && 167 # but this commit is okay 168 test_commit "okay_commit_after_auto_quit" && 169 test_expect_code 1 git p4 submit --conflict=quit >out && 170 test_grep "No commits applied" out 171 ) 172' 173 174# 175# Cleanup after submit fail, all cases. Some modifications happen 176# before trying to apply the patch. Make sure these are unwound 177# properly. Put each one in a diff along with something that will 178# obviously conflict. Make sure it is back to normal after. 179# 180 181test_expect_success 'cleanup edit p4 populate' ' 182 ( 183 cd "$cli" && 184 echo text file >text && 185 p4 add text && 186 echo text+x file >text+x && 187 chmod 755 text+x && 188 p4 add text+x && 189 p4 submit -d "populate p4" 190 ) 191' 192 193setup_conflict() { 194 # clone before modifying file1 to force it to conflict 195 test_when_finished cleanup_git && 196 git p4 clone --dest="$git" //depot && 197 # ticks outside subshells 198 test_tick && 199 ( 200 cd "$cli" && 201 p4 open file1 && 202 echo $test_tick >>file1 && 203 p4 submit -d "$test_tick in file1" 204 ) && 205 test_tick && 206 ( 207 cd "$git" && 208 git config git-p4.skipSubmitEdit true && 209 # easy conflict 210 echo $test_tick >>file1 && 211 git add file1 212 # caller will add more and submit 213 ) 214} 215 216test_expect_success 'cleanup edit after submit fail' ' 217 setup_conflict && 218 ( 219 cd "$git" && 220 echo another line >>text && 221 git add text && 222 git commit -m "conflict" && 223 test_expect_code 1 git p4 submit 224 ) && 225 ( 226 cd "$cli" && 227 # make sure it is not open 228 ! p4 fstat -T action text 229 ) 230' 231 232test_expect_success 'cleanup add after submit fail' ' 233 setup_conflict && 234 ( 235 cd "$git" && 236 echo new file >textnew && 237 git add textnew && 238 git commit -m "conflict" && 239 test_expect_code 1 git p4 submit 240 ) && 241 ( 242 cd "$cli" && 243 # make sure it is not there 244 # and that p4 thinks it is not added 245 # P4 returns 0 both for "not there but added" and 246 # "not there", so grep. 247 test_path_is_missing textnew && 248 p4 fstat -T action textnew 2>&1 | grep "no such file" 249 ) 250' 251 252test_expect_success 'cleanup delete after submit fail' ' 253 setup_conflict && 254 ( 255 cd "$git" && 256 git rm text+x && 257 git commit -m "conflict" && 258 test_expect_code 1 git p4 submit 259 ) && 260 ( 261 cd "$cli" && 262 # make sure it is there 263 test_path_is_file text+x && 264 ! p4 fstat -T action text+x 265 ) 266' 267 268test_expect_success 'cleanup copy after submit fail' ' 269 setup_conflict && 270 ( 271 cd "$git" && 272 cp text text2 && 273 git add text2 && 274 git commit -m "conflict" && 275 git config git-p4.detectCopies true && 276 git config git-p4.detectCopiesHarder true && 277 # make sure setup is okay 278 git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 && 279 test_expect_code 1 git p4 submit 280 ) && 281 ( 282 cd "$cli" && 283 test_path_is_missing text2 && 284 p4 fstat -T action text2 2>&1 | grep "no such file" 285 ) 286' 287 288test_expect_success 'cleanup rename after submit fail' ' 289 setup_conflict && 290 ( 291 cd "$git" && 292 git mv text text2 && 293 git commit -m "conflict" && 294 git config git-p4.detectRenames true && 295 # make sure setup is okay 296 git diff-tree -r -M HEAD | grep text2 | grep R100 && 297 test_expect_code 1 git p4 submit 298 ) && 299 ( 300 cd "$cli" && 301 test_path_is_missing text2 && 302 p4 fstat -T action text2 2>&1 | grep "no such file" 303 ) 304' 305 306# 307# Cleanup after deciding not to submit during editTemplate. This 308# involves unwinding more work, because files have been added, deleted 309# and chmod-ed now. Same approach as above. 310# 311 312test_expect_success 'cleanup edit after submit cancel' ' 313 test_when_finished cleanup_git && 314 git p4 clone --dest="$git" //depot && 315 ( 316 cd "$git" && 317 echo line >>text && 318 git add text && 319 git commit -m text && 320 echo n | test_expect_code 1 git p4 submit && 321 git reset --hard HEAD^ 322 ) && 323 ( 324 cd "$cli" && 325 ! p4 fstat -T action text && 326 test_cmp "$git"/text text 327 ) 328' 329 330test_expect_success 'cleanup add after submit cancel' ' 331 test_when_finished cleanup_git && 332 git p4 clone --dest="$git" //depot && 333 ( 334 cd "$git" && 335 echo line >textnew && 336 git add textnew && 337 git commit -m textnew && 338 echo n | test_expect_code 1 git p4 submit 339 ) && 340 ( 341 cd "$cli" && 342 test_path_is_missing textnew && 343 p4 fstat -T action textnew 2>&1 | grep "no such file" 344 ) 345' 346 347test_expect_success 'cleanup delete after submit cancel' ' 348 test_when_finished cleanup_git && 349 git p4 clone --dest="$git" //depot && 350 ( 351 cd "$git" && 352 git rm text && 353 git commit -m "rm text" && 354 echo n | test_expect_code 1 git p4 submit 355 ) && 356 ( 357 cd "$cli" && 358 test_path_is_file text && 359 ! p4 fstat -T action text 360 ) 361' 362 363test_expect_success 'cleanup copy after submit cancel' ' 364 test_when_finished cleanup_git && 365 git p4 clone --dest="$git" //depot && 366 ( 367 cd "$git" && 368 cp text text2 && 369 git add text2 && 370 git commit -m text2 && 371 git config git-p4.detectCopies true && 372 git config git-p4.detectCopiesHarder true && 373 git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 && 374 echo n | test_expect_code 1 git p4 submit 375 ) && 376 ( 377 cd "$cli" && 378 test_path_is_missing text2 && 379 p4 fstat -T action text2 2>&1 | grep "no such file" 380 ) 381' 382 383test_expect_success 'cleanup rename after submit cancel' ' 384 test_when_finished cleanup_git && 385 git p4 clone --dest="$git" //depot && 386 ( 387 cd "$git" && 388 git mv text text2 && 389 git commit -m text2 && 390 git config git-p4.detectRenames true && 391 git diff-tree -r -M HEAD | grep text2 | grep R100 && 392 echo n | test_expect_code 1 git p4 submit 393 ) && 394 ( 395 cd "$cli" && 396 test_path_is_missing text2 && 397 p4 fstat -T action text2 2>&1 | grep "no such file" && 398 test_path_is_file text && 399 ! p4 fstat -T action text 400 ) 401' 402 403test_expect_success 'cleanup chmod after submit cancel' ' 404 test_when_finished cleanup_git && 405 git p4 clone --dest="$git" //depot && 406 ( 407 cd "$git" && 408 test_chmod +x text && 409 test_chmod -x text+x && 410 git add text text+x && 411 git commit -m "chmod texts" && 412 echo n | test_expect_code 1 git p4 submit 413 ) && 414 ( 415 cd "$cli" && 416 test_path_is_file text && 417 ! p4 fstat -T action text && 418 test_path_is_file text+x && 419 ! p4 fstat -T action text+x && 420 ls -l text | grep -E ^-r-- && 421 ls -l text+x | grep -E ^-r-x 422 ) 423' 424 425test_done