t / t9902-completion.shon commit name-hash.c: fix endless loop with core.ignorecase=true (2092678)
   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. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
  17
  18# We don't need this function to actually join words or do anything special.
  19# Also, it's cleaner to avoid touching bash's internal completion variables.
  20# So let's override it with a minimal version for testing purposes.
  21_get_comp_words_by_ref ()
  22{
  23        while [ $# -gt 0 ]; do
  24                case "$1" in
  25                cur)
  26                        cur=${_words[_cword]}
  27                        ;;
  28                prev)
  29                        prev=${_words[_cword-1]}
  30                        ;;
  31                words)
  32                        words=("${_words[@]}")
  33                        ;;
  34                cword)
  35                        cword=$_cword
  36                        ;;
  37                esac
  38                shift
  39        done
  40}
  41
  42print_comp ()
  43{
  44        local IFS=$'\n'
  45        echo "${COMPREPLY[*]}" > out
  46}
  47
  48run_completion ()
  49{
  50        local -a COMPREPLY _words
  51        local _cword
  52        _words=( $1 )
  53        (( _cword = ${#_words[@]} - 1 ))
  54        __git_wrap__git_main && print_comp
  55}
  56
  57test_completion ()
  58{
  59        test $# -gt 1 && echo "$2" > expected
  60        run_completion "$@" &&
  61        test_cmp expected out
  62}
  63
  64# Like test_completion, but reads expectation from stdin,
  65# which is convenient when it is multiline. We also process "_" into
  66# spaces to make test vectors more readable.
  67test_completion_long ()
  68{
  69        tr _ " " >expected &&
  70        test_completion "$1"
  71}
  72
  73newline=$'\n'
  74
  75test_expect_success '__gitcomp - trailing space - options' '
  76        sed -e "s/Z$//" >expected <<-\EOF &&
  77        --reuse-message=Z
  78        --reedit-message=Z
  79        --reset-author Z
  80        EOF
  81        (
  82                local -a COMPREPLY &&
  83                cur="--re" &&
  84                __gitcomp "--dry-run --reuse-message= --reedit-message=
  85                                --reset-author" &&
  86                IFS="$newline" &&
  87                echo "${COMPREPLY[*]}" > out
  88        ) &&
  89        test_cmp expected out
  90'
  91
  92test_expect_success '__gitcomp - trailing space - config keys' '
  93        sed -e "s/Z$//" >expected <<-\EOF &&
  94        branch.Z
  95        branch.autosetupmerge Z
  96        branch.autosetuprebase Z
  97        browser.Z
  98        EOF
  99        (
 100                local -a COMPREPLY &&
 101                cur="br" &&
 102                __gitcomp "branch. branch.autosetupmerge
 103                                branch.autosetuprebase browser." &&
 104                IFS="$newline" &&
 105                echo "${COMPREPLY[*]}" > out
 106        ) &&
 107        test_cmp expected out
 108'
 109
 110test_expect_success '__gitcomp - option parameter' '
 111        sed -e "s/Z$//" >expected <<-\EOF &&
 112        recursive Z
 113        resolve Z
 114        EOF
 115        (
 116                local -a COMPREPLY &&
 117                cur="--strategy=re" &&
 118                __gitcomp "octopus ours recursive resolve subtree
 119                        " "" "re" &&
 120                IFS="$newline" &&
 121                echo "${COMPREPLY[*]}" > out
 122        ) &&
 123        test_cmp expected out
 124'
 125
 126test_expect_success '__gitcomp - prefix' '
 127        sed -e "s/Z$//" >expected <<-\EOF &&
 128        branch.maint.merge Z
 129        branch.maint.mergeoptions Z
 130        EOF
 131        (
 132                local -a COMPREPLY &&
 133                cur="branch.me" &&
 134                __gitcomp "remote merge mergeoptions rebase
 135                        " "branch.maint." "me" &&
 136                IFS="$newline" &&
 137                echo "${COMPREPLY[*]}" > out
 138        ) &&
 139        test_cmp expected out
 140'
 141
 142test_expect_success '__gitcomp - suffix' '
 143        sed -e "s/Z$//" >expected <<-\EOF &&
 144        branch.master.Z
 145        branch.maint.Z
 146        EOF
 147        (
 148                local -a COMPREPLY &&
 149                cur="branch.me" &&
 150                __gitcomp "master maint next pu
 151                        " "branch." "ma" "." &&
 152                IFS="$newline" &&
 153                echo "${COMPREPLY[*]}" > out
 154        ) &&
 155        test_cmp expected out
 156'
 157
 158test_expect_success 'basic' '
 159        run_completion "git \"\"" &&
 160        # built-in
 161        grep -q "^add \$" out &&
 162        # script
 163        grep -q "^filter-branch \$" out &&
 164        # plumbing
 165        ! grep -q "^ls-files \$" out &&
 166
 167        run_completion "git f" &&
 168        ! grep -q -v "^f" out
 169'
 170
 171test_expect_success 'double dash "git" itself' '
 172        sed -e "s/Z$//" >expected <<-\EOF &&
 173        --paginate Z
 174        --no-pager Z
 175        --git-dir=
 176        --bare Z
 177        --version Z
 178        --exec-path Z
 179        --exec-path=
 180        --html-path Z
 181        --info-path Z
 182        --work-tree=
 183        --namespace=
 184        --no-replace-objects Z
 185        --help Z
 186        EOF
 187        test_completion "git --"
 188'
 189
 190test_expect_success 'double dash "git checkout"' '
 191        sed -e "s/Z$//" >expected <<-\EOF &&
 192        --quiet Z
 193        --ours Z
 194        --theirs Z
 195        --track Z
 196        --no-track Z
 197        --merge Z
 198        --conflict=
 199        --orphan Z
 200        --patch Z
 201        EOF
 202        test_completion "git checkout --"
 203'
 204
 205test_expect_success 'general options' '
 206        test_completion "git --ver" "--version " &&
 207        test_completion "git --hel" "--help " &&
 208        sed -e "s/Z$//" >expected <<-\EOF &&
 209        --exec-path Z
 210        --exec-path=
 211        EOF
 212        test_completion "git --exe" &&
 213        test_completion "git --htm" "--html-path " &&
 214        test_completion "git --pag" "--paginate " &&
 215        test_completion "git --no-p" "--no-pager " &&
 216        test_completion "git --git" "--git-dir=" &&
 217        test_completion "git --wor" "--work-tree=" &&
 218        test_completion "git --nam" "--namespace=" &&
 219        test_completion "git --bar" "--bare " &&
 220        test_completion "git --inf" "--info-path " &&
 221        test_completion "git --no-r" "--no-replace-objects "
 222'
 223
 224test_expect_success 'general options plus command' '
 225        test_completion "git --version check" "checkout " &&
 226        test_completion "git --paginate check" "checkout " &&
 227        test_completion "git --git-dir=foo check" "checkout " &&
 228        test_completion "git --bare check" "checkout " &&
 229        test_completion "git --help des" "describe " &&
 230        test_completion "git --exec-path=foo check" "checkout " &&
 231        test_completion "git --html-path check" "checkout " &&
 232        test_completion "git --no-pager check" "checkout " &&
 233        test_completion "git --work-tree=foo check" "checkout " &&
 234        test_completion "git --namespace=foo check" "checkout " &&
 235        test_completion "git --paginate check" "checkout " &&
 236        test_completion "git --info-path check" "checkout " &&
 237        test_completion "git --no-replace-objects check" "checkout "
 238'
 239
 240test_expect_success 'setup for ref completion' '
 241        echo content >file1 &&
 242        echo more >file2 &&
 243        git add . &&
 244        git commit -m one &&
 245        git branch mybranch &&
 246        git tag mytag
 247'
 248
 249test_expect_success 'checkout completes ref names' '
 250        test_completion_long "git checkout m" <<-\EOF
 251        master_
 252        mybranch_
 253        mytag_
 254        EOF
 255'
 256
 257test_expect_success 'show completes all refs' '
 258        test_completion_long "git show m" <<-\EOF
 259        master_
 260        mybranch_
 261        mytag_
 262        EOF
 263'
 264
 265test_expect_success '<ref>: completes paths' '
 266        test_completion_long "git show mytag:f" <<-\EOF
 267        file1_
 268        file2_
 269        EOF
 270'
 271
 272test_expect_success 'complete tree filename with spaces' '
 273        echo content >"name with spaces" &&
 274        git add . &&
 275        git commit -m spaces &&
 276        test_completion_long "git show HEAD:nam" <<-\EOF
 277        name with spaces_
 278        EOF
 279'
 280
 281test_expect_failure 'complete tree filename with metacharacters' '
 282        echo content >"name with \${meta}" &&
 283        git add . &&
 284        git commit -m meta &&
 285        test_completion_long "git show HEAD:nam" <<-\EOF
 286        name with ${meta}_
 287        name with spaces_
 288        EOF
 289'
 290
 291test_done