summaryrefslogtreecommitdiff
path: root/t/t2020-checkout-detach.sh
diff options
context:
space:
mode:
Diffstat (limited to 't/t2020-checkout-detach.sh')
-rwxr-xr-xt/t2020-checkout-detach.sh56
1 files changed, 56 insertions, 0 deletions
diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh
index 00421453ba..2366f0f414 100755
--- a/t/t2020-checkout-detach.sh
+++ b/t/t2020-checkout-detach.sh
@@ -11,6 +11,14 @@ check_not_detached () {
git symbolic-ref -q HEAD >/dev/null
}
+ORPHAN_WARNING='you are leaving .* commit.*behind'
+check_orphan_warning() {
+ test_i18ngrep "$ORPHAN_WARNING" "$1"
+}
+check_no_orphan_warning() {
+ test_i18ngrep ! "$ORPHAN_WARNING" "$1"
+}
+
reset () {
git checkout master &&
check_not_detached
@@ -19,6 +27,8 @@ reset () {
test_expect_success 'setup' '
test_commit one &&
test_commit two &&
+ test_commit three && git tag -d three &&
+ test_commit four && git tag -d four &&
git branch branch &&
git tag tag
'
@@ -92,4 +102,50 @@ test_expect_success 'checkout --detach moves HEAD' '
git diff --exit-code two
'
+test_expect_success 'checkout warns on orphan commits' '
+ reset &&
+ git checkout --detach two &&
+ echo content >orphan &&
+ git add orphan &&
+ git commit -a -m orphan &&
+ git checkout master 2>stderr
+'
+
+test_expect_success 'checkout warns on orphan commits: output' '
+ check_orphan_warning stderr
+'
+
+test_expect_success 'checkout does not warn leaving ref tip' '
+ reset &&
+ git checkout --detach two &&
+ git checkout master 2>stderr
+'
+
+test_expect_success 'checkout does not warn leaving ref tip' '
+ check_no_orphan_warning stderr
+'
+
+test_expect_success 'checkout does not warn leaving reachable commit' '
+ reset &&
+ git checkout --detach HEAD^ &&
+ git checkout master 2>stderr
+'
+
+test_expect_success 'checkout does not warn leaving reachable commit' '
+ check_no_orphan_warning stderr
+'
+
+cat >expect <<'EOF'
+Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
+EOF
+test_expect_success 'tracking count is accurate after orphan check' '
+ reset &&
+ git branch child master^ &&
+ git config branch.child.remote . &&
+ git config branch.child.merge refs/heads/master &&
+ git checkout child^ &&
+ git checkout child >stdout &&
+ test_cmp expect stdout
+'
+
test_done