1#!/bin/sh
2
3last_shelved_change () {
4 p4 changes -s shelved -m1 | cut -d " " -f 2
5}
6
7test_description='git p4 unshelve'
8
9. ./lib-git-p4.sh
10
11test_expect_success 'start p4d' '
12 start_p4d
13'
14
15test_expect_success 'init depot' '
16 (
17 cd "$cli" &&
18 echo file1 >file1 &&
19 p4 add file1 &&
20 p4 submit -d "change 1" &&
21 : >file_to_delete &&
22 p4 add file_to_delete &&
23 p4 submit -d "file to delete"
24 )
25'
26
27test_expect_success 'initial clone' '
28 git p4 clone --dest="$git" //depot/@all
29'
30
31test_expect_success 'create shelved changelist' '
32 (
33 cd "$cli" &&
34 p4 edit file1 &&
35 echo "a change" >>file1 &&
36 echo "new file" >file2 &&
37 p4 add file2 &&
38 p4 delete file_to_delete &&
39 p4 opened &&
40 p4 shelve -i <<EOF
41Change: new
42Description:
43 Test commit
44
45 Further description
46Files:
47 //depot/file1
48 //depot/file2
49 //depot/file_to_delete
50EOF
51
52 ) &&
53 (
54 cd "$git" &&
55 change=$(last_shelved_change) &&
56 git p4 unshelve $change &&
57 git show refs/remotes/p4/unshelved/$change | grep -q "Further description" &&
58 git cherry-pick refs/remotes/p4/unshelved/$change &&
59 test_path_is_file file2 &&
60 test_cmp file1 "$cli"/file1 &&
61 test_cmp file2 "$cli"/file2 &&
62 test_path_is_missing file_to_delete
63 )
64'
65
66test_expect_success 'update shelved changelist and re-unshelve' '
67 test_when_finished cleanup_git &&
68 (
69 cd "$cli" &&
70 change=$(last_shelved_change) &&
71 echo "file3" >file3 &&
72 p4 add -c $change file3 &&
73 p4 shelve -i -r <<EOF &&
74Change: $change
75Description:
76 Test commit
77
78 Further description
79Files:
80 //depot/file1
81 //depot/file2
82 //depot/file3
83 //depot/file_to_delete
84EOF
85 p4 describe $change
86 ) &&
87 (
88 cd "$git" &&
89 change=$(last_shelved_change) &&
90 git p4 unshelve $change &&
91 git diff refs/remotes/p4/unshelved/$change.0 refs/remotes/p4/unshelved/$change | grep -q file3
92 )
93'
94
95# This is the tricky case where the shelved changelist base revision doesn't
96# match git-p4's idea of the base revision
97#
98# We will attempt to unshelve a change that is based on a change one commit
99# ahead of p4/master
100
101test_expect_success 'create shelved changelist based on p4 change ahead of p4/master' '
102 git p4 clone --dest="$git" //depot/@all &&
103 (
104 cd "$cli" &&
105 p4 revert ... &&
106 p4 edit file1 &&
107 echo "foo" >>file1 &&
108 p4 submit -d "change:foo" &&
109 p4 edit file1 &&
110 echo "bar" >>file1 &&
111 p4 shelve -i <<EOF &&
112Change: new
113Description:
114 Change to be unshelved
115Files:
116 //depot/file1
117EOF
118 change=$(last_shelved_change) &&
119 p4 describe -S $change | grep -q "Change to be unshelved"
120 )
121'
122
123# Now try to unshelve it. git-p4 should refuse to do so.
124test_expect_success 'try to unshelve the change' '
125 test_when_finished cleanup_git &&
126 (
127 change=$(last_shelved_change) &&
128 cd "$git" &&
129 test_must_fail git p4 unshelve $change 2>out.txt &&
130 grep -q "cannot unshelve" out.txt
131 )
132'
133
134test_expect_success 'kill p4d' '
135 kill_p4d
136'
137
138test_done