~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/per_branch/test_pull.py

  • Committer: Andrew Bennetts
  • Date: 2010-10-08 08:15:14 UTC
  • mto: This revision was merged to the branch mainline in revision 5498.
  • Revision ID: andrew.bennetts@canonical.com-20101008081514-dviqzrdfwyzsqbz2
Split NEWS into per-release doc/en/release-notes/bzr-*.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Tests for branch.pull behaviour."""
18
18
 
 
19
import os
 
20
 
19
21
from bzrlib import (
20
22
    branch,
21
 
    controldir,
 
23
    bzrdir,
22
24
    errors,
23
25
    memorytree,
24
26
    revision,
25
27
    )
26
 
from bzrlib.tests import (
27
 
    fixtures,
28
 
    per_branch,
29
 
    TestNotApplicable,
30
 
    )
 
28
from bzrlib.tests import per_branch
31
29
 
32
30
 
33
31
class TestPull(per_branch.TestCaseWithBranch):
42
40
        parent.merge_from_branch(mine.branch)
43
41
        parent.commit('merge my change', rev_id='P2')
44
42
        mine.pull(parent.branch)
45
 
        self.assertEqual('P2', mine.branch.last_revision())
 
43
        self.assertEqual(['P1', 'P2'], mine.branch.revision_history())
46
44
 
47
45
    def test_pull_merged_indirect(self):
48
46
        # it should be possible to do a pull from one branch into another
59
57
        parent.merge_from_branch(other.branch)
60
58
        parent.commit('merge other', rev_id='P2')
61
59
        mine.pull(parent.branch)
62
 
        self.assertEqual('P2', mine.branch.last_revision())
 
60
        self.assertEqual(['P1', 'P2'], mine.branch.revision_history())
63
61
 
64
62
    def test_pull_updates_checkout_and_master(self):
65
63
        """Pulling into a checkout updates the checkout and the master branch"""
71
69
        rev2 = other.commit('other commit')
72
70
        # now pull, which should update both checkout and master.
73
71
        checkout.branch.pull(other.branch)
74
 
        self.assertEqual(rev2, checkout.branch.last_revision())
75
 
        self.assertEqual(rev2, master_tree.branch.last_revision())
 
72
        self.assertEqual([rev1, rev2], checkout.branch.revision_history())
 
73
        self.assertEqual([rev1, rev2], master_tree.branch.revision_history())
76
74
 
77
75
    def test_pull_local_updates_checkout_only(self):
78
76
        """Pulling --local into a checkout updates the checkout and not the
85
83
        rev2 = other.commit('other commit')
86
84
        # now pull local, which should update checkout but not master.
87
85
        checkout.branch.pull(other.branch, local = True)
88
 
        self.assertEqual(rev2, checkout.branch.last_revision())
89
 
        self.assertEqual(rev1, master_tree.branch.last_revision())
 
86
        self.assertEqual([rev1, rev2], checkout.branch.revision_history())
 
87
        self.assertEqual([rev1], master_tree.branch.revision_history())
90
88
 
91
89
    def test_pull_local_raises_LocalRequiresBoundBranch_on_unbound(self):
92
90
        """Pulling --local into a branch that is not bound should fail."""
98
96
        # now pull --local, which should raise LocalRequiresBoundBranch error.
99
97
        self.assertRaises(errors.LocalRequiresBoundBranch,
100
98
                          master_tree.branch.pull, other.branch, local = True)
101
 
        self.assertEqual(rev1, master_tree.branch.last_revision())
 
99
        self.assertEqual([rev1], master_tree.branch.revision_history())
102
100
 
103
101
    def test_pull_returns_result(self):
104
102
        parent = self.make_branch_and_tree('parent')
115
113
        self.assertEqual('P1', result.old_revid)
116
114
        self.assertEqual(2, result.new_revno)
117
115
        self.assertEqual('M1', result.new_revid)
118
 
        self.assertEqual([], result.tag_conflicts)
 
116
        self.assertEqual(None, result.tag_conflicts)
119
117
 
