~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_merge.py

  • Committer: Vincent Ladeuil
  • Date: 2009-06-22 12:52:39 UTC
  • mto: (4471.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4472.
  • Revision ID: v.ladeuil+lp@free.fr-20090622125239-kabo9smxt9c3vnir
Use a consistent scheme for naming pyrex source files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
#
17
17
# Author: Aaron Bentley <aaron.bentley@utoronto.ca>
18
18
 
44
44
        tree.commit(message='setup')
45
45
        return tree
46
46
 
 
47
    def create_conflicting_branches(self):
 
48
        """Create two branches which have overlapping modifications.
 
49
 
 
50
        :return: (tree, other_branch) Where merging other_branch causes a file
 
51
            conflict.
 
52
        """
 
53
        builder = self.make_branch_builder('branch')
 
54
        builder.build_snapshot('rev1', None,
 
55
            [('add', ('', 'root-id', 'directory', None)),
 
56
             ('add', ('fname', 'f-id', 'file', 'a\nb\nc\n'))])
 
57
        builder.build_snapshot('rev2other', ['rev1'],
 
58
            [('modify', ('f-id', 'a\nB\nD\n'))])
 
59
        other = builder.get_branch().bzrdir.sprout('other').open_branch()
 
60
        builder.build_snapshot('rev2this', ['rev1'],
 
61
            [('modify', ('f-id', 'a\nB\nC\n'))])
 
62
        tree = builder.get_branch().create_checkout('tree', lightweight=True)
 
63
        return tree, other
 
64
 
47
65
    def test_merge_reprocess(self):
48
66
        d = BzrDir.create_standalone_workingtree('.')
49
67
        d.commit('h')
90
108
        self.assertTrue("Not a branch" in err)
91
109
        self.run_bzr('merge -r revno:%d:./..revno:%d:../b'
92
110
                    %(ancestor,b.revno()))
93
 
        self.assertEquals(a.get_parent_ids(), 
 
111
        self.assertEquals(a.get_parent_ids(),
94
112
                          [a.branch.last_revision(), b.last_revision()])
95
113
        self.check_file_contents('goodbye', 'quux')
96
114
        a_tree.revert(backups=False)
101
119
        self.run_bzr('merge ../b -r last:1')
102
120
        self.assertEqual([a_tip], a.get_parent_ids())
103
121
 
 
122
    def test_merge_defaults_to_reprocess(self):
 
123
        tree, other = self.create_conflicting_branches()
 
124
        # The default merge algorithm should enable 'reprocess' because
 
125
        # 'show-base' is not set
 
126
        self.run_bzr('merge ../other', working_dir='tree',
 
127
                     retcode=1)
 
128
        self.assertEqualDiff('a\n'
 
129
                             'B\n'
 
130
                             '<<<<<<< TREE\n'
 
131
                             'C\n'
 
132
                             '=======\n'
 
133
                             'D\n'
 
134
                             '>>>>>>> MERGE-SOURCE\n',
 
135
                             tree.get_file_text('f-id'))
 
136
 
 
137
    def test_merge_explicit_reprocess_show_base(self):
 
138
        tree, other = self.create_conflicting_branches()
 
139
        # Explicitly setting --reprocess, and --show-base is an error
 
140
        self.run_bzr_error(['Cannot do conflict reduction and show base'],
 
141
                           'merge ../other --reprocess --show-base',
 
142
                           working_dir='tree')
 
143
 
 
144
    def test_merge_override_reprocess(self):
 
145
        tree, other = self.create_conflicting_branches()
 
146
        # Explicitly disable reprocess
 
147
        self.run_bzr('merge ../other --no-reprocess', working_dir='tree',
 
148
                     retcode=1)
 
149
        self.assertEqualDiff('a\n'
 
150
                             '<<<<<<< TREE\n'
 
151
                             'B\n'
 
152
                             'C\n'
 
153
                             '=======\n'
 
154
                             'B\n'
 
155
                             'D\n'
 
156
                             '>>>>>>> MERGE-SOURCE\n',
 
157
                             tree.get_file_text('f-id'))
 
158
 
 
159
    def test_merge_override_show_base(self):
 
160
        tree, other = self.create_conflicting_branches()
 
161
        # Setting '--show-base' will auto-disable '--reprocess'
 
162
        self.run_bzr('merge ../other --show-base', working_dir='tree',
 
163
                     retcode=1)
 
164
        self.assertEqualDiff('a\n'
 
165
                             '<<<<<<< TREE\n'
 
166
                             'B\n'
 
167
                             'C\n'
 
168
                             '||||||| BASE-REVISION\n'
 
169
                             'b\n'
 
170
                             'c\n'
 
171
                             '=======\n'
 
172
                             'B\n'
 
173
                             'D\n'
 
174
                             '>>>>>>> MERGE-SOURCE\n',
 
175
                             tree.get_file_text('f-id'))
 
176
 
104
177
    def test_merge_with_missing_file(self):
105
178
        """Merge handles missing file conflicts"""
106
179
        self.build_tree_contents([
163
236
        out = self.run_bzr('merge', retcode=3)
164
237
        self.assertEquals(out,
165
238
                ('','bzr: ERROR: No location specified or remembered\n'))
166
 
        # test implicit --remember when no parent set, this merge conflicts
 
239
 
 
240
        # test uncommitted changes
167
241
        self.build_tree(['d'])
168
242
        tree_b.add('d')
169
243
        self.run_bzr_error(['Working tree ".*" has uncommitted changes'],
170
 
                           'merge ../branch_a')
171
 
        self.assertEquals(abspath(branch_b.get_submit_branch()),
172
 
                          abspath(parent))
173
 
        # test implicit --remember after resolving conflict
 
244
                           'merge')
 
245
 
 
246
        # merge should now pass and implicitly remember merge location
174
247
        tree_b.commit('commit d')
 
248
        out, err = self.run_bzr('merge ../branch_a')
 
249
 
 
250
        base = urlutils.local_path_from_url(branch_a.base)
 
251
        self.assertEndsWith(err, '+N  b\nAll changes applied successfully.\n')
 
252
        self.assertEquals(abspath(branch_b.get_submit_branch()),
 
253
                          abspath(parent))
 
254
        # test implicit --remember when committing new file
 
255
        self.build_tree(['e'])
 
256
        tree_b.add('e')
 
257
        tree_b.commit('commit e')
175
258
        out, err = self.run_bzr('merge')
176
 
        
177
 
        base = urlutils.local_path_from_url(branch_a.base)
178
259
        self.assertStartsWith(err,
179
 
                          'Merging from remembered location %s\n' % (base,))
180
 
        self.assertEndsWith(err, '+N  b\nAll changes applied successfully.\n')
181
 
        self.assertEquals(abspath(branch_b.get_submit_branch()),
182
 
                          abspath(parent))
 
260
                          'Merging from remembered submit location %s\n' % (base,))
183
261
        # re-open tree as external run_bzr modified it
184
262
        tree_b = branch_b.bzrdir.open_workingtree()
185
263
        tree_b.commit('merge branch_a')
365
443
 
366
444
    def assertDirectoryContent(self, directory, entries, message=''):
367
445
        """Assert whether entries (file or directories) exist in a directory.
368
 
        
 
446
 
369
447
        It also checks that there are no extra entries.
370
448
        """
371
449
        ondisk = os.listdir(directory)
413
491
        out, err = self.run_bzr(['merge', '-d', 'a', 'b'])
414
492
        self.assertContainsRe(err, 'Warning: criss-cross merge encountered.')
415
493
 
 
494
    def test_merge_force(self):
 
495
        tree_a = self.make_branch_and_tree('a')
 
496
        self.build_tree(['a/foo'])
 
497
        tree_a.add(['foo'])
 
498
        tree_a.commit('add file')
 
499
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
 
500
        self.build_tree_contents([('a/foo', 'change 1')])
 
501
        tree_a.commit('change file')
 
502
        tree_b.merge_from_branch(tree_a.branch)
 
503
        tree_a.commit('empty change to allow merge to run')
 
504
        self.run_bzr(['merge', '../a', '--force'], working_dir='b')
 
505
 
416
506
    def test_merge_from_submit(self):
417
507
        tree_a = self.make_branch_and_tree('a')
418
508
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
419
509
        tree_c = tree_a.bzrdir.sprout('c').open_workingtree()
420
510
        out, err = self.run_bzr(['merge', '-d', 'c'])
421
 
        self.assertContainsRe(err, 'Merging from remembered location .*a\/')
 
511
        self.assertContainsRe(err, 'Merging from remembered parent location .*a\/')
422
512
        tree_c.branch.set_submit_branch(tree_b.bzrdir.root_transport.base)
423
513
        out, err = self.run_bzr(['merge', '-d', 'c'])
424
 
        self.assertContainsRe(err, 'Merging from remembered location .*b\/')
 
514
        self.assertContainsRe(err, 'Merging from remembered submit location .*b\/')
425
515
 
426
516
    def test_remember_sets_submit(self):
427
517
        tree_a = self.make_branch_and_tree('a')