summaryrefslogtreecommitdiffstats
path: root/t/t2017-checkout-orphan.sh
blob: a5c7358eeabefb3dacc94ae94e2c61d200381ac5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/sh
#
# Copyright (c) 2010 Erick Mattos
#

test_description='git checkout --orphan

Main Tests for --orphan functionality.'

GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

TEST_FILE=foo

test_expect_success 'Setup' '
	echo "Initial" >"$TEST_FILE" &&
	git add "$TEST_FILE" &&
	git commit -m "First Commit" &&
	test_tick &&
	echo "State 1" >>"$TEST_FILE" &&
	git add "$TEST_FILE" &&
	test_tick &&
	git commit -m "Second Commit"
'

test_expect_success '--orphan creates a new orphan branch from HEAD' '
	git checkout --orphan alpha &&
	test_must_fail git rev-parse --verify HEAD &&
	test "refs/heads/alpha" = "$(git symbolic-ref HEAD)" &&
	test_tick &&
	git commit -m "Third Commit" &&
	test_must_fail git rev-parse --verify HEAD^ &&
	git diff-tree --quiet main alpha
'

test_expect_success '--orphan creates a new orphan branch from <start_point>' '
	git checkout main &&
	git checkout --orphan beta main^ &&
	test_must_fail git rev-parse --verify HEAD &&
	test "refs/heads/beta" = "$(git symbolic-ref HEAD)" &&
	test_tick &&
	git commit -m "Fourth Commit" &&
	test_must_fail git rev-parse --verify HEAD^ &&
	git diff-tree --quiet main^ beta
'

test_expect_success '--orphan must be rejected with -b' '
	git checkout main &&
	test_must_fail git checkout --orphan new -b newer &&
	test refs/heads/main = "$(git symbolic-ref HEAD)"
'

test_expect_success '--orphan must be rejected with -t' '
	git checkout main &&
	test_must_fail git checkout --orphan new -t main &&
	test refs/heads/main = "$(git symbolic-ref HEAD)"
'

test_expect_success '--orphan ignores branch.autosetupmerge' '
	git checkout main &&
	git config branch.autosetupmerge always &&
	git checkout --orphan gamma &&
	test_cmp_config "" --default "" branch.gamma.merge &&
	test refs/heads/gamma = "$(git symbolic-ref HEAD)" &&
	test_must_fail git rev-parse --verify HEAD^ &&
	git checkout main &&
	git config branch.autosetupmerge inherit &&
	git checkout --orphan eta &&
	test_cmp_config "" --default "" branch.eta.merge &&
	test_cmp_config "" --default "" branch.eta.remote &&
	echo refs/heads/eta >expected &&
	git symbolic-ref HEAD >actual &&
	test_cmp expected actual &&
	test_must_fail git rev-parse --verify HEAD^
'

test_expect_success '--orphan makes reflog by default' '
	git checkout main &&
	git config --unset core.logAllRefUpdates &&
	git checkout --orphan delta &&
	test_must_fail git rev-parse --verify delta@{0} &&
	git commit -m Delta &&
	git rev-parse --verify delta@{0}
'

test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = false' '
	git checkout main &&
	git config core.logAllRefUpdates false &&
	git checkout --orphan epsilon &&
	test_must_fail git rev-parse --verify epsilon@{0} &&
	git commit -m Epsilon &&
	test_must_fail git rev-parse --verify epsilon@{0}
'

test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = false' '
	git checkout main &&
	git checkout -l --orphan zeta &&
	test_must_fail git rev-parse --verify zeta@{0} &&
	git commit -m Zeta &&
	git rev-parse --verify zeta@{0}
'

test_expect_success 'giving up --orphan not committed when -l and core.logAllRefUpdates = false deletes reflog' '
	git checkout main &&
	git checkout -l --orphan eta &&
	test_must_fail git rev-parse --verify eta@{0} &&
	git checkout main &&
	test_must_fail git rev-parse --verify eta@{0}
'

test_expect_success '--orphan is rejected with an existing name' '
	git checkout main &&
	test_must_fail git checkout --orphan main &&
	test refs/heads/main = "$(git symbolic-ref HEAD)"
'

test_expect_success '--orphan refuses to switch if a merge is needed' '
	git checkout main &&
	git reset --hard &&
	echo local >>"$TEST_FILE" &&
	cat "$TEST_FILE" >"$TEST_FILE.saved" &&
	test_must_fail git checkout --orphan new main^ &&
	test refs/heads/main = "$(git symbolic-ref HEAD)" &&
	test_cmp "$TEST_FILE" "$TEST_FILE.saved" &&
	git diff-index --quiet --cached HEAD &&
	git reset --hard
'

test_expect_success 'cannot --detach on an unborn branch' '
	git checkout main &&
	git checkout --orphan new &&
	test_must_fail git checkout --detach
'

test_done