49
55
tree_b.commit('commit c')
50
56
# initial push location must be empty
51
57
self.assertEqual(None, branch_b.get_push_location())
52
59
# test push for failure without push location set
53
60
os.chdir('branch_a')
54
61
out = self.runbzr('push', retcode=3)
55
62
self.assertEquals(out,
56
63
('','bzr: ERROR: No push location known or specified.\n'))
65
# test not remembered if cannot actually push
66
self.run_bzr('push', '../path/which/doesnt/exist', retcode=3)
67
out = self.run_bzr('push', retcode=3)
69
('', 'bzr: ERROR: No push location known or specified.\n'),
57
72
# test implicit --remember when no push location set, push fails
58
out = self.runbzr('push ../branch_b', retcode=3)
73
out = self.run_bzr('push', '../branch_b', retcode=3)
59
74
self.assertEquals(out,
60
75
('','bzr: ERROR: These branches have diverged. '
61
'Try a merge then push with overwrite.\n'))
76
'Try using "merge" and then "push".\n'))
62
77
self.assertEquals(abspath(branch_a.get_push_location()),
63
78
abspath(branch_b.bzrdir.root_transport.base))
64
80
# test implicit --remember after resolving previous failure
65
81
uncommit(branch=branch_b, tree=tree_b)
66
82
transport.delete('branch_b/c')
68
self.assertEquals(abspath(branch_a.get_push_location()),
69
abspath(branch_b.bzrdir.root_transport.base))
83
out, err = self.run_bzr('push')
84
path = branch_a.get_push_location()
85
self.assertEquals(out,
86
'Using saved location: %s\n'
87
'Pushed up to revision 2.\n'
88
% local_path_from_url(path))
90
'All changes applied successfully.\n')
91
self.assertEqual(path,
92
branch_b.bzrdir.root_transport.base)
70
93
# test explicit --remember
71
self.runbzr('push ../branch_c --remember')
72
self.assertEquals(abspath(branch_a.get_push_location()),
73
abspath(branch_c.bzrdir.root_transport.base))
94
self.run_bzr('push', '../branch_c', '--remember')
95
self.assertEquals(branch_a.get_push_location(),
96
branch_c.bzrdir.root_transport.base)
75
98
def test_push_without_tree(self):
76
99
# bzr push from a branch that does not have a checkout should work.
77
100
b = self.make_branch('.')
78
101
out, err = self.run_bzr('push', 'pushed-location')
79
102
self.assertEqual('', out)
80
self.assertEqual('0 revision(s) pushed.\n', err)
81
b2 = bzrlib.branch.Branch.open('pushed-location')
103
self.assertEqual('Created new branch.\n', err)
104
b2 = Branch.open('pushed-location')
82
105
self.assertEndsWith(b2.base, 'pushed-location/')
84
107
def test_push_new_branch_revision_count(self):
93
116
out, err = self.run_bzr('push', 'pushed-to')
95
118
self.assertEqual('', out)
96
self.assertEqual('1 revision(s) pushed.\n', err)
119
self.assertEqual('Created new branch.\n', err)
121
def test_push_only_pushes_history(self):
122
# Knit branches should only push the history for the current revision.
123
format = BzrDirMetaFormat1()
124
format.repository_format = RepositoryFormatKnit1()
125
shared_repo = self.make_repository('repo', format=format, shared=True)
126
shared_repo.set_make_working_trees(True)
128
def make_shared_tree(path):
129
shared_repo.bzrdir.root_transport.mkdir(path)
130
shared_repo.bzrdir.create_branch_convenience('repo/' + path)
131
return WorkingTree.open('repo/' + path)
132
tree_a = make_shared_tree('a')
133
self.build_tree(['repo/a/file'])
135
tree_a.commit('commit a-1', rev_id='a-1')
136
f = open('repo/a/file', 'ab')
137
f.write('more stuff\n')
139
tree_a.commit('commit a-2', rev_id='a-2')
141
tree_b = make_shared_tree('b')
142
self.build_tree(['repo/b/file'])
144
tree_b.commit('commit b-1', rev_id='b-1')
146
self.assertTrue(shared_repo.has_revision('a-1'))
147
self.assertTrue(shared_repo.has_revision('a-2'))
148
self.assertTrue(shared_repo.has_revision('b-1'))
150
# Now that we have a repository with shared files, make sure
151
# that things aren't copied out by a 'push'
153
self.run_bzr('push', '../../push-b')
154
pushed_tree = WorkingTree.open('../../push-b')
155
pushed_repo = pushed_tree.branch.repository
156
self.assertFalse(pushed_repo.has_revision('a-1'))
157
self.assertFalse(pushed_repo.has_revision('a-2'))
158
self.assertTrue(pushed_repo.has_revision('b-1'))
160
def test_push_funky_id(self):
161
t = self.make_branch_and_tree('tree')
163
self.build_tree(['filename'])
164
t.add('filename', 'funky-chars<>%&;"\'')
165
t.commit('commit filename')
166
self.run_bzr('push', '../new-tree')
168
def test_push_dash_d(self):
169
t = self.make_branch_and_tree('from')
170
t.commit(allow_pointless=True,
171
message='first commit')
172
self.runbzr('push -d from to-one')
173
self.failUnlessExists('to-one')
174
self.runbzr('push -d %s %s'
175
% tuple(map(urlutils.local_path_to_url, ['from', 'to-two'])))
176
self.failUnlessExists('to-two')
178
def create_simple_tree(self):
179
tree = self.make_branch_and_tree('tree')
180
self.build_tree(['tree/a'])
181
tree.add(['a'], ['a-id'])
182
tree.commit('one', rev_id='r1')
185
def test_push_create_prefix(self):
186
"""'bzr push --create-prefix' will create leading directories."""
187
tree = self.create_simple_tree()
189
self.run_bzr_error(['Parent directory of ../new/tree does not exist'],
190
'push', '../new/tree',
192
self.run_bzr('push', '../new/tree', '--create-prefix',
194
new_tree = WorkingTree.open('new/tree')
195
self.assertEqual(tree.last_revision(), new_tree.last_revision())
196
self.failUnlessExists('new/tree/a')
198
def test_push_use_existing(self):
199
"""'bzr push --use-existing-dir' can push into an existing dir.
201
By default, 'bzr push' will not use an existing, non-versioned dir.
203
tree = self.create_simple_tree()
204
self.build_tree(['target/'])
206
self.run_bzr_error(['Target directory ../target already exists',
207
'Supply --use-existing-dir',
208
], 'push', '../target',
211
self.run_bzr('push', '--use-existing-dir', '../target',
214
new_tree = WorkingTree.open('target')
215
self.assertEqual(tree.last_revision(), new_tree.last_revision())
216
# The push should have created target/a
217
self.failUnlessExists('target/a')
219
def test_push_onto_repo(self):
220
"""We should be able to 'bzr push' into an existing bzrdir."""
221
tree = self.create_simple_tree()
222
repo = self.make_repository('repo', shared=True)
224
self.run_bzr('push', '../repo',
227
# Pushing onto an existing bzrdir will create a repository and
228
# branch as needed, but will only create a working tree if there was
230
self.assertRaises(errors.NoWorkingTree, WorkingTree.open, 'repo')
231
new_branch = Branch.open('repo')
232
self.assertEqual(tree.last_revision(), new_branch.last_revision())
234
def test_push_onto_just_bzrdir(self):
235
"""We don't handle when the target is just a bzrdir.
237
Because you shouldn't be able to create *just* a bzrdir in the wild.
239
# TODO: jam 20070109 Maybe it would be better to create the repository
241
tree = self.create_simple_tree()
242
a_bzrdir = self.make_bzrdir('dir')
244
self.run_bzr_error(['At ../dir you have a valid .bzr control'],