120
118
    def test_pull_overwrite(self):
121
119
        tree_a = self.make_branch_and_tree('tree_a')
128
126
                          tree_a.branch.pull, tree_b.branch,
129
127
                          overwrite=False, stop_revision='rev2b')
130
128
        # It should not have updated the branch tip, but it should have fetched
131
 
        # the revision if the repository supports "invisible" revisions
 
129
        # the revision
132
130
        self.assertEqual('rev2a', tree_a.branch.last_revision())
133
 
        if tree_a.branch.repository._format.supports_unreferenced_revisions:
134
 
            self.assertTrue(tree_a.branch.repository.has_revision('rev2b'))
 
131
        self.assertTrue(tree_a.branch.repository.has_revision('rev2b'))
135
132
        tree_a.branch.pull(tree_b.branch, overwrite=True,
136
133
                           stop_revision='rev2b')
137
134
        self.assertEqual('rev2b', tree_a.branch.last_revision())
138
 
        self.assertEqual(tree_b.branch.last_revision(),
139
 
                         tree_a.branch.last_revision())
140
 
 
141
 
    def test_pull_merges_and_fetches_tags(self):
142
 
        """Tags are updated by br.pull(source), and revisions named in those
143
 
        tags are fetched.
144
 
        """
145
 
        # Make a source, sprout a target off it
146
 
        try:
147
 
            builder = self.make_branch_builder('source')
148
 
        except errors.UninitializableFormat:
149
 
            raise TestNotApplicable('uninitializeable format')
150
 
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
151
 
        target = source.bzrdir.sprout('target').open_branch()
152
 
        # Add a tag to the source, then pull from source
153
 
        try:
154
 
            source.tags.set_tag('tag-a', 'rev-2')
155
 
        except errors.TagsNotSupported:
156
 
            raise TestNotApplicable('format does not support tags.')
157
 
        source.tags.set_tag('tag-a', 'rev-2')
158
 
        source.get_config_stack().set('branch.fetch_tags', True)
159
 
        target.pull(source)
160
 
        # The tag is present, and so is its revision.
161
 
        self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
162
 
        target.repository.get_revision('rev-2')
163
 
 
164
 
    def test_pull_stop_revision_merges_and_fetches_tags(self):
165
 
        """br.pull(source, stop_revision=REV) updates and fetches tags."""
166
 
        # Make a source, sprout a target off it
167
 
        try:
168
 
            builder = self.make_branch_builder('source')
169
 
        except errors.UninitializableFormat:
170
 
            raise TestNotApplicable('uninitializeable format')
171
 
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
172
 
        target = source.bzrdir.sprout('target').open_branch()
173
 
        # Add a new commit to the ancestry
174
 
        builder.build_commit(message="Rev 2 again", rev_id='rev-2-again')
175
 
        # Add a tag to the source, then pull rev-2-again from source
176
 
        try:
177
 
            source.tags.set_tag('tag-a', 'rev-2')
178
 
        except errors.TagsNotSupported:
179
 
            raise TestNotApplicable('format does not support tags.')
180
 
        source.get_config_stack().set('branch.fetch_tags', True)
181
 
        target.pull(source, 'rev-2-again')
182
 
        # The tag is present, and so is its revision.
183
 
        self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
184
 
        target.repository.get_revision('rev-2')
 
135
        self.assertEqual(tree_b.branch.revision_history(),
 
136
                         tree_a.branch.revision_history())
185
137
 
186
138
 
187
139
class TestPullHook(per_branch.TestCaseWithBranch):
238
190
            # remotebranches can't be bound.  Let's instead make a new local
239
191
            # branch of the default type, which does allow binding.
240
192
            # See https://bugs.launchpad.net/bzr/+bug/112020
241
 
            local = controldir.ControlDir.create_branch_convenience('local2')
 
193
            local = bzrdir.BzrDir.create_branch_convenience('local2')
242
194
            local.bind(target)
243
195
        source = self.make_branch('source')
244
196
        branch.Branch.hooks.install_named_hook(