t / t2020-checkout-detach.shon commit fsck: complain when .gitmodules is a symlink (b7b1fca)
   1#!/bin/sh
   2
   3test_description='checkout into detached HEAD state'
   4. ./test-lib.sh
   5
   6check_detached () {
   7        test_must_fail git symbolic-ref -q HEAD >/dev/null
   8}
   9
  10check_not_detached () {
  11        git symbolic-ref -q HEAD >/dev/null
  12}
  13
  14PREV_HEAD_DESC='Previous HEAD position was'
  15check_orphan_warning() {
  16        test_i18ngrep "you are leaving $2 behind" "$1" &&
  17        test_i18ngrep ! "$PREV_HEAD_DESC" "$1"
  18}
  19check_no_orphan_warning() {
  20        test_i18ngrep ! "you are leaving .* commit.*behind" "$1" &&
  21        test_i18ngrep "$PREV_HEAD_DESC" "$1"
  22}
  23
  24reset () {
  25        git checkout master &&
  26        check_not_detached
  27}
  28
  29test_expect_success 'setup' '
  30        test_commit one &&
  31        test_commit two &&
  32        test_commit three && git tag -d three &&
  33        test_commit four && git tag -d four &&
  34        git branch branch &&
  35        git tag tag
  36'
  37
  38test_expect_success 'checkout branch does not detach' '
  39        reset &&
  40        git checkout branch &&
  41        check_not_detached
  42'
  43
  44test_expect_success 'checkout tag detaches' '
  45        reset &&
  46        git checkout tag &&
  47        check_detached
  48'
  49
  50test_expect_success 'checkout branch by full name detaches' '
  51        reset &&
  52        git checkout refs/heads/branch &&
  53        check_detached
  54'
  55
  56test_expect_success 'checkout non-ref detaches' '
  57        reset &&
  58        git checkout branch^ &&
  59        check_detached
  60'
  61
  62test_expect_success 'checkout ref^0 detaches' '
  63        reset &&
  64        git checkout branch^0 &&
  65        check_detached
  66'
  67
  68test_expect_success 'checkout --detach detaches' '
  69        reset &&
  70        git checkout --detach branch &&
  71        check_detached
  72'
  73
  74test_expect_success 'checkout --detach without branch name' '
  75        reset &&
  76        git checkout --detach &&
  77        check_detached
  78'
  79
  80test_expect_success 'checkout --detach errors out for non-commit' '
  81        reset &&
  82        test_must_fail git checkout --detach one^{tree} &&
  83        check_not_detached
  84'
  85
  86test_expect_success 'checkout --detach errors out for extra argument' '
  87        reset &&
  88        git checkout master &&
  89        test_must_fail git checkout --detach tag one.t &&
  90        check_not_detached
  91'
  92
  93test_expect_success 'checkout --detached and -b are incompatible' '
  94        reset &&
  95        test_must_fail git checkout --detach -b newbranch tag &&
  96        check_not_detached
  97'
  98
  99test_expect_success 'checkout --detach moves HEAD' '
 100        reset &&
 101        git checkout one &&
 102        git checkout --detach two &&
 103        git diff --exit-code HEAD &&
 104        git diff --exit-code two
 105'
 106
 107test_expect_success 'checkout warns on orphan commits' '
 108        reset &&
 109        git checkout --detach two &&
 110        echo content >orphan &&
 111        git add orphan &&
 112        git commit -a -m orphan1 &&
 113        echo new content >orphan &&
 114        git commit -a -m orphan2 &&
 115        orphan2=$(git rev-parse HEAD) &&
 116        git checkout master 2>stderr
 117'
 118
 119test_expect_success 'checkout warns on orphan commits: output' '
 120        check_orphan_warning stderr "2 commits"
 121'
 122
 123test_expect_success 'checkout warns orphaning 1 of 2 commits' '
 124        git checkout "$orphan2" &&
 125        git checkout HEAD^ 2>stderr
 126'
 127
 128test_expect_success 'checkout warns orphaning 1 of 2 commits: output' '
 129        check_orphan_warning stderr "1 commit"
 130'
 131
 132test_expect_success 'checkout does not warn leaving ref tip' '
 133        reset &&
 134        git checkout --detach two &&
 135        git checkout master 2>stderr
 136'
 137
 138test_expect_success 'checkout does not warn leaving ref tip' '
 139        check_no_orphan_warning stderr
 140'
 141
 142test_expect_success 'checkout does not warn leaving reachable commit' '
 143        reset &&
 144        git checkout --detach HEAD^ &&
 145        git checkout master 2>stderr
 146'
 147
 148test_expect_success 'checkout does not warn leaving reachable commit' '
 149        check_no_orphan_warning stderr
 150'
 151
 152cat >expect <<'EOF'
 153Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
 154  (use "git pull" to update your local branch)
 155EOF
 156test_expect_success 'tracking count is accurate after orphan check' '
 157        reset &&
 158        git branch child master^ &&
 159        git config branch.child.remote . &&
 160        git config branch.child.merge refs/heads/master &&
 161        git checkout child^ &&
 162        git checkout child >stdout &&
 163        test_i18ncmp expect stdout
 164'
 165
 166test_expect_success 'no advice given for explicit detached head state' '
 167        # baseline
 168        test_config advice.detachedHead true &&
 169        git checkout child && git checkout HEAD^0 >expect.advice 2>&1 &&
 170        test_config advice.detachedHead false &&
 171        git checkout child && git checkout HEAD^0 >expect.no-advice 2>&1 &&
 172        test_unconfig advice.detachedHead &&
 173        # without configuration, the advice.* variables default to true
 174        git checkout child && git checkout HEAD^0 >actual 2>&1 &&
 175        test_cmp expect.advice actual &&
 176
 177        # with explicit --detach
 178        # no configuration
 179        test_unconfig advice.detachedHead &&
 180        git checkout child && git checkout --detach HEAD^0 >actual 2>&1 &&
 181        test_cmp expect.no-advice actual &&
 182
 183        # explicitly decline advice
 184        test_config advice.detachedHead false &&
 185        git checkout child && git checkout --detach HEAD^0 >actual 2>&1 &&
 186        test_cmp expect.no-advice actual
 187'
 188
 189# Detached HEAD tests for GIT_PRINT_SHA1_ELLIPSIS (new format)
 190test_expect_success 'describe_detached_head prints no SHA-1 ellipsis when not asked to' "
 191
 192        # The first detach operation is more chatty than the following ones.
 193        cat >1st_detach <<-'EOF' &&
 194        Note: checking out 'HEAD^'.
 195
 196        You are in 'detached HEAD' state. You can look around, make experimental
 197        changes and commit them, and you can discard any commits you make in this
 198        state without impacting any branches by performing another checkout.
 199
 200        If you want to create a new branch to retain commits you create, you may
 201        do so (now or later) by using -b with the checkout command again. Example:
 202
 203          git checkout -b <new-branch-name>
 204
 205        HEAD is now at 7c7cd714e262 three
 206        EOF
 207
 208        # The remaining ones just show info about previous and current HEADs.
 209        cat >2nd_detach <<-'EOF' &&
 210        Previous HEAD position was 7c7cd714e262 three
 211        HEAD is now at 139b20d8e6c5 two
 212        EOF
 213
 214        cat >3rd_detach <<-'EOF' &&
 215        Previous HEAD position was 139b20d8e6c5 two
 216        HEAD is now at d79ce1670bdc one
 217        EOF
 218
 219        reset &&
 220        check_not_detached &&
 221
 222        # Various ways of *not* asking for ellipses
 223
 224        sane_unset GIT_PRINT_SHA1_ELLIPSIS &&
 225        git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 226        check_detached &&
 227        test_i18ncmp 1st_detach actual &&
 228
 229        GIT_PRINT_SHA1_ELLIPSIS="no" git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 230        check_detached &&
 231        test_i18ncmp 2nd_detach actual &&
 232
 233        GIT_PRINT_SHA1_ELLIPSIS= git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 234        check_detached &&
 235        test_i18ncmp 3rd_detach actual &&
 236
 237        sane_unset GIT_PRINT_SHA1_ELLIPSIS &&
 238
 239        # We only have four commits, but we can re-use them
 240        reset &&
 241        check_not_detached &&
 242
 243        # Make no mention of the env var at all
 244        git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 245        check_detached &&
 246        test_i18ncmp 1st_detach actual &&
 247
 248        GIT_PRINT_SHA1_ELLIPSIS='nope' &&
 249        git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 250        check_detached &&
 251        test_i18ncmp 2nd_detach actual &&
 252
 253        GIT_PRINT_SHA1_ELLIPSIS=nein &&
 254        git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 255        check_detached &&
 256        test_i18ncmp 3rd_detach actual &&
 257
 258        true
 259"
 260
 261# Detached HEAD tests for GIT_PRINT_SHA1_ELLIPSIS (old format)
 262test_expect_success 'describe_detached_head does print SHA-1 ellipsis when asked to' "
 263
 264        # The first detach operation is more chatty than the following ones.
 265        cat >1st_detach <<-'EOF' &&
 266        Note: checking out 'HEAD^'.
 267
 268        You are in 'detached HEAD' state. You can look around, make experimental
 269        changes and commit them, and you can discard any commits you make in this
 270        state without impacting any branches by performing another checkout.
 271
 272        If you want to create a new branch to retain commits you create, you may
 273        do so (now or later) by using -b with the checkout command again. Example:
 274
 275          git checkout -b <new-branch-name>
 276
 277        HEAD is now at 7c7cd714e262... three
 278        EOF
 279
 280        # The remaining ones just show info about previous and current HEADs.
 281        cat >2nd_detach <<-'EOF' &&
 282        Previous HEAD position was 7c7cd714e262... three
 283        HEAD is now at 139b20d8e6c5... two
 284        EOF
 285
 286        cat >3rd_detach <<-'EOF' &&
 287        Previous HEAD position was 139b20d8e6c5... two
 288        HEAD is now at d79ce1670bdc... one
 289        EOF
 290
 291        reset &&
 292        check_not_detached &&
 293
 294        # Various ways of asking for ellipses...
 295        # The user can just use any kind of quoting (including none).
 296
 297        GIT_PRINT_SHA1_ELLIPSIS=yes git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 298        check_detached &&
 299        test_i18ncmp 1st_detach actual &&
 300
 301        GIT_PRINT_SHA1_ELLIPSIS=Yes git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 302        check_detached &&
 303        test_i18ncmp 2nd_detach actual &&
 304
 305        GIT_PRINT_SHA1_ELLIPSIS=YES git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
 306        check_detached &&
 307        test_i18ncmp 3rd_detach actual &&
 308
 309        true
 310"
 311
 312test_done