1
1
# Copyright (C) 2005 by Canonical Ltd
2
2
# -*- coding: utf-8 -*-
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
6
6
# the Free Software Foundation; either version 2 of the License, or
7
7
# (at your option) any later version.
9
9
# This program is distributed in the hope that it will be useful,
10
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
12
# GNU General Public License for more details.
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
"""Black-box tests for bzr push.
19
"""Black-box tests for bzr push."""
24
24
from bzrlib.branch import Branch
25
from bzrlib.bzrdir import BzrDirMetaFormat1
25
26
from bzrlib.osutils import abspath
27
from bzrlib.repository import RepositoryFormatKnit1
26
28
from bzrlib.tests.blackbox import ExternalBase
27
29
from bzrlib.uncommit import uncommit
30
from bzrlib.urlutils import local_path_from_url
31
from bzrlib.workingtree import WorkingTree
30
34
class TestPush(ExternalBase):
49
53
tree_b.commit('commit c')
50
54
# initial push location must be empty
51
55
self.assertEqual(None, branch_b.get_push_location())
52
57
# test push for failure without push location set
53
58
os.chdir('branch_a')
54
59
out = self.runbzr('push', retcode=3)
55
60
self.assertEquals(out,
56
61
('','bzr: ERROR: No push location known or specified.\n'))
63
# test not remembered if cannot actually push
64
self.run_bzr('push', '../path/which/doesnt/exist', retcode=3)
65
out = self.run_bzr('push', retcode=3)
67
('', 'bzr: ERROR: No push location known or specified.\n'),
57
70
# test implicit --remember when no push location set, push fails
58
out = self.runbzr('push ../branch_b', retcode=3)
71
out = self.run_bzr('push', '../branch_b', retcode=3)
59
72
self.assertEquals(out,
60
73
('','bzr: ERROR: These branches have diverged. '
61
74
'Try a merge then push with overwrite.\n'))
62
75
self.assertEquals(abspath(branch_a.get_push_location()),
63
76
abspath(branch_b.bzrdir.root_transport.base))
64
78
# test implicit --remember after resolving previous failure
65
79
uncommit(branch=branch_b, tree=tree_b)
66
80
transport.delete('branch_b/c')
68
self.assertEquals(abspath(branch_a.get_push_location()),
69
abspath(branch_b.bzrdir.root_transport.base))
81
out = self.run_bzr('push')
82
path = branch_a.get_push_location()
83
self.assertEquals(('Using saved location: %s\n'
84
% (local_path_from_url(path),)
85
, 'All changes applied successfully.\n'
86
'1 revision(s) pushed.\n'), out)
87
self.assertEqual(path,
88
branch_b.bzrdir.root_transport.base)
70
89
# 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))
90
self.run_bzr('push', '../branch_c', '--remember')
91
self.assertEquals(branch_a.get_push_location(),
92
branch_c.bzrdir.root_transport.base)
94
def test_push_without_tree(self):
95
# bzr push from a branch that does not have a checkout should work.
96
b = self.make_branch('.')
97
out, err = self.run_bzr('push', 'pushed-location')
98
self.assertEqual('', out)
99
self.assertEqual('0 revision(s) pushed.\n', err)
100
b2 = bzrlib.branch.Branch.open('pushed-location')
101
self.assertEndsWith(b2.base, 'pushed-location/')
103
def test_push_new_branch_revision_count(self):
104
# bzr push of a branch with revisions to a new location
105
# should print the number of revisions equal to the length of the
107
t = self.make_branch_and_tree('tree')
108
self.build_tree(['tree/file'])
112
out, err = self.run_bzr('push', 'pushed-to')
114
self.assertEqual('', out)
115
self.assertEqual('1 revision(s) pushed.\n', err)
117
def test_push_only_pushes_history(self):
118
# Knit branches should only push the history for the current revision.
119
format = BzrDirMetaFormat1()
120
format.repository_format = RepositoryFormatKnit1()
121
shared_repo = self.make_repository('repo', format=format, shared=True)
122
shared_repo.set_make_working_trees(True)
124
def make_shared_tree(path):
125
shared_repo.bzrdir.root_transport.mkdir(path)
126
shared_repo.bzrdir.create_branch_convenience('repo/' + path)
127
return WorkingTree.open('repo/' + path)
128
tree_a = make_shared_tree('a')
129
self.build_tree(['repo/a/file'])
131
tree_a.commit('commit a-1', rev_id='a-1')
132
f = open('repo/a/file', 'ab')
133
f.write('more stuff\n')
135
tree_a.commit('commit a-2', rev_id='a-2')
137
tree_b = make_shared_tree('b')
138
self.build_tree(['repo/b/file'])
140
tree_b.commit('commit b-1', rev_id='b-1')
142
self.assertTrue(shared_repo.has_revision('a-1'))
143
self.assertTrue(shared_repo.has_revision('a-2'))
144
self.assertTrue(shared_repo.has_revision('b-1'))
146
# Now that we have a repository with shared files, make sure
147
# that things aren't copied out by a 'push'
149
self.run_bzr('push', '../../push-b')
150
pushed_tree = WorkingTree.open('../../push-b')
151
pushed_repo = pushed_tree.branch.repository
152
self.assertFalse(pushed_repo.has_revision('a-1'))
153
self.assertFalse(pushed_repo.has_revision('a-2'))
154
self.assertTrue(pushed_repo.has_revision('b-1'))
156
def test_push_funky_id(self):
157
t = self.make_branch_and_tree('tree')
159
self.build_tree(['filename'])
160
t.add('filename', 'funky-chars<>%&;"\'')
161
t.commit('commit filename')
162
self.run_bzr('push', '../new-tree')