t / t9807-git-p4-submit.shon commit t9502: do not assume GNU tar (2060ed5)
   1#!/bin/sh
   2
   3test_description='git p4 submit'
   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                echo file1 >file1 &&
  15                p4 add file1 &&
  16                p4 submit -d "change 1"
  17        )
  18'
  19
  20test_expect_success 'submit with no client dir' '
  21        test_when_finished cleanup_git &&
  22        git p4 clone --dest="$git" //depot &&
  23        (
  24                cd "$git" &&
  25                echo file2 >file2 &&
  26                git add file2 &&
  27                git commit -m "git commit 2" &&
  28                rm -rf "$cli" &&
  29                git config git-p4.skipSubmitEdit true &&
  30                git p4 submit
  31        ) &&
  32        (
  33                cd "$cli" &&
  34                test_path_is_file file1 &&
  35                test_path_is_file file2
  36        )
  37'
  38
  39# make two commits, but tell it to apply only from HEAD^
  40test_expect_success 'submit --origin' '
  41        test_when_finished cleanup_git &&
  42        git p4 clone --dest="$git" //depot &&
  43        (
  44                cd "$git" &&
  45                test_commit "file3" &&
  46                test_commit "file4" &&
  47                git config git-p4.skipSubmitEdit true &&
  48                git p4 submit --origin=HEAD^
  49        ) &&
  50        (
  51                cd "$cli" &&
  52                test_path_is_missing "file3.t" &&
  53                test_path_is_file "file4.t"
  54        )
  55'
  56
  57test_expect_success 'submit --dry-run' '
  58        test_when_finished cleanup_git &&
  59        git p4 clone --dest="$git" //depot &&
  60        (
  61                cd "$git" &&
  62                test_commit "dry-run1" &&
  63                test_commit "dry-run2" &&
  64                git p4 submit --dry-run >out &&
  65                test_i18ngrep "Would apply" out
  66        ) &&
  67        (
  68                cd "$cli" &&
  69                test_path_is_missing "dry-run1.t" &&
  70                test_path_is_missing "dry-run2.t"
  71        )
  72'
  73
  74test_expect_success 'submit --dry-run --export-labels' '
  75        test_when_finished cleanup_git &&
  76        git p4 clone --dest="$git" //depot &&
  77        (
  78                cd "$git" &&
  79                echo dry-run1 >dry-run1 &&
  80                git add dry-run1 &&
  81                git commit -m "dry-run1" dry-run1 &&
  82                git config git-p4.skipSubmitEdit true &&
  83                git p4 submit &&
  84                echo dry-run2 >dry-run2 &&
  85                git add dry-run2 &&
  86                git commit -m "dry-run2" dry-run2 &&
  87                git tag -m "dry-run-tag1" dry-run-tag1 HEAD^ &&
  88                git p4 submit --dry-run --export-labels >out &&
  89                test_i18ngrep "Would create p4 label" out
  90        ) &&
  91        (
  92                cd "$cli" &&
  93                test_path_is_file "dry-run1" &&
  94                test_path_is_missing "dry-run2"
  95        )
  96'
  97
  98test_expect_success 'submit with allowSubmit' '
  99        test_when_finished cleanup_git &&
 100        git p4 clone --dest="$git" //depot &&
 101        (
 102                cd "$git" &&
 103                test_commit "file5" &&
 104                git config git-p4.skipSubmitEdit true &&
 105                git config git-p4.allowSubmit "nobranch" &&
 106                test_must_fail git p4 submit &&
 107                git config git-p4.allowSubmit "nobranch,master" &&
 108                git p4 submit
 109        )
 110'
 111
 112test_expect_success 'submit with master branch name from argv' '
 113        test_when_finished cleanup_git &&
 114        git p4 clone --dest="$git" //depot &&
 115        (
 116                cd "$git" &&
 117                test_commit "file6" &&
 118                git config git-p4.skipSubmitEdit true &&
 119                test_must_fail git p4 submit nobranch &&
 120                git branch otherbranch &&
 121                git reset --hard HEAD^ &&
 122                test_commit "file7" &&
 123                git p4 submit otherbranch
 124        ) &&
 125        (
 126                cd "$cli" &&
 127                test_path_is_file "file6.t" &&
 128                test_path_is_missing "file7.t"
 129        )
 130'
 131
 132#
 133# Basic submit tests, the five handled cases
 134#
 135
 136test_expect_success 'submit modify' '
 137        test_when_finished cleanup_git &&
 138        git p4 clone --dest="$git" //depot &&
 139        (
 140                cd "$git" &&
 141                git config git-p4.skipSubmitEdit true &&
 142                echo line >>file1 &&
 143                git add file1 &&
 144                git commit -m file1 &&
 145                git p4 submit
 146        ) &&
 147        (
 148                cd "$cli" &&
 149                test_path_is_file file1 &&
 150                test_line_count = 2 file1
 151        )
 152'
 153
 154test_expect_success 'submit add' '
 155        test_when_finished cleanup_git &&
 156        git p4 clone --dest="$git" //depot &&
 157        (
 158                cd "$git" &&
 159                git config git-p4.skipSubmitEdit true &&
 160                echo file13 >file13 &&
 161                git add file13 &&
 162                git commit -m file13 &&
 163                git p4 submit
 164        ) &&
 165        (
 166                cd "$cli" &&
 167                test_path_is_file file13
 168        )
 169'
 170
 171test_expect_success 'submit delete' '
 172        test_when_finished cleanup_git &&
 173        git p4 clone --dest="$git" //depot &&
 174        (
 175                cd "$git" &&
 176                git config git-p4.skipSubmitEdit true &&
 177                git rm file4.t &&
 178                git commit -m "delete file4.t" &&
 179                git p4 submit
 180        ) &&
 181        (
 182                cd "$cli" &&
 183                test_path_is_missing file4.t
 184        )
 185'
 186
 187test_expect_success 'submit copy' '
 188        test_when_finished cleanup_git &&
 189        git p4 clone --dest="$git" //depot &&
 190        (
 191                cd "$git" &&
 192                git config git-p4.skipSubmitEdit true &&
 193                git config git-p4.detectCopies true &&
 194                git config git-p4.detectCopiesHarder true &&
 195                cp file5.t file5.ta &&
 196                git add file5.ta &&
 197                git commit -m "copy to file5.ta" &&
 198                git p4 submit
 199        ) &&
 200        (
 201                cd "$cli" &&
 202                test_path_is_file file5.ta &&
 203                test ! -w file5.ta
 204        )
 205'
 206
 207test_expect_success 'submit rename' '
 208        test_when_finished cleanup_git &&
 209        git p4 clone --dest="$git" //depot &&
 210        (
 211                cd "$git" &&
 212                git config git-p4.skipSubmitEdit true &&
 213                git config git-p4.detectRenames true &&
 214                git mv file6.t file6.ta &&
 215                git commit -m "rename file6.t to file6.ta" &&
 216                git p4 submit
 217        ) &&
 218        (
 219                cd "$cli" &&
 220                test_path_is_missing file6.t &&
 221                test_path_is_file file6.ta &&
 222                test ! -w file6.ta
 223        )
 224'
 225
 226#
 227# Converting git commit message to p4 change description, including
 228# parsing out the optional Jobs: line.
 229#
 230test_expect_success 'simple one-line description' '
 231        test_when_finished cleanup_git &&
 232        git p4 clone --dest="$git" //depot &&
 233        (
 234                cd "$git" &&
 235                echo desc2 >desc2 &&
 236                git add desc2 &&
 237                cat >msg <<-EOF &&
 238                One-line description line for desc2.
 239                EOF
 240                git commit -F - <msg &&
 241                git config git-p4.skipSubmitEdit true &&
 242                git p4 submit &&
 243                change=$(p4 -G changes -m 1 //depot/... | \
 244                         marshal_dump change) &&
 245                # marshal_dump always adds a newline
 246                p4 -G describe $change | marshal_dump desc | sed \$d >pmsg &&
 247                test_cmp msg pmsg
 248        )
 249'
 250
 251test_expect_success 'description with odd formatting' '
 252        test_when_finished cleanup_git &&
 253        git p4 clone --dest="$git" //depot &&
 254        (
 255                cd "$git" &&
 256                echo desc3 >desc3 &&
 257                git add desc3 &&
 258                (
 259                        printf "subject line\n\n\tExtra tab\nline.\n\n" &&
 260                        printf "Description:\n\tBogus description marker\n\n" &&
 261                        # git commit eats trailing newlines; only use one
 262                        printf "Files:\n\tBogus descs marker\n"
 263                ) >msg &&
 264                git commit -F - <msg &&
 265                git config git-p4.skipSubmitEdit true &&
 266                git p4 submit &&
 267                change=$(p4 -G changes -m 1 //depot/... | \
 268                         marshal_dump change) &&
 269                # marshal_dump always adds a newline
 270                p4 -G describe $change | marshal_dump desc | sed \$d >pmsg &&
 271                test_cmp msg pmsg
 272        )
 273'
 274
 275make_job() {
 276        name="$1" &&
 277        tab="$(printf \\t)" &&
 278        p4 job -o | \
 279        sed -e "/^Job:/s/.*/Job: $name/" \
 280            -e "/^Description/{ n; s/.*/$tab job text/; }" | \
 281        p4 job -i
 282}
 283
 284test_expect_success 'description with Jobs section at end' '
 285        test_when_finished cleanup_git &&
 286        git p4 clone --dest="$git" //depot &&
 287        (
 288                cd "$git" &&
 289                echo desc4 >desc4 &&
 290                git add desc4 &&
 291                echo 6060842 >jobname &&
 292                (
 293                        printf "subject line\n\n\tExtra tab\nline.\n\n" &&
 294                        printf "Files:\n\tBogus files marker\n" &&
 295                        printf "Junk: 3164175\n" &&
 296                        printf "Jobs: $(cat jobname)\n"
 297                ) >msg &&
 298                git commit -F - <msg &&
 299                git config git-p4.skipSubmitEdit true &&
 300                # build a job
 301                make_job $(cat jobname) &&
 302                git p4 submit &&
 303                change=$(p4 -G changes -m 1 //depot/... | \
 304                         marshal_dump change) &&
 305                # marshal_dump always adds a newline
 306                p4 -G describe $change | marshal_dump desc | sed \$d >pmsg &&
 307                # make sure Jobs line and all following is gone
 308                sed "/^Jobs:/,\$d" msg >jmsg &&
 309                test_cmp jmsg pmsg &&
 310                # make sure p4 knows about job
 311                p4 -G describe $change | marshal_dump job0 >job0 &&
 312                test_cmp jobname job0
 313        )
 314'
 315
 316test_expect_success 'description with Jobs and values on separate lines' '
 317        test_when_finished cleanup_git &&
 318        git p4 clone --dest="$git" //depot &&
 319        (
 320                cd "$git" &&
 321                echo desc5 >desc5 &&
 322                git add desc5 &&
 323                echo PROJ-6060842 >jobname1 &&
 324                echo PROJ-6060847 >jobname2 &&
 325                (
 326                        printf "subject line\n\n\tExtra tab\nline.\n\n" &&
 327                        printf "Files:\n\tBogus files marker\n" &&
 328                        printf "Junk: 3164175\n" &&
 329                        printf "Jobs:\n" &&
 330                        printf "\t$(cat jobname1)\n" &&
 331                        printf "\t$(cat jobname2)\n"
 332                ) >msg &&
 333                git commit -F - <msg &&
 334                git config git-p4.skipSubmitEdit true &&
 335                # build two jobs
 336                make_job $(cat jobname1) &&
 337                make_job $(cat jobname2) &&
 338                git p4 submit &&
 339                change=$(p4 -G changes -m 1 //depot/... | \
 340                         marshal_dump change) &&
 341                # marshal_dump always adds a newline
 342                p4 -G describe $change | marshal_dump desc | sed \$d >pmsg &&
 343                # make sure Jobs line and all following is gone
 344                sed "/^Jobs:/,\$d" msg >jmsg &&
 345                test_cmp jmsg pmsg &&
 346                # make sure p4 knows about the two jobs
 347                p4 -G describe $change >change &&
 348                (
 349                        marshal_dump job0 <change &&
 350                        marshal_dump job1 <change
 351                ) | sort >jobs &&
 352                cat jobname1 jobname2 | sort >expected &&
 353                test_cmp expected jobs
 354        )
 355'
 356
 357test_expect_success 'description with Jobs section and bogus following text' '
 358        test_when_finished cleanup_git &&
 359        git p4 clone --dest="$git" //depot &&
 360        (
 361                cd "$git" &&
 362                echo desc6 >desc6 &&
 363                git add desc6 &&
 364                echo 6060843 >jobname &&
 365                (
 366                        printf "subject line\n\n\tExtra tab\nline.\n\n" &&
 367                        printf "Files:\n\tBogus files marker\n" &&
 368                        printf "Junk: 3164175\n" &&
 369                        printf "Jobs: $(cat jobname)\n" &&
 370                        printf "MoreJunk: 3711\n"
 371                ) >msg &&
 372                git commit -F - <msg &&
 373                git config git-p4.skipSubmitEdit true &&
 374                # build a job
 375                make_job $(cat jobname) &&
 376                test_must_fail git p4 submit 2>err &&
 377                test_i18ngrep "Unknown field name" err
 378        ) &&
 379        (
 380                cd "$cli" &&
 381                p4 revert desc6 &&
 382                rm desc6
 383        )
 384'
 385
 386test_expect_success 'submit --prepare-p4-only' '
 387        test_when_finished cleanup_git &&
 388        git p4 clone --dest="$git" //depot &&
 389        (
 390                cd "$git" &&
 391                echo prep-only-add >prep-only-add &&
 392                git add prep-only-add &&
 393                git commit -m "prep only add" &&
 394                git p4 submit --prepare-p4-only >out &&
 395                test_i18ngrep "prepared for submission" out &&
 396                test_i18ngrep "must be deleted" out
 397        ) &&
 398        (
 399                cd "$cli" &&
 400                test_path_is_file prep-only-add &&
 401                p4 fstat -T action prep-only-add | grep -w add
 402        )
 403'
 404
 405test_expect_success 'kill p4d' '
 406        kill_p4d
 407'
 408
 409test_done