/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/per_workingtree/test_merge_from_branch.py

  • Committer: Vincent Ladeuil
  • Date: 2010-04-15 15:03:15 UTC
  • mfrom: (4797.42.3 2.1-integration)
  • mto: This revision was merged to the branch mainline in revision 5160.
  • Revision ID: v.ladeuil+lp@free.fr-20100415150315-y2bbh2tzvshyzet0
Merge 2.1 into bzr.dev including fixes for #262450, #373898, #498409

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
 
1
# Copyright (C) 2006-2010 Canonical Ltd
2
2
# Authors:  Robert Collins <robert.collins@canonical.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
20
20
import os
21
21
 
22
22
from bzrlib import (
 
23
    branchbuilder,
23
24
    errors,
24
25
    merge
25
26
    )
26
 
from bzrlib.tests.per_workingtree import TestCaseWithWorkingTree
27
 
 
28
 
 
29
 
class TestMergeFromBranch(TestCaseWithWorkingTree):
 
27
from bzrlib.tests import per_workingtree
 
28
 
 
29
 
 
30
class TestMergeFromBranch(per_workingtree.TestCaseWithWorkingTree):
30
31
 
31
32
    def create_two_trees_for_merging(self):
32
33
        """Create two trees that can be merged from.
114
115
                self.tt.create_file('qux', trans_id)
115
116
        this.merge_from_branch(other.branch, merge_type=QuxMerge)
116
117
        self.assertEqual('qux', this.get_file_text('foo-id'))
 
118
 
 
119
 
 
120
class TestMergedBranch(per_workingtree.TestCaseWithWorkingTree):
 
121
 
 
122
    def make_branch_builder(self, relpath, format=None):
 
123
        if format is None:
 
124
            format = self.bzrdir_format
 
125
        builder = branchbuilder.BranchBuilder(self.get_transport(),
 
126
                                              format=format)
 
127
        return builder
 
128
 
 
129
    def make_inner_branch(self):
 
130
        bld_inner = self.make_branch_builder('inner')
 
131
        bld_inner.start_series()
 
132
        bld_inner.build_snapshot(
 
133
            '1', None,
 
134
            [('add', ('', 'inner-root-id', 'directory', '')),
 
135
             ('add', ('dir', 'dir-id', 'directory', '')),
 
136
             ('add', ('dir/file1', 'file1-id', 'file', 'file1 content\n')),
 
137
             ('add', ('file3', 'file3-id', 'file', 'file3 content\n')),
 
138
             ])
 
139
        bld_inner.build_snapshot(
 
140
            '3', ['1'], [('modify', ('file3-id', 'new file3 contents\n')),])
 
141
        bld_inner.build_snapshot(
 
142
            '2', ['1'],
 
143
            [('add', ('dir/file2', 'file2-id', 'file', 'file2 content\n')),
 
144
             ])
 
145
        bld_inner.finish_series()
 
146
        br = bld_inner.get_branch()
 
147
        return br
 
148
 
 
149
    def assertTreeLayout(self, expected, tree):
 
150
        tree.lock_read()
 
151
        try:
 
152
            actual = [e[0] for e in tree.list_files()]
 
153
            # list_files doesn't guarantee order
 
154
            actual = sorted(actual)
 
155
            self.assertEqual(expected, actual)
 
156
        finally:
 
157
            tree.unlock()
 
158
 
 
159
    def make_outer_tree(self):
 
160
        outer = self.make_branch_and_tree('outer')
 
161
        self.build_tree_contents([('outer/foo', 'foo')])
 
162
        outer.add('foo', 'foo-id')
 
163
        outer.commit('added foo')
 
164
        inner = self.make_inner_branch()
 
165
        outer.merge_from_branch(inner, to_revision='1', from_revision='null:')
 
166
        outer.commit('merge inner branch')
 
167
        outer.mkdir('dir-outer', 'dir-outer-id')
 
168
        outer.move(['dir', 'file3'], to_dir='dir-outer')
 
169
        outer.commit('rename imported dir and file3 to dir-outer')
 
170
        return outer, inner
 
171
 
 
172
    def test_file1_deleted_in_dir(self):
 
173
        outer, inner = self.make_outer_tree()
 
174
        outer.remove(['dir-outer/dir/file1'], keep_files=False)
 
175
        outer.commit('delete file1')
 
176
        outer.merge_from_branch(inner)
 
177
        outer.commit('merge the rest')
 
178
        self.assertTreeLayout(['dir-outer',
 
179
                               'dir-outer/dir',
 
180
                               'dir-outer/dir/file2',
 
181
                               'dir-outer/file3',
 
182
                               'foo'],
 
183
                              outer)
 
184
 
 
185
    def test_file3_deleted_in_root(self):
 
186
        # Reproduce bug #375898
 
187
        outer, inner = self.make_outer_tree()
 
188
        outer.remove(['dir-outer/file3'], keep_files=False)
 
189
        outer.commit('delete file3')
 
190
        outer.merge_from_branch(inner)
 
191
        outer.commit('merge the rest')
 
192
        self.assertTreeLayout(['dir-outer',
 
193
                               'dir-outer/dir',
 
194
                               'dir-outer/dir/file1',
 
195
                               'dir-outer/dir/file2',
 
196
                               'foo'],
 
197
                              outer)
 
198
 
 
199
 
 
200
    def test_file3_in_root_conflicted(self):
 
201
        outer, inner = self.make_outer_tree()
 
202
        outer.remove(['dir-outer/file3'], keep_files=False)
 
203
        outer.commit('delete file3')
 
204
        nb_conflicts = outer.merge_from_branch(inner, to_revision='3')
 
205
        self.assertEqual(4, nb_conflicts)
 
206
        self.assertTreeLayout(['dir-outer',
 
207
                               'dir-outer/dir',
 
208
                               'dir-outer/dir/file1',
 
209
                               # Ideally th conflict helpers should be in
 
210
                               # dir-outer/dir but since we can't easily find
 
211
                               # back the file3 -> outer-dir/dir rename, root
 
212
                               # is good enough -- vila 20100401
 
213
                               'file3.BASE',
 
214
                               'file3.OTHER',
 
215
                               'foo'],
 
216
                              outer)
 
217