t / t2020-checkout-detach.shon commit Merge branch 'maint' (61e8aaf)
   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
  14ORPHAN_WARNING='you are leaving .* commit.*behind'
  15check_orphan_warning() {
  16        grep "$ORPHAN_WARNING" "$1"
  17}
  18check_no_orphan_warning() {
  19        ! grep "$ORPHAN_WARNING" "$1"
  20}
  21
  22reset () {
  23        git checkout master &&
  24        check_not_detached
  25}
  26
  27test_expect_success 'setup' '
  28        test_commit one &&
  29        test_commit two &&
  30        test_commit three && git tag -d three &&
  31        test_commit four && git tag -d four &&
  32        git branch branch &&
  33        git tag tag
  34'
  35
  36test_expect_success 'checkout branch does not detach' '
  37        reset &&
  38        git checkout branch &&
  39        check_not_detached
  40'
  41
  42test_expect_success 'checkout tag detaches' '
  43        reset &&
  44        git checkout tag &&
  45        check_detached
  46'
  47
  48test_expect_success 'checkout branch by full name detaches' '
  49        reset &&
  50        git checkout refs/heads/branch &&
  51        check_detached
  52'
  53
  54test_expect_success 'checkout non-ref detaches' '
  55        reset &&
  56        git checkout branch^ &&
  57        check_detached
  58'
  59
  60test_expect_success 'checkout ref^0 detaches' '
  61        reset &&
  62        git checkout branch^0 &&
  63        check_detached
  64'
  65
  66test_expect_success 'checkout --detach detaches' '
  67        reset &&
  68        git checkout --detach branch &&
  69        check_detached
  70'
  71
  72test_expect_success 'checkout --detach without branch name' '
  73        reset &&
  74        git checkout --detach &&
  75        check_detached
  76'
  77
  78test_expect_success 'checkout --detach errors out for non-commit' '
  79        reset &&
  80        test_must_fail git checkout --detach one^{tree} &&
  81        check_not_detached
  82'
  83
  84test_expect_success 'checkout --detach errors out for extra argument' '
  85        reset &&
  86        git checkout master &&
  87        test_must_fail git checkout --detach tag one.t &&
  88        check_not_detached
  89'
  90
  91test_expect_success 'checkout --detached and -b are incompatible' '
  92        reset &&
  93        test_must_fail git checkout --detach -b newbranch tag &&
  94        check_not_detached
  95'
  96
  97test_expect_success 'checkout --detach moves HEAD' '
  98        reset &&
  99        git checkout one &&
 100        git checkout --detach two &&
 101        git diff --exit-code HEAD &&
 102        git diff --exit-code two
 103'
 104
 105test_expect_success 'checkout warns on orphan commits' '
 106        reset &&
 107        git checkout --detach two &&
 108        echo content >orphan &&
 109        git add orphan &&
 110        git commit -a -m orphan &&
 111        git checkout master 2>stderr &&
 112        check_orphan_warning stderr
 113'
 114
 115test_expect_success 'checkout does not warn leaving ref tip' '
 116        reset &&
 117        git checkout --detach two &&
 118        git checkout master 2>stderr &&
 119        check_no_orphan_warning stderr
 120'
 121
 122test_expect_success 'checkout does not warn leaving reachable commit' '
 123        reset &&
 124        git checkout --detach HEAD^ &&
 125        git checkout master 2>stderr &&
 126        check_no_orphan_warning stderr
 127'
 128
 129cat >expect <<'EOF'
 130Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
 131EOF
 132test_expect_success 'tracking count is accurate after orphan check' '
 133        reset &&
 134        git branch child master^ &&
 135        git config branch.child.remote . &&
 136        git config branch.child.merge refs/heads/master &&
 137        git checkout child^ &&
 138        git checkout child >stdout &&
 139        test_cmp expect stdout
 140'
 141
 142test_done