e73d6ab6b2b7abd77d9cc17d61e0d1a024d637ab
   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_i18ngrep "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_i18ngrep "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_i18ngrep "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_i18ngrep "No commits applied" out
 108        )
 109'
 110
 111#
 112# Cleanup after submit fail, all cases.  Some modifications happen
 113# before trying to apply the patch.  Make sure these are unwound
 114# properly.  Put each one in a diff along with something that will
 115# obviously conflict.  Make sure it is back to normal after.
 116#
 117
 118test_expect_success 'cleanup edit p4 populate' '
 119        (
 120                cd "$cli" &&
 121                echo text file >text &&
 122                p4 add text &&
 123                echo text+x file >text+x &&
 124                chmod 755 text+x &&
 125                p4 add text+x &&
 126                p4 submit -d "populate p4"
 127        )
 128'
 129
 130setup_conflict() {
 131        # clone before modifying file1 to force it to conflict
 132        test_when_finished cleanup_git &&
 133        git p4 clone --dest="$git" //depot &&
 134        # ticks outside subshells
 135        test_tick &&
 136        (
 137                cd "$cli" &&
 138                p4 open file1 &&
 139                echo $test_tick >>file1 &&
 140                p4 submit -d "$test_tick in file1"
 141        ) &&
 142        test_tick &&
 143        (
 144                cd "$git" &&
 145                git config git-p4.skipSubmitEdit true &&
 146                # easy conflict
 147                echo $test_tick >>file1 &&
 148                git add file1
 149                # caller will add more and submit
 150        )
 151}
 152
 153test_expect_success 'cleanup edit after submit fail' '
 154        setup_conflict &&
 155        (
 156                cd "$git" &&
 157                echo another line >>text &&
 158                git add text &&
 159                git commit -m "conflict" &&
 160                test_expect_code 1 git p4 submit
 161        ) &&
 162        (
 163                cd "$cli" &&
 164                # make sure it is not open
 165                ! p4 fstat -T action text
 166        )
 167'
 168
 169test_expect_success 'cleanup add after submit fail' '
 170        setup_conflict &&
 171        (
 172                cd "$git" &&
 173                echo new file >textnew &&
 174                git add textnew &&
 175                git commit -m "conflict" &&
 176                test_expect_code 1 git p4 submit
 177        ) &&
 178        (
 179                cd "$cli" &&
 180                # make sure it is not there
 181                # and that p4 thinks it is not added
 182                #   P4 returns 0 both for "not there but added" and
 183                #   "not there", so grep.
 184                test_path_is_missing textnew &&
 185                p4 fstat -T action textnew 2>&1 | grep "no such file"
 186        )
 187'
 188
 189test_expect_success 'cleanup delete after submit fail' '
 190        setup_conflict &&
 191        (
 192                cd "$git" &&
 193                git rm text+x &&
 194                git commit -m "conflict" &&
 195                test_expect_code 1 git p4 submit
 196        ) &&
 197        (
 198                cd "$cli" &&
 199                # make sure it is there
 200                test_path_is_file text+x &&
 201                ! p4 fstat -T action text+x
 202        )
 203'
 204
 205test_expect_success 'cleanup copy after submit fail' '
 206        setup_conflict &&
 207        (
 208                cd "$git" &&
 209                cp text text2 &&
 210                git add text2 &&
 211                git commit -m "conflict" &&
 212                git config git-p4.detectCopies true &&
 213                git config git-p4.detectCopiesHarder true &&
 214                # make sure setup is okay
 215                git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 &&
 216                test_expect_code 1 git p4 submit
 217        ) &&
 218        (
 219                cd "$cli" &&
 220                test_path_is_missing text2 &&
 221                p4 fstat -T action text2 2>&1 | grep "no such file"
 222        )
 223'
 224
 225test_expect_success 'cleanup rename after submit fail' '
 226        setup_conflict &&
 227        (
 228                cd "$git" &&
 229                git mv text text2 &&
 230                git commit -m "conflict" &&
 231                git config git-p4.detectRenames true &&
 232                # make sure setup is okay
 233                git diff-tree -r -M HEAD | grep text2 | grep R100 &&
 234                test_expect_code 1 git p4 submit
 235        ) &&
 236        (
 237                cd "$cli" &&
 238                test_path_is_missing text2 &&
 239                p4 fstat -T action text2 2>&1 | grep "no such file"
 240        )
 241'
 242
 243test_expect_success 'kill p4d' '
 244        kill_p4d
 245'
 246
 247test_done