~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Martin Pool
  • Date: 2005-05-02 04:24:33 UTC
  • Revision ID: mbp@sourcefrog.net-20050502042433-c825a7f7235f6b15
doc: notes on merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by Canonical Ltd
2
 
# -*- coding: utf-8 -*-
3
 
#
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
 
18
 
 
19
 
"""Tests for the update command of bzr."""
20
 
 
21
 
import os
22
 
 
23
 
from bzrlib import branch, bzrdir
24
 
from bzrlib.tests import TestSkipped
25
 
from bzrlib.tests.blackbox import ExternalBase
26
 
from bzrlib.workingtree import WorkingTree
27
 
 
28
 
 
29
 
class TestUpdate(ExternalBase):
30
 
 
31
 
    def test_update_standalone_trivial(self):
32
 
        self.runbzr("init")
33
 
        out, err = self.runbzr('update')
34
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
35
 
        self.assertEqual('', out)
36
 
 
37
 
    def test_update_standalone_trivial_with_alias_up(self):
38
 
        self.runbzr("init")
39
 
        out, err = self.runbzr('up')
40
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
41
 
        self.assertEqual('', out)
42
 
 
43
 
    def test_update_up_to_date_light_checkout(self):
44
 
        self.make_branch_and_tree('branch')
45
 
        self.runbzr('checkout --lightweight branch checkout')
46
 
        out, err = self.runbzr('update checkout')
47
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
48
 
        self.assertEqual('', out)
49
 
 
50
 
    def test_update_up_to_date_checkout(self):
51
 
        self.make_branch_and_tree('branch')
52
 
        self.run_bzr('checkout', 'branch', 'checkout')
53
 
        out, err = self.run_bzr('update', 'checkout')
54
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
55
 
        self.assertEqual('', out)
56
 
 
57
 
    def test_update_out_of_date_standalone_tree(self):
58
 
        # FIXME the default format has to change for this to pass
59
 
        # because it currently uses the branch last-revision marker.
60
 
        self.make_branch_and_tree('branch')
61
 
        # make a checkout
62
 
        self.runbzr('checkout --lightweight branch checkout')
63
 
        self.build_tree(['checkout/file'])
64
 
        self.runbzr('add checkout/file')
65
 
        self.runbzr('commit -m add-file checkout')
66
 
        # now branch should be out of date
67
 
        out,err = self.runbzr('update branch')
68
 
        self.assertEqual('', out)
69
 
        self.assertEqual('All changes applied successfully.\n'
70
 
                         'Updated to revision 1.\n', err)
71
 
        self.failUnlessExists('branch/file')
72
 
 
73
 
    def test_update_out_of_date_light_checkout(self):
74
 
        self.make_branch_and_tree('branch')
75
 
        # make two checkouts
76
 
        self.runbzr('checkout --lightweight branch checkout')
77
 
        self.runbzr('checkout --lightweight branch checkout2')
78
 
        self.build_tree(['checkout/file'])
79
 
        self.runbzr('add checkout/file')
80
 
        self.runbzr('commit -m add-file checkout')
81
 
        # now checkout2 should be out of date
82
 
        out,err = self.runbzr('update checkout2')
83
 
        self.assertEqual('All changes applied successfully.\n'
84
 
                         'Updated to revision 1.\n',
85
 
                         err)
86
 
        self.assertEqual('', out)
87
 
 
88
 
    def test_update_conflicts_returns_2(self):
89
 
        self.make_branch_and_tree('branch')
90
 
        # make two checkouts
91
 
        self.runbzr('checkout --lightweight branch checkout')
92
 
        self.build_tree(['checkout/file'])
93
 
        self.runbzr('add checkout/file')
94
 
        self.runbzr('commit -m add-file checkout')
95
 
        self.runbzr('checkout --lightweight branch checkout2')
96
 
        # now alter file in checkout
97
 
        a_file = file('checkout/file', 'wt')
98
 
        a_file.write('Foo')
99
 
        a_file.close()
100
 
        self.runbzr('commit -m checnge-file checkout')
101
 
        # now checkout2 should be out of date
102
 
        # make a local change to file
103
 
        a_file = file('checkout2/file', 'wt')
104
 
        a_file.write('Bar')
