Show More
@@ -0,0 +1,104 b'' | |||||
|
1 | #!/bin/sh | |||
|
2 | ||||
|
3 | "$TESTDIR/hghave" p4 execbit symlink || exit 80 | |||
|
4 | ||||
|
5 | echo "[extensions]" >> $HGRCPATH | |||
|
6 | echo "convert = " >> $HGRCPATH | |||
|
7 | ||||
|
8 | echo % create p4 depot | |||
|
9 | export P4ROOT=$PWD/depot | |||
|
10 | export P4AUDIT=$P4ROOT/audit | |||
|
11 | export P4JOURNAL=$P4ROOT/journal | |||
|
12 | export P4LOG=$P4ROOT/log | |||
|
13 | export P4PORT=localhost:16661 | |||
|
14 | export P4DEBUG=1 | |||
|
15 | export P4CHARSET=utf8 | |||
|
16 | ||||
|
17 | echo % start the p4 server | |||
|
18 | [ ! -d $P4ROOT ] && mkdir $P4ROOT | |||
|
19 | p4d -f -J off -xi >$P4ROOT/stdout 2>$P4ROOT/stderr | |||
|
20 | p4d -f -J off >$P4ROOT/stdout 2>$P4ROOT/stderr & | |||
|
21 | trap "echo % stop the p4 server ; p4 admin stop" EXIT | |||
|
22 | ||||
|
23 | # wait for the server to initialize | |||
|
24 | while ! p4 ; do | |||
|
25 | sleep 1 | |||
|
26 | done >/dev/null 2>/dev/null | |||
|
27 | ||||
|
28 | echo % create a client spec | |||
|
29 | export P4CLIENT=hg-p4-import | |||
|
30 | DEPOTPATH=//depot/test-mercurial-import/... | |||
|
31 | p4 client -o | sed '/^View:/,$ d' >p4client | |||
|
32 | echo View: >>p4client | |||
|
33 | echo " $DEPOTPATH //$P4CLIENT/..." >>p4client | |||
|
34 | p4 client -i <p4client | |||
|
35 | ||||
|
36 | echo % populate the depot | |||
|
37 | TYPES="text binary symlink" | |||
|
38 | TYPES="$TYPES text+m text+w text+x text+k text+kx text+ko text+l text+C text+D text+F text+S text+S2" | |||
|
39 | TYPES="$TYPES binary+k binary+x binary+kx symlink+k" | |||
|
40 | TYPES="$TYPES ctext cxtext ktext kxtext ltext tempobj ubinary uxbinary xbinary xltext xtempobj xtext" | |||
|
41 | # not testing these | |||
|
42 | #TYPES="$TYPES apple resource unicode utf16 uresource xunicode xutf16" | |||
|
43 | for T in $TYPES ; do | |||
|
44 | T2=`echo $T | tr [:upper:] [:lower:]` | |||
|
45 | case $T in | |||
|
46 | apple) | |||
|
47 | ;; | |||
|
48 | symlink*) | |||
|
49 | echo "this is target $T" >target_$T2 | |||
|
50 | ln -s target_$T file_$T2 | |||
|
51 | p4 add target_$T2 | |||
|
52 | p4 add -t $T file_$T2 | |||
|
53 | ;; | |||
|
54 | binary*) | |||
|
55 | python -c "file('file_$T2', 'wb').write('this is $T')" | |||
|
56 | p4 add -t $T file_$T2 | |||
|
57 | ;; | |||
|
58 | *) | |||
|
59 | echo "this is $T" >file_$T2 | |||
|
60 | p4 add -t $T file_$T2 | |||
|
61 | ;; | |||
|
62 | esac | |||
|
63 | done | |||
|
64 | p4 submit -d initial | |||
|
65 | ||||
|
66 | echo % test keyword expansion | |||
|
67 | p4 edit file_* target_* | |||
|
68 | for T in $TYPES ; do | |||
|
69 | T2=`echo $T | tr [:upper:] [:lower:]` | |||
|
70 | echo '$Id$' >>file_$T2 | |||
|
71 | echo '$Header$' >>file_$T2 | |||
|
72 | echo '$Date$' >>file_$T2 | |||
|
73 | echo '$DateTime$' >>file_$T2 | |||
|
74 | echo '$Change$' >>file_$T2 | |||
|
75 | echo '$File$' >>file_$T2 | |||
|
76 | echo '$Revision$' >>file_$T2 | |||
|
77 | echo '$Header$$Header$Header$' >>file_$T2 | |||
|
78 | done | |||
|
79 | ||||
|
80 | ln -s 'target_$Header$' crazy_symlink+k | |||
|
81 | p4 add -t symlink+k crazy_symlink+k | |||
|
82 | ||||
|
83 | p4 submit -d keywords | |||
|
84 | ||||
|
85 | echo % check keywords in p4 | |||
|
86 | grep -H Header file_* | |||
|
87 | ||||
|
88 | echo % convert | |||
|
89 | hg convert -s p4 $DEPOTPATH dst | |||
|
90 | hg -R dst log --template 'rev={rev} desc="{desc}" tags="{tags}" files="{files}"\n'g | |||
|
91 | ||||
|
92 | echo % revision 0 | |||
|
93 | hg -R dst update 0 | |||
|
94 | head dst/file_* | cat -v | |||
|
95 | ||||
|
96 | echo | |||
|
97 | echo % revision 1 | |||
|
98 | hg -R dst update 1 | |||
|
99 | head dst/file_* | cat -v | |||
|
100 | echo | |||
|
101 | echo % crazy_symlink | |||
|
102 | readlink crazy_symlink+k | |||
|
103 | readlink dst/crazy_symlink+k | |||
|
104 |
This diff has been collapsed as it changes many lines, (642 lines changed) Show them Hide them | |||||
@@ -0,0 +1,642 b'' | |||||
|
1 | % create p4 depot | |||
|
2 | % start the p4 server | |||
|
3 | % create a client spec | |||
|
4 | Client hg-p4-import saved. | |||
|
5 | % populate the depot | |||
|
6 | //depot/test-mercurial-import/file_text#1 - opened for add | |||
|
7 | //depot/test-mercurial-import/file_binary#1 - opened for add | |||
|
8 | //depot/test-mercurial-import/target_symlink#1 - opened for add | |||
|
9 | //depot/test-mercurial-import/file_symlink#1 - opened for add | |||
|
10 | //depot/test-mercurial-import/file_text+m#1 - opened for add | |||
|
11 | //depot/test-mercurial-import/file_text+w#1 - opened for add | |||
|
12 | //depot/test-mercurial-import/file_text+x#1 - opened for add | |||
|
13 | //depot/test-mercurial-import/file_text+k#1 - opened for add | |||
|
14 | //depot/test-mercurial-import/file_text+kx#1 - opened for add | |||
|
15 | //depot/test-mercurial-import/file_text+ko#1 - opened for add | |||
|
16 | //depot/test-mercurial-import/file_text+l#1 - opened for add | |||
|
17 | //depot/test-mercurial-import/file_text+c#1 - opened for add | |||
|
18 | //depot/test-mercurial-import/file_text+d#1 - opened for add | |||
|
19 | //depot/test-mercurial-import/file_text+f#1 - opened for add | |||
|
20 | //depot/test-mercurial-import/file_text+s#1 - opened for add | |||
|
21 | //depot/test-mercurial-import/file_text+s2#1 - opened for add | |||
|
22 | //depot/test-mercurial-import/file_binary+k#1 - opened for add | |||
|
23 | //depot/test-mercurial-import/file_binary+x#1 - opened for add | |||
|
24 | //depot/test-mercurial-import/file_binary+kx#1 - opened for add | |||
|
25 | //depot/test-mercurial-import/target_symlink+k#1 - opened for add | |||
|
26 | //depot/test-mercurial-import/file_symlink+k#1 - opened for add | |||
|
27 | //depot/test-mercurial-import/file_ctext#1 - opened for add | |||
|
28 | //depot/test-mercurial-import/file_cxtext#1 - opened for add | |||
|
29 | //depot/test-mercurial-import/file_ktext#1 - opened for add | |||
|
30 | //depot/test-mercurial-import/file_kxtext#1 - opened for add | |||
|
31 | //depot/test-mercurial-import/file_ltext#1 - opened for add | |||
|
32 | //depot/test-mercurial-import/file_tempobj#1 - opened for add | |||
|
33 | //depot/test-mercurial-import/file_ubinary#1 - opened for add | |||
|
34 | //depot/test-mercurial-import/file_uxbinary#1 - opened for add | |||
|
35 | //depot/test-mercurial-import/file_xbinary#1 - opened for add | |||
|
36 | //depot/test-mercurial-import/file_xltext#1 - opened for add | |||
|
37 | //depot/test-mercurial-import/file_xtempobj#1 - opened for add | |||
|
38 | //depot/test-mercurial-import/file_xtext#1 - opened for add | |||
|
39 | Submitting change 1. | |||
|
40 | Locking 33 files ... | |||
|
41 | add //depot/test-mercurial-import/file_binary#1 | |||
|
42 | add //depot/test-mercurial-import/file_binary+k#1 | |||
|
43 | add //depot/test-mercurial-import/file_binary+kx#1 | |||
|
44 | add //depot/test-mercurial-import/file_binary+x#1 | |||
|
45 | add //depot/test-mercurial-import/file_ctext#1 | |||
|
46 | add //depot/test-mercurial-import/file_cxtext#1 | |||
|
47 | add //depot/test-mercurial-import/file_ktext#1 | |||
|
48 | add //depot/test-mercurial-import/file_kxtext#1 | |||
|
49 | add //depot/test-mercurial-import/file_ltext#1 | |||
|
50 | add //depot/test-mercurial-import/file_symlink#1 | |||
|
51 | add //depot/test-mercurial-import/file_symlink+k#1 | |||
|
52 | add //depot/test-mercurial-import/file_tempobj#1 | |||
|
53 | add //depot/test-mercurial-import/file_text#1 | |||
|
54 | add //depot/test-mercurial-import/file_text+c#1 | |||
|
55 | add //depot/test-mercurial-import/file_text+d#1 | |||
|
56 | add //depot/test-mercurial-import/file_text+f#1 | |||
|
57 | add //depot/test-mercurial-import/file_text+k#1 | |||
|
58 | add //depot/test-mercurial-import/file_text+ko#1 | |||
|
59 | add //depot/test-mercurial-import/file_text+kx#1 | |||
|
60 | add //depot/test-mercurial-import/file_text+l#1 | |||
|
61 | add //depot/test-mercurial-import/file_text+m#1 | |||
|
62 | add //depot/test-mercurial-import/file_text+s#1 | |||
|
63 | add //depot/test-mercurial-import/file_text+s2#1 | |||
|
64 | add //depot/test-mercurial-import/file_text+w#1 | |||
|
65 | add //depot/test-mercurial-import/file_text+x#1 | |||
|
66 | add //depot/test-mercurial-import/file_ubinary#1 | |||
|
67 | add //depot/test-mercurial-import/file_uxbinary#1 | |||
|
68 | add //depot/test-mercurial-import/file_xbinary#1 | |||
|
69 | add //depot/test-mercurial-import/file_xltext#1 | |||
|
70 | add //depot/test-mercurial-import/file_xtempobj#1 | |||
|
71 | add //depot/test-mercurial-import/file_xtext#1 | |||
|
72 | add //depot/test-mercurial-import/target_symlink#1 | |||
|
73 | add //depot/test-mercurial-import/target_symlink+k#1 | |||
|
74 | Change 1 submitted. | |||
|
75 | //depot/test-mercurial-import/file_binary+k#1 - refreshing | |||
|
76 | //depot/test-mercurial-import/file_binary+kx#1 - refreshing | |||
|
77 | //depot/test-mercurial-import/file_ktext#1 - refreshing | |||
|
78 | //depot/test-mercurial-import/file_kxtext#1 - refreshing | |||
|
79 | //depot/test-mercurial-import/file_symlink+k#1 - refreshing | |||
|
80 | //depot/test-mercurial-import/file_text+k#1 - refreshing | |||
|
81 | //depot/test-mercurial-import/file_text+ko#1 - refreshing | |||
|
82 | //depot/test-mercurial-import/file_text+kx#1 - refreshing | |||
|
83 | % test keyword expansion | |||
|
84 | //depot/test-mercurial-import/file_binary#1 - opened for edit | |||
|
85 | //depot/test-mercurial-import/file_binary+k#1 - opened for edit | |||
|
86 | //depot/test-mercurial-import/file_binary+kx#1 - opened for edit | |||
|
87 | //depot/test-mercurial-import/file_binary+x#1 - opened for edit | |||
|
88 | //depot/test-mercurial-import/file_ctext#1 - opened for edit | |||
|
89 | //depot/test-mercurial-import/file_cxtext#1 - opened for edit | |||
|
90 | //depot/test-mercurial-import/file_ktext#1 - opened for edit | |||
|
91 | //depot/test-mercurial-import/file_kxtext#1 - opened for edit | |||
|
92 | //depot/test-mercurial-import/file_ltext#1 - opened for edit | |||
|
93 | //depot/test-mercurial-import/file_symlink#1 - opened for edit | |||
|
94 | //depot/test-mercurial-import/file_symlink+k#1 - opened for edit | |||
|
95 | //depot/test-mercurial-import/file_tempobj#1 - opened for edit | |||
|
96 | //depot/test-mercurial-import/file_text#1 - opened for edit | |||
|
97 | //depot/test-mercurial-import/file_text+c#1 - opened for edit | |||
|
98 | //depot/test-mercurial-import/file_text+d#1 - opened for edit | |||
|
99 | //depot/test-mercurial-import/file_text+f#1 - opened for edit | |||
|
100 | //depot/test-mercurial-import/file_text+k#1 - opened for edit | |||
|
101 | //depot/test-mercurial-import/file_text+ko#1 - opened for edit | |||
|
102 | //depot/test-mercurial-import/file_text+kx#1 - opened for edit | |||
|
103 | //depot/test-mercurial-import/file_text+l#1 - opened for edit | |||
|
104 | //depot/test-mercurial-import/file_text+m#1 - opened for edit | |||
|
105 | //depot/test-mercurial-import/file_text+s#1 - opened for edit | |||
|
106 | //depot/test-mercurial-import/file_text+s2#1 - opened for edit | |||
|
107 | //depot/test-mercurial-import/file_text+w#1 - opened for edit | |||
|
108 | //depot/test-mercurial-import/file_text+x#1 - opened for edit | |||
|
109 | //depot/test-mercurial-import/file_ubinary#1 - opened for edit | |||
|
110 | //depot/test-mercurial-import/file_uxbinary#1 - opened for edit | |||
|
111 | //depot/test-mercurial-import/file_xbinary#1 - opened for edit | |||
|
112 | //depot/test-mercurial-import/file_xltext#1 - opened for edit | |||
|
113 | //depot/test-mercurial-import/file_xtempobj#1 - opened for edit | |||
|
114 | //depot/test-mercurial-import/file_xtext#1 - opened for edit | |||
|
115 | //depot/test-mercurial-import/target_symlink#1 - opened for edit | |||
|
116 | //depot/test-mercurial-import/target_symlink+k#1 - opened for edit | |||
|
117 | //depot/test-mercurial-import/crazy_symlink+k#1 - opened for add | |||
|
118 | Submitting change 2. | |||
|
119 | Locking 34 files ... | |||
|
120 | add //depot/test-mercurial-import/crazy_symlink+k#1 | |||
|
121 | edit //depot/test-mercurial-import/file_binary#2 | |||
|
122 | edit //depot/test-mercurial-import/file_binary+k#2 | |||
|
123 | edit //depot/test-mercurial-import/file_binary+kx#2 | |||
|
124 | edit //depot/test-mercurial-import/file_binary+x#2 | |||
|
125 | edit //depot/test-mercurial-import/file_ctext#2 | |||
|
126 | edit //depot/test-mercurial-import/file_cxtext#2 | |||
|
127 | edit //depot/test-mercurial-import/file_ktext#2 | |||
|
128 | edit //depot/test-mercurial-import/file_kxtext#2 | |||
|
129 | edit //depot/test-mercurial-import/file_ltext#2 | |||
|
130 | edit //depot/test-mercurial-import/file_symlink#2 | |||
|
131 | edit //depot/test-mercurial-import/file_symlink+k#2 | |||
|
132 | edit //depot/test-mercurial-import/file_tempobj#2 | |||
|
133 | edit //depot/test-mercurial-import/file_text#2 | |||
|
134 | edit //depot/test-mercurial-import/file_text+c#2 | |||
|
135 | edit //depot/test-mercurial-import/file_text+d#2 | |||
|
136 | edit //depot/test-mercurial-import/file_text+f#2 | |||
|
137 | edit //depot/test-mercurial-import/file_text+k#2 | |||
|
138 | edit //depot/test-mercurial-import/file_text+ko#2 | |||
|
139 | edit //depot/test-mercurial-import/file_text+kx#2 | |||
|
140 | edit //depot/test-mercurial-import/file_text+l#2 | |||
|
141 | edit //depot/test-mercurial-import/file_text+m#2 | |||
|
142 | edit //depot/test-mercurial-import/file_text+s#2 | |||
|
143 | edit //depot/test-mercurial-import/file_text+s2#2 | |||
|
144 | edit //depot/test-mercurial-import/file_text+w#2 | |||
|
145 | edit //depot/test-mercurial-import/file_text+x#2 | |||
|
146 | edit //depot/test-mercurial-import/file_ubinary#2 | |||
|
147 | edit //depot/test-mercurial-import/file_uxbinary#2 | |||
|
148 | edit //depot/test-mercurial-import/file_xbinary#2 | |||
|
149 | edit //depot/test-mercurial-import/file_xltext#2 | |||
|
150 | edit //depot/test-mercurial-import/file_xtempobj#2 | |||
|
151 | edit //depot/test-mercurial-import/file_xtext#2 | |||
|
152 | edit //depot/test-mercurial-import/target_symlink#2 | |||
|
153 | edit //depot/test-mercurial-import/target_symlink+k#2 | |||
|
154 | Change 2 submitted. | |||
|
155 | //depot/test-mercurial-import/crazy_symlink+k#1 - refreshing | |||
|
156 | //depot/test-mercurial-import/file_binary+k#2 - refreshing | |||
|
157 | //depot/test-mercurial-import/file_binary+kx#2 - refreshing | |||
|
158 | //depot/test-mercurial-import/file_ktext#2 - refreshing | |||
|
159 | //depot/test-mercurial-import/file_kxtext#2 - refreshing | |||
|
160 | //depot/test-mercurial-import/file_symlink+k#2 - refreshing | |||
|
161 | //depot/test-mercurial-import/file_text+k#2 - refreshing | |||
|
162 | //depot/test-mercurial-import/file_text+ko#2 - refreshing | |||
|
163 | //depot/test-mercurial-import/file_text+kx#2 - refreshing | |||
|
164 | % check keywords in p4 | |||
|
165 | file_binary:$Header$ | |||
|
166 | file_binary:$Header$$Header$Header$ | |||
|
167 | file_binary+k:$Header: //depot/test-mercurial-import/file_binary+k#2 $ | |||
|
168 | file_binary+k:$Header: //depot/test-mercurial-import/file_binary+k#2 $$Header: //depot/test-mercurial-import/file_binary+k#2 $Header$ | |||
|
169 | file_binary+kx:$Header: //depot/test-mercurial-import/file_binary+kx#2 $ | |||
|
170 | file_binary+kx:$Header: //depot/test-mercurial-import/file_binary+kx#2 $$Header: //depot/test-mercurial-import/file_binary+kx#2 $Header$ | |||
|
171 | file_binary+x:$Header$ | |||
|
172 | file_binary+x:$Header$$Header$Header$ | |||
|
173 | file_ctext:$Header$ | |||
|
174 | file_ctext:$Header$$Header$Header$ | |||
|
175 | file_cxtext:$Header$ | |||
|
176 | file_cxtext:$Header$$Header$Header$ | |||
|
177 | file_ktext:$Header: //depot/test-mercurial-import/file_ktext#2 $ | |||
|
178 | file_ktext:$Header: //depot/test-mercurial-import/file_ktext#2 $$Header: //depot/test-mercurial-import/file_ktext#2 $Header$ | |||
|
179 | file_kxtext:$Header: //depot/test-mercurial-import/file_kxtext#2 $ | |||
|
180 | file_kxtext:$Header: //depot/test-mercurial-import/file_kxtext#2 $$Header: //depot/test-mercurial-import/file_kxtext#2 $Header$ | |||
|
181 | file_ltext:$Header$ | |||
|
182 | file_ltext:$Header$$Header$Header$ | |||
|
183 | file_symlink:$Header$ | |||
|
184 | file_symlink:$Header$$Header$Header$ | |||
|
185 | file_symlink+k:$Header$ | |||
|
186 | file_symlink+k:$Header$$Header$Header$ | |||
|
187 | file_tempobj:$Header$ | |||
|
188 | file_tempobj:$Header$$Header$Header$ | |||
|
189 | file_text:$Header$ | |||
|
190 | file_text:$Header$$Header$Header$ | |||
|
191 | file_text+c:$Header$ | |||
|
192 | file_text+c:$Header$$Header$Header$ | |||
|
193 | file_text+d:$Header$ | |||
|
194 | file_text+d:$Header$$Header$Header$ | |||
|
195 | file_text+f:$Header$ | |||
|
196 | file_text+f:$Header$$Header$Header$ | |||
|
197 | file_text+k:$Header: //depot/test-mercurial-import/file_text+k#2 $ | |||
|
198 | file_text+k:$Header: //depot/test-mercurial-import/file_text+k#2 $$Header: //depot/test-mercurial-import/file_text+k#2 $Header$ | |||
|
199 | file_text+ko:$Header: //depot/test-mercurial-import/file_text+ko#2 $ | |||
|
200 | file_text+ko:$Header: //depot/test-mercurial-import/file_text+ko#2 $$Header: //depot/test-mercurial-import/file_text+ko#2 $Header$ | |||
|
201 | file_text+kx:$Header: //depot/test-mercurial-import/file_text+kx#2 $ | |||
|
202 | file_text+kx:$Header: //depot/test-mercurial-import/file_text+kx#2 $$Header: //depot/test-mercurial-import/file_text+kx#2 $Header$ | |||
|
203 | file_text+l:$Header$ | |||
|
204 | file_text+l:$Header$$Header$Header$ | |||
|
205 | file_text+m:$Header$ | |||
|
206 | file_text+m:$Header$$Header$Header$ | |||
|
207 | file_text+s:$Header$ | |||
|
208 | file_text+s:$Header$$Header$Header$ | |||
|
209 | file_text+s2:$Header$ | |||
|
210 | file_text+s2:$Header$$Header$Header$ | |||
|
211 | file_text+w:$Header$ | |||
|
212 | file_text+w:$Header$$Header$Header$ | |||
|
213 | file_text+x:$Header$ | |||
|
214 | file_text+x:$Header$$Header$Header$ | |||
|
215 | file_ubinary:$Header$ | |||
|
216 | file_ubinary:$Header$$Header$Header$ | |||
|
217 | file_uxbinary:$Header$ | |||
|
218 | file_uxbinary:$Header$$Header$Header$ | |||
|
219 | file_xbinary:$Header$ | |||
|
220 | file_xbinary:$Header$$Header$Header$ | |||
|
221 | file_xltext:$Header$ | |||
|
222 | file_xltext:$Header$$Header$Header$ | |||
|
223 | file_xtempobj:$Header$ | |||
|
224 | file_xtempobj:$Header$$Header$Header$ | |||
|
225 | file_xtext:$Header$ | |||
|
226 | file_xtext:$Header$$Header$Header$ | |||
|
227 | % convert | |||
|
228 | initializing destination dst repository | |||
|
229 | reading p4 views | |||
|
230 | collecting p4 changelists | |||
|
231 | 1 initial | |||
|
232 | 2 keywords | |||
|
233 | scanning source... | |||
|
234 | sorting... | |||
|
235 | converting... | |||
|
236 | 1 initial | |||
|
237 | 0 keywords | |||
|
238 | rev=1 desc="keywords" tags="tip" files="crazy_symlink+k file_binary file_binary+k file_binary+kx file_binary+x file_ctext file_cxtext file_ktext file_kxtext file_ltext file_text file_text+c file_text+d file_text+f file_text+k file_text+ko file_text+kx file_text+l file_text+m file_text+s file_text+s2 file_text+w file_text+x file_ubinary file_uxbinary file_xbinary file_xltext file_xtext target_symlink target_symlink+k" | |||
|
239 | grev=0 desc="initial" tags="" files="file_binary file_binary+k file_binary+kx file_binary+x file_ctext file_cxtext file_ktext file_kxtext file_ltext file_symlink file_symlink+k file_text file_text+c file_text+d file_text+f file_text+k file_text+ko file_text+kx file_text+l file_text+m file_text+s2 file_text+w file_text+x file_ubinary file_uxbinary file_xbinary file_xltext file_xtext target_symlink target_symlink+k" | |||
|
240 | g% revision 0 | |||
|
241 | 30 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
242 | ==> dst/file_binary <== | |||
|
243 | this is binary | |||
|
244 | ==> dst/file_binary+k <== | |||
|
245 | this is binary+k | |||
|
246 | ==> dst/file_binary+kx <== | |||
|
247 | this is binary+kx | |||
|
248 | ==> dst/file_binary+x <== | |||
|
249 | this is binary+x | |||
|
250 | ==> dst/file_ctext <== | |||
|
251 | this is ctext | |||
|
252 | ||||
|
253 | ==> dst/file_cxtext <== | |||
|
254 | this is cxtext | |||
|
255 | ||||
|
256 | ==> dst/file_ktext <== | |||
|
257 | this is ktext | |||
|
258 | ||||
|
259 | ==> dst/file_kxtext <== | |||
|
260 | this is kxtext | |||
|
261 | ||||
|
262 | ==> dst/file_ltext <== | |||
|
263 | this is ltext | |||
|
264 | ||||
|
265 | ==> dst/file_symlink <== | |||
|
266 | this is target symlink | |||
|
267 | ||||
|
268 | ==> dst/file_symlink+k <== | |||
|
269 | this is target symlink+k | |||
|
270 | ||||
|
271 | ==> dst/file_text <== | |||
|
272 | this is text | |||
|
273 | ||||
|
274 | ==> dst/file_text+c <== | |||
|
275 | this is text+C | |||
|
276 | ||||
|
277 | ==> dst/file_text+d <== | |||
|
278 | this is text+D | |||
|
279 | ||||
|
280 | ==> dst/file_text+f <== | |||
|
281 | this is text+F | |||
|
282 | ||||
|
283 | ==> dst/file_text+k <== | |||
|
284 | this is text+k | |||
|
285 | ||||
|
286 | ==> dst/file_text+ko <== | |||
|
287 | this is text+ko | |||
|
288 | ||||
|
289 | ==> dst/file_text+kx <== | |||
|
290 | this is text+kx | |||
|
291 | ||||
|
292 | ==> dst/file_text+l <== | |||
|
293 | this is text+l | |||
|
294 | ||||
|
295 | ==> dst/file_text+m <== | |||
|
296 | this is text+m | |||
|
297 | ||||
|
298 | ==> dst/file_text+s2 <== | |||
|
299 | this is text+S2 | |||
|
300 | ||||
|
301 | ==> dst/file_text+w <== | |||
|
302 | this is text+w | |||
|
303 | ||||
|
304 | ==> dst/file_text+x <== | |||
|
305 | this is text+x | |||
|
306 | ||||
|
307 | ==> dst/file_ubinary <== | |||
|
308 | this is ubinary | |||
|
309 | ||||
|
310 | ==> dst/file_uxbinary <== | |||
|
311 | this is uxbinary | |||
|
312 | ||||
|
313 | ==> dst/file_xbinary <== | |||
|
314 | this is xbinary | |||
|
315 | ||||
|
316 | ==> dst/file_xltext <== | |||
|
317 | this is xltext | |||
|
318 | ||||
|
319 | ==> dst/file_xtext <== | |||
|
320 | this is xtext | |||
|
321 | ||||
|
322 | % revision 1 | |||
|
323 | 30 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
324 | ==> dst/file_binary <== | |||
|
325 | this is binary$Id$ | |||
|
326 | $Header$ | |||
|
327 | $Date$ | |||
|
328 | $DateTime$ | |||
|
329 | $Change$ | |||
|
330 | $File$ | |||
|
331 | $Revision$ | |||
|
332 | $Header$$Header$Header$ | |||
|
333 | ||||
|
334 | ==> dst/file_binary+k <== | |||
|
335 | this is binary+k$Id$ | |||
|
336 | $Header$ | |||
|
337 | $Date$ | |||
|
338 | $DateTime$ | |||
|
339 | $Change$ | |||
|
340 | $File$ | |||
|
341 | $Revision$ | |||
|
342 | $Header$$Header$Header$ | |||
|
343 | ||||
|
344 | ==> dst/file_binary+kx <== | |||
|
345 | this is binary+kx$Id$ | |||
|
346 | $Header$ | |||
|
347 | $Date$ | |||
|
348 | $DateTime$ | |||
|
349 | $Change$ | |||
|
350 | $File$ | |||
|
351 | $Revision$ | |||
|
352 | $Header$$Header$Header$ | |||
|
353 | ||||
|
354 | ==> dst/file_binary+x <== | |||
|
355 | this is binary+x$Id$ | |||
|
356 | $Header$ | |||
|
357 | $Date$ | |||
|
358 | $DateTime$ | |||
|
359 | $Change$ | |||
|
360 | $File$ | |||
|
361 | $Revision$ | |||
|
362 | $Header$$Header$Header$ | |||
|
363 | ||||
|
364 | ==> dst/file_ctext <== | |||
|
365 | this is ctext | |||
|
366 | $Id$ | |||
|
367 | $Header$ | |||
|
368 | $Date$ | |||
|
369 | $DateTime$ | |||
|
370 | $Change$ | |||
|
371 | $File$ | |||
|
372 | $Revision$ | |||
|
373 | $Header$$Header$Header$ | |||
|
374 | ||||
|
375 | ==> dst/file_cxtext <== | |||
|
376 | this is cxtext | |||
|
377 | $Id$ | |||
|
378 | $Header$ | |||
|
379 | $Date$ | |||
|
380 | $DateTime$ | |||
|
381 | $Change$ | |||
|
382 | $File$ | |||
|
383 | $Revision$ | |||
|
384 | $Header$$Header$Header$ | |||
|
385 | ||||
|
386 | ==> dst/file_ktext <== | |||
|
387 | this is ktext | |||
|
388 | $Id$ | |||
|
389 | $Header$ | |||
|
390 | $Date$ | |||
|
391 | $DateTime$ | |||
|
392 | $Change$ | |||
|
393 | $File$ | |||
|
394 | $Revision$ | |||
|
395 | $Header$$Header$Header$ | |||
|
396 | ||||
|
397 | ==> dst/file_kxtext <== | |||
|
398 | this is kxtext | |||
|
399 | $Id$ | |||
|
400 | $Header$ | |||
|
401 | $Date$ | |||
|
402 | $DateTime$ | |||
|
403 | $Change$ | |||
|
404 | $File$ | |||
|
405 | $Revision$ | |||
|
406 | $Header$$Header$Header$ | |||
|
407 | ||||
|
408 | ==> dst/file_ltext <== | |||
|
409 | this is ltext | |||
|
410 | $Id$ | |||
|
411 | $Header$ | |||
|
412 | $Date$ | |||
|
413 | $DateTime$ | |||
|
414 | $Change$ | |||
|
415 | $File$ | |||
|
416 | $Revision$ | |||
|
417 | $Header$$Header$Header$ | |||
|
418 | ||||
|
419 | ==> dst/file_symlink <== | |||
|
420 | this is target symlink | |||
|
421 | $Id$ | |||
|
422 | $Header$ | |||
|
423 | $Date$ | |||
|
424 | $DateTime$ | |||
|
425 | $Change$ | |||
|
426 | $File$ | |||
|
427 | $Revision$ | |||
|
428 | $Header$$Header$Header$ | |||
|
429 | ||||
|
430 | ==> dst/file_symlink+k <== | |||
|
431 | this is target symlink+k | |||
|
432 | $Id$ | |||
|
433 | $Header$ | |||
|
434 | $Date$ | |||
|
435 | $DateTime$ | |||
|
436 | $Change$ | |||
|
437 | $File$ | |||
|
438 | $Revision$ | |||
|
439 | $Header$$Header$Header$ | |||
|
440 | ||||
|
441 | ==> dst/file_text <== | |||
|
442 | this is text | |||
|
443 | $Id$ | |||
|
444 | $Header$ | |||
|
445 | $Date$ | |||
|
446 | $DateTime$ | |||
|
447 | $Change$ | |||
|
448 | $File$ | |||
|
449 | $Revision$ | |||
|
450 | $Header$$Header$Header$ | |||
|
451 | ||||
|
452 | ==> dst/file_text+c <== | |||
|
453 | this is text+C | |||
|
454 | $Id$ | |||
|
455 | $Header$ | |||
|
456 | $Date$ | |||
|
457 | $DateTime$ | |||
|
458 | $Change$ | |||
|
459 | $File$ | |||
|
460 | $Revision$ | |||
|
461 | $Header$$Header$Header$ | |||
|
462 | ||||
|
463 | ==> dst/file_text+d <== | |||
|
464 | this is text+D | |||
|
465 | $Id$ | |||
|
466 | $Header$ | |||
|
467 | $Date$ | |||
|
468 | $DateTime$ | |||
|
469 | $Change$ | |||
|
470 | $File$ | |||
|
471 | $Revision$ | |||
|
472 | $Header$$Header$Header$ | |||
|
473 | ||||
|
474 | ==> dst/file_text+f <== | |||
|
475 | this is text+F | |||
|
476 | $Id$ | |||
|
477 | $Header$ | |||
|
478 | $Date$ | |||
|
479 | $DateTime$ | |||
|
480 | $Change$ | |||
|
481 | $File$ | |||
|
482 | $Revision$ | |||
|
483 | $Header$$Header$Header$ | |||
|
484 | ||||
|
485 | ==> dst/file_text+k <== | |||
|
486 | this is text+k | |||
|
487 | $Id$ | |||
|
488 | $Header$ | |||
|
489 | $Date$ | |||
|
490 | $DateTime$ | |||
|
491 | $Change$ | |||
|
492 | $File$ | |||
|
493 | $Revision$ | |||
|
494 | $Header$$Header$Header$ | |||
|
495 | ||||
|
496 | ==> dst/file_text+ko <== | |||
|
497 | this is text+ko | |||
|
498 | $Id$ | |||
|
499 | $Header$ | |||
|
500 | $Date$ | |||
|
501 | $DateTime$ | |||
|
502 | $Change$ | |||
|
503 | $File$ | |||
|
504 | $Revision$ | |||
|
505 | $Header$$Header$Header$ | |||
|
506 | ||||
|
507 | ==> dst/file_text+kx <== | |||
|
508 | this is text+kx | |||
|
509 | $Id$ | |||
|
510 | $Header$ | |||
|
511 | $Date$ | |||
|
512 | $DateTime$ | |||
|
513 | $Change$ | |||
|
514 | $File$ | |||
|
515 | $Revision$ | |||
|
516 | $Header$$Header$Header$ | |||
|
517 | ||||
|
518 | ==> dst/file_text+l <== | |||
|
519 | this is text+l | |||
|
520 | $Id$ | |||
|
521 | $Header$ | |||
|
522 | $Date$ | |||
|
523 | $DateTime$ | |||
|
524 | $Change$ | |||
|
525 | $File$ | |||
|
526 | $Revision$ | |||
|
527 | $Header$$Header$Header$ | |||
|
528 | ||||
|
529 | ==> dst/file_text+m <== | |||
|
530 | this is text+m | |||
|
531 | $Id$ | |||
|
532 | $Header$ | |||
|
533 | $Date$ | |||
|
534 | $DateTime$ | |||
|
535 | $Change$ | |||
|
536 | $File$ | |||
|
537 | $Revision$ | |||
|
538 | $Header$$Header$Header$ | |||
|
539 | ||||
|
540 | ==> dst/file_text+s <== | |||
|
541 | this is text+S | |||
|
542 | $Id$ | |||
|
543 | $Header$ | |||
|
544 | $Date$ | |||
|
545 | $DateTime$ | |||
|
546 | $Change$ | |||
|
547 | $File$ | |||
|
548 | $Revision$ | |||
|
549 | $Header$$Header$Header$ | |||
|
550 | ||||
|
551 | ==> dst/file_text+s2 <== | |||
|
552 | this is text+S2 | |||
|
553 | $Id$ | |||
|
554 | $Header$ | |||
|
555 | $Date$ | |||
|
556 | $DateTime$ | |||
|
557 | $Change$ | |||
|
558 | $File$ | |||
|
559 | $Revision$ | |||
|
560 | $Header$$Header$Header$ | |||
|
561 | ||||
|
562 | ==> dst/file_text+w <== | |||
|
563 | this is text+w | |||
|
564 | $Id$ | |||
|
565 | $Header$ | |||
|
566 | $Date$ | |||
|
567 | $DateTime$ | |||
|
568 | $Change$ | |||
|
569 | $File$ | |||
|
570 | $Revision$ | |||
|
571 | $Header$$Header$Header$ | |||
|
572 | ||||
|
573 | ==> dst/file_text+x <== | |||
|
574 | this is text+x | |||
|
575 | $Id$ | |||
|
576 | $Header$ | |||
|
577 | $Date$ | |||
|
578 | $DateTime$ | |||
|
579 | $Change$ | |||
|
580 | $File$ | |||
|
581 | $Revision$ | |||
|
582 | $Header$$Header$Header$ | |||
|
583 | ||||
|
584 | ==> dst/file_ubinary <== | |||
|
585 | this is ubinary | |||
|
586 | $Id$ | |||
|
587 | $Header$ | |||
|
588 | $Date$ | |||
|
589 | $DateTime$ | |||
|
590 | $Change$ | |||
|
591 | $File$ | |||
|
592 | $Revision$ | |||
|
593 | $Header$$Header$Header$ | |||
|
594 | ||||
|
595 | ==> dst/file_uxbinary <== | |||
|
596 | this is uxbinary | |||
|
597 | $Id$ | |||
|
598 | $Header$ | |||
|
599 | $Date$ | |||
|
600 | $DateTime$ | |||
|
601 | $Change$ | |||
|
602 | $File$ | |||
|
603 | $Revision$ | |||
|
604 | $Header$$Header$Header$ | |||
|
605 | ||||
|
606 | ==> dst/file_xbinary <== | |||
|
607 | this is xbinary | |||
|
608 | $Id$ | |||
|
609 | $Header$ | |||
|
610 | $Date$ | |||
|
611 | $DateTime$ | |||
|
612 | $Change$ | |||
|
613 | $File$ | |||
|
614 | $Revision$ | |||
|
615 | $Header$$Header$Header$ | |||
|
616 | ||||
|
617 | ==> dst/file_xltext <== | |||
|
618 | this is xltext | |||
|
619 | $Id$ | |||
|
620 | $Header$ | |||
|
621 | $Date$ | |||
|
622 | $DateTime$ | |||
|
623 | $Change$ | |||
|
624 | $File$ | |||
|
625 | $Revision$ | |||
|
626 | $Header$$Header$Header$ | |||
|
627 | ||||
|
628 | ==> dst/file_xtext <== | |||
|
629 | this is xtext | |||
|
630 | $Id$ | |||
|
631 | $Header$ | |||
|
632 | $Date$ | |||
|
633 | $DateTime$ | |||
|
634 | $Change$ | |||
|
635 | $File$ | |||
|
636 | $Revision$ | |||
|
637 | $Header$$Header$Header$ | |||
|
638 | ||||
|
639 | % crazy_symlink | |||
|
640 | target_$Header: //depot/test-mercurial-import/crazy_symlink+k#1 $ | |||
|
641 | target_$Header$ | |||
|
642 | % stop the p4 server |
@@ -1,179 +1,205 b'' | |||||
1 | # |
|
1 | # | |
2 | # Perforce source for convert extension. |
|
2 | # Perforce source for convert extension. | |
3 | # |
|
3 | # | |
4 | # Copyright 2009, Frank Kingswood <frank@kingswood-consulting.co.uk> |
|
4 | # Copyright 2009, Frank Kingswood <frank@kingswood-consulting.co.uk> | |
5 | # |
|
5 | # | |
6 | # This software may be used and distributed according to the terms of the |
|
6 | # This software may be used and distributed according to the terms of the | |
7 | # GNU General Public License version 2, incorporated herein by reference. |
|
7 | # GNU General Public License version 2, incorporated herein by reference. | |
8 | # |
|
8 | # | |
9 |
|
9 | |||
10 | from mercurial import util |
|
10 | from mercurial import util | |
11 | from mercurial.i18n import _ |
|
11 | from mercurial.i18n import _ | |
12 |
|
12 | |||
13 | from common import commit, converter_source, checktool, NoRepo |
|
13 | from common import commit, converter_source, checktool, NoRepo | |
14 | import marshal |
|
14 | import marshal | |
|
15 | import re | |||
15 |
|
16 | |||
16 | def loaditer(f): |
|
17 | def loaditer(f): | |
17 | "Yield the dictionary objects generated by p4" |
|
18 | "Yield the dictionary objects generated by p4" | |
18 | try: |
|
19 | try: | |
19 | while True: |
|
20 | while True: | |
20 | d = marshal.load(f) |
|
21 | d = marshal.load(f) | |
21 | if not d: |
|
22 | if not d: | |
22 | break |
|
23 | break | |
23 | yield d |
|
24 | yield d | |
24 | except EOFError: |
|
25 | except EOFError: | |
25 | pass |
|
26 | pass | |
26 |
|
27 | |||
27 | class p4_source(converter_source): |
|
28 | class p4_source(converter_source): | |
28 | def __init__(self, ui, path, rev=None): |
|
29 | def __init__(self, ui, path, rev=None): | |
29 | super(p4_source, self).__init__(ui, path, rev=rev) |
|
30 | super(p4_source, self).__init__(ui, path, rev=rev) | |
30 |
|
31 | |||
31 | if not path.startswith('//'): |
|
32 | if "/" in path and not path.startswith('//'): | |
32 | raise NoRepo('%s does not look like a P4 repo' % path) |
|
33 | raise NoRepo('%s does not look like a P4 repo' % path) | |
33 |
|
34 | |||
34 | checktool('p4', abort=False) |
|
35 | checktool('p4', abort=False) | |
35 |
|
36 | |||
36 | self.p4changes = {} |
|
37 | self.p4changes = {} | |
37 | self.heads = {} |
|
38 | self.heads = {} | |
38 | self.changeset = {} |
|
39 | self.changeset = {} | |
39 | self.files = {} |
|
40 | self.files = {} | |
40 | self.tags = {} |
|
41 | self.tags = {} | |
41 | self.lastbranch = {} |
|
42 | self.lastbranch = {} | |
42 | self.parent = {} |
|
43 | self.parent = {} | |
43 | self.encoding = "latin_1" |
|
44 | self.encoding = "latin_1" | |
44 | self.depotname = {} # mapping from local name to depot name |
|
45 | self.depotname = {} # mapping from local name to depot name | |
45 | self.modecache = {} |
|
46 | self.modecache = {} | |
|
47 | self.re_type = re.compile("([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)(\+\w+)?$") | |||
|
48 | self.re_keywords = re.compile(r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author):[^$\n]*\$") | |||
|
49 | self.re_keywords_old = re.compile("\$(Id|Header):[^$\n]*\$") | |||
46 |
|
50 | |||
47 | self._parse(ui, path) |
|
51 | self._parse(ui, path) | |
48 |
|
52 | |||
49 | def _parse_view(self, path): |
|
53 | def _parse_view(self, path): | |
50 | "Read changes affecting the path" |
|
54 | "Read changes affecting the path" | |
51 | cmd = 'p4 -G changes -s submitted "%s"' % path |
|
55 | cmd = 'p4 -G changes -s submitted "%s"' % path | |
52 | stdout = util.popen(cmd) |
|
56 | stdout = util.popen(cmd) | |
53 | for d in loaditer(stdout): |
|
57 | for d in loaditer(stdout): | |
54 | c = d.get("change", None) |
|
58 | c = d.get("change", None) | |
55 | if c: |
|
59 | if c: | |
56 | self.p4changes[c] = True |
|
60 | self.p4changes[c] = True | |
57 |
|
61 | |||
58 | def _parse(self, ui, path): |
|
62 | def _parse(self, ui, path): | |
59 | "Prepare list of P4 filenames and revisions to import" |
|
63 | "Prepare list of P4 filenames and revisions to import" | |
60 | ui.status(_('reading p4 views\n')) |
|
64 | ui.status(_('reading p4 views\n')) | |
61 |
|
65 | |||
62 | # read client spec or view |
|
66 | # read client spec or view | |
63 | if "/" in path: |
|
67 | if "/" in path: | |
64 | self._parse_view(path) |
|
68 | self._parse_view(path) | |
65 | if path.startswith("//") and path.endswith("/..."): |
|
69 | if path.startswith("//") and path.endswith("/..."): | |
66 | views = {path[:-3]:""} |
|
70 | views = {path[:-3]:""} | |
67 | else: |
|
71 | else: | |
68 | views = {"//": ""} |
|
72 | views = {"//": ""} | |
69 | else: |
|
73 | else: | |
70 | cmd = 'p4 -G client -o "%s"' % path |
|
74 | cmd = 'p4 -G client -o "%s"' % path | |
71 | clientspec = marshal.load(util.popen(cmd)) |
|
75 | clientspec = marshal.load(util.popen(cmd)) | |
72 |
|
76 | |||
73 | views = {} |
|
77 | views = {} | |
74 | for client in clientspec: |
|
78 | for client in clientspec: | |
75 | if client.startswith("View"): |
|
79 | if client.startswith("View"): | |
76 | sview, cview = clientspec[client].split() |
|
80 | sview, cview = clientspec[client].split() | |
77 | self._parse_view(sview) |
|
81 | self._parse_view(sview) | |
78 | if sview.endswith("...") and cview.endswith("..."): |
|
82 | if sview.endswith("...") and cview.endswith("..."): | |
79 | sview = sview[:-3] |
|
83 | sview = sview[:-3] | |
80 | cview = cview[:-3] |
|
84 | cview = cview[:-3] | |
81 | cview = cview[2:] |
|
85 | cview = cview[2:] | |
82 | cview = cview[cview.find("/") + 1:] |
|
86 | cview = cview[cview.find("/") + 1:] | |
83 | views[sview] = cview |
|
87 | views[sview] = cview | |
84 |
|
88 | |||
85 | # list of changes that affect our source files |
|
89 | # list of changes that affect our source files | |
86 | self.p4changes = self.p4changes.keys() |
|
90 | self.p4changes = self.p4changes.keys() | |
87 | self.p4changes.sort(key=int) |
|
91 | self.p4changes.sort(key=int) | |
88 |
|
92 | |||
89 | # list with depot pathnames, longest first |
|
93 | # list with depot pathnames, longest first | |
90 | vieworder = views.keys() |
|
94 | vieworder = views.keys() | |
91 | vieworder.sort(key=lambda x: -len(x)) |
|
95 | vieworder.sort(key=lambda x: -len(x)) | |
92 |
|
96 | |||
93 | # handle revision limiting |
|
97 | # handle revision limiting | |
94 | startrev = self.ui.config('convert', 'p4.startrev', default=0) |
|
98 | startrev = self.ui.config('convert', 'p4.startrev', default=0) | |
95 | self.p4changes = [x for x in self.p4changes |
|
99 | self.p4changes = [x for x in self.p4changes | |
96 | if ((not startrev or int(x) >= int(startrev)) and |
|
100 | if ((not startrev or int(x) >= int(startrev)) and | |
97 | (not self.rev or int(x) <= int(self.rev)))] |
|
101 | (not self.rev or int(x) <= int(self.rev)))] | |
98 |
|
102 | |||
99 | # now read the full changelists to get the list of file revisions |
|
103 | # now read the full changelists to get the list of file revisions | |
100 | ui.status(_('collecting p4 changelists\n')) |
|
104 | ui.status(_('collecting p4 changelists\n')) | |
101 | lastid = None |
|
105 | lastid = None | |
102 | for change in self.p4changes: |
|
106 | for change in self.p4changes: | |
103 | cmd = "p4 -G describe %s" % change |
|
107 | cmd = "p4 -G describe %s" % change | |
104 | stdout = util.popen(cmd) |
|
108 | stdout = util.popen(cmd) | |
105 | d = marshal.load(stdout) |
|
109 | d = marshal.load(stdout) | |
106 |
|
110 | |||
107 | desc = self.recode(d["desc"]) |
|
111 | desc = self.recode(d["desc"]) | |
108 | shortdesc = desc.split("\n", 1)[0] |
|
112 | shortdesc = desc.split("\n", 1)[0] | |
109 | t = '%s %s' % (d["change"], repr(shortdesc)[1:-1]) |
|
113 | t = '%s %s' % (d["change"], repr(shortdesc)[1:-1]) | |
110 | ui.status(util.ellipsis(t, 80) + '\n') |
|
114 | ui.status(util.ellipsis(t, 80) + '\n') | |
111 |
|
115 | |||
112 | if lastid: |
|
116 | if lastid: | |
113 | parents = [lastid] |
|
117 | parents = [lastid] | |
114 | else: |
|
118 | else: | |
115 | parents = [] |
|
119 | parents = [] | |
116 |
|
120 | |||
117 | date = (int(d["time"]), 0) # timezone not set |
|
121 | date = (int(d["time"]), 0) # timezone not set | |
118 | c = commit(author=self.recode(d["user"]), date=util.datestr(date), |
|
122 | c = commit(author=self.recode(d["user"]), date=util.datestr(date), | |
119 | parents=parents, desc=desc, branch='', extra={"p4": change}) |
|
123 | parents=parents, desc=desc, branch='', extra={"p4": change}) | |
120 |
|
124 | |||
121 | files = [] |
|
125 | files = [] | |
122 | i = 0 |
|
126 | i = 0 | |
123 | while ("depotFile%d" % i) in d and ("rev%d" % i) in d: |
|
127 | while ("depotFile%d" % i) in d and ("rev%d" % i) in d: | |
124 | oldname = d["depotFile%d" % i] |
|
128 | oldname = d["depotFile%d" % i] | |
125 | filename = None |
|
129 | filename = None | |
126 | for v in vieworder: |
|
130 | for v in vieworder: | |
127 | if oldname.startswith(v): |
|
131 | if oldname.startswith(v): | |
128 | filename = views[v] + oldname[len(v):] |
|
132 | filename = views[v] + oldname[len(v):] | |
129 | break |
|
133 | break | |
130 | if filename: |
|
134 | if filename: | |
131 | files.append((filename, d["rev%d" % i])) |
|
135 | files.append((filename, d["rev%d" % i])) | |
132 | self.depotname[filename] = oldname |
|
136 | self.depotname[filename] = oldname | |
133 | i += 1 |
|
137 | i += 1 | |
134 | self.changeset[change] = c |
|
138 | self.changeset[change] = c | |
135 | self.files[change] = files |
|
139 | self.files[change] = files | |
136 | lastid = change |
|
140 | lastid = change | |
137 |
|
141 | |||
138 | if lastid: |
|
142 | if lastid: | |
139 | self.heads = [lastid] |
|
143 | self.heads = [lastid] | |
140 |
|
144 | |||
141 | def getheads(self): |
|
145 | def getheads(self): | |
142 | return self.heads |
|
146 | return self.heads | |
143 |
|
147 | |||
144 | def getfile(self, name, rev): |
|
148 | def getfile(self, name, rev): | |
145 | cmd = 'p4 -G print "%s#%s"' % (self.depotname[name], rev) |
|
149 | cmd = 'p4 -G print "%s#%s"' % (self.depotname[name], rev) | |
146 | stdout = util.popen(cmd) |
|
150 | stdout = util.popen(cmd) | |
147 |
|
151 | |||
148 | mode = None |
|
152 | mode = None | |
149 |
|
|
153 | contents = "" | |
|
154 | keywords = None | |||
150 |
|
155 | |||
151 | for d in loaditer(stdout): |
|
156 | for d in loaditer(stdout): | |
152 |
|
|
157 | code = d["code"] | |
153 | if "+x" in d["type"]: |
|
158 | data = d.get("data") | |
|
159 | ||||
|
160 | if code == "error": | |||
|
161 | raise IOError(d["generic"], data) | |||
|
162 | ||||
|
163 | elif code == "stat": | |||
|
164 | p4type = self.re_type.match(d["type"]) | |||
|
165 | if p4type: | |||
|
166 | mode = "" | |||
|
167 | flags = (p4type.group(1) or "") + (p4type.group(3) or "") | |||
|
168 | if "x" in flags: | |||
154 | mode = "x" |
|
169 | mode = "x" | |
155 | else: |
|
170 | if p4type.group(2) == "symlink": | |
156 | mode = "" |
|
171 | mode = "l" | |
157 | elif d["code"] == "text": |
|
172 | if "ko" in flags: | |
158 | data += d["data"] |
|
173 | keywords = self.re_keywords_old | |
|
174 | elif "k" in flags: | |||
|
175 | keywords = self.re_keywords | |||
|
176 | ||||
|
177 | elif code == "text" or code == "binary": | |||
|
178 | contents += data | |||
159 |
|
179 | |||
160 | if mode is None: |
|
180 | if mode is None: | |
161 | raise IOError() |
|
181 | raise IOError(0, "bad stat") | |
162 |
|
182 | |||
163 | self.modecache[(name, rev)] = mode |
|
183 | self.modecache[(name, rev)] = mode | |
164 | return data |
|
184 | ||
|
185 | if keywords: | |||
|
186 | contents = keywords.sub("$\\1$", contents) | |||
|
187 | if mode == "l" and contents.endswith("\n"): | |||
|
188 | contents = contents[:-1] | |||
|
189 | ||||
|
190 | return contents | |||
165 |
|
191 | |||
166 | def getmode(self, name, rev): |
|
192 | def getmode(self, name, rev): | |
167 | return self.modecache[(name, rev)] |
|
193 | return self.modecache[(name, rev)] | |
168 |
|
194 | |||
169 | def getchanges(self, rev): |
|
195 | def getchanges(self, rev): | |
170 | return self.files[rev], {} |
|
196 | return self.files[rev], {} | |
171 |
|
197 | |||
172 | def getcommit(self, rev): |
|
198 | def getcommit(self, rev): | |
173 | return self.changeset[rev] |
|
199 | return self.changeset[rev] | |
174 |
|
200 | |||
175 | def gettags(self): |
|
201 | def gettags(self): | |
176 | return self.tags |
|
202 | return self.tags | |
177 |
|
203 | |||
178 | def getchangedfiles(self, rev, i): |
|
204 | def getchangedfiles(self, rev, i): | |
179 | return sorted([x[0] for x in self.files[rev]]) |
|
205 | return sorted([x[0] for x in self.files[rev]]) |
General Comments 0
You need to be logged in to leave comments.
Login now