t / t9809-git-p4-client-view.shon commit git-p4: fix submit regression with clientSpec and subdir clone (543987b)
   1#!/bin/sh
   2
   3test_description='git-p4 client view'
   4
   5. ./lib-git-p4.sh
   6
   7test_expect_success 'start p4d' '
   8        start_p4d
   9'
  10
  11#
  12# Construct a client with this list of View lines
  13#
  14client_view() {
  15        (
  16                cat <<-EOF &&
  17                Client: client
  18                Description: client
  19                Root: $cli
  20                View:
  21                EOF
  22                for arg ; do
  23                        printf "\t$arg\n"
  24                done
  25        ) | p4 client -i
  26}
  27
  28#
  29# Verify these files exist, exactly.  Caller creates
  30# a list of files in file "files".
  31#
  32check_files_exist() {
  33        ok=0 &&
  34        num=${#@} &&
  35        for arg ; do
  36                test_path_is_file "$arg" &&
  37                ok=$(($ok + 1))
  38        done &&
  39        test $ok -eq $num &&
  40        test_line_count = $num files
  41}
  42
  43#
  44# Sync up the p4 client, make sure the given files (and only
  45# those) exist.
  46#
  47client_verify() {
  48        (
  49                cd "$cli" &&
  50                p4 sync &&
  51                find . -type f ! -name files >files &&
  52                check_files_exist "$@"
  53        )
  54}
  55
  56#
  57# Make sure the named files, exactly, exist.
  58#
  59git_verify() {
  60        (
  61                cd "$git" &&
  62                git ls-files >files &&
  63                check_files_exist "$@"
  64        )
  65}
  66
  67# //depot
  68#   - dir1
  69#     - file11
  70#     - file12
  71#   - dir2
  72#     - file21
  73#     - file22
  74init_depot() {
  75        for d in 1 2 ; do
  76                mkdir -p dir$d &&
  77                for f in 1 2 ; do
  78                        echo dir$d/file$d$f >dir$d/file$d$f &&
  79                        p4 add dir$d/file$d$f &&
  80                        p4 submit -d "dir$d/file$d$f"
  81                done
  82        done &&
  83        find . -type f ! -name files >files &&
  84        check_files_exist dir1/file11 dir1/file12 \
  85                          dir2/file21 dir2/file22
  86}
  87
  88test_expect_success 'init depot' '
  89        (
  90                cd "$cli" &&
  91                init_depot
  92        )
  93'
  94
  95# double % for printf
  96test_expect_success 'unsupported view wildcard %%n' '
  97        client_view "//depot/%%%%1/sub/... //client/sub/%%%%1/..." &&
  98        test_when_finished cleanup_git &&
  99        test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
 100'
 101
 102test_expect_success 'unsupported view wildcard *' '
 103        client_view "//depot/*/bar/... //client/*/bar/..." &&
 104        test_when_finished cleanup_git &&
 105        test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
 106'
 107
 108test_expect_success 'wildcard ... only supported at end of spec' '
 109        client_view "//depot/.../file11 //client/.../file11" &&
 110        test_when_finished cleanup_git &&
 111        test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
 112'
 113
 114test_expect_success 'basic map' '
 115        client_view "//depot/dir1/... //client/cli1/..." &&
 116        files="cli1/file11 cli1/file12" &&
 117        client_verify $files &&
 118        test_when_finished cleanup_git &&
 119        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 120        git_verify $files
 121'
 122
 123test_expect_success 'client view with no mappings' '
 124        client_view &&
 125        client_verify &&
 126        test_when_finished cleanup_git &&
 127        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 128        git_verify
 129'
 130
 131test_expect_success 'single file map' '
 132        client_view "//depot/dir1/file11 //client/file11" &&
 133        files="file11" &&
 134        client_verify $files &&
 135        test_when_finished cleanup_git &&
 136        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 137        git_verify $files
 138'
 139
 140test_expect_success 'later mapping takes precedence (entire repo)' '
 141        client_view "//depot/dir1/... //client/cli1/..." \
 142                    "//depot/... //client/cli2/..." &&
 143        files="cli2/dir1/file11 cli2/dir1/file12
 144               cli2/dir2/file21 cli2/dir2/file22" &&
 145        client_verify $files &&
 146        test_when_finished cleanup_git &&
 147        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 148        git_verify $files
 149'
 150
 151test_expect_success 'later mapping takes precedence (partial repo)' '
 152        client_view "//depot/dir1/... //client/..." \
 153                    "//depot/dir2/... //client/..." &&
 154        files="file21 file22" &&
 155        client_verify $files &&
 156        test_when_finished cleanup_git &&
 157        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 158        git_verify $files
 159'
 160
 161# Reading the view backwards,
 162#   dir2 goes to cli12
 163#   dir1 cannot go to cli12 since it was filled by dir2
 164#   dir1 also does not go to cli3, since the second rule
 165#     noticed that it matched, but was already filled
 166test_expect_success 'depot path matching rejected client path' '
 167        client_view "//depot/dir1/... //client/cli3/..." \
 168                    "//depot/dir1/... //client/cli12/..." \
 169                    "//depot/dir2/... //client/cli12/..." &&
 170        files="cli12/file21 cli12/file22" &&
 171        client_verify $files &&
 172        test_when_finished cleanup_git &&
 173        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 174        git_verify $files
 175'
 176
 177# since both have the same //client/..., the exclusion
 178# rule keeps everything out
 179test_expect_success 'exclusion wildcard, client rhs same (odd)' '
 180        client_view "//depot/... //client/..." \
 181                    "-//depot/dir2/... //client/..." &&
 182        client_verify &&
 183        test_when_finished cleanup_git &&
 184        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 185        git_verify
 186'
 187
 188test_expect_success 'exclusion wildcard, client rhs different (normal)' '
 189        client_view "//depot/... //client/..." \
 190                    "-//depot/dir2/... //client/dir2/..." &&
 191        files="dir1/file11 dir1/file12" &&
 192        client_verify $files &&
 193        test_when_finished cleanup_git &&
 194        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 195        git_verify $files
 196'
 197
 198test_expect_success 'exclusion single file' '
 199        client_view "//depot/... //client/..." \
 200                    "-//depot/dir2/file22 //client/file22" &&
 201        files="dir1/file11 dir1/file12 dir2/file21" &&
 202        client_verify $files &&
 203        test_when_finished cleanup_git &&
 204        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 205        git_verify $files
 206'
 207
 208test_expect_success 'overlay wildcard' '
 209        client_view "//depot/dir1/... //client/cli/..." \
 210                    "+//depot/dir2/... //client/cli/...\n" &&
 211        files="cli/file11 cli/file12 cli/file21 cli/file22" &&
 212        client_verify $files &&
 213        test_when_finished cleanup_git &&
 214        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 215        git_verify $files
 216'
 217
 218test_expect_success 'overlay single file' '
 219        client_view "//depot/dir1/... //client/cli/..." \
 220                    "+//depot/dir2/file21 //client/cli/file21" &&
 221        files="cli/file11 cli/file12 cli/file21" &&
 222        client_verify $files &&
 223        test_when_finished cleanup_git &&
 224        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 225        git_verify $files
 226'
 227
 228test_expect_success 'exclusion with later inclusion' '
 229        client_view "//depot/... //client/..." \
 230                    "-//depot/dir2/... //client/dir2/..." \
 231                    "//depot/dir2/... //client/dir2incl/..." &&
 232        files="dir1/file11 dir1/file12 dir2incl/file21 dir2incl/file22" &&
 233        client_verify $files &&
 234        test_when_finished cleanup_git &&
 235        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 236        git_verify $files
 237'
 238
 239test_expect_success 'quotes on rhs only' '
 240        client_view "//depot/dir1/... \"//client/cdir 1/...\"" &&
 241        client_verify "cdir 1/file11" "cdir 1/file12" &&
 242        test_when_finished cleanup_git &&
 243        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 244        git_verify "cdir 1/file11" "cdir 1/file12"
 245'
 246
 247#
 248# Submit tests
 249#
 250
 251# clone sets variable
 252test_expect_success 'clone --use-client-spec sets useClientSpec' '
 253        client_view "//depot/... //client/..." &&
 254        test_when_finished cleanup_git &&
 255        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 256        (
 257                cd "$git" &&
 258                git config --bool git-p4.useClientSpec >actual &&
 259                echo true >true &&
 260                test_cmp actual true
 261        )
 262'
 263
 264# clone just a subdir of the client spec
 265test_expect_success 'subdir clone' '
 266        client_view "//depot/... //client/..." &&
 267        files="dir1/file11 dir1/file12 dir2/file21 dir2/file22" &&
 268        client_verify $files &&
 269        test_when_finished cleanup_git &&
 270        "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
 271        git_verify dir1/file11 dir1/file12
 272'
 273
 274#
 275# submit back, see what happens:  five cases
 276#
 277test_expect_success 'subdir clone, submit modify' '
 278        client_view "//depot/... //client/..." &&
 279        test_when_finished cleanup_git &&
 280        "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
 281        (
 282                cd "$git" &&
 283                git config git-p4.skipSubmitEdit true &&
 284                echo line >>dir1/file12 &&
 285                git add dir1/file12 &&
 286                git commit -m dir1/file12 &&
 287                "$GITP4" submit
 288        ) &&
 289        (
 290                cd "$cli" &&
 291                test_path_is_file dir1/file12 &&
 292                test_line_count = 2 dir1/file12
 293        )
 294'
 295
 296test_expect_success 'subdir clone, submit add' '
 297        client_view "//depot/... //client/..." &&
 298        test_when_finished cleanup_git &&
 299        "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
 300        (
 301                cd "$git" &&
 302                git config git-p4.skipSubmitEdit true &&
 303                echo file13 >dir1/file13 &&
 304                git add dir1/file13 &&
 305                git commit -m dir1/file13 &&
 306                "$GITP4" submit
 307        ) &&
 308        (
 309                cd "$cli" &&
 310                test_path_is_file dir1/file13
 311        )
 312'
 313
 314test_expect_success 'subdir clone, submit delete' '
 315        client_view "//depot/... //client/..." &&
 316        test_when_finished cleanup_git &&
 317        "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
 318        (
 319                cd "$git" &&
 320                git config git-p4.skipSubmitEdit true &&
 321                git rm dir1/file12 &&
 322                git commit -m "delete dir1/file12" &&
 323                "$GITP4" submit
 324        ) &&
 325        (
 326                cd "$cli" &&
 327                test_path_is_missing dir1/file12
 328        )
 329'
 330
 331test_expect_success 'subdir clone, submit copy' '
 332        client_view "//depot/... //client/..." &&
 333        test_when_finished cleanup_git &&
 334        "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
 335        (
 336                cd "$git" &&
 337                git config git-p4.skipSubmitEdit true &&
 338                git config git-p4.detectCopies true &&
 339                cp dir1/file11 dir1/file11a &&
 340                git add dir1/file11a &&
 341                git commit -m "copy to dir1/file11a" &&
 342                "$GITP4" submit
 343        ) &&
 344        (
 345                cd "$cli" &&
 346                test_path_is_file dir1/file11a
 347        )
 348'
 349
 350test_expect_success 'subdir clone, submit rename' '
 351        client_view "//depot/... //client/..." &&
 352        test_when_finished cleanup_git &&
 353        "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
 354        (
 355                cd "$git" &&
 356                git config git-p4.skipSubmitEdit true &&
 357                git config git-p4.detectRenames true &&
 358                git mv dir1/file13 dir1/file13a &&
 359                git commit -m "rename dir1/file13 to dir1/file13a" &&
 360                "$GITP4" submit
 361        ) &&
 362        (
 363                cd "$cli" &&
 364                test_path_is_missing dir1/file13 &&
 365                test_path_is_file dir1/file13a
 366        )
 367'
 368
 369test_expect_success 'reinit depot' '
 370        (
 371                cd "$cli" &&
 372                p4 sync -f &&
 373                rm files &&
 374                p4 delete */* &&
 375                p4 submit -d "delete all files" &&
 376                init_depot
 377        )
 378'
 379
 380#
 381# Rename directories to test quoting in depot-side mappings
 382# //depot
 383#    - "dir 1"
 384#       - file11
 385#       - file12
 386#    - "dir 2"
 387#       - file21
 388#       - file22
 389#
 390test_expect_success 'rename files to introduce spaces' '
 391        client_view "//depot/... //client/..." &&
 392        client_verify dir1/file11 dir1/file12 \
 393                      dir2/file21 dir2/file22 &&
 394        (
 395                cd "$cli" &&
 396                p4 open dir1/... &&
 397                p4 move dir1/... "dir 1"/... &&
 398                p4 open dir2/... &&
 399                p4 move dir2/... "dir 2"/... &&
 400                p4 submit -d "rename with spaces"
 401        ) &&
 402        client_verify "dir 1/file11" "dir 1/file12" \
 403                      "dir 2/file21" "dir 2/file22"
 404'
 405
 406test_expect_success 'quotes on lhs only' '
 407        client_view "\"//depot/dir 1/...\" //client/cdir1/..." &&
 408        files="cdir1/file11 cdir1/file12" &&
 409        client_verify $files &&
 410        test_when_finished cleanup_git &&
 411        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 412        client_verify $files
 413'
 414
 415test_expect_success 'quotes on both sides' '
 416        client_view "\"//depot/dir 1/...\" \"//client/cdir 1/...\"" &&
 417        client_verify "cdir 1/file11" "cdir 1/file12" &&
 418        test_when_finished cleanup_git &&
 419        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 420        git_verify "cdir 1/file11" "cdir 1/file12"
 421'
 422
 423test_expect_success 'kill p4d' '
 424        kill_p4d
 425'
 426
 427test_done