105
 
        a_file.close()
106
 
        out,err = self.runbzr('update checkout2', retcode=1)
107
 
        self.assertEqual(['1 conflicts encountered.',
108
 
                          'Updated to revision 2.'],
109
 
                         err.split('\n')[1:3])
110
 
        self.assertContainsRe(err, 'Text conflict in file\n')
111
 
        self.assertEqual('', out)
112
 
 
113
 
    def test_smoke_update_checkout_bound_branch_local_commits(self):
114
 
        # smoke test for doing an update of a checkout of a bound
115
 
        # branch with local commits.
116
 
        master = self.make_branch_and_tree('master')
117
 
        # make a bound branch
118
 
        self.run_bzr('checkout', 'master', 'child')
119
 
        # get an object form of child
120
 
        child = WorkingTree.open('child')
121
 
        # check that out
122
 
        self.run_bzr('checkout', '--lightweight', 'child', 'checkout')
123
 
        # get an object form of the checkout to manipulate
124
 
        wt = WorkingTree.open('checkout')
125
 
        # change master
126
 
        a_file = file('master/file', 'wt')
127
 
        a_file.write('Foo')
128
 
        a_file.close()
129
 
        master.add(['file'])
130
 
        master_tip = master.commit('add file')
131
 
        # change child
132
 
        a_file = file('child/file_b', 'wt')
133
 
        a_file.write('Foo')
134
 
        a_file.close()
135
 
        child.add(['file_b'])
136
 
        child_tip = child.commit('add file_b', local=True)
137
 
        # check checkout
138
 
        a_file = file('checkout/file_c', 'wt')
139
 
        a_file.write('Foo')
140
 
        a_file.close()
141
 
        wt.add(['file_c'])
142
 
 
143
 
        # now, update checkout ->
144
 
        # get all three files and a pending merge.
145
 
        out, err = self.run_bzr('update', 'checkout')
146
 
        self.assertEqual('', out)
147
 
        self.assertContainsRe(err, 'Updated to revision 1.\n'
148
 
                                   'Your local commits will now show as'
149
 
                                   ' pending merges')
150
 
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
151
 
        self.failUnlessExists('checkout/file')
152
 
        self.failUnlessExists('checkout/file_b')
153
 
        self.failUnlessExists('checkout/file_c')
154
 
        self.assertTrue(wt.has_filename('file_c'))
155
 
 
156
 
    def test_update_with_merges(self):
157
 
        # Test that 'bzr update' works correctly when you have
158
 
        # an update in the master tree, and a lightweight checkout
159
 
        # which has merged another branch
160
 
        master = self.make_branch_and_tree('master')
161
 
        self.build_tree(['master/file'])
162
 
        master.add(['file'])
163
 
        master.commit('one', rev_id='m1')
164
 
 
165
 
        self.build_tree(['checkout1/'])
166
 
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
167
 
        branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
168
 
        checkout1 = checkout_dir.create_workingtree('m1')
169
 
 
170
 
        # Create a second branch, with an extra commit
171
 
        other = master.bzrdir.sprout('other').open_workingtree()
172
 
        self.build_tree(['other/file2'])
173
 
        other.add(['file2'])
174
 
        other.commit('other2', rev_id='o2')
175
 
 
176
 
        # Create a new commit in the master branch
177
 
        self.build_tree(['master/file3'])
178
 
        master.add(['file3'])
179
 
        master.commit('f3', rev_id='m2')
180
 
 
181
 
        # Merge the other branch into checkout
182
 
        os.chdir('checkout1')
183
 
        self.run_bzr('merge', '../other')
184
 
 
185
 
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
186
 
 
187
 
        # At this point, 'commit' should fail, because we are out of date
188
 
        self.run_bzr_error(["please run 'bzr update'"],
189
 
                           'commit', '-m', 'merged')
190
 
 
191
 
        # This should not report about local commits being pending
192
 
        # merges, because they were real merges
193
 
        out, err = self.run_bzr('update')
194
 
        self.assertEqual('', out)
195
 
        self.assertEqual('All changes applied successfully.\n'
196
 
                         'Updated to revision 2.\n', err)
197
 
 
198
 
        # The pending merges should still be there
199
 
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])