summaryrefslogtreecommitdiff
path: root/t/t9832-unshelve.sh
blob: 48ec7679b8d9632259c3b319d11ad8eb1acd5ceb (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

last_shelved_change () {
	p4 changes -s shelved -m1 | cut -d " " -f 2
}

test_description='git p4 unshelve'

. ./lib-git-p4.sh

test_expect_success 'start p4d' '
	start_p4d
'

test_expect_success 'init depot' '
	(
		cd "$cli" &&
		echo file1 >file1 &&
		p4 add file1 &&
		p4 submit -d "change 1" &&
		: >file_to_delete &&
		p4 add file_to_delete &&
		p4 submit -d "file to delete"
	)
'

test_expect_success 'initial clone' '
	git p4 clone --dest="$git" //depot/@all
'

test_expect_success 'create shelved changelist' '
	(
		cd "$cli" &&
		p4 edit file1 &&
		echo "a change" >>file1 &&
		echo "new file" >file2 &&
		p4 add file2 &&
		p4 delete file_to_delete &&
		p4 opened &&
		p4 shelve -i <<EOF
Change: new
Description:
	Test commit

	Further description
Files:
	//depot/file1
	//depot/file2
	//depot/file_to_delete
EOF

	) &&
	(
		cd "$git" &&
		change=$(last_shelved_change) &&
		git p4 unshelve $change &&
		git show refs/remotes/p4/unshelved/$change | grep -q "Further description" &&
		git cherry-pick refs/remotes/p4/unshelved/$change &&
		test_path_is_file file2 &&
		test_cmp file1 "$cli"/file1 &&
		test_cmp file2 "$cli"/file2 &&
		test_path_is_missing file_to_delete
	)
'

test_expect_success 'update shelved changelist and re-unshelve' '
	test_when_finished cleanup_git &&
	(
		cd "$cli" &&
		change=$(last_shelved_change) &&
		echo "file3" >file3 &&
		p4 add -c $change file3 &&
		p4 shelve -i -r <<EOF &&
Change: $change
Description:
	Test commit

	Further description
Files:
	//depot/file1
	//depot/file2
	//depot/file3
	//depot/file_to_delete
EOF
		p4 describe $change
	) &&
	(
		cd "$git" &&
		change=$(last_shelved_change) &&
		git p4 unshelve $change &&
		git diff refs/remotes/p4/unshelved/$change.0 refs/remotes/p4/unshelved/$change | grep -q file3
	)
'

# This is the tricky case where the shelved changelist base revision doesn't
# match git-p4's idea of the base revision
#
# We will attempt to unshelve a change that is based on a change one commit
# ahead of p4/master

test_expect_success 'create shelved changelist based on p4 change ahead of p4/master' '
	git p4 clone --dest="$git" //depot/@all &&
	(
		cd "$cli" &&
		p4 revert ... &&
		p4 edit file1 &&
		echo "foo" >>file1 &&
		p4 submit -d "change:foo" &&
		p4 edit file1 &&
		echo "bar" >>file1 &&
		p4 shelve -i <<EOF &&
Change: new
Description:
	Change to be unshelved
Files:
	//depot/file1
EOF
		change=$(last_shelved_change) &&
		p4 describe -S $change | grep -q "Change to be unshelved"
	)
'

# Now try to unshelve it. git-p4 should refuse to do so.
test_expect_success 'try to unshelve the change' '
	test_when_finished cleanup_git &&
	(
		change=$(last_shelved_change) &&
		cd "$git" &&
		test_must_fail git p4 unshelve $change 2>out.txt &&
		grep -q "cannot unshelve" out.txt
	)
'

test_expect_success 'kill p4d' '
	kill_p4d
'

test_done