t / t9809-git-p4-client-view.shon commit Merge branch 'nk/ctype-for-perf' into maint (f342afa)
   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
  74test_expect_success 'init depot' '
  75        (
  76                cd "$cli" &&
  77                for d in 1 2 ; do
  78                        mkdir -p dir$d &&
  79                        for f in 1 2 ; do
  80                                echo dir$d/file$d$f >dir$d/file$d$f &&
  81                                p4 add dir$d/file$d$f &&
  82                                p4 submit -d "dir$d/file$d$f"
  83                        done
  84                done &&
  85                find . -type f ! -name files >files &&
  86                check_files_exist dir1/file11 dir1/file12 \
  87                                  dir2/file21 dir2/file22
  88        )
  89'
  90
  91# double % for printf
  92test_expect_success 'unsupported view wildcard %%n' '
  93        client_view "//depot/%%%%1/sub/... //client/sub/%%%%1/..." &&
  94        test_when_finished cleanup_git &&
  95        test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
  96'
  97
  98test_expect_success 'unsupported view wildcard *' '
  99        client_view "//depot/*/bar/... //client/*/bar/..." &&
 100        test_when_finished cleanup_git &&
 101        test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
 102'
 103
 104test_expect_success 'wildcard ... only supported at end of spec' '
 105        client_view "//depot/.../file11 //client/.../file11" &&
 106        test_when_finished cleanup_git &&
 107        test_must_fail "$GITP4" clone --use-client-spec --dest="$git" //depot
 108'
 109
 110test_expect_success 'basic map' '
 111        client_view "//depot/dir1/... //client/cli1/..." &&
 112        files="cli1/file11 cli1/file12" &&
 113        client_verify $files &&
 114        test_when_finished cleanup_git &&
 115        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 116        git_verify $files
 117'
 118
 119test_expect_success 'client view with no mappings' '
 120        client_view &&
 121        client_verify &&
 122        test_when_finished cleanup_git &&
 123        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 124        git_verify
 125'
 126
 127test_expect_success 'single file map' '
 128        client_view "//depot/dir1/file11 //client/file11" &&
 129        files="file11" &&
 130        client_verify $files &&
 131        test_when_finished cleanup_git &&
 132        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 133        git_verify $files
 134'
 135
 136test_expect_success 'later mapping takes precedence (entire repo)' '
 137        client_view "//depot/dir1/... //client/cli1/..." \
 138                    "//depot/... //client/cli2/..." &&
 139        files="cli2/dir1/file11 cli2/dir1/file12
 140               cli2/dir2/file21 cli2/dir2/file22" &&
 141        client_verify $files &&
 142        test_when_finished cleanup_git &&
 143        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 144        git_verify $files
 145'
 146
 147test_expect_success 'later mapping takes precedence (partial repo)' '
 148        client_view "//depot/dir1/... //client/..." \
 149                    "//depot/dir2/... //client/..." &&
 150        files="file21 file22" &&
 151        client_verify $files &&
 152        test_when_finished cleanup_git &&
 153        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 154        git_verify $files
 155'
 156
 157# Reading the view backwards,
 158#   dir2 goes to cli12
 159#   dir1 cannot go to cli12 since it was filled by dir2
 160#   dir1 also does not go to cli3, since the second rule
 161#     noticed that it matched, but was already filled
 162test_expect_success 'depot path matching rejected client path' '
 163        client_view "//depot/dir1/... //client/cli3/..." \
 164                    "//depot/dir1/... //client/cli12/..." \
 165                    "//depot/dir2/... //client/cli12/..." &&
 166        files="cli12/file21 cli12/file22" &&
 167        client_verify $files &&
 168        test_when_finished cleanup_git &&
 169        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 170        git_verify $files
 171'
 172
 173# since both have the same //client/..., the exclusion
 174# rule keeps everything out
 175test_expect_success 'exclusion wildcard, client rhs same (odd)' '
 176        client_view "//depot/... //client/..." \
 177                    "-//depot/dir2/... //client/..." &&
 178        client_verify &&
 179        test_when_finished cleanup_git &&
 180        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 181        git_verify
 182'
 183
 184test_expect_success 'exclusion wildcard, client rhs different (normal)' '
 185        client_view "//depot/... //client/..." \
 186                    "-//depot/dir2/... //client/dir2/..." &&
 187        files="dir1/file11 dir1/file12" &&
 188        client_verify $files &&
 189        test_when_finished cleanup_git &&
 190        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 191        git_verify $files
 192'
 193
 194test_expect_success 'exclusion single file' '
 195        client_view "//depot/... //client/..." \
 196                    "-//depot/dir2/file22 //client/file22" &&
 197        files="dir1/file11 dir1/file12 dir2/file21" &&
 198        client_verify $files &&
 199        test_when_finished cleanup_git &&
 200        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 201        git_verify $files
 202'
 203
 204test_expect_success 'overlay wildcard' '
 205        client_view "//depot/dir1/... //client/cli/..." \
 206                    "+//depot/dir2/... //client/cli/...\n" &&
 207        files="cli/file11 cli/file12 cli/file21 cli/file22" &&
 208        client_verify $files &&
 209        test_when_finished cleanup_git &&
 210        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 211        git_verify $files
 212'
 213
 214test_expect_success 'overlay single file' '
 215        client_view "//depot/dir1/... //client/cli/..." \
 216                    "+//depot/dir2/file21 //client/cli/file21" &&
 217        files="cli/file11 cli/file12 cli/file21" &&
 218        client_verify $files &&
 219        test_when_finished cleanup_git &&
 220        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 221        git_verify $files
 222'
 223
 224test_expect_success 'exclusion with later inclusion' '
 225        client_view "//depot/... //client/..." \
 226                    "-//depot/dir2/... //client/dir2/..." \
 227                    "//depot/dir2/... //client/dir2incl/..." &&
 228        files="dir1/file11 dir1/file12 dir2incl/file21 dir2incl/file22" &&
 229        client_verify $files &&
 230        test_when_finished cleanup_git &&
 231        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 232        git_verify $files
 233'
 234
 235test_expect_success 'quotes on rhs only' '
 236        client_view "//depot/dir1/... \"//client/cdir 1/...\"" &&
 237        client_verify "cdir 1/file11" "cdir 1/file12" &&
 238        test_when_finished cleanup_git &&
 239        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 240        git_verify "cdir 1/file11" "cdir 1/file12"
 241'
 242
 243#
 244# Rename directories to test quoting in depot-side mappings
 245# //depot
 246#    - "dir 1"
 247#       - file11
 248#       - file12
 249#    - "dir 2"
 250#       - file21
 251#       - file22
 252#
 253test_expect_success 'rename files to introduce spaces' '
 254        client_view "//depot/... //client/..." &&
 255        client_verify dir1/file11 dir1/file12 \
 256                      dir2/file21 dir2/file22 &&
 257        (
 258                cd "$cli" &&
 259                p4 open dir1/... &&
 260                p4 move dir1/... "dir 1"/... &&
 261                p4 open dir2/... &&
 262                p4 move dir2/... "dir 2"/... &&
 263                p4 submit -d "rename with spaces"
 264        ) &&
 265        client_verify "dir 1/file11" "dir 1/file12" \
 266                      "dir 2/file21" "dir 2/file22"
 267'
 268
 269test_expect_success 'quotes on lhs only' '
 270        client_view "\"//depot/dir 1/...\" //client/cdir1/..." &&
 271        files="cdir1/file11 cdir1/file12" &&
 272        client_verify $files &&
 273        test_when_finished cleanup_git &&
 274        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 275        client_verify $files
 276'
 277
 278test_expect_success 'quotes on both sides' '
 279        client_view "\"//depot/dir 1/...\" \"//client/cdir 1/...\"" &&
 280        client_verify "cdir 1/file11" "cdir 1/file12" &&
 281        test_when_finished cleanup_git &&
 282        "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 283        git_verify "cdir 1/file11" "cdir 1/file12"
 284'
 285
 286test_expect_success 'kill p4d' '
 287        kill_p4d
 288'
 289
 290test_done