4884e1b40c8a40e549f877493643296a9b0855e0
   1#!/bin/sh
   2
   3test_description='Test automatic use of a pager.'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY"/lib-pager.sh
   7. "$TEST_DIRECTORY"/lib-terminal.sh
   8
   9cleanup_fail() {
  10        echo >&2 cleanup failed
  11        (exit 1)
  12}
  13
  14test_expect_success 'setup' '
  15        sane_unset GIT_PAGER GIT_PAGER_IN_USE &&
  16        test_unconfig core.pager &&
  17
  18        PAGER="cat >paginated.out" &&
  19        export PAGER &&
  20
  21        test_commit initial
  22'
  23
  24test_expect_success TTY 'some commands use a pager' '
  25        rm -f paginated.out ||
  26        cleanup_fail &&
  27
  28        test_terminal git log &&
  29        test -e paginated.out
  30'
  31
  32test_expect_failure TTY 'pager runs from subdir' '
  33        echo subdir/paginated.out >expected &&
  34        mkdir -p subdir &&
  35        rm -f paginated.out subdir/paginated.out &&
  36        (
  37                cd subdir &&
  38                test_terminal git log
  39        ) &&
  40        {
  41                ls paginated.out subdir/paginated.out ||
  42                :
  43        } >actual &&
  44        test_cmp expected actual
  45'
  46
  47test_expect_success TTY 'some commands do not use a pager' '
  48        rm -f paginated.out ||
  49        cleanup_fail &&
  50
  51        test_terminal git rev-list HEAD &&
  52        ! test -e paginated.out
  53'
  54
  55test_expect_success 'no pager when stdout is a pipe' '
  56        rm -f paginated.out ||
  57        cleanup_fail &&
  58
  59        git log | cat &&
  60        ! test -e paginated.out
  61'
  62
  63test_expect_success 'no pager when stdout is a regular file' '
  64        rm -f paginated.out ||
  65        cleanup_fail &&
  66
  67        git log >file &&
  68        ! test -e paginated.out
  69'
  70
  71test_expect_success TTY 'git --paginate rev-list uses a pager' '
  72        rm -f paginated.out ||
  73        cleanup_fail &&
  74
  75        test_terminal git --paginate rev-list HEAD &&
  76        test -e paginated.out
  77'
  78
  79test_expect_success 'no pager even with --paginate when stdout is a pipe' '
  80        rm -f file paginated.out ||
  81        cleanup_fail &&
  82
  83        git --paginate log | cat &&
  84        ! test -e paginated.out
  85'
  86
  87test_expect_success TTY 'no pager with --no-pager' '
  88        rm -f paginated.out ||
  89        cleanup_fail &&
  90
  91        test_terminal git --no-pager log &&
  92        ! test -e paginated.out
  93'
  94
  95test_expect_success TTY 'configuration can disable pager' '
  96        rm -f paginated.out &&
  97        test_unconfig pager.grep &&
  98        test_terminal git grep initial &&
  99        test -e paginated.out &&
 100
 101        rm -f paginated.out &&
 102        test_config pager.grep false &&
 103        test_terminal git grep initial &&
 104        ! test -e paginated.out
 105'
 106
 107test_expect_success TTY 'git config uses a pager if configured to' '
 108        rm -f paginated.out &&
 109        test_config pager.config true &&
 110        test_terminal git config --list &&
 111        test -e paginated.out
 112'
 113
 114test_expect_success TTY 'configuration can enable pager (from subdir)' '
 115        rm -f paginated.out &&
 116        mkdir -p subdir &&
 117        test_config pager.bundle true &&
 118
 119        git bundle create test.bundle --all &&
 120        rm -f paginated.out subdir/paginated.out &&
 121        (
 122                cd subdir &&
 123                test_terminal git bundle unbundle ../test.bundle
 124        ) &&
 125        {
 126                test -e paginated.out ||
 127                test -e subdir/paginated.out
 128        }
 129'
 130
 131# A colored commit log will begin with an appropriate ANSI escape
 132# for the first color; the text "commit" comes later.
 133colorful() {
 134        read firstline <$1
 135        ! expr "$firstline" : "[a-zA-Z]" >/dev/null
 136}
 137
 138test_expect_success 'tests can detect color' '
 139        rm -f colorful.log colorless.log ||
 140        cleanup_fail &&
 141
 142        git log --no-color >colorless.log &&
 143        git log --color >colorful.log &&
 144        ! colorful colorless.log &&
 145        colorful colorful.log
 146'
 147
 148test_expect_success 'no color when stdout is a regular file' '
 149        rm -f colorless.log &&
 150        test_config color.ui auto ||
 151        cleanup_fail &&
 152
 153        git log >colorless.log &&
 154        ! colorful colorless.log
 155'
 156
 157test_expect_success TTY 'color when writing to a pager' '
 158        rm -f paginated.out &&
 159        test_config color.ui auto ||
 160        cleanup_fail &&
 161
 162        (
 163                TERM=vt100 &&
 164                export TERM &&
 165                test_terminal git log
 166        ) &&
 167        colorful paginated.out
 168'
 169
 170test_expect_success 'color when writing to a file intended for a pager' '
 171        rm -f colorful.log &&
 172        test_config color.ui auto ||
 173        cleanup_fail &&
 174
 175        (
 176                TERM=vt100 &&
 177                GIT_PAGER_IN_USE=true &&
 178                export TERM GIT_PAGER_IN_USE &&
 179                git log >colorful.log
 180        ) &&
 181        colorful colorful.log
 182'
 183
 184test_expect_success TTY 'colors are sent to pager for external commands' '
 185        test_config alias.externallog "!git log" &&
 186        test_config color.ui auto &&
 187        (
 188                TERM=vt100 &&
 189                export TERM &&
 190                test_terminal git -p externallog
 191        ) &&
 192        colorful paginated.out
 193'
 194
 195# Use this helper to make it easy for the caller of your
 196# terminal-using function to specify whether it should fail.
 197# If you write
 198#
 199#       your_test() {
 200#               parse_args "$@"
 201#
 202#               $test_expectation "$cmd - behaves well" "
 203#                       ...
 204#                       $full_command &&
 205#                       ...
 206#               "
 207#       }
 208#
 209# then your test can be used like this:
 210#
 211#       your_test expect_(success|failure) [test_must_fail] 'git foo'
 212#
 213parse_args() {
 214        test_expectation="test_$1"
 215        shift
 216        if test "$1" = test_must_fail
 217        then
 218                full_command="test_must_fail test_terminal "
 219                shift
 220        else
 221                full_command="test_terminal "
 222        fi
 223        cmd=$1
 224        full_command="$full_command $1"
 225}
 226
 227test_default_pager() {
 228        parse_args "$@"
 229
 230        $test_expectation SIMPLEPAGER,TTY "$cmd - default pager is used by default" "
 231                sane_unset PAGER GIT_PAGER &&
 232                test_unconfig core.pager &&
 233                rm -f default_pager_used ||
 234                cleanup_fail &&
 235
 236                cat >\$less <<-\EOF &&
 237                #!/bin/sh
 238                wc >default_pager_used
 239                EOF
 240                chmod +x \$less &&
 241                (
 242                        PATH=.:\$PATH &&
 243                        export PATH &&
 244                        $full_command
 245                ) &&
 246                test -e default_pager_used
 247        "
 248}
 249
 250test_PAGER_overrides() {
 251        parse_args "$@"
 252
 253        $test_expectation TTY "$cmd - PAGER overrides default pager" "
 254                sane_unset GIT_PAGER &&
 255                test_unconfig core.pager &&
 256                rm -f PAGER_used ||
 257                cleanup_fail &&
 258
 259                PAGER='wc >PAGER_used' &&
 260                export PAGER &&
 261                $full_command &&
 262                test -e PAGER_used
 263        "
 264}
 265
 266test_core_pager_overrides() {
 267        if_local_config=
 268        used_if_wanted='overrides PAGER'
 269        test_core_pager "$@"
 270}
 271
 272test_local_config_ignored() {
 273        if_local_config='! '
 274        used_if_wanted='is not used'
 275        test_core_pager "$@"
 276}
 277
 278test_core_pager() {
 279        parse_args "$@"
 280
 281        $test_expectation TTY "$cmd - repository-local core.pager setting $used_if_wanted" "
 282                sane_unset GIT_PAGER &&
 283                rm -f core.pager_used ||
 284                cleanup_fail &&
 285
 286                PAGER=wc &&
 287                export PAGER &&
 288                test_config core.pager 'wc >core.pager_used' &&
 289                $full_command &&
 290                ${if_local_config}test -e core.pager_used
 291        "
 292}
 293
 294test_core_pager_subdir() {
 295        if_local_config=
 296        used_if_wanted='overrides PAGER'
 297        test_pager_subdir_helper "$@"
 298}
 299
 300test_no_local_config_subdir() {
 301        if_local_config='! '
 302        used_if_wanted='is not used'
 303        test_pager_subdir_helper "$@"
 304}
 305
 306test_pager_subdir_helper() {
 307        parse_args "$@"
 308
 309        $test_expectation TTY "$cmd - core.pager $used_if_wanted from subdirectory" "
 310                sane_unset GIT_PAGER &&
 311                rm -f core.pager_used &&
 312                rm -fr sub ||
 313                cleanup_fail &&
 314
 315                PAGER=wc &&
 316                stampname=\$(pwd)/core.pager_used &&
 317                export PAGER stampname &&
 318                test_config core.pager 'wc >\"\$stampname\"' &&
 319                mkdir sub &&
 320                (
 321                        cd sub &&
 322                        $full_command
 323                ) &&
 324                ${if_local_config}test -e core.pager_used
 325        "
 326}
 327
 328test_GIT_PAGER_overrides() {
 329        parse_args "$@"
 330
 331        $test_expectation TTY "$cmd - GIT_PAGER overrides core.pager" "
 332                rm -f GIT_PAGER_used ||
 333                cleanup_fail &&
 334
 335                test_config core.pager wc &&
 336                GIT_PAGER='wc >GIT_PAGER_used' &&
 337                export GIT_PAGER &&
 338                $full_command &&
 339                test -e GIT_PAGER_used
 340        "
 341}
 342
 343test_doesnt_paginate() {
 344        parse_args "$@"
 345
 346        $test_expectation TTY "no pager for '$cmd'" "
 347                rm -f GIT_PAGER_used ||
 348                cleanup_fail &&
 349
 350                GIT_PAGER='wc >GIT_PAGER_used' &&
 351                export GIT_PAGER &&
 352                $full_command &&
 353                ! test -e GIT_PAGER_used
 354        "
 355}
 356
 357test_pager_choices() {
 358        test_default_pager        expect_success "$@"
 359        test_PAGER_overrides      expect_success "$@"
 360        test_core_pager_overrides expect_success "$@"
 361        test_core_pager_subdir    expect_success "$@"
 362        test_GIT_PAGER_overrides  expect_success "$@"
 363}
 364
 365test_expect_success 'setup: some aliases' '
 366        git config alias.aliasedlog log &&
 367        git config alias.true "!true"
 368'
 369
 370test_pager_choices                       'git log'
 371test_pager_choices                       'git -p log'
 372test_pager_choices                       'git aliasedlog'
 373
 374test_default_pager        expect_success 'git -p aliasedlog'
 375test_PAGER_overrides      expect_success 'git -p aliasedlog'
 376test_core_pager_overrides expect_success 'git -p aliasedlog'
 377test_core_pager_subdir    expect_failure 'git -p aliasedlog'
 378test_GIT_PAGER_overrides  expect_success 'git -p aliasedlog'
 379
 380test_default_pager        expect_success 'git -p true'
 381test_PAGER_overrides      expect_success 'git -p true'
 382test_core_pager_overrides expect_success 'git -p true'
 383test_core_pager_subdir    expect_failure 'git -p true'
 384test_GIT_PAGER_overrides  expect_success 'git -p true'
 385
 386test_default_pager        expect_success test_must_fail 'git -p request-pull'
 387test_PAGER_overrides      expect_success test_must_fail 'git -p request-pull'
 388test_core_pager_overrides expect_success test_must_fail 'git -p request-pull'
 389test_core_pager_subdir    expect_failure test_must_fail 'git -p request-pull'
 390test_GIT_PAGER_overrides  expect_success test_must_fail 'git -p request-pull'
 391
 392test_default_pager        expect_success test_must_fail 'git -p'
 393test_PAGER_overrides      expect_success test_must_fail 'git -p'
 394test_local_config_ignored expect_failure test_must_fail 'git -p'
 395test_no_local_config_subdir expect_success test_must_fail 'git -p'
 396test_GIT_PAGER_overrides  expect_success test_must_fail 'git -p'
 397
 398test_doesnt_paginate      expect_failure test_must_fail 'git -p nonsense'
 399
 400test_pager_choices                       'git shortlog'
 401test_expect_success 'setup: configure shortlog not to paginate' '
 402        git config pager.shortlog false
 403'
 404test_doesnt_paginate      expect_success 'git shortlog'
 405test_no_local_config_subdir expect_success 'git shortlog'
 406test_default_pager        expect_success 'git -p shortlog'
 407test_core_pager_subdir    expect_success 'git -p shortlog'
 408
 409test_core_pager_subdir    expect_success test_must_fail \
 410                                         'git -p apply </dev/null'
 411
 412test_expect_success TTY 'command-specific pager' '
 413        sane_unset PAGER GIT_PAGER &&
 414        echo "foo:initial" >expect &&
 415        >actual &&
 416        test_unconfig core.pager &&
 417        test_config pager.log "sed s/^/foo:/ >actual" &&
 418        test_terminal git log --format=%s -1 &&
 419        test_cmp expect actual
 420'
 421
 422test_expect_success TTY 'command-specific pager overrides core.pager' '
 423        sane_unset PAGER GIT_PAGER &&
 424        echo "foo:initial" >expect &&
 425        >actual &&
 426        test_config core.pager "exit 1"
 427        test_config pager.log "sed s/^/foo:/ >actual" &&
 428        test_terminal git log --format=%s -1 &&
 429        test_cmp expect actual
 430'
 431
 432test_expect_success TTY 'command-specific pager overridden by environment' '
 433        GIT_PAGER="sed s/^/foo:/ >actual" && export GIT_PAGER &&
 434        >actual &&
 435        echo "foo:initial" >expect &&
 436        test_config pager.log "exit 1" &&
 437        test_terminal git log --format=%s -1 &&
 438        test_cmp expect actual
 439'
 440
 441test_done