comparison tests/test_push_command.py @ 1570:d55c9d0ba350

tests: use scmutils.revsymbol instead of repo.__getitem__ for non-integers
author Paul Morelle <paul.morelle@octobus.net>
date Fri, 25 May 2018 11:52:03 +0200
parents cff81f35b31e
children 2b342625a92a
comparison
equal deleted inserted replaced
1569:4afe8d7e4602 1570:d55c9d0ba350
21 from hgsubversion import util 21 from hgsubversion import util
22 from hgsubversion import compathacks 22 from hgsubversion import compathacks
23 23
24 import time 24 import time
25 25
26 revsymbol = test_util.revsymbol
27
26 28
27 class PushTests(test_util.TestBase): 29 class PushTests(test_util.TestBase):
28 obsolete_mode_tests = True 30 obsolete_mode_tests = True
29 31
30 def setUp(self): 32 def setUp(self):
42 islink=False, 44 islink=False,
43 isexec=False, 45 isexec=False,
44 copied=False) 46 copied=False)
45 raise IOError() 47 raise IOError()
46 ctx = context.memctx(repo, 48 ctx = context.memctx(repo,
47 (repo['default'].node(), node.nullid), 49 (revsymbol(repo, 'default').node(), node.nullid),
48 'automated test', 50 'automated test',
49 [], 51 [],
50 file_callback, 52 file_callback,
51 'an_author', 53 'an_author',
52 '2008-10-07 20:59:48 -0500', 54 '2008-10-07 20:59:48 -0500',
53 {'branch': 'default', }) 55 {'branch': 'default', })
54 new_hash = repo.commitctx(ctx) 56 new_hash = repo.commitctx(ctx)
55 hg.update(repo, repo['tip'].node()) 57 hg.update(repo, revsymbol(repo, 'tip').node())
56 old_tip = repo['tip'].node() 58 old_tip = revsymbol(repo, 'tip').node()
57 self.pushrevisions() 59 self.pushrevisions()
58 tip = self.repo['tip'] 60 tip = revsymbol(self.repo, 'tip')
59 self.assertEqual(tip.node(), old_tip) 61 self.assertEqual(tip.node(), old_tip)
60 62
61 def test_push_add_of_added_upstream_gives_sane_error(self): 63 def test_push_add_of_added_upstream_gives_sane_error(self):
62 repo = self.repo 64 repo = self.repo
63 def file_callback(repo, memctx, path): 65 def file_callback(repo, memctx, path):
68 data='foo', 70 data='foo',
69 islink=False, 71 islink=False,
70 isexec=False, 72 isexec=False,
71 copied=False) 73 copied=False)
72 raise IOError() 74 raise IOError()
73 p1 = repo['default'].node() 75 p1 = revsymbol(repo, 'default').node()
74 ctx = context.memctx(repo, 76 ctx = context.memctx(repo,
75 (p1, node.nullid), 77 (p1, node.nullid),
76 'automated test', 78 'automated test',
77 ['adding_file'], 79 ['adding_file'],
78 file_callback, 80 file_callback,
79 'an_author', 81 'an_author',
80 '2008-10-07 20:59:48 -0500', 82 '2008-10-07 20:59:48 -0500',
81 {'branch': 'default', }) 83 {'branch': 'default', })
82 new_hash = repo.commitctx(ctx) 84 new_hash = repo.commitctx(ctx)
83 hg.update(repo, repo['tip'].node()) 85 hg.update(repo, revsymbol(repo, 'tip').node())
84 old_tip = repo['tip'].node() 86 old_tip = revsymbol(repo, 'tip').node()
85 self.pushrevisions() 87 self.pushrevisions()
86 tip = self.repo['tip'] 88 tip = revsymbol(self.repo, 'tip')
87 self.assertNotEqual(tip.node(), old_tip) 89 self.assertNotEqual(tip.node(), old_tip)
88 90
89 # This node adds the same file as the first one we added, and 91 # This node adds the same file as the first one we added, and
90 # will be refused by the server for adding a file that already 92 # will be refused by the server for adding a file that already
91 # exists. We should respond with an error suggesting the user 93 # exists. We should respond with an error suggesting the user
97 file_callback, 99 file_callback,
98 'an_author', 100 'an_author',
99 '2008-10-07 20:59:48 -0500', 101 '2008-10-07 20:59:48 -0500',
100 {'branch': 'default', }) 102 {'branch': 'default', })
101 new_hash = repo.commitctx(ctx) 103 new_hash = repo.commitctx(ctx)
102 hg.update(repo, repo['tip'].node()) 104 hg.update(repo, revsymbol(repo, 'tip').node())
103 old_tip = repo['tip'].node() 105 old_tip = revsymbol(repo, 'tip').node()
104 try: 106 try:
105 self.pushrevisions() 107 self.pushrevisions()
106 except hgerror.Abort, e: 108 except hgerror.Abort, e:
107 assert "pull again and rebase" in str(e) 109 assert "pull again and rebase" in str(e)
108 tip = self.repo['tip'] 110 tip = revsymbol(self.repo, 'tip')
109 self.assertEqual(tip.node(), old_tip) 111 self.assertEqual(tip.node(), old_tip)
110 112
111 def test_cant_push_with_changes(self): 113 def test_cant_push_with_changes(self):
112 repo = self.repo 114 repo = self.repo
113 def file_callback(repo, memctx, path): 115 def file_callback(repo, memctx, path):
117 data='foo', 119 data='foo',
118 islink=False, 120 islink=False,
119 isexec=False, 121 isexec=False,
120 copied=False) 122 copied=False)
121 ctx = context.memctx(repo, 123 ctx = context.memctx(repo,
122 (repo['default'].node(), node.nullid), 124 (revsymbol(repo, 'default').node(), node.nullid),
123 'automated test', 125 'automated test',
124 ['adding_file'], 126 ['adding_file'],
125 file_callback, 127 file_callback,
126 'an_author', 128 'an_author',
127 '2008-10-07 20:59:48 -0500', 129 '2008-10-07 20:59:48 -0500',
128 {'branch': 'default', }) 130 {'branch': 'default', })
129 new_hash = repo.commitctx(ctx) 131 new_hash = repo.commitctx(ctx)
130 hg.update(repo, repo['tip'].node()) 132 hg.update(repo, revsymbol(repo, 'tip').node())
131 # Touch an existing file 133 # Touch an existing file
132 repo.wwrite('beta', 'something else', '') 134 repo.wwrite('beta', 'something else', '')
133 try: 135 try:
134 self.pushrevisions() 136 self.pushrevisions()
135 except hgerror.Abort: 137 except hgerror.Abort:
136 pass 138 pass
137 tip = self.repo['tip'] 139 tip = revsymbol(self.repo, 'tip')
138 self.assertEqual(new_hash, tip.node()) 140 self.assertEqual(new_hash, tip.node())
139 141
140 def internal_push_over_svnserve(self, subdir='', commit=True): 142 def internal_push_over_svnserve(self, subdir='', commit=True):
141 repo_path = self.load_svndump('simple_branch.svndump') 143 repo_path = self.load_svndump('simple_branch.svndump')
142 open(os.path.join(repo_path, 'conf', 'svnserve.conf'), 144 open(os.path.join(repo_path, 'conf', 'svnserve.conf'),
191 commands.clone(self.ui(), 193 commands.clone(self.ui(),
192 urlfmt % (self.host, self.port, subdir), 194 urlfmt % (self.host, self.port, subdir),
193 self.wc_path, noupdate=True) 195 self.wc_path, noupdate=True)
194 196
195 repo = self.repo 197 repo = self.repo
196 old_tip = repo['tip'].node() 198 old_tip = revsymbol(repo, 'tip').node()
197 expected_parent = repo['default'].node() 199 expected_parent = revsymbol(repo, 'default').node()
198 def file_callback(repo, memctx, path): 200 def file_callback(repo, memctx, path):
199 if path == 'adding_file': 201 if path == 'adding_file':
200 return compathacks.makememfilectx(repo, 202 return compathacks.makememfilectx(repo,
201 memctx=memctx, 203 memctx=memctx,
202 path=path, 204 path=path,
204 islink=False, 206 islink=False,
205 isexec=False, 207 isexec=False,
206 copied=False) 208 copied=False)
207 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 209 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
208 ctx = context.memctx(repo, 210 ctx = context.memctx(repo,
209 parents=(repo['default'].node(), node.nullid), 211 parents=(revsymbol(repo, 'default').node(), node.nullid),
210 text='automated test', 212 text='automated test',
211 files=['adding_file'], 213 files=['adding_file'],
212 filectxfn=file_callback, 214 filectxfn=file_callback,
213 user='an_author', 215 user='an_author',
214 date='2008-10-07 20:59:48 -0500', 216 date='2008-10-07 20:59:48 -0500',
215 extra={'branch': 'default', }) 217 extra={'branch': 'default', })
216 new_hash = repo.commitctx(ctx) 218 new_hash = repo.commitctx(ctx)
217 if not commit: 219 if not commit:
218 return # some tests use this test as an extended setup. 220 return # some tests use this test as an extended setup.
219 hg.update(repo, repo['tip'].node()) 221 hg.update(repo, revsymbol(repo, 'tip').node())
220 oldauthor = repo['tip'].user() 222 oldauthor = revsymbol(repo, 'tip').user()
221 commands.push(repo.ui, repo) 223 commands.push(repo.ui, repo)
222 tip = self.repo['tip'] 224 tip = revsymbol(self.repo, 'tip')
223 self.assertNotEqual(oldauthor, tip.user()) 225 self.assertNotEqual(oldauthor, tip.user())
224 self.assertNotEqual(tip.node(), old_tip) 226 self.assertNotEqual(tip.node(), old_tip)
225 self.assertEqual(tip.parents()[0].node(), expected_parent) 227 self.assertEqual(tip.parents()[0].node(), expected_parent)
226 self.assertEqual(tip['adding_file'].data(), 'foo') 228 self.assertEqual(tip['adding_file'].data(), 'foo')
227 self.assertEqual(tip.branch(), 'default') 229 self.assertEqual(tip.branch(), 'default')
240 def test_push_over_svnserve_with_subdir(self): 242 def test_push_over_svnserve_with_subdir(self):
241 self.internal_push_over_svnserve(subdir='///branches////the_branch/////') 243 self.internal_push_over_svnserve(subdir='///branches////the_branch/////')
242 244
243 def test_push_to_default(self, commit=True): 245 def test_push_to_default(self, commit=True):
244 repo = self.repo 246 repo = self.repo
245 old_tip = repo['tip'].node() 247 old_tip = revsymbol(repo, 'tip').node()
246 expected_parent = repo['default'].node() 248 expected_parent = revsymbol(repo, 'default').node()
247 def file_callback(repo, memctx, path): 249 def file_callback(repo, memctx, path):
248 if path == 'adding_file': 250 if path == 'adding_file':
249 return compathacks.makememfilectx(repo, 251 return compathacks.makememfilectx(repo,
250 memctx=memctx, 252 memctx=memctx,
251 path=path, 253 path=path,
253 islink=False, 255 islink=False,
254 isexec=False, 256 isexec=False,
255 copied=False) 257 copied=False)
256 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 258 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
257 ctx = context.memctx(repo, 259 ctx = context.memctx(repo,
258 (repo['default'].node(), node.nullid), 260 (revsymbol(repo, 'default').node(), node.nullid),
259 'automated test', 261 'automated test',
260 ['adding_file'], 262 ['adding_file'],
261 file_callback, 263 file_callback,
262 'an_author', 264 'an_author',
263 '2008-10-07 20:59:48 -0500', 265 '2008-10-07 20:59:48 -0500',
264 {'branch': 'default', }) 266 {'branch': 'default', })
265 new_hash = repo.commitctx(ctx) 267 new_hash = repo.commitctx(ctx)
266 if not commit: 268 if not commit:
267 return # some tests use this test as an extended setup. 269 return # some tests use this test as an extended setup.
268 hg.update(repo, repo['tip'].node()) 270 hg.update(repo, revsymbol(repo, 'tip').node())
269 self.pushrevisions() 271 self.pushrevisions()
270 tip = self.repo['tip'] 272 tip = revsymbol(self.repo, 'tip')
271 self.assertNotEqual(tip.node(), old_tip) 273 self.assertNotEqual(tip.node(), old_tip)
272 self.assertEqual(node.hex(tip.parents()[0].node()), 274 self.assertEqual(node.hex(tip.parents()[0].node()),
273 node.hex(expected_parent)) 275 node.hex(expected_parent))
274 self.assertEqual(tip['adding_file'].data(), 'foo') 276 self.assertEqual(tip['adding_file'].data(), 'foo')
275 self.assertEqual(tip.branch(), 'default') 277 self.assertEqual(tip.branch(), 'default')
281 path=path, 283 path=path,
282 data=path, 284 data=path,
283 islink=False, 285 islink=False,
284 isexec=False, 286 isexec=False,
285 copied=False) 287 copied=False)
286 oldtiphash = self.repo['default'].node() 288 oldtiphash = revsymbol(self.repo, 'default').node()
287 lr = self.repo 289 lr = self.repo
288 ctx = context.memctx(lr, 290 ctx = context.memctx(lr,
289 (lr[0].node(), revlog.nullid,), 291 (lr[0].node(), revlog.nullid,),
290 'automated test', 292 'automated test',
291 ['gamma', ], 293 ['gamma', ],
304 {'branch': 'localbranch', }) 306 {'branch': 'localbranch', })
305 newhash = lr.commitctx(ctx) 307 newhash = lr.commitctx(ctx)
306 repo = self.repo 308 repo = self.repo
307 hg.update(repo, newhash) 309 hg.update(repo, newhash)
308 commands.push(repo.ui, repo) 310 commands.push(repo.ui, repo)
309 self.assertEqual(self.repo['tip'].parents()[0].parents()[0].node(), oldtiphash) 311 self.assertEqual(revsymbol(self.repo, 'tip').parents()[0].parents()[0].node(), oldtiphash)
310 self.assertEqual(self.repo['tip'].files(), ['delta', ]) 312 self.assertEqual(revsymbol(self.repo, 'tip').files(), ['delta', ])
311 self.assertEqual(sorted(self.repo['tip'].manifest().keys()), 313 self.assertEqual(sorted(revsymbol(self.repo, 'tip').manifest().keys()),
312 ['alpha', 'beta', 'delta', 'gamma']) 314 ['alpha', 'beta', 'delta', 'gamma'])
313 315
314 def test_push_two_revs(self): 316 def test_push_two_revs(self):
315 # set up some work for us 317 # set up some work for us
316 self.test_push_to_default(commit=False) 318 self.test_push_to_default(commit=False)
317 repo = self.repo 319 repo = self.repo
318 old_tip = repo['tip'].node() 320 old_tip = revsymbol(repo, 'tip').node()
319 expected_parent = repo['tip'].parents()[0].node() 321 expected_parent = revsymbol(repo, 'tip').parents()[0].node()
320 def file_callback(repo, memctx, path): 322 def file_callback(repo, memctx, path):
321 if path == 'adding_file2': 323 if path == 'adding_file2':
322 return compathacks.makememfilectx(repo, 324 return compathacks.makememfilectx(repo,
323 memctx=memctx, 325 memctx=memctx,
324 path=path, 326 path=path,
326 islink=False, 328 islink=False,
327 isexec=False, 329 isexec=False,
328 copied=False) 330 copied=False)
329 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 331 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
330 ctx = context.memctx(repo, 332 ctx = context.memctx(repo,
331 (repo['default'].node(), node.nullid), 333 (revsymbol(repo, 'default').node(), node.nullid),
332 'automated test', 334 'automated test',
333 ['adding_file2'], 335 ['adding_file2'],
334 file_callback, 336 file_callback,
335 'an_author', 337 'an_author',
336 '2008-10-07 20:59:48 -0500', 338 '2008-10-07 20:59:48 -0500',
337 {'branch': 'default', }) 339 {'branch': 'default', })
338 new_hash = repo.commitctx(ctx) 340 new_hash = repo.commitctx(ctx)
339 hg.update(repo, repo['tip'].node()) 341 hg.update(repo, revsymbol(repo, 'tip').node())
340 self.pushrevisions() 342 self.pushrevisions()
341 tip = self.repo['tip'] 343 tip = revsymbol(self.repo, 'tip')
342 self.assertNotEqual(tip.node(), old_tip) 344 self.assertNotEqual(tip.node(), old_tip)
343 self.assertNotEqual(tip.parents()[0].node(), old_tip) 345 self.assertNotEqual(tip.parents()[0].node(), old_tip)
344 self.assertEqual(tip.parents()[0].parents()[0].node(), expected_parent) 346 self.assertEqual(tip.parents()[0].parents()[0].node(), expected_parent)
345 self.assertEqual(tip['adding_file2'].data(), 'foo2') 347 self.assertEqual(tip['adding_file2'].data(), 'foo2')
346 self.assertEqual(tip['adding_file'].data(), 'foo') 348 self.assertEqual(tip['adding_file'].data(), 'foo')
363 islink=False, 365 islink=False,
364 isexec=False, 366 isexec=False,
365 copied=False) 367 copied=False)
366 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 368 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
367 ctx = context.memctx(repo, 369 ctx = context.memctx(repo,
368 (repo['the_branch'].node(), node.nullid), 370 (revsymbol(repo, 'the_branch').node(), node.nullid),
369 'automated test', 371 'automated test',
370 ['adding_file'], 372 ['adding_file'],
371 file_callback, 373 file_callback,
372 'an_author', 374 'an_author',
373 '2008-10-07 20:59:48 -0500', 375 '2008-10-07 20:59:48 -0500',
374 {'branch': 'the_branch', }) 376 {'branch': 'the_branch', })
375 new_hash = repo.commitctx(ctx) 377 new_hash = repo.commitctx(ctx)
376 hg.update(repo, repo['tip'].node()) 378 hg.update(repo, revsymbol(repo, 'tip').node())
377 if push: 379 if push:
378 self.pushrevisions() 380 self.pushrevisions()
379 tip = self.repo['tip'] 381 tip = revsymbol(self.repo, 'tip')
380 self.assertNotEqual(tip.node(), new_hash) 382 self.assertNotEqual(tip.node(), new_hash)
381 self.assertEqual(tip['adding_file'].data(), 'foo') 383 self.assertEqual(tip['adding_file'].data(), 'foo')
382 self.assertEqual(tip.branch(), 'the_branch') 384 self.assertEqual(tip.branch(), 'the_branch')
383 385
384 def test_push_to_non_tip(self): 386 def test_push_to_non_tip(self):
406 svncommands.rebuildmeta(u, 408 svncommands.rebuildmeta(u,
407 self.repo, 409 self.repo,
408 args=[test_util.fileurl(self.repo_path)]) 410 args=[test_util.fileurl(self.repo_path)])
409 411
410 412
411 hg.update(self.repo, self.repo['tip'].node()) 413 hg.update(self.repo, revsymbol(self.repo, 'tip').node())
412 oldnode = self.repo['tip'].hex() 414 oldnode = revsymbol(self.repo, 'tip').hex()
413 self.pushrevisions(expected_extra_back=1) 415 self.pushrevisions(expected_extra_back=1)
414 self.assertNotEqual(oldnode, self.repo['tip'].hex(), 'Revision was not pushed.') 416 self.assertNotEqual(oldnode, revsymbol(self.repo, 'tip').hex(), 'Revision was not pushed.')
415 417
416 def test_delete_file(self): 418 def test_delete_file(self):
417 repo = self.repo 419 repo = self.repo
418 def file_callback(repo, memctx, path): 420 def file_callback(repo, memctx, path):
419 return compathacks.filectxfn_deleted(memctx, path) 421 return compathacks.filectxfn_deleted(memctx, path)
420 old_files = set(repo['default'].manifest().keys()) 422 old_files = set(revsymbol(repo, 'default').manifest().keys())
421 ctx = context.memctx(repo, 423 ctx = context.memctx(repo,
422 (repo['default'].node(), node.nullid), 424 (revsymbol(repo, 'default').node(), node.nullid),
423 'automated test', 425 'automated test',
424 ['alpha'], 426 ['alpha'],
425 file_callback, 427 file_callback,
426 'an author', 428 'an author',
427 '2008-10-29 21:26:00 -0500', 429 '2008-10-29 21:26:00 -0500',
428 {'branch': 'default', }) 430 {'branch': 'default', })
429 new_hash = repo.commitctx(ctx) 431 new_hash = repo.commitctx(ctx)
430 hg.update(repo, repo['tip'].node()) 432 hg.update(repo, revsymbol(repo, 'tip').node())
431 self.pushrevisions() 433 self.pushrevisions()
432 tip = self.repo['tip'] 434 tip = revsymbol(self.repo, 'tip')
433 self.assertEqual(old_files, 435 self.assertEqual(old_files,
434 set(tip.manifest().keys() + ['alpha'])) 436 set(tip.manifest().keys() + ['alpha']))
435 self.assert_('alpha' not in tip.manifest()) 437 self.assert_('alpha' not in tip.manifest())
436 438
437 def test_push_executable_file(self): 439 def test_push_executable_file(self):
446 islink=False, 448 islink=False,
447 isexec=True, 449 isexec=True,
448 copied=False) 450 copied=False)
449 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 451 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
450 ctx = context.memctx(repo, 452 ctx = context.memctx(repo,
451 (repo['tip'].node(), node.nullid), 453 (revsymbol(repo, 'tip').node(), node.nullid),
452 'message', 454 'message',
453 ['gamma', ], 455 ['gamma', ],
454 file_callback, 456 file_callback,
455 'author', 457 'author',
456 '2008-10-29 21:26:00 -0500', 458 '2008-10-29 21:26:00 -0500',
457 {'branch': 'default', }) 459 {'branch': 'default', })
458 new_hash = repo.commitctx(ctx) 460 new_hash = repo.commitctx(ctx)
459 hg.clean(repo, repo['tip'].node()) 461 hg.clean(repo, revsymbol(repo, 'tip').node())
460 self.pushrevisions() 462 self.pushrevisions()
461 tip = self.repo['tip'] 463 tip = revsymbol(self.repo, 'tip')
462 self.assertNotEqual(tip.node(), new_hash) 464 self.assertNotEqual(tip.node(), new_hash)
463 self.assert_('@' in self.repo['tip'].user()) 465 self.assert_('@' in revsymbol(self.repo, 'tip').user())
464 self.assertEqual(tip['gamma'].flags(), 'x') 466 self.assertEqual(tip['gamma'].flags(), 'x')
465 self.assertEqual(tip['gamma'].data(), 'foo') 467 self.assertEqual(tip['gamma'].data(), 'foo')
466 self.assertEqual(sorted([x for x in tip.manifest().keys() if 'x' not in 468 self.assertEqual(sorted([x for x in tip.manifest().keys() if 'x' not in
467 tip[x].flags()]), 469 tip[x].flags()]),
468 ['adding_file', 'alpha', 'beta', ]) 470 ['adding_file', 'alpha', 'beta', ])
479 islink=True, 481 islink=True,
480 isexec=False, 482 isexec=False,
481 copied=False) 483 copied=False)
482 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 484 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
483 ctx = context.memctx(repo, 485 ctx = context.memctx(repo,
484 (repo['tip'].node(), node.nullid), 486 (revsymbol(repo, 'tip').node(), node.nullid),
485 'message', 487 'message',
486 ['gamma', ], 488 ['gamma', ],
487 file_callback, 489 file_callback,
488 'author', 490 'author',
489 '2008-10-29 21:26:00 -0500', 491 '2008-10-29 21:26:00 -0500',
490 {'branch': 'default', }) 492 {'branch': 'default', })
491 new_hash = repo.commitctx(ctx) 493 new_hash = repo.commitctx(ctx)
492 hg.update(repo, repo['tip'].node()) 494 hg.update(repo, revsymbol(repo, 'tip').node())
493 self.pushrevisions() 495 self.pushrevisions()
494 # grab a new repo instance (self.repo is an @property functions) 496 # grab a new repo instance (self.repo is an @property functions)
495 repo = self.repo 497 repo = self.repo
496 tip = repo['tip'] 498 tip = revsymbol(repo, 'tip')
497 self.assertNotEqual(tip.node(), new_hash) 499 self.assertNotEqual(tip.node(), new_hash)
498 self.assertEqual(tip['gamma'].flags(), 'l') 500 self.assertEqual(tip['gamma'].flags(), 'l')
499 self.assertEqual(tip['gamma'].data(), 'foo') 501 self.assertEqual(tip['gamma'].data(), 'foo')
500 self.assertEqual(sorted([x for x in tip.manifest().keys() if 'l' not in 502 self.assertEqual(sorted([x for x in tip.manifest().keys() if 'l' not in
501 tip[x].flags()]), 503 tip[x].flags()]),
511 isexec=False, 513 isexec=False,
512 copied=False) 514 copied=False)
513 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 515 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
514 516
515 ctx = context.memctx(repo, 517 ctx = context.memctx(repo,
516 (repo['tip'].node(), node.nullid), 518 (revsymbol(repo, 'tip').node(), node.nullid),
517 'message', 519 'message',
518 ['gamma', ], 520 ['gamma', ],
519 file_callback2, 521 file_callback2,
520 'author', 522 'author',
521 '2014-08-08 20:11:41 -0700', 523 '2014-08-08 20:11:41 -0700',
522 {'branch': 'default', }) 524 {'branch': 'default', })
523 repo.commitctx(ctx) 525 repo.commitctx(ctx)
524 hg.update(repo, repo['tip'].node()) 526 hg.update(repo, revsymbol(repo, 'tip').node())
525 self.pushrevisions() 527 self.pushrevisions()
526 # grab a new repo instance (self.repo is an @property functions) 528 # grab a new repo instance (self.repo is an @property functions)
527 repo = self.repo 529 repo = self.repo
528 tip = repo['tip'] 530 tip = revsymbol(repo, 'tip')
529 self.assertEqual(tip['gamma'].flags(), 'l') 531 self.assertEqual(tip['gamma'].flags(), 'l')
530 self.assertEqual(tip['gamma'].data(), 'a'*129) 532 self.assertEqual(tip['gamma'].data(), 'a'*129)
531 533
532 def file_callback3(repo, memctx, path): 534 def file_callback3(repo, memctx, path):
533 if path == 'gamma': 535 if path == 'gamma':
539 isexec=False, 541 isexec=False,
540 copied=False) 542 copied=False)
541 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 543 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
542 544
543 ctx = context.memctx(repo, 545 ctx = context.memctx(repo,
544 (repo['tip'].node(), node.nullid), 546 (revsymbol(repo, 'tip').node(), node.nullid),
545 'message', 547 'message',
546 ['gamma', ], 548 ['gamma', ],
547 file_callback3, 549 file_callback3,
548 'author', 550 'author',
549 '2014-08-08 20:16:25 -0700', 551 '2014-08-08 20:16:25 -0700',
550 {'branch': 'default', }) 552 {'branch': 'default', })
551 repo.commitctx(ctx) 553 repo.commitctx(ctx)
552 hg.update(repo, repo['tip'].node()) 554 hg.update(repo, revsymbol(repo, 'tip').node())
553 self.pushrevisions() 555 self.pushrevisions()
554 repo = self.repo 556 repo = self.repo
555 tip = repo['tip'] 557 tip = revsymbol(repo, 'tip')
556 self.assertEqual(tip['gamma'].flags(), 'l') 558 self.assertEqual(tip['gamma'].flags(), 'l')
557 self.assertEqual(tip['gamma'].data(), 'a' * 64 + 'b' * 65) 559 self.assertEqual(tip['gamma'].data(), 'a' * 64 + 'b' * 65)
558 560
559 561
560 def test_push_existing_file_newly_symlink(self): 562 def test_push_existing_file_newly_symlink(self):
573 data='foo', 575 data='foo',
574 islink=link, 576 islink=link,
575 isexec=execute, 577 isexec=execute,
576 copied=False) 578 copied=False)
577 ctx = context.memctx(repo, 579 ctx = context.memctx(repo,
578 (repo['default'].node(), node.nullid), 580 (revsymbol(repo, 'default').node(), node.nullid),
579 'message', 581 'message',
580 ['alpha', ], 582 ['alpha', ],
581 file_callback, 583 file_callback,
582 'author', 584 'author',
583 '2008-1-1 00:00:00 -0500', 585 '2008-1-1 00:00:00 -0500',
584 {'branch': 'default', }) 586 {'branch': 'default', })
585 new_hash = repo.commitctx(ctx) 587 new_hash = repo.commitctx(ctx)
586 hg.update(repo, repo['tip'].node()) 588 hg.update(repo, revsymbol(repo, 'tip').node())
587 self.pushrevisions() 589 self.pushrevisions()
588 tip = self.repo['tip'] 590 tip = revsymbol(self.repo, 'tip')
589 self.assertNotEqual(tip.node(), new_hash) 591 self.assertNotEqual(tip.node(), new_hash)
590 self.assertEqual(tip['alpha'].data(), 'foo') 592 self.assertEqual(tip['alpha'].data(), 'foo')
591 self.assertEqual(tip.parents()[0]['alpha'].flags(), '') 593 self.assertEqual(tip.parents()[0]['alpha'].flags(), '')
592 self.assertEqual(tip['alpha'].flags(), expected_flags) 594 self.assertEqual(tip['alpha'].flags(), expected_flags)
593 # while we're here, double check pushing an already-executable file 595 # while we're here, double check pushing an already-executable file
600 data='bar', 602 data='bar',
601 islink=link, 603 islink=link,
602 isexec=execute, 604 isexec=execute,
603 copied=False) 605 copied=False)
604 ctx = context.memctx(repo, 606 ctx = context.memctx(repo,
605 (repo['default'].node(), node.nullid), 607 (revsymbol(repo, 'default').node(), node.nullid),
606 'mutate already-special file alpha', 608 'mutate already-special file alpha',
607 ['alpha', ], 609 ['alpha', ],
608 file_callback2, 610 file_callback2,
609 'author', 611 'author',
610 '2008-1-1 00:00:00 -0500', 612 '2008-1-1 00:00:00 -0500',
611 {'branch': 'default', }) 613 {'branch': 'default', })
612 new_hash = repo.commitctx(ctx) 614 new_hash = repo.commitctx(ctx)
613 hg.update(repo, repo['tip'].node()) 615 hg.update(repo, revsymbol(repo, 'tip').node())
614 self.pushrevisions() 616 self.pushrevisions()
615 tip = self.repo['tip'] 617 tip = revsymbol(self.repo, 'tip')
616 self.assertNotEqual(tip.node(), new_hash) 618 self.assertNotEqual(tip.node(), new_hash)
617 self.assertEqual(tip['alpha'].data(), 'bar') 619 self.assertEqual(tip['alpha'].data(), 'bar')
618 self.assertEqual(tip.parents()[0]['alpha'].flags(), expected_flags) 620 self.assertEqual(tip.parents()[0]['alpha'].flags(), expected_flags)
619 self.assertEqual(tip['alpha'].flags(), expected_flags) 621 self.assertEqual(tip['alpha'].flags(), expected_flags)
620 # now test removing the property entirely 622 # now test removing the property entirely
626 data='bar', 628 data='bar',
627 islink=False, 629 islink=False,
628 isexec=False, 630 isexec=False,
629 copied=False) 631 copied=False)
630 ctx = context.memctx(repo, 632 ctx = context.memctx(repo,
631 (repo['default'].node(), node.nullid), 633 (revsymbol(repo, 'default').node(), node.nullid),
632 'convert alpha back to regular file', 634 'convert alpha back to regular file',
633 ['alpha', ], 635 ['alpha', ],
634 file_callback3, 636 file_callback3,
635 'author', 637 'author',
636 '2008-01-01 00:00:00 -0500', 638 '2008-01-01 00:00:00 -0500',
637 {'branch': 'default', }) 639 {'branch': 'default', })
638 new_hash = repo.commitctx(ctx) 640 new_hash = repo.commitctx(ctx)
639 hg.update(repo, repo['tip'].node()) 641 hg.update(repo, revsymbol(repo, 'tip').node())
640 self.pushrevisions() 642 self.pushrevisions()
641 tip = self.repo['tip'] 643 tip = revsymbol(self.repo, 'tip')
642 self.assertNotEqual(tip.node(), new_hash) 644 self.assertNotEqual(tip.node(), new_hash)
643 self.assertEqual(tip['alpha'].data(), 'bar') 645 self.assertEqual(tip['alpha'].data(), 'bar')
644 self.assertEqual(tip.parents()[0]['alpha'].flags(), expected_flags) 646 self.assertEqual(tip.parents()[0]['alpha'].flags(), expected_flags)
645 self.assertEqual(tip['alpha'].flags(), '') 647 self.assertEqual(tip['alpha'].flags(), '')
646 648
647 def test_push_outdated_base_text(self): 649 def test_push_outdated_base_text(self):
648 self.test_push_two_revs() 650 self.test_push_two_revs()
649 changes = [('adding_file', 'adding_file', 'different_content',), 651 changes = [('adding_file', 'adding_file', 'different_content',),
650 ] 652 ]
651 par = self.repo['tip'].rev() 653 par = revsymbol(self.repo, 'tip').rev()
652 self.commitchanges(changes, parent=par) 654 self.commitchanges(changes, parent=par)
653 self.pushrevisions() 655 self.pushrevisions()
654 changes = [('adding_file', 'adding_file', 656 changes = [('adding_file', 'adding_file',
655 'even_more different_content',), 657 'even_more different_content',),
656 ] 658 ]
673 # used to fail because hg internal encoding was being changed during 675 # used to fail because hg internal encoding was being changed during
674 # the interactions with subversion, *and during the rebase*, which 676 # the interactions with subversion, *and during the rebase*, which
675 # confused the dirstate and made it believe the file was deleted. 677 # confused the dirstate and made it believe the file was deleted.
676 fn = 'pi\xc3\xa8ce/test' 678 fn = 'pi\xc3\xa8ce/test'
677 changes = [(fn, fn, 'a')] 679 changes = [(fn, fn, 'a')]
678 par = self.repo['tip'].rev() 680 par = revsymbol(self.repo, 'tip').rev()
679 self.commitchanges(changes, parent=par) 681 self.commitchanges(changes, parent=par)
680 self.pushrevisions() 682 self.pushrevisions()
681 683
682 def test_push_emptying_changeset(self): 684 def test_push_emptying_changeset(self):
683 r = self.repo['tip'] 685 r = revsymbol(self.repo, 'tip')
684 changes = [ 686 changes = [
685 ('alpha', None, None), 687 ('alpha', None, None),
686 ('beta', None, None), 688 ('beta', None, None),
687 ] 689 ]
688 parent = self.repo['tip'].rev() 690 parent = revsymbol(self.repo, 'tip').rev()
689 self.commitchanges(changes, parent=parent) 691 self.commitchanges(changes, parent=parent)
690 self.pushrevisions() 692 self.pushrevisions()
691 self.assertEqual(len(self.repo['tip'].manifest()), 0) 693 self.assertEqual(len(revsymbol(self.repo, 'tip').manifest()), 0)
692 694
693 # Try to re-add a file after emptying the branch 695 # Try to re-add a file after emptying the branch
694 changes = [ 696 changes = [
695 ('alpha', 'alpha', 'alpha'), 697 ('alpha', 'alpha', 'alpha'),
696 ] 698 ]
697 self.commitchanges(changes, parent=self.repo['tip'].rev()) 699 self.commitchanges(changes, parent=revsymbol(self.repo, 'tip').rev())
698 self.pushrevisions() 700 self.pushrevisions()
699 self.assertEqual(['alpha'], list(self.repo['tip'].manifest())) 701 self.assertEqual(['alpha'], list(revsymbol(self.repo, 'tip').manifest()))
700 702
701 def test_push_without_pushing_children(self): 703 def test_push_without_pushing_children(self):
702 ''' 704 '''
703 Verify that a push of a nontip node, keeps the tip child 705 Verify that a push of a nontip node, keeps the tip child
704 on top of the pushed commit. 706 on top of the pushed commit.
705 ''' 707 '''
706 708
707 oldlen = test_util.repolen(self.repo) 709 oldlen = test_util.repolen(self.repo)
708 oldtiphash = self.repo['default'].node() 710 oldtiphash = revsymbol(self.repo, 'default').node()
709 711
710 changes = [('gamma', 'gamma', 'sometext')] 712 changes = [('gamma', 'gamma', 'sometext')]
711 newhash1 = self.commitchanges(changes) 713 newhash1 = self.commitchanges(changes)
712 714
713 changes = [('delta', 'delta', 'sometext')] 715 changes = [('delta', 'delta', 'sometext')]
718 hg.update(repo, newhash1) 720 hg.update(repo, newhash1)
719 commands.push(repo.ui, repo) 721 commands.push(repo.ui, repo)
720 self.assertEqual(test_util.repolen(self.repo), oldlen + 2) 722 self.assertEqual(test_util.repolen(self.repo), oldlen + 2)
721 723
722 # verify that the first commit is pushed, and the second is not 724 # verify that the first commit is pushed, and the second is not
723 commit2 = self.repo['tip'] 725 commit2 = revsymbol(self.repo, 'tip')
724 self.assertEqual(commit2.files(), ['delta', ]) 726 self.assertEqual(commit2.files(), ['delta', ])
725 self.assertEqual(util.getsvnrev(commit2), None) 727 self.assertEqual(util.getsvnrev(commit2), None)
726 commit1 = commit2.parents()[0] 728 commit1 = commit2.parents()[0]
727 self.assertEqual(commit1.files(), ['gamma', ]) 729 self.assertEqual(commit1.files(), ['gamma', ])
728 prefix = 'svn:' + self.repo.svnmeta().uuid 730 prefix = 'svn:' + self.repo.svnmeta().uuid
734 Push performs a rebase if two commits touch the same file. 736 Push performs a rebase if two commits touch the same file.
735 This test verifies that code path works. 737 This test verifies that code path works.
736 ''' 738 '''
737 739
738 oldlen = test_util.repolen(self.repo) 740 oldlen = test_util.repolen(self.repo)
739 oldtiphash = self.repo['default'].node() 741 oldtiphash = revsymbol(self.repo, 'default').node()
740 742
741 changes = [('gamma', 'gamma', 'sometext')] 743 changes = [('gamma', 'gamma', 'sometext')]
742 newhash = self.commitchanges(changes) 744 newhash = self.commitchanges(changes)
743 changes = [('gamma', 'gamma', 'sometext\n moretext'), 745 changes = [('gamma', 'gamma', 'sometext\n moretext'),
744 ('delta', 'delta', 'sometext\n moretext'), 746 ('delta', 'delta', 'sometext\n moretext'),
749 hg.update(repo, newhash) 751 hg.update(repo, newhash)
750 commands.push(repo.ui, repo) 752 commands.push(repo.ui, repo)
751 self.assertEqual(test_util.repolen(self.repo), oldlen + 2) 753 self.assertEqual(test_util.repolen(self.repo), oldlen + 2)
752 754
753 # verify that both commits are pushed 755 # verify that both commits are pushed
754 commit1 = self.repo['tip'] 756 commit1 = revsymbol(self.repo, 'tip')
755 self.assertEqual(commit1.files(), ['delta', 'gamma']) 757 self.assertEqual(commit1.files(), ['delta', 'gamma'])
756 758
757 prefix = 'svn:' + self.repo.svnmeta().uuid 759 prefix = 'svn:' + self.repo.svnmeta().uuid
758 self.assertEqual(util.getsvnrev(commit1), 760 self.assertEqual(util.getsvnrev(commit1),
759 prefix + '/branches/the_branch@6') 761 prefix + '/branches/the_branch@6')
762 self.assertEqual(util.getsvnrev(commit2), 764 self.assertEqual(util.getsvnrev(commit2),
763 prefix + '/branches/the_branch@5') 765 prefix + '/branches/the_branch@5')
764 766
765 def test_push_in_subdir(self, commit=True): 767 def test_push_in_subdir(self, commit=True):
766 repo = self.repo 768 repo = self.repo
767 old_tip = repo['tip'].node() 769 old_tip = revsymbol(repo, 'tip').node()
768 def file_callback(repo, memctx, path): 770 def file_callback(repo, memctx, path):
769 if path == 'adding_file' or path == 'newdir/new_file': 771 if path == 'adding_file' or path == 'newdir/new_file':
770 testData = 'fooFirstFile' 772 testData = 'fooFirstFile'
771 if path == 'newdir/new_file': 773 if path == 'newdir/new_file':
772 testData = 'fooNewFile' 774 testData = 'fooNewFile'
777 islink=False, 779 islink=False,
778 isexec=False, 780 isexec=False,
779 copied=False) 781 copied=False)
780 raise IOError(errno.EINVAL, 'Invalid operation: ' + path) 782 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
781 ctx = context.memctx(repo, 783 ctx = context.memctx(repo,
782 (repo['default'].node(), node.nullid), 784 (revsymbol(repo, 'default').node(), node.nullid),
783 'automated test', 785 'automated test',
784 ['adding_file'], 786 ['adding_file'],
785 file_callback, 787 file_callback,
786 'an_author', 788 'an_author',
787 '2012-12-13 20:59:48 -0500', 789 '2012-12-13 20:59:48 -0500',
788 {'branch': 'default', }) 790 {'branch': 'default', })
789 new_hash = repo.commitctx(ctx) 791 new_hash = repo.commitctx(ctx)
790 p = os.path.join(repo.root, "newdir") 792 p = os.path.join(repo.root, "newdir")
791 os.mkdir(p) 793 os.mkdir(p)
792 ctx = context.memctx(repo, 794 ctx = context.memctx(repo,
793 (repo['default'].node(), node.nullid), 795 (revsymbol(repo, 'default').node(), node.nullid),
794 'automated test', 796 'automated test',
795 ['newdir/new_file'], 797 ['newdir/new_file'],
796 file_callback, 798 file_callback,
797 'an_author', 799 'an_author',
798 '2012-12-13 20:59:48 -0500', 800 '2012-12-13 20:59:48 -0500',
799 {'branch': 'default', }) 801 {'branch': 'default', })
800 os.chdir(p) 802 os.chdir(p)
801 new_hash = repo.commitctx(ctx) 803 new_hash = repo.commitctx(ctx)
802 hg.update(repo, repo['tip'].node()) 804 hg.update(repo, revsymbol(repo, 'tip').node())
803 self.pushrevisions() 805 self.pushrevisions()
804 tip = self.repo['tip'] 806 tip = revsymbol(self.repo, 'tip')
805 self.assertNotEqual(tip.node(), old_tip) 807 self.assertNotEqual(tip.node(), old_tip)
806 self.assertEqual(p, os.getcwd()) 808 self.assertEqual(p, os.getcwd())
807 self.assertEqual(tip['adding_file'].data(), 'fooFirstFile') 809 self.assertEqual(tip['adding_file'].data(), 'fooFirstFile')
808 self.assertEqual(tip['newdir/new_file'].data(), 'fooNewFile') 810 self.assertEqual(tip['newdir/new_file'].data(), 'fooNewFile')
809 self.assertEqual(tip.branch(), 'default') 811 self.assertEqual(tip.branch(), 'default')
818 self.repo_path, 820 self.repo_path,
819 {'trunk/racey_file': 'race conditions suck'})) 821 {'trunk/racey_file': 'race conditions suck'}))
820 822
821 self.test_push_to_branch(push=False) 823 self.test_push_to_branch(push=False)
822 commands.push(ui, repo) 824 commands.push(ui, repo)
823 newctx = self.repo['.'] 825 newctx = revsymbol(self.repo, '.')
824 self.assertNotEqual(newctx.node(), self.repo['tip'].node()) 826 self.assertNotEqual(newctx.node(), revsymbol(self.repo, 'tip').node())
825 self.assertEqual(newctx['adding_file'].data(), 'foo') 827 self.assertEqual(newctx['adding_file'].data(), 'foo')
826 self.assertEqual(newctx.branch(), 'the_branch') 828 self.assertEqual(newctx.branch(), 'the_branch')