t / t9801-git-p4-branch.shon commit Merge branch 'ss/fix-config-fd-leak' into maint (8136099)
   1#!/bin/sh
   2
   3test_description='git p4 tests for p4 branches'
   4
   5. ./lib-git-p4.sh
   6
   7test_expect_success 'start p4d' '
   8        start_p4d
   9'
  10
  11#
  12# 1: //depot/main/f1
  13# 2: //depot/main/f2
  14# 3: integrate //depot/main/... -> //depot/branch1/...
  15# 4: //depot/main/f4
  16# 5: //depot/branch1/f5
  17# .: named branch branch2
  18# 6: integrate -b branch2
  19# 7: //depot/branch2/f7
  20# 8: //depot/main/f8
  21#
  22test_expect_success 'basic p4 branches' '
  23        (
  24                cd "$cli" &&
  25                mkdir -p main &&
  26
  27                echo f1 >main/f1 &&
  28                p4 add main/f1 &&
  29                p4 submit -d "main/f1" &&
  30
  31                echo f2 >main/f2 &&
  32                p4 add main/f2 &&
  33                p4 submit -d "main/f2" &&
  34
  35                p4 integrate //depot/main/... //depot/branch1/... &&
  36                p4 submit -d "integrate main to branch1" &&
  37
  38                echo f4 >main/f4 &&
  39                p4 add main/f4 &&
  40                p4 submit -d "main/f4" &&
  41
  42                echo f5 >branch1/f5 &&
  43                p4 add branch1/f5 &&
  44                p4 submit -d "branch1/f5" &&
  45
  46                p4 branch -i <<-EOF &&
  47                Branch: branch2
  48                View: //depot/main/... //depot/branch2/...
  49                EOF
  50
  51                p4 integrate -b branch2 &&
  52                p4 submit -d "integrate main to branch2" &&
  53
  54                echo f7 >branch2/f7 &&
  55                p4 add branch2/f7 &&
  56                p4 submit -d "branch2/f7" &&
  57
  58                echo f8 >main/f8 &&
  59                p4 add main/f8 &&
  60                p4 submit -d "main/f8"
  61        )
  62'
  63
  64test_expect_success 'import main, no branch detection' '
  65        test_when_finished cleanup_git &&
  66        git p4 clone --dest="$git" //depot/main@all &&
  67        (
  68                cd "$git" &&
  69                git log --oneline --graph --decorate --all &&
  70                git rev-list master >wc &&
  71                test_line_count = 4 wc
  72        )
  73'
  74
  75test_expect_success 'import branch1, no branch detection' '
  76        test_when_finished cleanup_git &&
  77        git p4 clone --dest="$git" //depot/branch1@all &&
  78        (
  79                cd "$git" &&
  80                git log --oneline --graph --decorate --all &&
  81                git rev-list master >wc &&
  82                test_line_count = 2 wc
  83        )
  84'
  85
  86test_expect_success 'import branch2, no branch detection' '
  87        test_when_finished cleanup_git &&
  88        git p4 clone --dest="$git" //depot/branch2@all &&
  89        (
  90                cd "$git" &&
  91                git log --oneline --graph --decorate --all &&
  92                git rev-list master >wc &&
  93                test_line_count = 2 wc
  94        )
  95'
  96
  97test_expect_success 'import depot, no branch detection' '
  98        test_when_finished cleanup_git &&
  99        git p4 clone --dest="$git" //depot@all &&
 100        (
 101                cd "$git" &&
 102                git log --oneline --graph --decorate --all &&
 103                git rev-list master >wc &&
 104                test_line_count = 8 wc
 105        )
 106'
 107
 108test_expect_success 'import depot, branch detection' '
 109        test_when_finished cleanup_git &&
 110        git p4 clone --dest="$git" --detect-branches //depot@all &&
 111        (
 112                cd "$git" &&
 113
 114                git log --oneline --graph --decorate --all &&
 115
 116                # 4 main commits
 117                git rev-list master >wc &&
 118                test_line_count = 4 wc &&
 119
 120                # 3 main, 1 integrate, 1 on branch2
 121                git rev-list p4/depot/branch2 >wc &&
 122                test_line_count = 5 wc &&
 123
 124                # no branch1, since no p4 branch created for it
 125                test_must_fail git show-ref p4/depot/branch1
 126        )
 127'
 128
 129test_expect_success 'import depot, branch detection, branchList branch definition' '
 130        test_when_finished cleanup_git &&
 131        test_create_repo "$git" &&
 132        (
 133                cd "$git" &&
 134                git config git-p4.branchList main:branch1 &&
 135                git p4 clone --dest=. --detect-branches //depot@all &&
 136
 137                git log --oneline --graph --decorate --all &&
 138
 139                # 4 main commits
 140                git rev-list master >wc &&
 141                test_line_count = 4 wc &&
 142
 143                # 3 main, 1 integrate, 1 on branch2
 144                git rev-list p4/depot/branch2 >wc &&
 145                test_line_count = 5 wc &&
 146
 147                # 2 main, 1 integrate, 1 on branch1
 148                git rev-list p4/depot/branch1 >wc &&
 149                test_line_count = 4 wc
 150        )
 151'
 152
 153test_expect_success 'restart p4d' '
 154        kill_p4d &&
 155        start_p4d
 156'
 157
 158#
 159# 1: //depot/branch1/file1
 160#    //depot/branch1/file2
 161# 2: integrate //depot/branch1/... -> //depot/branch2/...
 162# 3: //depot/branch1/file3
 163# 4: //depot/branch1/file2 (edit)
 164# 5: integrate //depot/branch1/... -> //depot/branch3/...
 165#
 166## Create a simple branch structure in P4 depot.
 167test_expect_success 'add simple p4 branches' '
 168        (
 169                cd "$cli" &&
 170                mkdir branch1 &&
 171                cd branch1 &&
 172                echo file1 >file1 &&
 173                echo file2 >file2 &&
 174                p4 add file1 file2 &&
 175                p4 submit -d "Create branch1" &&
 176                p4 integrate //depot/branch1/... //depot/branch2/... &&
 177                p4 submit -d "Integrate branch2 from branch1" &&
 178                echo file3 >file3 &&
 179                p4 add file3 &&
 180                p4 submit -d "add file3 in branch1" &&
 181                p4 open file2 &&
 182                echo update >>file2 &&
 183                p4 submit -d "update file2 in branch1" &&
 184                p4 integrate //depot/branch1/... //depot/branch3/... &&
 185                p4 submit -d "Integrate branch3 from branch1"
 186        )
 187'
 188
 189# Configure branches through git-config and clone them.
 190# All files are tested to make sure branches were cloned correctly.
 191# Finally, make an update to branch1 on P4 side to check if it is imported
 192# correctly by git p4.
 193test_expect_success 'git p4 clone simple branches' '
 194        test_when_finished cleanup_git &&
 195        test_create_repo "$git" &&
 196        (
 197                cd "$git" &&
 198                git config git-p4.branchList branch1:branch2 &&
 199                git config --add git-p4.branchList branch1:branch3 &&
 200                git p4 clone --dest=. --detect-branches //depot@all &&
 201                git log --all --graph --decorate --stat &&
 202                git reset --hard p4/depot/branch1 &&
 203                test -f file1 &&
 204                test -f file2 &&
 205                test -f file3 &&
 206                grep update file2 &&
 207                git reset --hard p4/depot/branch2 &&
 208                test -f file1 &&
 209                test -f file2 &&
 210                test ! -f file3 &&
 211                ! grep update file2 &&
 212                git reset --hard p4/depot/branch3 &&
 213                test -f file1 &&
 214                test -f file2 &&
 215                test -f file3 &&
 216                grep update file2 &&
 217                cd "$cli" &&
 218                cd branch1 &&
 219                p4 edit file2 &&
 220                echo file2_ >>file2 &&
 221                p4 submit -d "update file2 in branch1" &&
 222                cd "$git" &&
 223                git reset --hard p4/depot/branch1 &&
 224                git p4 rebase &&
 225                grep file2_ file2
 226        )
 227'
 228
 229# Create a complex branch structure in P4 depot to check if they are correctly
 230# cloned. The branches are created from older changelists to check if git p4 is
 231# able to correctly detect them.
 232# The final expected structure is:
 233# `branch1
 234# | `- file1
 235# | `- file2 (updated)
 236# | `- file3
 237# `branch2
 238# | `- file1
 239# | `- file2
 240# `branch3
 241# | `- file1
 242# | `- file2 (updated)
 243# | `- file3
 244# `branch4
 245# | `- file1
 246# | `- file2
 247# `branch5
 248#   `- file1
 249#   `- file2
 250#   `- file3
 251test_expect_success 'git p4 add complex branches' '
 252        (
 253                cd "$cli" &&
 254                changelist=$(p4 changes -m1 //depot/... | cut -d" " -f2) &&
 255                changelist=$(($changelist - 5)) &&
 256                p4 integrate //depot/branch1/...@$changelist //depot/branch4/... &&
 257                p4 submit -d "Integrate branch4 from branch1@${changelist}" &&
 258                changelist=$(($changelist + 2)) &&
 259                p4 integrate //depot/branch1/...@$changelist //depot/branch5/... &&
 260                p4 submit -d "Integrate branch5 from branch1@${changelist}"
 261        )
 262'
 263
 264# Configure branches through git-config and clone them. git p4 will only be able
 265# to clone the original structure if it is able to detect the origin changelist
 266# of each branch.
 267test_expect_success 'git p4 clone complex branches' '
 268        test_when_finished cleanup_git &&
 269        test_create_repo "$git" &&
 270        (
 271                cd "$git" &&
 272                git config git-p4.branchList branch1:branch2 &&
 273                git config --add git-p4.branchList branch1:branch3 &&
 274                git config --add git-p4.branchList branch1:branch4 &&
 275                git config --add git-p4.branchList branch1:branch5 &&
 276                git p4 clone --dest=. --detect-branches //depot@all &&
 277                git log --all --graph --decorate --stat &&
 278                git reset --hard p4/depot/branch1 &&
 279                test_path_is_file file1 &&
 280                test_path_is_file file2 &&
 281                test_path_is_file file3 &&
 282                grep update file2 &&
 283                git reset --hard p4/depot/branch2 &&
 284                test_path_is_file file1 &&
 285                test_path_is_file file2 &&
 286                test_path_is_missing file3 &&
 287                ! grep update file2 &&
 288                git reset --hard p4/depot/branch3 &&
 289                test_path_is_file file1 &&
 290                test_path_is_file file2 &&
 291                test_path_is_file file3 &&
 292                grep update file2 &&
 293                git reset --hard p4/depot/branch4 &&
 294                test_path_is_file file1 &&
 295                test_path_is_file file2 &&
 296                test_path_is_missing file3 &&
 297                ! grep update file2 &&
 298                git reset --hard p4/depot/branch5 &&
 299                test_path_is_file file1 &&
 300                test_path_is_file file2 &&
 301                test_path_is_file file3 &&
 302                ! grep update file2 &&
 303                test_path_is_missing .git/git-p4-tmp
 304        )
 305'
 306
 307# Move branch3/file3 to branch4/file3 in a single changelist
 308test_expect_success 'git p4 submit to two branches in a single changelist' '
 309        (
 310                cd "$cli" &&
 311                p4 integrate //depot/branch3/file3 //depot/branch4/file3 &&
 312                p4 delete //depot/branch3/file3 &&
 313                p4 submit -d "Move branch3/file3 to branch4/file3"
 314        )
 315'
 316
 317# Confirm that changes to two branches done in a single changelist
 318# are correctly imported by git p4
 319test_expect_success 'git p4 sync changes to two branches in the same changelist' '
 320        test_when_finished cleanup_git &&
 321        test_create_repo "$git" &&
 322        (
 323                cd "$git" &&
 324                git config git-p4.branchList branch1:branch2 &&
 325                git config --add git-p4.branchList branch1:branch3 &&
 326                git config --add git-p4.branchList branch1:branch4 &&
 327                git config --add git-p4.branchList branch1:branch5 &&
 328                git p4 clone --dest=. --detect-branches //depot@all &&
 329                git log --all --graph --decorate --stat &&
 330                git reset --hard p4/depot/branch1 &&
 331                test_path_is_file file1 &&
 332                test_path_is_file file2 &&
 333                test_path_is_file file3 &&
 334                grep update file2 &&
 335                git reset --hard p4/depot/branch2 &&
 336                test_path_is_file file1 &&
 337                test_path_is_file file2 &&
 338                test_path_is_missing file3 &&
 339                ! grep update file2 &&
 340                git reset --hard p4/depot/branch3 &&
 341                test_path_is_file file1 &&
 342                test_path_is_file file2 &&
 343                test_path_is_missing file3 &&
 344                grep update file2 &&
 345                git reset --hard p4/depot/branch4 &&
 346                test_path_is_file file1 &&
 347                test_path_is_file file2 &&
 348                test_path_is_file file3 &&
 349                ! grep update file2 &&
 350                git reset --hard p4/depot/branch5 &&
 351                test_path_is_file file1 &&
 352                test_path_is_file file2 &&
 353                test_path_is_file file3 &&
 354                ! grep update file2 &&
 355                test_path_is_missing .git/git-p4-tmp
 356        )
 357'
 358
 359# Create a branch by integrating a single file
 360test_expect_success 'git p4 file subset branch' '
 361        (
 362                cd "$cli" &&
 363                p4 integrate //depot/branch1/file1 //depot/branch6/file1 &&
 364                p4 submit -d "Integrate file1 alone from branch1 to branch6"
 365        )
 366'
 367
 368# Check if git p4 creates a new branch containing a single file,
 369# instead of keeping the old files from the original branch
 370test_expect_failure 'git p4 clone file subset branch' '
 371        test_when_finished cleanup_git &&
 372        test_create_repo "$git" &&
 373        (
 374                cd "$git" &&
 375                git config git-p4.branchList branch1:branch2 &&
 376                git config --add git-p4.branchList branch1:branch3 &&
 377                git config --add git-p4.branchList branch1:branch4 &&
 378                git config --add git-p4.branchList branch1:branch5 &&
 379                git config --add git-p4.branchList branch1:branch6 &&
 380                git p4 clone --dest=. --detect-branches //depot@all &&
 381                git log --all --graph --decorate --stat &&
 382                git reset --hard p4/depot/branch1 &&
 383                test_path_is_file file1 &&
 384                test_path_is_file file2 &&
 385                test_path_is_file file3 &&
 386                grep update file2 &&
 387                git reset --hard p4/depot/branch2 &&
 388                test_path_is_file file1 &&
 389                test_path_is_file file2 &&
 390                test_path_is_missing file3 &&
 391                ! grep update file2 &&
 392                git reset --hard p4/depot/branch3 &&
 393                test_path_is_file file1 &&
 394                test_path_is_file file2 &&
 395                test_path_is_missing file3 &&
 396                grep update file2 &&
 397                git reset --hard p4/depot/branch4 &&
 398                test_path_is_file file1 &&
 399                test_path_is_file file2 &&
 400                test_path_is_file file3 &&
 401                ! grep update file2 &&
 402                git reset --hard p4/depot/branch5 &&
 403                test_path_is_file file1 &&
 404                test_path_is_file file2 &&
 405                test_path_is_file file3 &&
 406                ! grep update file2 &&
 407                git reset --hard p4/depot/branch6 &&
 408                test_path_is_file file1 &&
 409                test_path_is_missing file2 &&
 410                test_path_is_missing file3
 411        )
 412'
 413
 414# From a report in http://stackoverflow.com/questions/11893688
 415# where --use-client-spec caused branch prefixes not to be removed;
 416# every file in git appeared into a subdirectory of the branch name.
 417test_expect_success 'use-client-spec detect-branches setup' '
 418        rm -rf "$cli" &&
 419        mkdir "$cli" &&
 420        (
 421                cd "$cli" &&
 422                client_view "//depot/usecs/... //client/..." &&
 423                mkdir b1 &&
 424                echo b1/b1-file1 >b1/b1-file1 &&
 425                p4 add b1/b1-file1 &&
 426                p4 submit -d "b1/b1-file1" &&
 427
 428                p4 integrate //depot/usecs/b1/... //depot/usecs/b2/... &&
 429                p4 submit -d "b1 -> b2" &&
 430                p4 branch -i <<-EOF &&
 431                Branch: b2
 432                View: //depot/usecs/b1/... //depot/usecs/b2/...
 433                EOF
 434
 435                echo b2/b2-file2 >b2/b2-file2 &&
 436                p4 add b2/b2-file2 &&
 437                p4 submit -d "b2/b2-file2"
 438        )
 439'
 440
 441test_expect_success 'use-client-spec detect-branches files in top-level' '
 442        test_when_finished cleanup_git &&
 443        test_create_repo "$git" &&
 444        (
 445                cd "$git" &&
 446                git p4 sync --detect-branches --use-client-spec //depot/usecs@all &&
 447                git checkout -b master p4/usecs/b1 &&
 448                test_path_is_file b1-file1 &&
 449                test_path_is_missing b2-file2 &&
 450                test_path_is_missing b1 &&
 451                test_path_is_missing b2 &&
 452
 453                git checkout -b b2 p4/usecs/b2 &&
 454                test_path_is_file b1-file1 &&
 455                test_path_is_file b2-file2 &&
 456                test_path_is_missing b1 &&
 457                test_path_is_missing b2
 458        )
 459'
 460
 461test_expect_success 'use-client-spec detect-branches skips branches setup' '
 462        (
 463                cd "$cli" &&
 464
 465                p4 integrate //depot/usecs/b1/... //depot/usecs/b3/... &&
 466                p4 submit -d "b1 -> b3" &&
 467                p4 branch -i <<-EOF &&
 468                Branch: b3
 469                View: //depot/usecs/b1/... //depot/usecs/b3/...
 470                EOF
 471
 472                echo b3/b3-file3_1 >b3/b3-file3_1 &&
 473                echo b3/b3-file3_2 >b3/b3-file3_2 &&
 474                p4 add b3/b3-file3_1 &&
 475                p4 add b3/b3-file3_2 &&
 476                p4 submit -d "b3/b3-file3_1 b3/b3-file3_2"
 477        )
 478'
 479
 480test_expect_success 'use-client-spec detect-branches skips branches' '
 481        client_view "//depot/usecs/... //client/..." \
 482                    "-//depot/usecs/b3/... //client/b3/..." &&
 483        test_when_finished cleanup_git &&
 484        test_create_repo "$git" &&
 485        (
 486                cd "$git" &&
 487                git p4 sync --detect-branches --use-client-spec //depot/usecs@all &&
 488                test_must_fail git rev-parse refs/remotes/p4/usecs/b3
 489        )
 490'
 491
 492test_expect_success 'use-client-spec detect-branches skips files in branches' '
 493        client_view "//depot/usecs/... //client/..." \
 494                    "-//depot/usecs/b3/b3-file3_1 //client/b3/b3-file3_1" &&
 495        test_when_finished cleanup_git &&
 496        test_create_repo "$git" &&
 497        (
 498                cd "$git" &&
 499                git p4 sync --detect-branches --use-client-spec //depot/usecs@all &&
 500                git checkout -b master p4/usecs/b3 &&
 501                test_path_is_file b1-file1 &&
 502                test_path_is_file b3-file3_2 &&
 503                test_path_is_missing b3-file3_1
 504        )
 505'
 506
 507test_expect_success 'restart p4d' '
 508        kill_p4d &&
 509        start_p4d
 510'
 511
 512#
 513# 1: //depot/branch1/base/file1
 514#    //depot/branch1/base/file2
 515#    //depot/branch1/base/dir/sub_file1
 516# 2: integrate //depot/branch1/base/... -> //depot/branch2/base/...
 517# 3: //depot/branch1/base/file3
 518# 4: //depot/branch1/base/file2 (edit)
 519# 5: integrate //depot/branch1/base/... -> //depot/branch3/base/...
 520#
 521# Note: the client view removes the "base" folder from the workspace
 522#       and moves sub_file1 one level up.
 523test_expect_success 'add simple p4 branches with common base folder on each branch' '
 524        (
 525                cd "$cli" &&
 526                client_view "//depot/branch1/base/... //client/branch1/..." \
 527                            "//depot/branch1/base/dir/sub_file1 //client/branch1/sub_file1" \
 528                            "//depot/branch2/base/... //client/branch2/..." \
 529                            "//depot/branch3/base/... //client/branch3/..." &&
 530                mkdir -p branch1 &&
 531                cd branch1 &&
 532                echo file1 >file1 &&
 533                echo file2 >file2 &&
 534                mkdir dir &&
 535                echo sub_file1 >sub_file1 &&
 536                p4 add file1 file2 sub_file1 &&
 537                p4 submit -d "Create branch1" &&
 538                p4 integrate //depot/branch1/base/... //depot/branch2/base/... &&
 539                p4 submit -d "Integrate branch2 from branch1" &&
 540                echo file3 >file3 &&
 541                p4 add file3 &&
 542                p4 submit -d "add file3 in branch1" &&
 543                p4 open file2 &&
 544                echo update >>file2 &&
 545                p4 submit -d "update file2 in branch1" &&
 546                p4 integrate //depot/branch1/base/... //depot/branch3/base/... &&
 547                p4 submit -d "Integrate branch3 from branch1"
 548        )
 549'
 550
 551# Configure branches through git-config and clone them.
 552# All files are tested to make sure branches were cloned correctly.
 553# Finally, make an update to branch1 on P4 side to check if it is imported
 554# correctly by git p4.
 555# git p4 is expected to use the client view to also not include the common
 556# "base" folder in the imported directory structure.
 557test_expect_success 'git p4 clone simple branches with base folder on server side' '
 558        test_create_repo "$git" &&
 559        (
 560                cd "$git" &&
 561                git config git-p4.branchList branch1:branch2 &&
 562                git config --add git-p4.branchList branch1:branch3 &&
 563                git p4 clone --dest=. --use-client-spec  --detect-branches //depot@all &&
 564                git log --all --graph --decorate --stat &&
 565                git reset --hard p4/depot/branch1 &&
 566                test -f file1 &&
 567                test -f file2 &&
 568                test -f file3 &&
 569                test -f sub_file1 &&
 570                grep update file2 &&
 571                git reset --hard p4/depot/branch2 &&
 572                test -f file1 &&
 573                test -f file2 &&
 574                test ! -f file3 &&
 575                test -f sub_file1 &&
 576                ! grep update file2 &&
 577                git reset --hard p4/depot/branch3 &&
 578                test -f file1 &&
 579                test -f file2 &&
 580                test -f file3 &&
 581                test -f sub_file1 &&
 582                grep update file2 &&
 583                cd "$cli" &&
 584                cd branch1 &&
 585                p4 edit file2 &&
 586                echo file2_ >>file2 &&
 587                p4 submit -d "update file2 in branch1" &&
 588                cd "$git" &&
 589                git reset --hard p4/depot/branch1 &&
 590                git p4 rebase &&
 591                grep file2_ file2
 592        )
 593'
 594
 595# Now update a file in one of the branches in git and submit to P4
 596test_expect_success 'Update a file in git side and submit to P4 using client view' '
 597        test_when_finished cleanup_git &&
 598        (
 599                cd "$git" &&
 600                git reset --hard p4/depot/branch1 &&
 601                echo "client spec" >> file1 &&
 602                git add -u . &&
 603                git commit -m "update file1 in branch1" &&
 604                git config git-p4.skipSubmitEdit true &&
 605                git p4 submit --verbose &&
 606                cd "$cli" &&
 607                p4 sync ... &&
 608                cd branch1 &&
 609                grep "client spec" file1
 610        )
 611'
 612
 613test_expect_success 'kill p4d' '
 614        kill_p4d
 615'
 616
 617test_done