##// END OF EJS Templates
tests: make and use a new `svnurlof.py` helper for constructing svn urls...
Augie Fackler -
r41518:41bd254b default draft
parent child Browse files
Show More
@@ -0,0 +1,17
1 import sys
2
3 from mercurial import (
4 pycompat,
5 util,
6 )
7
8 def main(argv):
9 enc = util.urlreq.quote(pycompat.sysbytes(argv[1]))
10 if pycompat.iswindows:
11 fmt = 'file:///%s'
12 else:
13 fmt = 'file://%s'
14 print(fmt % pycompat.sysstr(enc))
15
16 if __name__ == '__main__':
17 main(sys.argv)
@@ -1,122 +1,118
1 1 #require svn svn-bindings
2 2
3 3 $ filter_svn_output () {
4 4 > egrep -v 'Committing|Updating|(^$)' | sed -e 's/done$//' || true
5 5 > }
6 6
7 7 $ cat <<EOF >> $HGRCPATH
8 8 > [extensions]
9 9 > convert =
10 10 > mq =
11 11 > EOF
12 12
13 13 $ SVNREPOPATH=`pwd`/svn-repo
14 #if windows
15 $ SVNREPOURL=file:///`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
16 #else
17 $ SVNREPOURL=file://`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
18 #endif
14 $ SVNREPOURL="`$PYTHON $TESTDIR/svnurlof.py \"$SVNREPOPATH\"`"
19 15
20 16 $ svnadmin create "$SVNREPOPATH"
21 17 $ cat > "$SVNREPOPATH"/hooks/pre-revprop-change <<EOF
22 18 > #!/bin/sh
23 19 >
24 20 > REPOS="$1"
25 21 > REV="$2"
26 22 > USER="$3"
27 23 > PROPNAME="$4"
28 24 > ACTION="$5"
29 25 >
30 26 > if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
31 27 > if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-branch" ]; then exit 0; fi
32 28 > if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-rev" ]; then exit 0; fi
33 29 >
34 30 > echo "Changing prohibited revision property" >&2
35 31 > exit 1
36 32 > EOF
37 33 $ chmod +x "$SVNREPOPATH"/hooks/pre-revprop-change
38 34 $ svn co "$SVNREPOURL" "$SVNREPOPATH"-wc
39 35 Checked out revision 0.
40 36 $ cd "$SVNREPOPATH"-wc
41 37 $ echo a > a
42 38 $ svn add a
43 39 A a
44 40 $ svn ci -m'added a' a | filter_svn_output
45 41 Adding a
46 42 Transmitting file data .
47 43 Committed revision 1.
48 44 $ cd ..
49 45
50 46 initial roundtrip
51 47
52 48 $ hg convert -s svn -d hg "$SVNREPOPATH"-wc "$SVNREPOPATH"-hg | grep -v initializing
53 49 scanning source...
54 50 sorting...
55 51 converting...
56 52 0 added a
57 53 $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
58 54 scanning source...
59 55 sorting...
60 56 converting...
61 57
62 58 second roundtrip should do nothing
63 59
64 60 $ hg convert -s svn -d hg "$SVNREPOPATH"-wc "$SVNREPOPATH"-hg
65 61 scanning source...
66 62 sorting...
67 63 converting...
68 64 $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
69 65 scanning source...
70 66 sorting...
71 67 converting...
72 68
73 69 new hg rev
74 70
75 71 $ hg clone "$SVNREPOPATH"-hg "$SVNREPOPATH"-work
76 72 updating to branch default
77 73 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
78 74 $ cd "$SVNREPOPATH"-work
79 75 $ echo b > b
80 76 $ hg add b
81 77 $ hg ci -mb
82 78
83 79 adding an empty revision
84 80
85 81 $ hg qnew -m emtpy empty
86 82 $ hg qfinish -a
87 83 $ cd ..
88 84
89 85 echo hg to svn
90 86
91 87 $ hg --cwd "$SVNREPOPATH"-hg pull -q "$SVNREPOPATH"-work
92 88 $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
93 89 scanning source...
94 90 sorting...
95 91 converting...
96 92 1 b
97 93 0 emtpy
98 94
99 95 svn back to hg should do nothing
100 96
101 97 $ hg convert -s svn -d hg "$SVNREPOPATH"-wc "$SVNREPOPATH"-hg
102 98 scanning source...
103 99 sorting...
104 100 converting...
105 101
106 102 hg back to svn should do nothing
107 103
108 104 $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
109 105 scanning source...
110 106 sorting...
111 107 converting...
112 108
113 109 verify which shamap format we are storing and must be able to handle
114 110
115 111 $ cat svn-repo-hg/.hg/shamap
116 112 svn:????????-????-????-????-????????????@1 ???????????????????????????????????????? (glob)
117 113 svn:????????-????-????-????-????????????@2 ???????????????????????????????????????? (glob)
118 114 svn:????????-????-????-????-????????????@2 ???????????????????????????????????????? (glob)
119 115 $ cat svn-repo-wc/.svn/hg-shamap
120 116 ???????????????????????????????????????? 1 (glob)
121 117 ???????????????????????????????????????? svn:????????-????-????-????-????????????@2 (glob)
122 118 ???????????????????????????????????????? svn:????????-????-????-????-????????????@2 (glob)
@@ -1,245 +1,241
1 1 #require svn svn-bindings
2 2
3 3 $ cat >> $HGRCPATH <<EOF
4 4 > [extensions]
5 5 > convert =
6 6 > EOF
7 7
8 8 $ svnadmin create svn-repo
9 9 $ svnadmin load -q svn-repo < "$TESTDIR/svn/move.svndump"
10 10 $ SVNREPOPATH=`pwd`/svn-repo
11 #if windows
12 $ SVNREPOURL=file:///`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
13 #else
14 $ SVNREPOURL=file://`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
15 #endif
11 $ SVNREPOURL="`$PYTHON $TESTDIR/svnurlof.py \"$SVNREPOPATH\"`"
16 12
17 13 Convert trunk and branches
18 14
19 15 $ hg convert --datesort "$SVNREPOURL"/subproject A-hg
20 16 initializing destination A-hg repository
21 17 scanning source...
22 18 sorting...
23 19 converting...
24 20 13 createtrunk
25 21 12 moved1
26 22 11 moved1
27 23 10 moved2
28 24 9 changeb and rm d2
29 25 8 changeb and rm d2
30 26 7 moved1again
31 27 6 moved1again
32 28 5 copyfilefrompast
33 29 4 copydirfrompast
34 30 3 add d3
35 31 2 copy dir and remove subdir
36 32 1 add d4old
37 33 0 rename d4old into d4new
38 34
39 35 $ cd A-hg
40 36 $ hg log -G --template '{rev} {desc|firstline} files: {files}\n'
41 37 o 13 rename d4old into d4new files: d4new/g d4old/g
42 38 |
43 39 o 12 add d4old files: d4old/g
44 40 |
45 41 o 11 copy dir and remove subdir files: d3/d31/e d4/d31/e d4/f
46 42 |
47 43 o 10 add d3 files: d3/d31/e d3/f
48 44 |
49 45 o 9 copydirfrompast files: d2/d
50 46 |
51 47 o 8 copyfilefrompast files: d
52 48 |
53 49 o 7 moved1again files: d1/b d1/c
54 50 |
55 51 | o 6 moved1again files:
56 52 | |
57 53 o | 5 changeb and rm d2 files: d1/b d2/d
58 54 | |
59 55 | o 4 changeb and rm d2 files: b
60 56 | |
61 57 o | 3 moved2 files: d2/d
62 58 | |
63 59 o | 2 moved1 files: d1/b d1/c
64 60 | |
65 61 | o 1 moved1 files: b c
66 62 |
67 63 o 0 createtrunk files:
68 64
69 65
70 66 Check move copy records
71 67
72 68 $ hg st --rev 12:13 --copies
73 69 A d4new/g
74 70 d4old/g
75 71 R d4old/g
76 72
77 73 Check branches
78 74
79 75 $ hg branches
80 76 default 13:* (glob)
81 77 d1 6:* (glob)
82 78 $ cd ..
83 79
84 80 $ mkdir test-replace
85 81 $ cd test-replace
86 82 $ svnadmin create svn-repo
87 83 $ svnadmin load -q svn-repo < "$TESTDIR/svn/replace.svndump"
88 84
89 85 Convert files being replaced by directories
90 86
91 87 $ hg convert svn-repo hg-repo
92 88 initializing destination hg-repo repository
93 89 scanning source...
94 90 sorting...
95 91 converting...
96 92 6 initial
97 93 5 clobber symlink
98 94 4 clobber1
99 95 3 clobber2
100 96 2 adddb
101 97 1 clobberdir
102 98 0 branch
103 99
104 100 $ cd hg-repo
105 101
106 102 Manifest before
107 103
108 104 $ hg -v manifest -r 1
109 105 644 a
110 106 644 d/b
111 107 644 d2/a
112 108 644 @ dlink
113 109 644 @ dlink2
114 110 644 dlink3
115 111
116 112 Manifest after clobber1
117 113
118 114 $ hg -v manifest -r 2
119 115 644 a/b
120 116 644 d/b
121 117 644 d2/a
122 118 644 dlink/b
123 119 644 @ dlink2
124 120 644 dlink3
125 121
126 122 Manifest after clobber2
127 123
128 124 $ hg -v manifest -r 3
129 125 644 a/b
130 126 644 d/b
131 127 644 d2/a
132 128 644 dlink/b
133 129 644 @ dlink2
134 130 644 @ dlink3
135 131
136 132 Manifest after clobberdir
137 133
138 134 $ hg -v manifest -r 6
139 135 644 a/b
140 136 644 d/b
141 137 644 d2/a
142 138 644 d2/c
143 139 644 dlink/b
144 140 644 @ dlink2
145 141 644 @ dlink3
146 142
147 143 Try updating
148 144
149 145 $ hg up -qC default
150 146 $ cd ..
151 147
152 148 Test convert progress bar
153 149
154 150 $ cat >> $HGRCPATH <<EOF
155 151 > [progress]
156 152 > assume-tty = 1
157 153 > delay = 0
158 154 > changedelay = 0
159 155 > format = topic bar number
160 156 > refresh = 0
161 157 > width = 60
162 158 > EOF
163 159
164 160 $ hg convert svn-repo hg-progress
165 161 \r (no-eol) (esc)
166 162 scanning [=====> ] 1/7\r (no-eol) (esc)
167 163 scanning [===========> ] 2/7\r (no-eol) (esc)
168 164 scanning [=================> ] 3/7\r (no-eol) (esc)
169 165 scanning [========================> ] 4/7\r (no-eol) (esc)
170 166 scanning [==============================> ] 5/7\r (no-eol) (esc)
171 167 scanning [====================================> ] 6/7\r (no-eol) (esc)
172 168 scanning [===========================================>] 7/7\r (no-eol) (esc)
173 169 \r (no-eol) (esc)
174 170 \r (no-eol) (esc)
175 171 converting [ ] 0/7\r (no-eol) (esc)
176 172 getting files [=====> ] 1/6\r (no-eol) (esc)
177 173 getting files [============> ] 2/6\r (no-eol) (esc)
178 174 getting files [==================> ] 3/6\r (no-eol) (esc)
179 175 getting files [=========================> ] 4/6\r (no-eol) (esc)
180 176 getting files [===============================> ] 5/6\r (no-eol) (esc)
181 177 getting files [======================================>] 6/6\r (no-eol) (esc)
182 178 \r (no-eol) (esc)
183 179 \r (no-eol) (esc)
184 180 converting [=====> ] 1/7\r (no-eol) (esc)
185 181 scanning paths [ ] 0/1\r (no-eol) (esc)
186 182 getting files [======================================>] 1/1\r (no-eol) (esc)
187 183 \r (no-eol) (esc)
188 184 \r (no-eol) (esc)
189 185 converting [===========> ] 2/7\r (no-eol) (esc)
190 186 scanning paths [ ] 0/2\r (no-eol) (esc)
191 187 scanning paths [==================> ] 1/2\r (no-eol) (esc)
192 188 getting files [========> ] 1/4\r (no-eol) (esc)
193 189 getting files [==================> ] 2/4\r (no-eol) (esc)
194 190 getting files [============================> ] 3/4\r (no-eol) (esc)
195 191 getting files [======================================>] 4/4\r (no-eol) (esc)
196 192 \r (no-eol) (esc)
197 193 \r (no-eol) (esc)
198 194 converting [=================> ] 3/7\r (no-eol) (esc)
199 195 scanning paths [ ] 0/1\r (no-eol) (esc)
200 196 getting files [======================================>] 1/1\r (no-eol) (esc)
201 197 \r (no-eol) (esc)
202 198 \r (no-eol) (esc)
203 199 converting [=======================> ] 4/7\r (no-eol) (esc)
204 200 scanning paths [ ] 0/1\r (no-eol) (esc)
205 201 getting files [======================================>] 1/1\r (no-eol) (esc)
206 202 \r (no-eol) (esc)
207 203 \r (no-eol) (esc)
208 204 converting [=============================> ] 5/7\r (no-eol) (esc)
209 205 scanning paths [ ] 0/1\r (no-eol) (esc)
210 206 getting files [===> ] 1/8\r (no-eol) (esc)
211 207 getting files [========> ] 2/8\r (no-eol) (esc)
212 208 getting files [=============> ] 3/8\r (no-eol) (esc)
213 209 getting files [==================> ] 4/8\r (no-eol) (esc)
214 210 getting files [=======================> ] 5/8\r (no-eol) (esc)
215 211 getting files [============================> ] 6/8\r (no-eol) (esc)
216 212 getting files [=================================> ] 7/8\r (no-eol) (esc)
217 213 getting files [======================================>] 8/8\r (no-eol) (esc)
218 214 \r (no-eol) (esc)
219 215 \r (no-eol) (esc)
220 216 converting [===================================> ] 6/7\r (no-eol) (esc)
221 217 scanning paths [ ] 0/3\r (no-eol) (esc)
222 218 scanning paths [===========> ] 1/3\r (no-eol) (esc)
223 219 scanning paths [========================> ] 2/3\r (no-eol) (esc)
224 220 getting files [===> ] 1/8\r (no-eol) (esc)
225 221 getting files [========> ] 2/8\r (no-eol) (esc)
226 222 getting files [=============> ] 3/8\r (no-eol) (esc)
227 223 getting files [==================> ] 4/8\r (no-eol) (esc)
228 224 getting files [=======================> ] 5/8\r (no-eol) (esc)
229 225 getting files [============================> ] 6/8\r (no-eol) (esc)
230 226 getting files [=================================> ] 7/8\r (no-eol) (esc)
231 227 getting files [======================================>] 8/8\r (no-eol) (esc)
232 228 \r (no-eol) (esc)
233 229 initializing destination hg-progress repository
234 230 scanning source...
235 231 sorting...
236 232 converting...
237 233 6 initial
238 234 5 clobber symlink
239 235 4 clobber1
240 236 3 clobber2
241 237 2 adddb
242 238 1 clobberdir
243 239 0 branch
244 240
245 241 $ cd ..
@@ -1,324 +1,320
1 1 #require svn svn-bindings
2 2
3 3 $ filter_svn_output () {
4 4 > egrep -v 'Committing|Updating|(^$)' | sed -e 's/done$//' || true
5 5 > }
6 6
7 7 $ cat >> $HGRCPATH <<EOF
8 8 > [extensions]
9 9 > convert =
10 10 > [convert]
11 11 > svn.trunk = mytrunk
12 12 > EOF
13 13
14 14 $ svnadmin create svn-repo
15 15 $ SVNREPOPATH=`pwd`/svn-repo
16 #if windows
17 $ SVNREPOURL=file:///`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
18 #else
19 $ SVNREPOURL=file://`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
20 #endif
16 $ SVNREPOURL="`$PYTHON $TESTDIR/svnurlof.py \"$SVNREPOPATH\"`"
21 17 $ INVALIDREVISIONID=svn:x2147622-4a9f-4db4-a8d3-13562ff547b2/proj%20B/mytrunk@1
22 18 $ VALIDREVISIONID=svn:a2147622-4a9f-4db4-a8d3-13562ff547b2/proj%20B/mytrunk/mytrunk@1
23 19
24 20 Now test that it works with trunk/tags layout, but no branches yet.
25 21
26 22 Initial svn import
27 23
28 24 $ mkdir projB
29 25 $ cd projB
30 26 $ mkdir mytrunk
31 27 $ mkdir tags
32 28 $ cd ..
33 29
34 30 $ svn import -m "init projB" projB "$SVNREPOURL/proj%20B" | filter_svn_output | sort
35 31 Adding projB/mytrunk
36 32 Adding projB/tags
37 33 Committed revision 1.
38 34
39 35 Update svn repository
40 36
41 37 $ svn co "$SVNREPOURL/proj%20B/mytrunk" B | filter_svn_output
42 38 Checked out revision 1.
43 39 $ cd B
44 40 $ echo hello > 'letter .txt'
45 41 $ svn add 'letter .txt' | filter_svn_output
46 42 A letter .txt
47 43 $ svn ci -m hello | filter_svn_output
48 44 Adding letter .txt
49 45 Transmitting file data .
50 46 Committed revision 2.
51 47
52 48 $ svn-safe-append.py world 'letter .txt'
53 49 $ svn ci -m world | filter_svn_output
54 50 Sending letter .txt
55 51 Transmitting file data .
56 52 Committed revision 3.
57 53
58 54 $ svn copy -m "tag v0.1" "$SVNREPOURL/proj%20B/mytrunk" "$SVNREPOURL/proj%20B/tags/v0.1" | filter_svn_output
59 55 Committed revision 4.
60 56
61 57 $ svn-safe-append.py 'nice day today!' 'letter .txt'
62 58 $ svn ci -m "nice day" | filter_svn_output
63 59 Sending letter .txt
64 60 Transmitting file data .
65 61 Committed revision 5.
66 62 $ cd ..
67 63
68 64 Convert to hg once and also test localtimezone option
69 65
70 66 NOTE: This doesn't check all time zones -- it merely determines that
71 67 the configuration option is taking effect.
72 68
73 69 An arbitrary (U.S.) time zone is used here. TZ=US/Hawaii is selected
74 70 since it does not use DST (unlike other U.S. time zones) and is always
75 71 a fixed difference from UTC.
76 72
77 73 $ TZ=US/Hawaii hg convert --config convert.localtimezone=True "$SVNREPOURL/proj%20B" B-hg
78 74 initializing destination B-hg repository
79 75 scanning source...
80 76 sorting...
81 77 converting...
82 78 3 init projB
83 79 2 hello
84 80 1 world
85 81 0 nice day
86 82 updating tags
87 83
88 84 Update svn repository again
89 85
90 86 $ cd B
91 87 $ svn-safe-append.py "see second letter" 'letter .txt'
92 88 $ echo "nice to meet you" > letter2.txt
93 89 $ svn add letter2.txt | filter_svn_output
94 90 A letter2.txt
95 91 $ svn ci -m "second letter" | filter_svn_output
96 92 Sending letter .txt
97 93 Adding letter2.txt
98 94 Transmitting file data ..
99 95 Committed revision 6.
100 96
101 97 $ svn copy -m "tag v0.2" "$SVNREPOURL/proj%20B/mytrunk" "$SVNREPOURL/proj%20B/tags/v0.2" | filter_svn_output
102 98 Committed revision 7.
103 99
104 100 $ svn-safe-append.py "blah-blah-blah" letter2.txt
105 101 $ svn ci -m "work in progress" | filter_svn_output
106 102 Sending letter2.txt
107 103 Transmitting file data .
108 104 Committed revision 8.
109 105 $ cd ..
110 106
111 107 $ hg convert -s svn "$SVNREPOURL/proj%20B/non-existent-path" dest
112 108 initializing destination dest repository
113 109 abort: no revision found in module /proj B/non-existent-path
114 110 [255]
115 111
116 112 ########################################
117 113
118 114 Test incremental conversion
119 115
120 116 $ TZ=US/Hawaii hg convert --config convert.localtimezone=True "$SVNREPOURL/proj%20B" B-hg
121 117 scanning source...
122 118 sorting...
123 119 converting...
124 120 1 second letter
125 121 0 work in progress
126 122 updating tags
127 123
128 124 $ cd B-hg
129 125 $ hg log -G --template '{rev} {desc|firstline} date: {date|date} files: {files}\n'
130 126 o 7 update tags date: * +0000 files: .hgtags (glob)
131 127 |
132 128 o 6 work in progress date: * -1000 files: letter2.txt (glob)
133 129 |
134 130 o 5 second letter date: * -1000 files: letter .txt letter2.txt (glob)
135 131 |
136 132 o 4 update tags date: * +0000 files: .hgtags (glob)
137 133 |
138 134 o 3 nice day date: * -1000 files: letter .txt (glob)
139 135 |
140 136 o 2 world date: * -1000 files: letter .txt (glob)
141 137 |
142 138 o 1 hello date: * -1000 files: letter .txt (glob)
143 139 |
144 140 o 0 init projB date: * -1000 files: (glob)
145 141
146 142 $ hg tags -q
147 143 tip
148 144 v0.2
149 145 v0.1
150 146 $ cd ..
151 147
152 148 Test filemap
153 149 $ echo 'include letter2.txt' > filemap
154 150 $ hg convert --filemap filemap "$SVNREPOURL/proj%20B/mytrunk" fmap
155 151 initializing destination fmap repository
156 152 scanning source...
157 153 sorting...
158 154 converting...
159 155 5 init projB
160 156 4 hello
161 157 3 world
162 158 2 nice day
163 159 1 second letter
164 160 0 work in progress
165 161 $ hg -R fmap branch -q
166 162 default
167 163 $ hg log -G -R fmap --template '{rev} {desc|firstline} files: {files}\n'
168 164 o 1 work in progress files: letter2.txt
169 165 |
170 166 o 0 second letter files: letter2.txt
171 167
172 168 Convert with --full adds and removes files that didn't change
173 169
174 170 $ cd B
175 171 $ echo >> "letter .txt"
176 172 $ svn ci -m 'nothing' | filter_svn_output
177 173 Sending letter .txt
178 174 Transmitting file data .
179 175 Committed revision 9.
180 176 $ cd ..
181 177
182 178 $ echo 'rename letter2.txt letter3.txt' > filemap
183 179 $ hg convert --filemap filemap --full "$SVNREPOURL/proj%20B/mytrunk" fmap
184 180 scanning source...
185 181 sorting...
186 182 converting...
187 183 0 nothing
188 184 $ hg -R fmap st --change tip
189 185 A letter .txt
190 186 A letter3.txt
191 187 R letter2.txt
192 188
193 189 test invalid splicemap1
194 190
195 191 $ cat > splicemap <<EOF
196 192 > $INVALIDREVISIONID $VALIDREVISIONID
197 193 > EOF
198 194 $ hg convert --splicemap splicemap "$SVNREPOURL/proj%20B/mytrunk" smap
199 195 initializing destination smap repository
200 196 abort: splicemap entry svn:x2147622-4a9f-4db4-a8d3-13562ff547b2/proj%20B/mytrunk@1 is not a valid revision identifier
201 197 [255]
202 198
203 199 Test stop revision
204 200 $ hg convert --rev 1 "$SVNREPOURL/proj%20B/mytrunk" stoprev
205 201 initializing destination stoprev repository
206 202 scanning source...
207 203 sorting...
208 204 converting...
209 205 0 init projB
210 206 $ hg -R stoprev branch -q
211 207 default
212 208
213 209 Check convert_revision extra-records.
214 210 This is also the only place testing more than one extra field in a revision.
215 211
216 212 $ cd stoprev
217 213 $ hg tip --debug | grep extra
218 214 extra: branch=default
219 215 extra: convert_revision=svn:........-....-....-....-............/proj B/mytrunk@1 (re)
220 216 $ cd ..
221 217
222 218 Test converting empty heads (issue3347).
223 219 Also tests getting logs directly without debugsvnlog.
224 220
225 221 $ svnadmin create svn-empty
226 222 $ svnadmin load -q svn-empty < "$TESTDIR/svn/empty.svndump"
227 223 $ hg --config convert.svn.trunk= --config convert.svn.debugsvnlog=0 convert svn-empty
228 224 assuming destination svn-empty-hg
229 225 initializing destination svn-empty-hg repository
230 226 scanning source...
231 227 sorting...
232 228 converting...
233 229 1 init projA
234 230 0 adddir
235 231 $ hg --config convert.svn.trunk= convert "$SVNREPOURL/../svn-empty/trunk"
236 232 assuming destination trunk-hg
237 233 initializing destination trunk-hg repository
238 234 scanning source...
239 235 sorting...
240 236 converting...
241 237 1 init projA
242 238 0 adddir
243 239
244 240 Test that a too-new repository format is properly rejected:
245 241 $ mv svn-empty/format format
246 242 $ echo 999 > svn-empty/format
247 243 It's important that this command explicitly specify svn, otherwise it
248 244 can have surprising side effects (like falling back to a perforce
249 245 depot that can be seen from the test environment and slurping from that.)
250 246 $ hg convert --source-type svn svn-empty this-will-fail
251 247 initializing destination this-will-fail repository
252 248 file:/*/$TESTTMP/svn-empty does not look like a Subversion repository to libsvn version 1.*.* (glob)
253 249 abort: svn-empty: missing or unsupported repository
254 250 [255]
255 251 $ mv format svn-empty/format
256 252
257 253 enable svn subrepos
258 254
259 255 $ cat >> $HGRCPATH <<EOF
260 256 > [subrepos]
261 257 > svn:allowed = true
262 258 > EOF
263 259
264 260 try converting when we have an svn subrepo and a merge in hg superrepo (issue5657)
265 261
266 262 $ cd "$TESTTMP"
267 263 $ hg init withmerge
268 264 $ cd withmerge
269 265 $ echo "subrepo = [svn]$SVNREPOURL" >.hgsub
270 266 $ hg add .hgsub
271 267 $ svn checkout "$SVNREPOURL" subrepo | sort
272 268 A subrepo/proj B
273 269 A subrepo/proj B/mytrunk
274 270 A subrepo/proj B/mytrunk/letter .txt
275 271 A subrepo/proj B/mytrunk/letter2.txt
276 272 A subrepo/proj B/tags
277 273 A subrepo/proj B/tags/v0.1
278 274 A subrepo/proj B/tags/v0.1/letter .txt
279 275 A subrepo/proj B/tags/v0.2
280 276 A subrepo/proj B/tags/v0.2/letter .txt
281 277 A subrepo/proj B/tags/v0.2/letter2.txt
282 278 Checked out revision 9.
283 279 $ hg ci -m "Adding svn subrepo"
284 280 $ touch file1.txt
285 281 $ hg add file1.txt
286 282 $ hg ci -m "Adding file1"
287 283 $ hg up 0
288 284 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
289 285 $ touch file2.txt
290 286 $ hg add file2.txt
291 287 $ hg ci -m "Adding file2"
292 288 created new head
293 289 $ hg merge 1
294 290 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
295 291 (branch merge, don't forget to commit)
296 292 $ hg ci -m "merged"
297 293 $ cd ..
298 294 $ hg --config extensions.convert= convert withmerge withmerge-converted
299 295 initializing destination withmerge-converted repository
300 296 scanning source...
301 297 sorting...
302 298 converting...
303 299 3 Adding svn subrepo
304 300 2 Adding file1
305 301 1 Adding file2
306 302 0 merged
307 303 $ cd withmerge-converted
308 304 $ hg up | sort
309 305 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
310 306 A subrepo/proj B
311 307 A subrepo/proj B/mytrunk
312 308 A subrepo/proj B/mytrunk/letter .txt
313 309 A subrepo/proj B/mytrunk/letter2.txt
314 310 A subrepo/proj B/tags
315 311 A subrepo/proj B/tags/v0.1
316 312 A subrepo/proj B/tags/v0.1/letter .txt
317 313 A subrepo/proj B/tags/v0.2
318 314 A subrepo/proj B/tags/v0.2/letter .txt
319 315 A subrepo/proj B/tags/v0.2/letter2.txt
320 316 Checked out revision 9.
321 317 $ ls
322 318 file1.txt
323 319 file2.txt
324 320 subrepo
@@ -1,63 +1,52
1 1 #require svn13
2 2
3 3 $ cat <<EOF >> $HGRCPATH
4 4 > [extensions]
5 5 > mq =
6 6 > [diff]
7 7 > nodates = 1
8 8 > [subrepos]
9 9 > allowed = true
10 10 > svn:allowed = true
11 11 > EOF
12 12
13 13 fn to create new repository, and cd into it
14 14 $ mkrepo() {
15 15 > hg init $1
16 16 > cd $1
17 17 > hg qinit
18 18 > }
19 19
20 20
21 21 handle svn subrepos safely
22 22
23 23 $ svnadmin create svn-repo-2499
24 24
25 25 $ SVNREPOPATH=`pwd`/svn-repo-2499/project
26
27 #if py3
28 $ pathquoted=`"$PYTHON" -c "import sys, urllib.parse; sys.stdout.write(urllib.parse.quote(sys.argv[1]))" "$SVNREPOPATH"`
29 #else
30 $ pathquoted=`"$PYTHON" -c "import sys, urllib; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
31 #endif
32
33 #if windows
34 $ SVNREPOURL=file:///$pathquoted
35 #else
36 $ SVNREPOURL=file://$pathquoted
37 #endif
26 $ SVNREPOURL="`$PYTHON $TESTDIR/svnurlof.py \"$SVNREPOPATH\"`"
38 27
39 28 $ mkdir -p svn-project-2499/trunk
40 29 $ svn import -qm 'init project' svn-project-2499 "$SVNREPOURL"
41 30
42 31 qnew on repo w/svn subrepo
43 32 $ mkrepo repo-2499-svn-subrepo
44 33 $ svn co "$SVNREPOURL"/trunk sub
45 34 Checked out revision 1.
46 35 $ echo 'sub = [svn]sub' >> .hgsub
47 36 $ hg add .hgsub
48 37 $ hg status -S -X '**/format'
49 38 A .hgsub
50 39 $ hg qnew -m0 0.diff
51 40 $ cd sub
52 41 $ echo a > a
53 42 $ svn add a
54 43 A a
55 44 $ svn st
56 45 A* a (glob)
57 46 $ cd ..
58 47 $ hg status -S # doesn't show status for svn subrepos (yet)
59 48 $ hg qnew -m1 1.diff
60 49 abort: uncommitted changes in subrepository "sub"
61 50 [255]
62 51
63 52 $ cd ..
@@ -1,690 +1,686
1 1 #require svn15
2 2
3 3 $ SVNREPOPATH=`pwd`/svn-repo
4 #if windows
5 $ SVNREPOURL=file:///`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
6 #else
7 $ SVNREPOURL=file://`"$PYTHON" -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
8 #endif
4 $ SVNREPOURL="`$PYTHON $TESTDIR/svnurlof.py \"$SVNREPOPATH\"`"
9 5
10 6 $ filter_svn_output () {
11 7 > egrep -v 'Committing|Transmitting|Updating|(^$)' || true
12 8 > }
13 9
14 10 create subversion repo
15 11
16 12 $ WCROOT="`pwd`/svn-wc"
17 13 $ svnadmin create svn-repo
18 14 $ svn co "$SVNREPOURL" svn-wc
19 15 Checked out revision 0.
20 16 $ cd svn-wc
21 17 $ mkdir src
22 18 $ echo alpha > src/alpha
23 19 $ svn add src
24 20 A src
25 21 A src/alpha
26 22 $ mkdir externals
27 23 $ echo other > externals/other
28 24 $ svn add externals
29 25 A externals
30 26 A externals/other
31 27 $ svn ci -qm 'Add alpha'
32 28 $ svn up -q
33 29 $ echo "externals -r1 $SVNREPOURL/externals" > extdef
34 30 $ svn propset -F extdef svn:externals src
35 31 property 'svn:externals' set on 'src'
36 32 $ svn ci -qm 'Setting externals'
37 33 $ cd ..
38 34
39 35 create hg repo
40 36
41 37 $ mkdir sub
42 38 $ cd sub
43 39 $ hg init t
44 40 $ cd t
45 41
46 42 first revision, no sub
47 43
48 44 $ echo a > a
49 45 $ hg ci -Am0
50 46 adding a
51 47
52 48 add first svn sub with leading whitespaces
53 49
54 50 $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub
55 51 $ echo "subdir/s = [svn] $SVNREPOURL/src" >> .hgsub
56 52 $ svn co --quiet "$SVNREPOURL"/src s
57 53 $ mkdir subdir
58 54 $ svn co --quiet "$SVNREPOURL"/src subdir/s
59 55 $ hg add .hgsub
60 56
61 57 svn subrepo is disabled by default
62 58
63 59 $ hg ci -m1
64 60 abort: svn subrepos not allowed
65 61 (see 'hg help config.subrepos' for details)
66 62 [255]
67 63
68 64 so enable it
69 65
70 66 $ cat >> $HGRCPATH <<EOF
71 67 > [subrepos]
72 68 > svn:allowed = true
73 69 > EOF
74 70
75 71 $ hg ci -m1
76 72
77 73 make sure we avoid empty commits (issue2445)
78 74
79 75 $ hg sum
80 76 parent: 1:* tip (glob)
81 77 1
82 78 branch: default
83 79 commit: (clean)
84 80 update: (current)
85 81 phases: 2 draft
86 82 $ hg ci -moops
87 83 nothing changed
88 84 [1]
89 85
90 86 debugsub
91 87
92 88 $ hg debugsub
93 89 path s
94 90 source file:/*/$TESTTMP/svn-repo/src (glob)
95 91 revision 2
96 92 path subdir/s
97 93 source file:/*/$TESTTMP/svn-repo/src (glob)
98 94 revision 2
99 95
100 96 change file in svn and hg, commit
101 97
102 98 $ echo a >> a
103 99 $ echo alpha >> s/alpha
104 100 $ hg sum
105 101 parent: 1:* tip (glob)
106 102 1
107 103 branch: default
108 104 commit: 1 modified, 1 subrepos
109 105 update: (current)
110 106 phases: 2 draft
111 107 $ hg commit --subrepos -m 'Message!' | filter_svn_output
112 108 committing subrepository s
113 109 Sending*s/alpha (glob)
114 110 Committed revision 3.
115 111 Fetching external item into '*s/externals'* (glob)
116 112 External at revision 1.
117 113 At revision 3.
118 114 $ hg debugsub
119 115 path s
120 116 source file:/*/$TESTTMP/svn-repo/src (glob)
121 117 revision 3
122 118 path subdir/s
123 119 source file:/*/$TESTTMP/svn-repo/src (glob)
124 120 revision 2
125 121
126 122 missing svn file, commit should fail
127 123
128 124 $ rm s/alpha
129 125 $ hg commit --subrepos -m 'abort on missing file'
130 126 committing subrepository s
131 127 abort: cannot commit missing svn entries (in subrepository "s")
132 128 [255]
133 129 $ svn revert s/alpha > /dev/null
134 130
135 131 add an unrelated revision in svn and update the subrepo to without
136 132 bringing any changes.
137 133
138 134 $ svn mkdir "$SVNREPOURL/unrelated" -qm 'create unrelated'
139 135 $ svn up -q s
140 136 $ hg sum
141 137 parent: 2:* tip (glob)
142 138 Message!
143 139 branch: default
144 140 commit: (clean)
145 141 update: (current)
146 142 phases: 3 draft
147 143
148 144 $ echo a > s/a
149 145
150 146 should be empty despite change to s/a
151 147
152 148 $ hg st
153 149
154 150 add a commit from svn
155 151
156 152 $ cd "$WCROOT/src"
157 153 $ svn up -q
158 154 $ echo xyz >> alpha
159 155 $ svn propset svn:mime-type 'text/xml' alpha
160 156 property 'svn:mime-type' set on 'alpha'
161 157 $ svn ci -qm 'amend a from svn'
162 158 $ cd ../../sub/t
163 159
164 160 this commit from hg will fail
165 161
166 162 $ echo zzz >> s/alpha
167 163 $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date'
168 164 committing subrepository s
169 165 abort: svn:*Commit failed (details follow): (glob)
170 166 [255]
171 167 $ svn revert -q s/alpha
172 168
173 169 this commit fails because of meta changes
174 170
175 171 $ svn propset svn:mime-type 'text/html' s/alpha
176 172 property 'svn:mime-type' set on 's/alpha'
177 173 $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date'
178 174 committing subrepository s
179 175 abort: svn:*Commit failed (details follow): (glob)
180 176 [255]
181 177 $ svn revert -q s/alpha
182 178
183 179 this commit fails because of externals changes
184 180
185 181 $ echo zzz > s/externals/other
186 182 $ hg ci --subrepos -m 'amend externals from hg'
187 183 committing subrepository s
188 184 abort: cannot commit svn externals (in subrepository "s")
189 185 [255]
190 186 $ hg diff --subrepos -r 1:2 | grep -v diff
191 187 --- a/.hgsubstate Thu Jan 01 00:00:00 1970 +0000
192 188 +++ b/.hgsubstate Thu Jan 01 00:00:00 1970 +0000
193 189 @@ -1,2 +1,2 @@
194 190 -2 s
195 191 +3 s
196 192 2 subdir/s
197 193 --- a/a Thu Jan 01 00:00:00 1970 +0000
198 194 +++ b/a Thu Jan 01 00:00:00 1970 +0000
199 195 @@ -1,1 +1,2 @@
200 196 a
201 197 +a
202 198 $ svn revert -q s/externals/other
203 199
204 200 this commit fails because of externals meta changes
205 201
206 202 $ svn propset svn:mime-type 'text/html' s/externals/other
207 203 property 'svn:mime-type' set on 's/externals/other'
208 204 $ hg ci --subrepos -m 'amend externals from hg'
209 205 committing subrepository s
210 206 abort: cannot commit svn externals (in subrepository "s")
211 207 [255]
212 208 $ svn revert -q s/externals/other
213 209
214 210 clone
215 211
216 212 $ cd ..
217 213 $ hg clone t tc
218 214 updating to branch default
219 215 A tc/s/alpha
220 216 U tc/s
221 217
222 218 Fetching external item into 'tc/s/externals'* (glob)
223 219 A tc/s/externals/other
224 220 Checked out external at revision 1.
225 221
226 222 Checked out revision 3.
227 223 A tc/subdir/s/alpha
228 224 U tc/subdir/s
229 225
230 226 Fetching external item into 'tc/subdir/s/externals'* (glob)
231 227 A tc/subdir/s/externals/other
232 228 Checked out external at revision 1.
233 229
234 230 Checked out revision 2.
235 231 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
236 232 $ cd tc
237 233
238 234 debugsub in clone
239 235
240 236 $ hg debugsub
241 237 path s
242 238 source file:/*/$TESTTMP/svn-repo/src (glob)
243 239 revision 3
244 240 path subdir/s
245 241 source file:/*/$TESTTMP/svn-repo/src (glob)
246 242 revision 2
247 243
248 244 verify subrepo is contained within the repo directory
249 245
250 246 $ "$PYTHON" -c "from __future__ import print_function; import os.path; print(os.path.exists('s'))"
251 247 True
252 248
253 249 update to nullrev (must delete the subrepo)
254 250
255 251 $ hg up null
256 252 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
257 253 $ ls
258 254
259 255 Check hg update --clean
260 256 $ cd "$TESTTMP/sub/t"
261 257 $ cd s
262 258 $ echo c0 > alpha
263 259 $ echo c1 > f1
264 260 $ echo c1 > f2
265 261 $ svn add f1 -q
266 262 $ svn status | sort
267 263
268 264 ? * a (glob)
269 265 ? * f2 (glob)
270 266 A * f1 (glob)
271 267 M * alpha (glob)
272 268 Performing status on external item at 'externals'* (glob)
273 269 X * externals (glob)
274 270 $ cd ../..
275 271 $ hg -R t update -C
276 272
277 273 Fetching external item into 't/s/externals'* (glob)
278 274 Checked out external at revision 1.
279 275
280 276 Checked out revision 3.
281 277 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
282 278 $ cd t/s
283 279 $ svn status | sort
284 280
285 281 ? * a (glob)
286 282 ? * f1 (glob)
287 283 ? * f2 (glob)
288 284 Performing status on external item at 'externals'* (glob)
289 285 X * externals (glob)
290 286
291 287 Sticky subrepositories, no changes
292 288 $ cd "$TESTTMP/sub/t"
293 289 $ hg id -n
294 290 2
295 291 $ cd s
296 292 $ svnversion
297 293 3
298 294 $ cd ..
299 295 $ hg update 1
300 296 U *s/alpha (glob)
301 297
302 298 Fetching external item into '*s/externals'* (glob)
303 299 Checked out external at revision 1.
304 300
305 301 Checked out revision 2.
306 302 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
307 303 $ hg id -n
308 304 1
309 305 $ cd s
310 306 $ svnversion
311 307 2
312 308 $ cd ..
313 309
314 310 Sticky subrepositories, file changes
315 311 $ touch s/f1
316 312 $ cd s
317 313 $ svn add f1
318 314 A f1
319 315 $ cd ..
320 316 $ hg id -n
321 317 1+
322 318 $ cd s
323 319 $ svnversion
324 320 2M
325 321 $ cd ..
326 322 $ hg update tip
327 323 subrepository s diverged (local revision: 2, remote revision: 3)
328 324 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
329 325 subrepository sources for s differ
330 326 use (l)ocal source (2) or (r)emote source (3)? l
331 327 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
332 328 $ hg id -n
333 329 2+
334 330 $ cd s
335 331 $ svnversion
336 332 2M
337 333 $ cd ..
338 334 $ hg update --clean tip
339 335 U *s/alpha (glob)
340 336
341 337 Fetching external item into '*s/externals'* (glob)
342 338 Checked out external at revision 1.
343 339
344 340 Checked out revision 3.
345 341 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
346 342
347 343 Sticky subrepository, revision updates
348 344 $ hg id -n
349 345 2
350 346 $ cd s
351 347 $ svnversion
352 348 3
353 349 $ cd ..
354 350 $ cd s
355 351 $ svn update -qr 1
356 352 $ cd ..
357 353 $ hg update 1
358 354 subrepository s diverged (local revision: 3, remote revision: 2)
359 355 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
360 356 subrepository sources for s differ (in checked out version)
361 357 use (l)ocal source (1) or (r)emote source (2)? l
362 358 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
363 359 $ hg id -n
364 360 1+
365 361 $ cd s
366 362 $ svnversion
367 363 1
368 364 $ cd ..
369 365
370 366 Sticky subrepository, file changes and revision updates
371 367 $ touch s/f1
372 368 $ cd s
373 369 $ svn add f1
374 370 A f1
375 371 $ svnversion
376 372 1M
377 373 $ cd ..
378 374 $ hg id -n
379 375 1+
380 376 $ hg update tip
381 377 subrepository s diverged (local revision: 3, remote revision: 3)
382 378 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
383 379 subrepository sources for s differ
384 380 use (l)ocal source (1) or (r)emote source (3)? l
385 381 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
386 382 $ hg id -n
387 383 2+
388 384 $ cd s
389 385 $ svnversion
390 386 1M
391 387 $ cd ..
392 388
393 389 Sticky repository, update --clean
394 390 $ hg update --clean tip | grep -v 's[/\]externals[/\]other'
395 391 U *s/alpha (glob)
396 392 U *s (glob)
397 393
398 394 Fetching external item into '*s/externals'* (glob)
399 395 Checked out external at revision 1.
400 396
401 397 Checked out revision 3.
402 398 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
403 399 $ hg id -n
404 400 2
405 401 $ cd s
406 402 $ svnversion
407 403 3
408 404 $ cd ..
409 405
410 406 Test subrepo already at intended revision:
411 407 $ cd s
412 408 $ svn update -qr 2
413 409 $ cd ..
414 410 $ hg update 1
415 411 subrepository s diverged (local revision: 3, remote revision: 2)
416 412 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
417 413 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
418 414 $ hg id -n
419 415 1+
420 416 $ cd s
421 417 $ svnversion
422 418 2
423 419 $ cd ..
424 420
425 421 Test case where subversion would fail to update the subrepo because there
426 422 are unknown directories being replaced by tracked ones (happens with rebase).
427 423
428 424 $ cd "$WCROOT/src"
429 425 $ mkdir dir
430 426 $ echo epsilon.py > dir/epsilon.py
431 427 $ svn add dir
432 428 A dir
433 429 A dir/epsilon.py
434 430 $ svn ci -qm 'Add dir/epsilon.py'
435 431 $ cd ../..
436 432 $ hg init rebaserepo
437 433 $ cd rebaserepo
438 434 $ svn co -r5 --quiet "$SVNREPOURL"/src s
439 435 $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub
440 436 $ hg add .hgsub
441 437 $ hg ci -m addsub
442 438 $ echo a > a
443 439 $ hg add .
444 440 adding a
445 441 $ hg ci -m adda
446 442 $ hg up 0
447 443 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
448 444 $ svn up -qr6 s
449 445 $ hg ci -m updatesub
450 446 created new head
451 447 $ echo pyc > s/dir/epsilon.pyc
452 448 $ hg up 1
453 449 D *s/dir (glob)
454 450
455 451 Fetching external item into '*s/externals'* (glob)
456 452 Checked out external at revision 1.
457 453
458 454 Checked out revision 5.
459 455 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
460 456 $ hg up -q 2
461 457
462 458 Modify one of the externals to point to a different path so we can
463 459 test having obstructions when switching branches on checkout:
464 460 $ hg checkout tip
465 461 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
466 462 $ echo "obstruct = [svn] $SVNREPOURL/externals" >> .hgsub
467 463 $ svn co -r5 --quiet "$SVNREPOURL"/externals obstruct
468 464 $ hg commit -m 'Start making obstructed working copy'
469 465 $ hg book other
470 466 $ hg co -r 'p1(tip)'
471 467 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
472 468 (leaving bookmark other)
473 469 $ echo "obstruct = [svn] $SVNREPOURL/src" >> .hgsub
474 470 $ svn co -r5 --quiet "$SVNREPOURL"/src obstruct
475 471 $ hg commit -m 'Other branch which will be obstructed'
476 472 created new head
477 473
478 474 Switching back to the head where we have another path mapped to the
479 475 same subrepo should work if the subrepo is clean.
480 476 $ hg co other
481 477 A *obstruct/other (glob)
482 478 Checked out revision 1.
483 479 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
484 480 (activating bookmark other)
485 481
486 482 This is surprising, but is also correct based on the current code:
487 483 $ echo "updating should (maybe) fail" > obstruct/other
488 484 $ hg co tip
489 485 abort: uncommitted changes
490 486 (commit or update --clean to discard changes)
491 487 [255]
492 488
493 489 Point to a Subversion branch which has since been deleted and recreated
494 490 First, create that condition in the repository.
495 491
496 492 $ hg ci --subrepos -m cleanup | filter_svn_output
497 493 committing subrepository obstruct
498 494 Sending obstruct/other
499 495 Committed revision 7.
500 496 At revision 7.
501 497 $ svn mkdir -qm "baseline" $SVNREPOURL/trunk
502 498 $ svn copy -qm "initial branch" $SVNREPOURL/trunk $SVNREPOURL/branch
503 499 $ svn co --quiet "$SVNREPOURL"/branch tempwc
504 500 $ cd tempwc
505 501 $ echo "something old" > somethingold
506 502 $ svn add somethingold
507 503 A somethingold
508 504 $ svn ci -qm 'Something old'
509 505 $ svn rm -qm "remove branch" $SVNREPOURL/branch
510 506 $ svn copy -qm "recreate branch" $SVNREPOURL/trunk $SVNREPOURL/branch
511 507 $ svn up -q
512 508 $ echo "something new" > somethingnew
513 509 $ svn add somethingnew
514 510 A somethingnew
515 511 $ svn ci -qm 'Something new'
516 512 $ cd ..
517 513 $ rm -rf tempwc
518 514 $ svn co "$SVNREPOURL/branch"@10 recreated
519 515 A recreated/somethingold
520 516 Checked out revision 10.
521 517 $ echo "recreated = [svn] $SVNREPOURL/branch" >> .hgsub
522 518 $ hg ci -m addsub
523 519 $ cd recreated
524 520 $ svn up -q
525 521 $ cd ..
526 522 $ hg ci -m updatesub
527 523 $ hg up -r-2
528 524 D *recreated/somethingnew (glob)
529 525 A *recreated/somethingold (glob)
530 526 Checked out revision 10.
531 527 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
532 528 (leaving bookmark other)
533 529 $ test -f recreated/somethingold
534 530
535 531 Test archive
536 532
537 533 $ hg archive -S ../archive-all --debug --config progress.debug=true
538 534 archiving: 0/2 files (0.00%)
539 535 archiving: .hgsub 1/2 files (50.00%)
540 536 archiving: .hgsubstate 2/2 files (100.00%)
541 537 archiving (obstruct): 0/1 files (0.00%)
542 538 archiving (obstruct): 1/1 files (100.00%)
543 539 archiving (recreated): 0/1 files (0.00%)
544 540 archiving (recreated): 1/1 files (100.00%)
545 541 archiving (s): 0/2 files (0.00%)
546 542 archiving (s): 1/2 files (50.00%)
547 543 archiving (s): 2/2 files (100.00%)
548 544
549 545 $ hg archive -S ../archive-exclude --debug --config progress.debug=true -X **old
550 546 archiving: 0/2 files (0.00%)
551 547 archiving: .hgsub 1/2 files (50.00%)
552 548 archiving: .hgsubstate 2/2 files (100.00%)
553 549 archiving (obstruct): 0/1 files (0.00%)
554 550 archiving (obstruct): 1/1 files (100.00%)
555 551 archiving (recreated): 0 files
556 552 archiving (s): 0/2 files (0.00%)
557 553 archiving (s): 1/2 files (50.00%)
558 554 archiving (s): 2/2 files (100.00%)
559 555 $ find ../archive-exclude | sort
560 556 ../archive-exclude
561 557 ../archive-exclude/.hg_archival.txt
562 558 ../archive-exclude/.hgsub
563 559 ../archive-exclude/.hgsubstate
564 560 ../archive-exclude/obstruct
565 561 ../archive-exclude/obstruct/other
566 562 ../archive-exclude/s
567 563 ../archive-exclude/s/alpha
568 564 ../archive-exclude/s/dir
569 565 ../archive-exclude/s/dir/epsilon.py
570 566
571 567 Test forgetting files, not implemented in svn subrepo, used to
572 568 traceback
573 569
574 570 $ hg forget 'notafile*'
575 571 notafile*: $ENOENT$
576 572 [1]
577 573
578 574 Test a subrepo referencing a just moved svn path. Last commit rev will
579 575 be different from the revision, and the path will be different as
580 576 well.
581 577
582 578 $ cd "$WCROOT"
583 579 $ svn up > /dev/null
584 580 $ mkdir trunk/subdir branches
585 581 $ echo a > trunk/subdir/a
586 582 $ svn add trunk/subdir branches
587 583 A trunk/subdir
588 584 A trunk/subdir/a
589 585 A branches
590 586 $ svn ci -qm addsubdir
591 587 $ svn cp -qm branchtrunk $SVNREPOURL/trunk $SVNREPOURL/branches/somebranch
592 588 $ cd ..
593 589
594 590 $ hg init repo2
595 591 $ cd repo2
596 592 $ svn co $SVNREPOURL/branches/somebranch/subdir
597 593 A subdir/a
598 594 Checked out revision 15.
599 595 $ echo "subdir = [svn] $SVNREPOURL/branches/somebranch/subdir" > .hgsub
600 596 $ hg add .hgsub
601 597 $ hg ci -m addsub
602 598 $ hg up null
603 599 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
604 600 $ hg up
605 601 A *subdir/a (glob)
606 602 Checked out revision 15.
607 603 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
608 604 $ cd ..
609 605
610 606 Test sanitizing ".hg/hgrc" in subrepo
611 607
612 608 $ cd sub/t
613 609 $ hg update -q -C tip
614 610 $ cd s
615 611 $ mkdir .hg
616 612 $ echo '.hg/hgrc in svn repo' > .hg/hgrc
617 613 $ mkdir -p sub/.hg
618 614 $ echo 'sub/.hg/hgrc in svn repo' > sub/.hg/hgrc
619 615 $ svn add .hg sub
620 616 A .hg
621 617 A .hg/hgrc
622 618 A sub
623 619 A sub/.hg
624 620 A sub/.hg/hgrc
625 621 $ svn ci -qm 'add .hg/hgrc to be sanitized at hg update'
626 622 $ svn up -q
627 623 $ cd ..
628 624 $ hg commit -S -m 'commit with svn revision including .hg/hgrc'
629 625 $ grep ' s$' .hgsubstate
630 626 16 s
631 627 $ cd ..
632 628
633 629 $ hg -R tc pull -u -q 2>&1 | sort
634 630 warning: removing potentially hostile 'hgrc' in '$TESTTMP/sub/tc/s/.hg'
635 631 warning: removing potentially hostile 'hgrc' in '$TESTTMP/sub/tc/s/sub/.hg'
636 632 $ cd tc
637 633 $ grep ' s$' .hgsubstate
638 634 16 s
639 635 $ test -f s/.hg/hgrc
640 636 [1]
641 637 $ test -f s/sub/.hg/hgrc
642 638 [1]
643 639
644 640 Test that sanitizing is omitted in meta data area:
645 641
646 642 $ mkdir s/.svn/.hg
647 643 $ echo '.hg/hgrc in svn metadata area' > s/.svn/.hg/hgrc
648 644 $ hg update -q -C '.^1'
649 645
650 646 $ cd ../..
651 647
652 648 SEC: test for ssh exploit
653 649
654 650 $ hg init ssh-vuln
655 651 $ cd ssh-vuln
656 652 $ echo "s = [svn]$SVNREPOURL/src" >> .hgsub
657 653 $ svn co --quiet "$SVNREPOURL"/src s
658 654 $ hg add .hgsub
659 655 $ hg ci -m1
660 656 $ echo "s = [svn]svn+ssh://-oProxyCommand=touch%20owned%20nested" > .hgsub
661 657 $ hg ci -m2
662 658 $ cd ..
663 659 $ hg clone ssh-vuln ssh-vuln-clone
664 660 updating to branch default
665 661 abort: potentially unsafe url: 'svn+ssh://-oProxyCommand=touch owned nested' (in subrepository "s")
666 662 [255]
667 663
668 664 also check that a percent encoded '-' (%2D) doesn't work
669 665
670 666 $ cd ssh-vuln
671 667 $ echo "s = [svn]svn+ssh://%2DoProxyCommand=touch%20owned%20nested" > .hgsub
672 668 $ hg ci -m3
673 669 $ cd ..
674 670 $ rm -r ssh-vuln-clone
675 671 $ hg clone ssh-vuln ssh-vuln-clone
676 672 updating to branch default
677 673 abort: potentially unsafe url: 'svn+ssh://-oProxyCommand=touch owned nested' (in subrepository "s")
678 674 [255]
679 675
680 676 also check that hiding the attack in the username doesn't work:
681 677
682 678 $ cd ssh-vuln
683 679 $ echo "s = [svn]svn+ssh://%2DoProxyCommand=touch%20owned%20foo@example.com/nested" > .hgsub
684 680 $ hg ci -m3
685 681 $ cd ..
686 682 $ rm -r ssh-vuln-clone
687 683 $ hg clone ssh-vuln ssh-vuln-clone
688 684 updating to branch default
689 685 abort: potentially unsafe url: 'svn+ssh://-oProxyCommand=touch owned foo@example.com/nested' (in subrepository "s")
690 686 [255]
General Comments 0
You need to be logged in to leave comments. Login now