comparison tests/test_push_command.py @ 1106:5cb6c95e0283 stable

Merge default and stable so I can do stable releases again.
author Augie Fackler <raf@durin42.com>
date Tue, 11 Feb 2014 12:48:49 -0500
parents 2d7398fffd0d
children cccc7a50f66d
comparison
equal deleted inserted replaced
1020:b5b1fce26f1f 1106:5cb6c95e0283
15 from mercurial import hg 15 from mercurial import hg
16 from mercurial import node 16 from mercurial import node
17 from mercurial import revlog 17 from mercurial import revlog
18 from mercurial import util as hgutil 18 from mercurial import util as hgutil
19 19
20 from hgsubversion import util
21
20 import time 22 import time
21 23
22 24
23 class PushTests(test_util.TestBase): 25 class PushTests(test_util.TestBase):
26 obsolete_mode_tests = True
27
24 def setUp(self): 28 def setUp(self):
25 test_util.TestBase.setUp(self) 29 test_util.TestBase.setUp(self)
26 self.repo_path = self.load_and_fetch('simple_branch.svndump')[1] 30 self.repo_path = self.load_and_fetch('simple_branch.svndump')[1]
27 31
28 def test_cant_push_empty_ctx(self): 32 def test_cant_push_empty_ctx(self):
45 {'branch': 'default', }) 49 {'branch': 'default', })
46 new_hash = repo.commitctx(ctx) 50 new_hash = repo.commitctx(ctx)
47 hg.update(repo, repo['tip'].node()) 51 hg.update(repo, repo['tip'].node())
48 old_tip = repo['tip'].node() 52 old_tip = repo['tip'].node()
49 self.pushrevisions() 53 self.pushrevisions()
54 tip = self.repo['tip']
55 self.assertEqual(tip.node(), old_tip)
56
57 def test_push_add_of_added_upstream_gives_sane_error(self):
58 repo = self.repo
59 def file_callback(repo, memctx, path):
60 if path == 'adding_file':
61 return context.memfilectx(path=path,
62 data='foo',
63 islink=False,
64 isexec=False,
65 copied=False)
66 raise IOError()
67 p1 = repo['default'].node()
68 ctx = context.memctx(repo,
69 (p1, node.nullid),
70 'automated test',
71 ['adding_file'],
72 file_callback,
73 'an_author',
74 '2008-10-07 20:59:48 -0500',
75 {'branch': 'default', })
76 new_hash = repo.commitctx(ctx)
77 hg.update(repo, repo['tip'].node())
78 old_tip = repo['tip'].node()
79 self.pushrevisions()
80 tip = self.repo['tip']
81 self.assertNotEqual(tip.node(), old_tip)
82
83 # This node adds the same file as the first one we added, and
84 # will be refused by the server for adding a file that already
85 # exists. We should respond with an error suggesting the user
86 # rebase.
87 ctx = context.memctx(repo,
88 (p1, node.nullid),
89 'automated test',
90 ['adding_file'],
91 file_callback,
92 'an_author',
93 '2008-10-07 20:59:48 -0500',
94 {'branch': 'default', })
95 new_hash = repo.commitctx(ctx)
96 hg.update(repo, repo['tip'].node())
97 old_tip = repo['tip'].node()
98 try:
99 self.pushrevisions()
100 except hgutil.Abort, e:
101 assert "pull again and rebase" in str(e)
50 tip = self.repo['tip'] 102 tip = self.repo['tip']
51 self.assertEqual(tip.node(), old_tip) 103 self.assertEqual(tip.node(), old_tip)
52 104
53 def test_cant_push_with_changes(self): 105 def test_cant_push_with_changes(self):
54 repo = self.repo 106 repo = self.repo
520 ] 572 ]
521 self.commitchanges(changes, parent=self.repo['tip'].rev()) 573 self.commitchanges(changes, parent=self.repo['tip'].rev())
522 self.pushrevisions() 574 self.pushrevisions()
523 self.assertEqual(['alpha'], list(self.repo['tip'].manifest())) 575 self.assertEqual(['alpha'], list(self.repo['tip'].manifest()))
524 576
525 def suite(): 577 def test_push_without_pushing_children(self):
526 test_classes = [PushTests, ] 578 '''
527 all_tests = [] 579 Verify that a push of a nontip node, keeps the tip child
528 # This is the quickest hack I could come up with to load all the tests from 580 on top of the pushed commit.
529 # both classes. Would love a patch that simplifies this without adding 581 '''
530 # dependencies. 582
531 for tc in test_classes: 583 oldlen = test_util.repolen(self.repo)
532 for attr in dir(tc): 584 oldtiphash = self.repo['default'].node()
533 if attr.startswith('test_'): 585
534 all_tests.append(tc(attr)) 586 changes = [('gamma', 'gamma', 'sometext')]
535 return unittest.TestSuite(all_tests) 587 newhash1 = self.commitchanges(changes)
588
589 changes = [('delta', 'delta', 'sometext')]
590 newhash2 = self.commitchanges(changes)
591
592 # push only the first commit
593 repo = self.repo
594 hg.update(repo, newhash1)
595 commands.push(repo.ui, repo)
596 self.assertEqual(test_util.repolen(self.repo), oldlen + 2)
597
598 # verify that the first commit is pushed, and the second is not
599 commit2 = self.repo['tip']
600 self.assertEqual(commit2.files(), ['delta', ])
601 self.assertEqual(util.getsvnrev(commit2), None)
602 commit1 = commit2.parents()[0]
603 self.assertEqual(commit1.files(), ['gamma', ])
604 prefix = 'svn:' + self.repo.svnmeta().uuid
605 self.assertEqual(util.getsvnrev(commit1),
606 prefix + '/branches/the_branch@5')
607
608 def test_push_two_that_modify_same_file(self):
609 '''
610 Push performs a rebase if two commits touch the same file.
611 This test verifies that code path works.
612 '''
613
614 oldlen = test_util.repolen(self.repo)
615 oldtiphash = self.repo['default'].node()
616
617 changes = [('gamma', 'gamma', 'sometext')]
618 newhash = self.commitchanges(changes)
619 changes = [('gamma', 'gamma', 'sometext\n moretext'),
620 ('delta', 'delta', 'sometext\n moretext'),
621 ]
622 newhash = self.commitchanges(changes)
623
624 repo = self.repo
625 hg.update(repo, newhash)
626 commands.push(repo.ui, repo)
627 self.assertEqual(test_util.repolen(self.repo), oldlen + 2)
628
629 # verify that both commits are pushed
630 commit1 = self.repo['tip']
631 self.assertEqual(commit1.files(), ['delta', 'gamma'])
632
633 prefix = 'svn:' + self.repo.svnmeta().uuid
634 self.assertEqual(util.getsvnrev(commit1),
635 prefix + '/branches/the_branch@6')
636 commit2 = commit1.parents()[0]
637 self.assertEqual(commit2.files(), ['gamma'])
638 self.assertEqual(util.getsvnrev(commit2),
639 prefix + '/branches/the_branch@5')
640
641 def test_push_in_subdir(self, commit=True):
642 repo = self.repo
643 old_tip = repo['tip'].node()
644 def file_callback(repo, memctx, path):
645 if path == 'adding_file' or path == 'newdir/new_file':
646 testData = 'fooFirstFile'
647 if path == 'newdir/new_file':
648 testData = 'fooNewFile'
649 return context.memfilectx(path=path,
650 data=testData,
651 islink=False,
652 isexec=False,
653 copied=False)
654 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
655 ctx = context.memctx(repo,
656 (repo['default'].node(), node.nullid),
657 'automated test',
658 ['adding_file'],
659 file_callback,
660 'an_author',
661 '2012-12-13 20:59:48 -0500',
662 {'branch': 'default', })
663 new_hash = repo.commitctx(ctx)
664 p = os.path.join(repo.root, "newdir")
665 os.mkdir(p)
666 ctx = context.memctx(repo,
667 (repo['default'].node(), node.nullid),
668 'automated test',
669 ['newdir/new_file'],
670 file_callback,
671 'an_author',
672 '2012-12-13 20:59:48 -0500',
673 {'branch': 'default', })
674 os.chdir(p)
675 new_hash = repo.commitctx(ctx)
676 hg.update(repo, repo['tip'].node())
677 self.pushrevisions()
678 tip = self.repo['tip']
679 self.assertNotEqual(tip.node(), old_tip)
680 self.assertEqual(p, os.getcwd())
681 self.assertEqual(tip['adding_file'].data(), 'fooFirstFile')
682 self.assertEqual(tip['newdir/new_file'].data(), 'fooNewFile')
683 self.assertEqual(tip.branch(), 'default')