t / t9902-completion.shon commit completion: list short refs from a remote given as a URL (91b7ea8)
   1#!/bin/sh
   2#
   3# Copyright (c) 2012 Felipe Contreras
   4#
   5
   6test_description='test bash completion'
   7
   8. ./lib-bash.sh
   9
  10complete ()
  11{
  12        # do nothing
  13        return 0
  14}
  15
  16# Be careful when updating this list:
  17#
  18# (1) The build tree may have build artifact from different branch, or
  19#     the user's $PATH may have a random executable that may begin
  20#     with "git-check" that are not part of the subcommands this build
  21#     will ship, e.g.  "check-ignore".  The tests for completion for
  22#     subcommand names tests how "check" is expanded; we limit the
  23#     possible candidates to "checkout" and "check-attr" to make sure
  24#     "check-attr", which is known by the filter function as a
  25#     subcommand to be thrown out, while excluding other random files
  26#     that happen to begin with "check" to avoid letting them get in
  27#     the way.
  28#
  29# (2) A test makes sure that common subcommands are included in the
  30#     completion for "git <TAB>", and a plumbing is excluded.  "add",
  31#     "filter-branch" and "ls-files" are listed for this.
  32
  33GIT_TESTING_COMMAND_COMPLETION='add checkout check-attr filter-branch ls-files'
  34
  35. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
  36
  37# We don't need this function to actually join words or do anything special.
  38# Also, it's cleaner to avoid touching bash's internal completion variables.
  39# So let's override it with a minimal version for testing purposes.
  40_get_comp_words_by_ref ()
  41{
  42        while [ $# -gt 0 ]; do
  43                case "$1" in
  44                cur)
  45                        cur=${_words[_cword]}
  46                        ;;
  47                prev)
  48                        prev=${_words[_cword-1]}
  49                        ;;
  50                words)
  51                        words=("${_words[@]}")
  52                        ;;
  53                cword)
  54                        cword=$_cword
  55                        ;;
  56                esac
  57                shift
  58        done
  59}
  60
  61print_comp ()
  62{
  63        local IFS=$'\n'
  64        echo "${COMPREPLY[*]}" > out
  65}
  66
  67run_completion ()
  68{
  69        local -a COMPREPLY _words
  70        local _cword
  71        _words=( $1 )
  72        test "${1: -1}" = ' ' && _words[${#_words[@]}+1]=''
  73        (( _cword = ${#_words[@]} - 1 ))
  74        __git_wrap__git_main && print_comp
  75}
  76
  77# Test high-level completion
  78# Arguments are:
  79# 1: typed text so far (cur)
  80# 2: expected completion
  81test_completion ()
  82{
  83        if test $# -gt 1
  84        then
  85                printf '%s\n' "$2" >expected
  86        else
  87                sed -e 's/Z$//' >expected
  88        fi &&
  89        run_completion "$1" &&
  90        test_cmp expected out
  91}
  92
  93# Test __gitcomp.
  94# The first argument is the typed text so far (cur); the rest are
  95# passed to __gitcomp.  Expected output comes is read from the
  96# standard input, like test_completion().
  97test_gitcomp ()
  98{
  99        local -a COMPREPLY &&
 100        sed -e 's/Z$//' >expected &&
 101        local cur="$1" &&
 102        shift &&
 103        __gitcomp "$@" &&
 104        print_comp &&
 105        test_cmp expected out
 106}
 107
 108# Test __gitcomp_nl
 109# Arguments are:
 110# 1: current word (cur)
 111# -: the rest are passed to __gitcomp_nl
 112test_gitcomp_nl ()
 113{
 114        local -a COMPREPLY &&
 115        sed -e 's/Z$//' >expected &&
 116        local cur="$1" &&
 117        shift &&
 118        __gitcomp_nl "$@" &&
 119        print_comp &&
 120        test_cmp expected out
 121}
 122
 123invalid_variable_name='${foo.bar}'
 124
 125actual="$TRASH_DIRECTORY/actual"
 126
 127if test_have_prereq MINGW
 128then
 129        ROOT="$(pwd -W)"
 130else
 131        ROOT="$(pwd)"
 132fi
 133
 134test_expect_success 'setup for __gitdir tests' '
 135        mkdir -p subdir/subsubdir &&
 136        git init otherrepo
 137'
 138
 139test_expect_success '__gitdir - from command line (through $__git_dir)' '
 140        echo "$ROOT/otherrepo/.git" >expected &&
 141        (
 142                __git_dir="$ROOT/otherrepo/.git" &&
 143                __gitdir >"$actual"
 144        ) &&
 145        test_cmp expected "$actual"
 146'
 147
 148test_expect_success '__gitdir - repo as argument' '
 149        echo "otherrepo/.git" >expected &&
 150        __gitdir "otherrepo" >"$actual" &&
 151        test_cmp expected "$actual"
 152'
 153
 154test_expect_success '__gitdir - remote as argument' '
 155        echo "remote" >expected &&
 156        __gitdir "remote" >"$actual" &&
 157        test_cmp expected "$actual"
 158'
 159
 160test_expect_success '__gitdir - .git directory in cwd' '
 161        echo ".git" >expected &&
 162        __gitdir >"$actual" &&
 163        test_cmp expected "$actual"
 164'
 165
 166test_expect_success '__gitdir - .git directory in parent' '
 167        echo "$ROOT/.git" >expected &&
 168        (
 169                cd subdir/subsubdir &&
 170                __gitdir >"$actual"
 171        ) &&
 172        test_cmp expected "$actual"
 173'
 174
 175test_expect_success '__gitdir - cwd is a .git directory' '
 176        echo "." >expected &&
 177        (
 178                cd .git &&
 179                __gitdir >"$actual"
 180        ) &&
 181        test_cmp expected "$actual"
 182'
 183
 184test_expect_success '__gitdir - parent is a .git directory' '
 185        echo "$ROOT/.git" >expected &&
 186        (
 187                cd .git/refs/heads &&
 188                __gitdir >"$actual"
 189        ) &&
 190        test_cmp expected "$actual"
 191'
 192
 193test_expect_success '__gitdir - $GIT_DIR set while .git directory in cwd' '
 194        echo "$ROOT/otherrepo/.git" >expected &&
 195        (
 196                GIT_DIR="$ROOT/otherrepo/.git" &&
 197                export GIT_DIR &&
 198                __gitdir >"$actual"
 199        ) &&
 200        test_cmp expected "$actual"
 201'
 202
 203test_expect_success '__gitdir - $GIT_DIR set while .git directory in parent' '
 204        echo "$ROOT/otherrepo/.git" >expected &&
 205        (
 206                GIT_DIR="$ROOT/otherrepo/.git" &&
 207                export GIT_DIR &&
 208                cd subdir &&
 209                __gitdir >"$actual"
 210        ) &&
 211        test_cmp expected "$actual"
 212'
 213
 214test_expect_success '__gitdir - non-existing path in $__git_dir' '
 215        (
 216                __git_dir="non-existing" &&
 217                test_must_fail __gitdir >"$actual"
 218        ) &&
 219        test_must_be_empty "$actual"
 220'
 221
 222test_expect_success '__gitdir - non-existing $GIT_DIR' '
 223        (
 224                GIT_DIR="$ROOT/non-existing" &&
 225                export GIT_DIR &&
 226                test_must_fail __gitdir >"$actual"
 227        ) &&
 228        test_must_be_empty "$actual"
 229'
 230
 231test_expect_success '__gitdir - gitfile in cwd' '
 232        echo "$ROOT/otherrepo/.git" >expected &&
 233        echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
 234        test_when_finished "rm -f subdir/.git" &&
 235        (
 236                cd subdir &&
 237                __gitdir >"$actual"
 238        ) &&
 239        test_cmp expected "$actual"
 240'
 241
 242test_expect_success '__gitdir - gitfile in parent' '
 243        echo "$ROOT/otherrepo/.git" >expected &&
 244        echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
 245        test_when_finished "rm -f subdir/.git" &&
 246        (
 247                cd subdir/subsubdir &&
 248                __gitdir >"$actual"
 249        ) &&
 250        test_cmp expected "$actual"
 251'
 252
 253test_expect_success SYMLINKS '__gitdir - resulting path avoids symlinks' '
 254        echo "$ROOT/otherrepo/.git" >expected &&
 255        mkdir otherrepo/dir &&
 256        test_when_finished "rm -rf otherrepo/dir" &&
 257        ln -s otherrepo/dir link &&
 258        test_when_finished "rm -f link" &&
 259        (
 260                cd link &&
 261                __gitdir >"$actual"
 262        ) &&
 263        test_cmp expected "$actual"
 264'
 265
 266test_expect_success '__gitdir - not a git repository' '
 267        nongit test_must_fail __gitdir >"$actual" &&
 268        test_must_be_empty "$actual"
 269'
 270
 271test_expect_success '__gitcomp - trailing space - options' '
 272        test_gitcomp "--re" "--dry-run --reuse-message= --reedit-message=
 273                --reset-author" <<-EOF
 274        --reuse-message=Z
 275        --reedit-message=Z
 276        --reset-author Z
 277        EOF
 278'
 279
 280test_expect_success '__gitcomp - trailing space - config keys' '
 281        test_gitcomp "br" "branch. branch.autosetupmerge
 282                branch.autosetuprebase browser." <<-\EOF
 283        branch.Z
 284        branch.autosetupmerge Z
 285        branch.autosetuprebase Z
 286        browser.Z
 287        EOF
 288'
 289
 290test_expect_success '__gitcomp - option parameter' '
 291        test_gitcomp "--strategy=re" "octopus ours recursive resolve subtree" \
 292                "" "re" <<-\EOF
 293        recursive Z
 294        resolve Z
 295        EOF
 296'
 297
 298test_expect_success '__gitcomp - prefix' '
 299        test_gitcomp "branch.me" "remote merge mergeoptions rebase" \
 300                "branch.maint." "me" <<-\EOF
 301        branch.maint.merge Z
 302        branch.maint.mergeoptions Z
 303        EOF
 304'
 305
 306test_expect_success '__gitcomp - suffix' '
 307        test_gitcomp "branch.me" "master maint next pu" "branch." \
 308                "ma" "." <<-\EOF
 309        branch.master.Z
 310        branch.maint.Z
 311        EOF
 312'
 313
 314test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '
 315        __gitcomp "$invalid_variable_name"
 316'
 317
 318read -r -d "" refs <<-\EOF
 319maint
 320master
 321next
 322pu
 323EOF
 324
 325test_expect_success '__gitcomp_nl - trailing space' '
 326        test_gitcomp_nl "m" "$refs" <<-EOF
 327        maint Z
 328        master Z
 329        EOF
 330'
 331
 332test_expect_success '__gitcomp_nl - prefix' '
 333        test_gitcomp_nl "--fixup=m" "$refs" "--fixup=" "m" <<-EOF
 334        --fixup=maint Z
 335        --fixup=master Z
 336        EOF
 337'
 338
 339test_expect_success '__gitcomp_nl - suffix' '
 340        test_gitcomp_nl "branch.ma" "$refs" "branch." "ma" "." <<-\EOF
 341        branch.maint.Z
 342        branch.master.Z
 343        EOF
 344'
 345
 346test_expect_success '__gitcomp_nl - no suffix' '
 347        test_gitcomp_nl "ma" "$refs" "" "ma" "" <<-\EOF
 348        maintZ
 349        masterZ
 350        EOF
 351'
 352
 353test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name' '
 354        __gitcomp_nl "$invalid_variable_name"
 355'
 356
 357test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from config file' '
 358        cat >expect <<-EOF &&
 359        remote_from_file_1
 360        remote_from_file_2
 361        remote_in_config_1
 362        remote_in_config_2
 363        EOF
 364        test_when_finished "rm -rf .git/remotes" &&
 365        mkdir -p .git/remotes &&
 366        >.git/remotes/remote_from_file_1 &&
 367        >.git/remotes/remote_from_file_2 &&
 368        test_when_finished "git remote remove remote_in_config_1" &&
 369        git remote add remote_in_config_1 git://remote_1 &&
 370        test_when_finished "git remote remove remote_in_config_2" &&
 371        git remote add remote_in_config_2 git://remote_2 &&
 372        __git_remotes >actual &&
 373        test_cmp expect actual
 374'
 375
 376test_expect_success '__git_is_configured_remote' '
 377        test_when_finished "git remote remove remote_1" &&
 378        git remote add remote_1 git://remote_1 &&
 379        test_when_finished "git remote remove remote_2" &&
 380        git remote add remote_2 git://remote_2 &&
 381        verbose __git_is_configured_remote remote_2 &&
 382        test_must_fail __git_is_configured_remote non-existent
 383'
 384
 385test_expect_success 'setup for ref completion' '
 386        git commit --allow-empty -m initial &&
 387        git branch matching-branch &&
 388        git tag matching-tag &&
 389        (
 390                cd otherrepo &&
 391                git commit --allow-empty -m initial &&
 392                git branch -m master master-in-other &&
 393                git branch branch-in-other &&
 394                git tag tag-in-other
 395        ) &&
 396        git remote add other "$ROOT/otherrepo/.git" &&
 397        git fetch --no-tags other &&
 398        rm -f .git/FETCH_HEAD &&
 399        git init thirdrepo
 400'
 401
 402test_expect_success '__git_refs - simple' '
 403        cat >expected <<-EOF &&
 404        HEAD
 405        master
 406        matching-branch
 407        other/branch-in-other
 408        other/master-in-other
 409        matching-tag
 410        EOF
 411        (
 412                cur= &&
 413                __git_refs >"$actual"
 414        ) &&
 415        test_cmp expected "$actual"
 416'
 417
 418test_expect_success '__git_refs - full refs' '
 419        cat >expected <<-EOF &&
 420        refs/heads/master
 421        refs/heads/matching-branch
 422        EOF
 423        (
 424                cur=refs/heads/ &&
 425                __git_refs >"$actual"
 426        ) &&
 427        test_cmp expected "$actual"
 428'
 429
 430test_expect_success '__git_refs - repo given on the command line' '
 431        cat >expected <<-EOF &&
 432        HEAD
 433        branch-in-other
 434        master-in-other
 435        tag-in-other
 436        EOF
 437        (
 438                __git_dir="$ROOT/otherrepo/.git" &&
 439                cur= &&
 440                __git_refs >"$actual"
 441        ) &&
 442        test_cmp expected "$actual"
 443'
 444
 445test_expect_success '__git_refs - remote on local file system' '
 446        cat >expected <<-EOF &&
 447        HEAD
 448        branch-in-other
 449        master-in-other
 450        tag-in-other
 451        EOF
 452        (
 453                cur= &&
 454                __git_refs otherrepo >"$actual"
 455        ) &&
 456        test_cmp expected "$actual"
 457'
 458
 459test_expect_success '__git_refs - remote on local file system - full refs' '
 460        cat >expected <<-EOF &&
 461        refs/heads/branch-in-other
 462        refs/heads/master-in-other
 463        refs/tags/tag-in-other
 464        EOF
 465        (
 466                cur=refs/ &&
 467                __git_refs otherrepo >"$actual"
 468        ) &&
 469        test_cmp expected "$actual"
 470'
 471
 472test_expect_success '__git_refs - configured remote' '
 473        cat >expected <<-EOF &&
 474        HEAD
 475        branch-in-other
 476        master-in-other
 477        EOF
 478        (
 479                cur= &&
 480                __git_refs other >"$actual"
 481        ) &&
 482        test_cmp expected "$actual"
 483'
 484
 485test_expect_success '__git_refs - configured remote - full refs' '
 486        cat >expected <<-EOF &&
 487        refs/heads/branch-in-other
 488        refs/heads/master-in-other
 489        refs/tags/tag-in-other
 490        EOF
 491        (
 492                cur=refs/ &&
 493                __git_refs other >"$actual"
 494        ) &&
 495        test_cmp expected "$actual"
 496'
 497
 498test_expect_success '__git_refs - configured remote - repo given on the command line' '
 499        cat >expected <<-EOF &&
 500        HEAD
 501        branch-in-other
 502        master-in-other
 503        EOF
 504        (
 505                cd thirdrepo &&
 506                __git_dir="$ROOT/.git" &&
 507                cur= &&
 508                __git_refs other >"$actual"
 509        ) &&
 510        test_cmp expected "$actual"
 511'
 512
 513test_expect_success '__git_refs - configured remote - full refs - repo given on the command line' '
 514        cat >expected <<-EOF &&
 515        refs/heads/branch-in-other
 516        refs/heads/master-in-other
 517        refs/tags/tag-in-other
 518        EOF
 519        (
 520                cd thirdrepo &&
 521                __git_dir="$ROOT/.git" &&
 522                cur=refs/ &&
 523                __git_refs other >"$actual"
 524        ) &&
 525        test_cmp expected "$actual"
 526'
 527
 528test_expect_success '__git_refs - configured remote - remote name matches a directory' '
 529        cat >expected <<-EOF &&
 530        HEAD
 531        branch-in-other
 532        master-in-other
 533        EOF
 534        mkdir other &&
 535        test_when_finished "rm -rf other" &&
 536        (
 537                cur= &&
 538                __git_refs other >"$actual"
 539        ) &&
 540        test_cmp expected "$actual"
 541'
 542
 543test_expect_success '__git_refs - URL remote' '
 544        cat >expected <<-EOF &&
 545        HEAD
 546        branch-in-other
 547        master-in-other
 548        tag-in-other
 549        EOF
 550        (
 551                cur= &&
 552                __git_refs "file://$ROOT/otherrepo/.git" >"$actual"
 553        ) &&
 554        test_cmp expected "$actual"
 555'
 556
 557test_expect_success '__git_refs - URL remote - full refs' '
 558        cat >expected <<-EOF &&
 559        refs/heads/branch-in-other
 560        refs/heads/master-in-other
 561        refs/tags/tag-in-other
 562        EOF
 563        (
 564                cur=refs/ &&
 565                __git_refs "file://$ROOT/otherrepo/.git" >"$actual"
 566        ) &&
 567        test_cmp expected "$actual"
 568'
 569
 570test_expect_success '__git_refs - non-existing remote' '
 571        (
 572                cur= &&
 573                __git_refs non-existing >"$actual"
 574        ) &&
 575        test_must_be_empty "$actual"
 576'
 577
 578test_expect_success '__git_refs - non-existing remote - full refs' '
 579        (
 580                cur=refs/ &&
 581                __git_refs non-existing >"$actual"
 582        ) &&
 583        test_must_be_empty "$actual"
 584'
 585
 586test_expect_success '__git_refs - non-existing URL remote' '
 587        (
 588                cur= &&
 589                __git_refs "file://$ROOT/non-existing" >"$actual"
 590        ) &&
 591        test_must_be_empty "$actual"
 592'
 593
 594test_expect_success '__git_refs - non-existing URL remote - full refs' '
 595        (
 596                cur=refs/ &&
 597                __git_refs "file://$ROOT/non-existing" >"$actual"
 598        ) &&
 599        test_must_be_empty "$actual"
 600'
 601
 602test_expect_success '__git_refs - not in a git repository' '
 603        (
 604                GIT_CEILING_DIRECTORIES="$ROOT" &&
 605                export GIT_CEILING_DIRECTORIES &&
 606                cd subdir &&
 607                cur= &&
 608                __git_refs >"$actual"
 609        ) &&
 610        test_must_be_empty "$actual"
 611'
 612
 613test_expect_success '__git_refs - unique remote branches for git checkout DWIMery' '
 614        cat >expected <<-EOF &&
 615        HEAD
 616        master
 617        matching-branch
 618        other/ambiguous
 619        other/branch-in-other
 620        other/master-in-other
 621        remote/ambiguous
 622        remote/branch-in-remote
 623        matching-tag
 624        branch-in-other
 625        branch-in-remote
 626        master-in-other
 627        EOF
 628        for remote_ref in refs/remotes/other/ambiguous \
 629                refs/remotes/remote/ambiguous \
 630                refs/remotes/remote/branch-in-remote
 631        do
 632                git update-ref $remote_ref master &&
 633                test_when_finished "git update-ref -d $remote_ref"
 634        done &&
 635        (
 636                cur= &&
 637                __git_refs "" 1 >"$actual"
 638        ) &&
 639        test_cmp expected "$actual"
 640'
 641
 642test_expect_success 'teardown after ref completion' '
 643        git branch -d matching-branch &&
 644        git tag -d matching-tag &&
 645        git remote remove other
 646'
 647
 648test_expect_success '__git_get_config_variables' '
 649        cat >expect <<-EOF &&
 650        name-1
 651        name-2
 652        EOF
 653        test_config interesting.name-1 good &&
 654        test_config interesting.name-2 good &&
 655        test_config subsection.interesting.name-3 bad &&
 656        __git_get_config_variables interesting >actual &&
 657        test_cmp expect actual
 658'
 659
 660test_expect_success '__git_pretty_aliases' '
 661        cat >expect <<-EOF &&
 662        author
 663        hash
 664        EOF
 665        test_config pretty.author "%an %ae" &&
 666        test_config pretty.hash %H &&
 667        __git_pretty_aliases >actual &&
 668        test_cmp expect actual
 669'
 670
 671test_expect_success '__git_aliases' '
 672        cat >expect <<-EOF &&
 673        ci
 674        co
 675        EOF
 676        test_config alias.ci commit &&
 677        test_config alias.co checkout &&
 678        __git_aliases >actual &&
 679        test_cmp expect actual
 680'
 681
 682test_expect_success 'basic' '
 683        run_completion "git " &&
 684        # built-in
 685        grep -q "^add \$" out &&
 686        # script
 687        grep -q "^filter-branch \$" out &&
 688        # plumbing
 689        ! grep -q "^ls-files \$" out &&
 690
 691        run_completion "git f" &&
 692        ! grep -q -v "^f" out
 693'
 694
 695test_expect_success 'double dash "git" itself' '
 696        test_completion "git --" <<-\EOF
 697        --paginate Z
 698        --no-pager Z
 699        --git-dir=
 700        --bare Z
 701        --version Z
 702        --exec-path Z
 703        --exec-path=
 704        --html-path Z
 705        --man-path Z
 706        --info-path Z
 707        --work-tree=
 708        --namespace=
 709        --no-replace-objects Z
 710        --help Z
 711        EOF
 712'
 713
 714test_expect_success 'double dash "git checkout"' '
 715        test_completion "git checkout --" <<-\EOF
 716        --quiet Z
 717        --ours Z
 718        --theirs Z
 719        --track Z
 720        --no-track Z
 721        --merge Z
 722        --conflict=
 723        --orphan Z
 724        --patch Z
 725        EOF
 726'
 727
 728test_expect_success 'general options' '
 729        test_completion "git --ver" "--version " &&
 730        test_completion "git --hel" "--help " &&
 731        test_completion "git --exe" <<-\EOF &&
 732        --exec-path Z
 733        --exec-path=
 734        EOF
 735        test_completion "git --htm" "--html-path " &&
 736        test_completion "git --pag" "--paginate " &&
 737        test_completion "git --no-p" "--no-pager " &&
 738        test_completion "git --git" "--git-dir=" &&
 739        test_completion "git --wor" "--work-tree=" &&
 740        test_completion "git --nam" "--namespace=" &&
 741        test_completion "git --bar" "--bare " &&
 742        test_completion "git --inf" "--info-path " &&
 743        test_completion "git --no-r" "--no-replace-objects "
 744'
 745
 746test_expect_success 'general options plus command' '
 747        test_completion "git --version check" "checkout " &&
 748        test_completion "git --paginate check" "checkout " &&
 749        test_completion "git --git-dir=foo check" "checkout " &&
 750        test_completion "git --bare check" "checkout " &&
 751        test_completion "git --exec-path=foo check" "checkout " &&
 752        test_completion "git --html-path check" "checkout " &&
 753        test_completion "git --no-pager check" "checkout " &&
 754        test_completion "git --work-tree=foo check" "checkout " &&
 755        test_completion "git --namespace=foo check" "checkout " &&
 756        test_completion "git --paginate check" "checkout " &&
 757        test_completion "git --info-path check" "checkout " &&
 758        test_completion "git --no-replace-objects check" "checkout "
 759'
 760
 761test_expect_success 'git --help completion' '
 762        test_completion "git --help ad" "add " &&
 763        test_completion "git --help core" "core-tutorial "
 764'
 765
 766test_expect_success 'setup for integration tests' '
 767        echo content >file1 &&
 768        echo more >file2 &&
 769        git add file1 file2 &&
 770        git commit -m one &&
 771        git branch mybranch &&
 772        git tag mytag
 773'
 774
 775test_expect_success 'checkout completes ref names' '
 776        test_completion "git checkout m" <<-\EOF
 777        master Z
 778        mybranch Z
 779        mytag Z
 780        EOF
 781'
 782
 783test_expect_success 'show completes all refs' '
 784        test_completion "git show m" <<-\EOF
 785        master Z
 786        mybranch Z
 787        mytag Z
 788        EOF
 789'
 790
 791test_expect_success '<ref>: completes paths' '
 792        test_completion "git show mytag:f" <<-\EOF
 793        file1 Z
 794        file2 Z
 795        EOF
 796'
 797
 798test_expect_success 'complete tree filename with spaces' '
 799        echo content >"name with spaces" &&
 800        git add "name with spaces" &&
 801        git commit -m spaces &&
 802        test_completion "git show HEAD:nam" <<-\EOF
 803        name with spaces Z
 804        EOF
 805'
 806
 807test_expect_success 'complete tree filename with metacharacters' '
 808        echo content >"name with \${meta}" &&
 809        git add "name with \${meta}" &&
 810        git commit -m meta &&
 811        test_completion "git show HEAD:nam" <<-\EOF
 812        name with ${meta} Z
 813        name with spaces Z
 814        EOF
 815'
 816
 817test_expect_success 'send-email' '
 818        test_completion "git send-email --cov" "--cover-letter " &&
 819        test_completion "git send-email ma" "master "
 820'
 821
 822test_expect_success 'complete files' '
 823        git init tmp && cd tmp &&
 824        test_when_finished "cd .. && rm -rf tmp" &&
 825
 826        echo "expected" > .gitignore &&
 827        echo "out" >> .gitignore &&
 828
 829        git add .gitignore &&
 830        test_completion "git commit " ".gitignore" &&
 831
 832        git commit -m ignore &&
 833
 834        touch new &&
 835        test_completion "git add " "new" &&
 836
 837        git add new &&
 838        git commit -a -m new &&
 839        test_completion "git add " "" &&
 840
 841        git mv new modified &&
 842        echo modify > modified &&
 843        test_completion "git add " "modified" &&
 844
 845        touch untracked &&
 846
 847        : TODO .gitignore should not be here &&
 848        test_completion "git rm " <<-\EOF &&
 849        .gitignore
 850        modified
 851        EOF
 852
 853        test_completion "git clean " "untracked" &&
 854
 855        : TODO .gitignore should not be here &&
 856        test_completion "git mv " <<-\EOF &&
 857        .gitignore
 858        modified
 859        EOF
 860
 861        mkdir dir &&
 862        touch dir/file-in-dir &&
 863        git add dir/file-in-dir &&
 864        git commit -m dir &&
 865
 866        mkdir untracked-dir &&
 867
 868        : TODO .gitignore should not be here &&
 869        test_completion "git mv modified " <<-\EOF &&
 870        .gitignore
 871        dir
 872        modified
 873        untracked
 874        untracked-dir
 875        EOF
 876
 877        test_completion "git commit " "modified" &&
 878
 879        : TODO .gitignore should not be here &&
 880        test_completion "git ls-files " <<-\EOF &&
 881        .gitignore
 882        dir
 883        modified
 884        EOF
 885
 886        touch momified &&
 887        test_completion "git add mom" "momified"
 888'
 889
 890test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cmd> ...'" '
 891        test_config alias.co "!sh -c '"'"'git checkout ...'"'"'" &&
 892        test_completion "git co m" <<-\EOF
 893        master Z
 894        mybranch Z
 895        mytag Z
 896        EOF
 897'
 898
 899test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val git <cmd> ... }' '
 900        test_config alias.co "!f () { VAR=val git checkout ... ; } f" &&
 901        test_completion "git co m" <<-\EOF
 902        master Z
 903        mybranch Z
 904        mytag Z
 905        EOF
 906'
 907
 908test_expect_success 'completion used <cmd> completion for alias: !f() { : git <cmd> ; ... }' '
 909        test_config alias.co "!f() { : git checkout ; if ... } f" &&
 910        test_completion "git co m" <<-\EOF
 911        master Z
 912        mybranch Z
 913        mytag Z
 914        EOF
 915'
 916
 917test_expect_failure 'complete with tilde expansion' '
 918        git init tmp && cd tmp &&
 919        test_when_finished "cd .. && rm -rf tmp" &&
 920
 921        touch ~/tmp/file &&
 922
 923        test_completion "git add ~/tmp/" "~/tmp/file"
 924'
 925
 926test_done