~bzr-pqm/bzr/bzr.dev

720 by Martin Pool
- start moving external tests into the testsuite framework
1
# Copyright (C) 2005 by Canonical Ltd
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
2
# -*- coding: utf-8 -*-
720 by Martin Pool
- start moving external tests into the testsuite framework
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
"""Black-box tests for bzr.
20
21
These check that it behaves properly when it's invoked through the regular
1403 by Robert Collins
merge from martin
22
command-line interface. This doesn't actually run a new interpreter but 
1393.1.45 by Martin Pool
doc
23
rather starts again from the run_bzr function.
720 by Martin Pool
- start moving external tests into the testsuite framework
24
"""
25
1393.1.45 by Martin Pool
doc
26
1185.1.25 by Robert Collins
merge David Clymer's patch for TestCaseInTestDir.runcmd
27
from cStringIO import StringIO
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
28
import os
1185.16.43 by Martin Pool
- clean up handling of option objects
29
import re
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
30
import shutil
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
31
import sys
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
32
33
from bzrlib.branch import Branch
1432 by Robert Collins
branch: namespace
34
from bzrlib.clone import copy_branch
1393.3.3 by Jelmer Vernooij
Add test for empty commit messages.
35
from bzrlib.errors import BzrCommandError
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
36
from bzrlib.osutils import has_symlinks
1414 by Robert Collins
merge in an adjusted version of Jelmer's empty-log detection patch.
37
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
1400.1.1 by Robert Collins
implement a basic test for the ui branch command from http servers
38
from bzrlib.selftest.HTTPTestUtil import TestCaseWithWebserver
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
39
898 by Martin Pool
- add new runbzr method for external tests
40
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
41
class ExternalBase(TestCaseInTempDir):
1185.1.31 by Robert Collins
Change the use of run_bzr to run_bzr_captured in blackbox tests - inspired by David Clymers patch to change run_bzr usage to runbzr
42
1185.3.23 by Martin Pool
- run some previously external tests in process
43
    def runbzr(self, args, retcode=0, backtick=False):
898 by Martin Pool
- add new runbzr method for external tests
44
        if isinstance(args, basestring):
45
            args = args.split()
1074 by Martin Pool
- check for email address in BRANCH_ROOT/.bzr/email, so you can
46
47
        if backtick:
1185.3.23 by Martin Pool
- run some previously external tests in process
48
            return self.run_bzr_captured(args, retcode=retcode)[0]
1074 by Martin Pool
- check for email address in BRANCH_ROOT/.bzr/email, so you can
49
        else:
1185.3.23 by Martin Pool
- run some previously external tests in process
50
            return self.run_bzr_captured(args, retcode=retcode)
904 by Martin Pool
- more selftest external-command fixes
51
1142 by Martin Pool
- remove dead code from blackbox tests (pychecker)
52
1102 by Martin Pool
- merge test refactoring from robertc
53
class TestCommands(ExternalBase):
54
55
    def test_help_commands(self):
898 by Martin Pool
- add new runbzr method for external tests
56
        self.runbzr('--help')
57
        self.runbzr('help')
58
        self.runbzr('help commands')
59
        self.runbzr('help help')
60
        self.runbzr('commit -h')
727 by Martin Pool
- move more code to run external commands from testbzr to selftest
61
1102 by Martin Pool
- merge test refactoring from robertc
62
    def test_init_branch(self):
898 by Martin Pool
- add new runbzr method for external tests
63
        self.runbzr(['init'])
732 by Martin Pool
- move more tests into bzr selftest
64
1185.16.138 by Martin Pool
[patch] 'bzr init DIR' (John)
65
        # Can it handle subdirectories as well?
66
        self.runbzr('init subdir1')
67
        self.assert_(os.path.exists('subdir1'))
68
        self.assert_(os.path.exists('subdir1/.bzr'))
69
70
        self.runbzr('init subdir2/nothere', retcode=2)
71
        
72
        os.mkdir('subdir2')
73
        self.runbzr('init subdir2')
74
        self.runbzr('init subdir2', retcode=1)
75
76
        self.runbzr('init subdir2/subsubdir1')
77
        self.assert_(os.path.exists('subdir2/subsubdir1/.bzr'))
78
1102 by Martin Pool
- merge test refactoring from robertc
79
    def test_whoami(self):
732 by Martin Pool
- move more tests into bzr selftest
80
        # this should always identify something, if only "john@localhost"
898 by Martin Pool
- add new runbzr method for external tests
81
        self.runbzr("whoami")
82
        self.runbzr("whoami --email")
1074 by Martin Pool
- check for email address in BRANCH_ROOT/.bzr/email, so you can
83
84
        self.assertEquals(self.runbzr("whoami --email",
85
                                      backtick=True).count('@'), 1)
86
        
1102 by Martin Pool
- merge test refactoring from robertc
87
    def test_whoami_branch(self):
88
        """branch specific user identity works."""
1074 by Martin Pool
- check for email address in BRANCH_ROOT/.bzr/email, so you can
89
        self.runbzr('init')
90
        f = file('.bzr/email', 'wt')
91
        f.write('Branch Identity <branch@identi.ty>')
92
        f.close()
1185.6.1 by John Arbash Meinel
Updated the whomai test to handle BZREMAIL
93
        bzr_email = os.environ.get('BZREMAIL')
94
        if bzr_email is not None:
95
            del os.environ['BZREMAIL']
1074 by Martin Pool
- check for email address in BRANCH_ROOT/.bzr/email, so you can
96
        whoami = self.runbzr("whoami",backtick=True)
97
        whoami_email = self.runbzr("whoami --email",backtick=True)
98
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
99
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
1185.6.1 by John Arbash Meinel
Updated the whomai test to handle BZREMAIL
100
        # Verify that the environment variable overrides the value 
101
        # in the file
102
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
103
        whoami = self.runbzr("whoami",backtick=True)
104
        whoami_email = self.runbzr("whoami --email",backtick=True)
105
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
106
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
107
        if bzr_email is not None:
108
            os.environ['BZREMAIL'] = bzr_email
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
109
1102 by Martin Pool
- merge test refactoring from robertc
110
    def test_invalid_commands(self):
898 by Martin Pool
- add new runbzr method for external tests
111
        self.runbzr("pants", retcode=1)
112
        self.runbzr("--pants off", retcode=1)
113
        self.runbzr("diff --message foo", retcode=1)
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
114
1102 by Martin Pool
- merge test refactoring from robertc
115
    def test_empty_commit(self):
898 by Martin Pool
- add new runbzr method for external tests
116
        self.runbzr("init")
885 by Martin Pool
- commit command refuses unless something is changed or --unchanged is given
117
        self.build_tree(['hello.txt'])
898 by Martin Pool
- add new runbzr method for external tests
118
        self.runbzr("commit -m empty", retcode=1)
119
        self.runbzr("add hello.txt")
1185.34.4 by Jelmer Vernooij
Support -r option to bzr status. The backend code already handled
120
        self.runbzr("commit -m added")       
885 by Martin Pool
- commit command refuses unless something is changed or --unchanged is given
121
1393.3.3 by Jelmer Vernooij
Add test for empty commit messages.
122
    def test_empty_commit_message(self):
123
        self.runbzr("init")
124
        file('foo.c', 'wt').write('int main() {}')
125
        self.runbzr(['add', 'foo.c'])
1414 by Robert Collins
merge in an adjusted version of Jelmer's empty-log detection patch.
126
        self.runbzr(["commit", "-m", ""] , retcode=1) 
1393.3.3 by Jelmer Vernooij
Add test for empty commit messages.
127
1185.12.101 by Aaron Bentley
Made commit take branch from first argument, if supplied.
128
    def test_other_branch_commit(self):
129
        # this branch is to ensure consistent behaviour, whether we're run
130
        # inside a branch, or not.
131
        os.mkdir('empty_branch')
132
        os.chdir('empty_branch')
133
        self.runbzr('init')
134
        os.mkdir('branch')
135
        os.chdir('branch')
136
        self.runbzr('init')
137
        file('foo.c', 'wt').write('int main() {}')
138
        file('bar.c', 'wt').write('int main() {}')
139
        os.chdir('..')
140
        self.runbzr(['add', 'branch/foo.c'])
141
        self.runbzr(['add', 'branch'])
142
        # can't commit files in different trees; sane error
143
        self.runbzr('commit -m newstuff branch/foo.c .', retcode=1)
144
        self.runbzr('commit -m newstuff branch/foo.c')
145
        self.runbzr('commit -m newstuff branch')
146
        self.runbzr('commit -m newstuff branch', retcode=1)
147
148
1102 by Martin Pool
- merge test refactoring from robertc
149
    def test_ignore_patterns(self):
906 by Martin Pool
- split out black-box ignore commands
150
        from bzrlib.branch import Branch
151
        
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
152
        b = Branch.initialize('.')
906 by Martin Pool
- split out black-box ignore commands
153
        self.assertEquals(list(b.unknowns()), [])
154
155
        file('foo.tmp', 'wt').write('tmp files are ignored')
156
        self.assertEquals(list(b.unknowns()), [])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
157
        self.assertEquals(self.capture('unknowns'), '')
906 by Martin Pool
- split out black-box ignore commands
158
159
        file('foo.c', 'wt').write('int main() {}')
160
        self.assertEquals(list(b.unknowns()), ['foo.c'])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
161
        self.assertEquals(self.capture('unknowns'), 'foo.c\n')
906 by Martin Pool
- split out black-box ignore commands
162
163
        self.runbzr(['add', 'foo.c'])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
164
        self.assertEquals(self.capture('unknowns'), '')
906 by Martin Pool
- split out black-box ignore commands
165
166
        # 'ignore' works when creating the .bzignore file
167
        file('foo.blah', 'wt').write('blah')
168
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
169
        self.runbzr('ignore *.blah')
170
        self.assertEquals(list(b.unknowns()), [])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
171
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\n')
906 by Martin Pool
- split out black-box ignore commands
172
173
        # 'ignore' works when then .bzrignore file already exists
174
        file('garh', 'wt').write('garh')
175
        self.assertEquals(list(b.unknowns()), ['garh'])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
176
        self.assertEquals(self.capture('unknowns'), 'garh\n')
906 by Martin Pool
- split out black-box ignore commands
177
        self.runbzr('ignore garh')
178
        self.assertEquals(list(b.unknowns()), [])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
179
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\ngarh\n')
1102 by Martin Pool
- merge test refactoring from robertc
180
181
    def test_revert(self):
182
        self.runbzr('init')
183
184
        file('hello', 'wt').write('foo')
185
        self.runbzr('add hello')
186
        self.runbzr('commit -m setup hello')
187
188
        file('goodbye', 'wt').write('baz')
189
        self.runbzr('add goodbye')
190
        self.runbzr('commit -m setup goodbye')
1092.2.18 by Robert Collins
merge from symlink branch
191
1102 by Martin Pool
- merge test refactoring from robertc
192
        file('hello', 'wt').write('bar')
193
        file('goodbye', 'wt').write('qux')
194
        self.runbzr('revert hello')
195
        self.check_file_contents('hello', 'foo')
196
        self.check_file_contents('goodbye', 'qux')
197
        self.runbzr('revert')
198
        self.check_file_contents('goodbye', 'baz')
199
200
        os.mkdir('revertdir')
201
        self.runbzr('add revertdir')
202
        self.runbzr('commit -m f')
203
        os.rmdir('revertdir')
204
        self.runbzr('revert')
205
1092.2.18 by Robert Collins
merge from symlink branch
206
        os.symlink('/unlikely/to/exist', 'symlink')
207
        self.runbzr('add symlink')
208
        self.runbzr('commit -m f')
209
        os.unlink('symlink')
210
        self.runbzr('revert')
1448 by Robert Collins
revert symlinks correctly
211
        self.failUnlessExists('symlink')
212
        os.unlink('symlink')
213
        os.symlink('a-different-path', 'symlink')
214
        self.runbzr('revert')
215
        self.assertEqual('/unlikely/to/exist',
216
                         os.readlink('symlink'))
1092.2.18 by Robert Collins
merge from symlink branch
217
        
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
218
        file('hello', 'wt').write('xyz')
219
        self.runbzr('commit -m xyz hello')
220
        self.runbzr('revert -r 1 hello')
221
        self.check_file_contents('hello', 'foo')
222
        self.runbzr('revert hello')
223
        self.check_file_contents('hello', 'xyz')
1185.8.5 by Aaron Bentley
Fixed non-tree-root bug in branch, revert, merge
224
        os.chdir('revertdir')
225
        self.runbzr('revert')
226
        os.chdir('..')
227
1185.34.4 by Jelmer Vernooij
Support -r option to bzr status. The backend code already handled
228
    def test_status(self):
229
        self.runbzr("init")
230
        self.build_tree(['hello.txt'])
231
        result = self.runbzr("status")
232
        self.assert_("unknown:\n  hello.txt\n" in result, result)
233
        self.runbzr("add hello.txt")
234
        result = self.runbzr("status")
235
        self.assert_("added:\n  hello.txt\n" in result, result)
236
        self.runbzr("commit -m added")
237
        result = self.runbzr("status -r 0..1")
238
        self.assert_("added:\n  hello.txt\n" in result, result)
239
        self.build_tree(['world.txt'])
240
        result = self.runbzr("status -r 0")
241
        self.assert_("added:\n  hello.txt\n" \
242
                     "unknown:\n  world.txt\n" in result, result)
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
243
1185.1.8 by Robert Collins
David Clymers patch to use rename rather than mv for two argument non-directory target bzr mv calls.
244
    def test_mv_modes(self):
1102 by Martin Pool
- merge test refactoring from robertc
245
        """Test two modes of operation for mv"""
246
        from bzrlib.branch import Branch
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
247
        b = Branch.initialize('.')
1102 by Martin Pool
- merge test refactoring from robertc
248
        self.build_tree(['a', 'c', 'subdir/'])
1185.1.31 by Robert Collins
Change the use of run_bzr to run_bzr_captured in blackbox tests - inspired by David Clymers patch to change run_bzr usage to runbzr
249
        self.run_bzr_captured(['add', self.test_dir])
250
        self.run_bzr_captured(['mv', 'a', 'b'])
251
        self.run_bzr_captured(['mv', 'b', 'subdir'])
252
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
253
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
254
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
1102 by Martin Pool
- merge test refactoring from robertc
255
256
    def test_main_version(self):
257
        """Check output from version command and master option is reasonable"""
258
        # output is intentionally passed through to stdout so that we
259
        # can see the version being tested
260
        output = self.runbzr('version', backtick=1)
261
        self.log('bzr version output:')
262
        self.log(output)
263
        self.assert_(output.startswith('bzr (bazaar-ng) '))
264
        self.assertNotEqual(output.index('Canonical'), -1)
265
        # make sure --version is consistent
266
        tmp_output = self.runbzr('--version', backtick=1)
267
        self.log('bzr --version output:')
268
        self.log(tmp_output)
269
        self.assertEquals(output, tmp_output)
906 by Martin Pool
- split out black-box ignore commands
270
1092.1.39 by Robert Collins
merge from mpool
271
    def example_branch(test):
272
        test.runbzr('init')
273
        file('hello', 'wt').write('foo')
274
        test.runbzr('add hello')
275
        test.runbzr('commit -m setup hello')
276
        file('goodbye', 'wt').write('baz')
277
        test.runbzr('add goodbye')
278
        test.runbzr('commit -m setup goodbye')
279
1185.12.1 by Aaron Bentley
Fixed export
280
    def test_export(self):
281
        os.mkdir('branch')
282
        os.chdir('branch')
283
        self.example_branch()
284
        self.runbzr('export ../latest')
285
        self.assertEqual(file('../latest/goodbye', 'rt').read(), 'baz')
286
        self.runbzr('export ../first -r 1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
287
        self.assert_(not os.path.exists('../first/goodbye'))
1185.12.1 by Aaron Bentley
Fixed export
288
        self.assertEqual(file('../first/hello', 'rt').read(), 'foo')
289
        self.runbzr('export ../first.gz -r 1')
290
        self.assertEqual(file('../first.gz/hello', 'rt').read(), 'foo')
291
        self.runbzr('export ../first.bz2 -r 1')
292
        self.assertEqual(file('../first.bz2/hello', 'rt').read(), 'foo')
293
        self.runbzr('export ../first.tar -r 1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
294
        self.assert_(os.path.isfile('../first.tar'))
1185.12.1 by Aaron Bentley
Fixed export
295
        from tarfile import TarFile
296
        tf = TarFile('../first.tar')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
297
        self.assert_('first/hello' in tf.getnames(), tf.getnames())
1185.12.1 by Aaron Bentley
Fixed export
298
        self.assertEqual(tf.extractfile('first/hello').read(), 'foo')
299
        self.runbzr('export ../first.tar.gz -r 1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
300
        self.assert_(os.path.isfile('../first.tar.gz'))
1185.12.1 by Aaron Bentley
Fixed export
301
        self.runbzr('export ../first.tbz2 -r 1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
302
        self.assert_(os.path.isfile('../first.tbz2'))
1185.12.1 by Aaron Bentley
Fixed export
303
        self.runbzr('export ../first.tar.bz2 -r 1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
304
        self.assert_(os.path.isfile('../first.tar.bz2'))
1185.12.1 by Aaron Bentley
Fixed export
305
        self.runbzr('export ../first.tar.tbz2 -r 1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
306
        self.assert_(os.path.isfile('../first.tar.tbz2'))
1185.12.1 by Aaron Bentley
Fixed export
307
        from bz2 import BZ2File
308
        tf = TarFile('../first.tar.tbz2', 
309
                     fileobj=BZ2File('../first.tar.tbz2', 'r'))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
310
        self.assert_('first.tar/hello' in tf.getnames(), tf.getnames())
1185.12.1 by Aaron Bentley
Fixed export
311
        self.assertEqual(tf.extractfile('first.tar/hello').read(), 'foo')
312
        self.runbzr('export ../first2.tar -r 1 --root pizza')
313
        tf = TarFile('../first2.tar')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
314
        self.assert_('pizza/hello' in tf.getnames(), tf.getnames())
1185.12.1 by Aaron Bentley
Fixed export
315
1185.4.1 by Lalo Martins
blackbox tests for diff
316
    def test_diff(self):
317
        self.example_branch()
318
        file('hello', 'wt').write('hello world!')
319
        self.runbzr('commit -m fixing hello')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
320
        output = self.runbzr('diff -r 2..3', backtick=1, retcode=1)
1185.4.1 by Lalo Martins
blackbox tests for diff
321
        self.assert_('\n+hello world!' in output)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
322
        output = self.runbzr('diff -r last:3..last:1', backtick=1, retcode=1)
1185.4.1 by Lalo Martins
blackbox tests for diff
323
        self.assert_('\n+baz' in output)
324
1432 by Robert Collins
branch: namespace
325
    def test_diff_branches(self):
326
        self.build_tree(['branch1/', 'branch1/file', 'branch2/'])
327
        branch = Branch.initialize('branch1')
328
        branch.add(['file'])
329
        branch.commit('add file')
330
        copy_branch(branch, 'branch2')
331
        print >> open('branch2/file', 'w'), 'new content'
332
        branch2 = Branch.open('branch2')
333
        branch2.commit('update file')
334
        # should open branch1 and diff against branch2, 
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
335
        output = self.run_bzr_captured(['diff', '-r', 'branch:branch2', 
336
                                        'branch1'],
337
                                       retcode=1)
1432 by Robert Collins
branch: namespace
338
        self.assertEquals(("=== modified file 'file'\n"
339
                           "--- file\n"
340
                           "+++ file\n"
341
                           "@@ -1,1 +1,1 @@\n"
342
                           "-new content\n"
343
                           "+contents of branch1/file\n"
344
                           "\n", ''), output)
345
1185.8.4 by Aaron Bentley
Fixed branch -r
346
    def test_branch(self):
347
        """Branch from one branch to another."""
348
        os.mkdir('a')
349
        os.chdir('a')
350
        self.example_branch()
351
        os.chdir('..')
352
        self.runbzr('branch a b')
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
353
        self.assertFileEqual('b\n', 'b/.bzr/branch-name')
1185.8.4 by Aaron Bentley
Fixed branch -r
354
        self.runbzr('branch a c -r 1')
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
355
        os.chdir('b')
356
        self.runbzr('commit -m foo --unchanged')
357
        os.chdir('..')
1391 by Robert Collins
merge from integration
358
        # naughty - abstraction violations RBC 20050928  
1393 by Robert Collins
reenable remotebranch tests
359
        print "test_branch used to delete the stores, how is this meant to work ?"
360
        #shutil.rmtree('a/.bzr/revision-store')
361
        #shutil.rmtree('a/.bzr/inventory-store', ignore_errors=True)
362
        #shutil.rmtree('a/.bzr/text-store', ignore_errors=True)
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
363
        self.runbzr('branch a d --basis b')
1185.8.4 by Aaron Bentley
Fixed branch -r
364
1092.1.39 by Robert Collins
merge from mpool
365
    def test_merge(self):
366
        from bzrlib.branch import Branch
1139 by Martin Pool
- merge in merge improvements and additional tests
367
        
1092.1.39 by Robert Collins
merge from mpool
368
        os.mkdir('a')
369
        os.chdir('a')
370
        self.example_branch()
371
        os.chdir('..')
372
        self.runbzr('branch a b')
373
        os.chdir('b')
374
        file('goodbye', 'wt').write('quux')
375
        self.runbzr(['commit',  '-m',  "more u's are always good"])
376
377
        os.chdir('../a')
378
        file('hello', 'wt').write('quuux')
379
        # We can't merge when there are in-tree changes
380
        self.runbzr('merge ../b', retcode=1)
381
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
1185.12.84 by Aaron Bentley
got merge type selection under test
382
        self.runbzr('merge ../b -r last:1..last:1 --merge-type blooof',
383
                    retcode=1)
384
        self.runbzr('merge ../b -r last:1..last:1 --merge-type merge3')
385
        self.runbzr('revert --no-backup')
386
        self.runbzr('merge ../b -r last:1..last:1 --merge-type weave')
1185.12.46 by Aaron Bentley
Fixed -r brokenness in merge
387
        self.runbzr('revert --no-backup')
1185.24.3 by Aaron Bentley
Integrated reprocessing into the rest of the merge stuff
388
        self.runbzr('merge ../b -r last:1..last:1 --reprocess')
389
        self.runbzr('revert --no-backup')
1185.12.46 by Aaron Bentley
Fixed -r brokenness in merge
390
        self.runbzr('merge ../b -r last:1')
1092.1.39 by Robert Collins
merge from mpool
391
        self.check_file_contents('goodbye', 'quux')
392
        # Merging a branch pulls its revision into the tree
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
393
        a = Branch.open('.')
394
        b = Branch.open('../b')
1241 by Martin Pool
- rename last_patch to last_revision
395
        a.get_revision_xml(b.last_revision())
1139 by Martin Pool
- merge in merge improvements and additional tests
396
        self.log('pending merges: %s', a.pending_merges())
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
397
        self.assertEquals(a.pending_merges(), [b.last_revision()])
1185.12.77 by Aaron Bentley
Prevented all ancestors from being marked as pending merges
398
        self.runbzr('commit -m merged')
399
        self.runbzr('merge ../b -r last:1')
400
        self.assertEqual(Branch.open('.').pending_merges(), [])
401
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
402
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
403
    def test_merge_with_missing_file(self):
404
        """Merge handles missing file conflicts"""
405
        os.mkdir('a')
406
        os.chdir('a')
407
        os.mkdir('sub')
408
        print >> file('sub/a.txt', 'wb'), "hello"
1185.10.10 by Aaron Bentley
Handled modified files missing from THIS
409
        print >> file('b.txt', 'wb'), "hello"
410
        print >> file('sub/c.txt', 'wb'), "hello"
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
411
        self.runbzr('init')
412
        self.runbzr('add')
413
        self.runbzr(('commit', '-m', 'added a'))
414
        self.runbzr('branch . ../b')
415
        print >> file('sub/a.txt', 'ab'), "there"
1185.10.10 by Aaron Bentley
Handled modified files missing from THIS
416
        print >> file('b.txt', 'ab'), "there"
417
        print >> file('sub/c.txt', 'ab'), "there"
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
418
        self.runbzr(('commit', '-m', 'Added there'))
419
        os.unlink('sub/a.txt')
1185.10.10 by Aaron Bentley
Handled modified files missing from THIS
420
        os.unlink('sub/c.txt')
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
421
        os.rmdir('sub')
1185.10.10 by Aaron Bentley
Handled modified files missing from THIS
422
        os.unlink('b.txt')
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
423
        self.runbzr(('commit', '-m', 'Removed a.txt'))
424
        os.chdir('../b')
425
        print >> file('sub/a.txt', 'ab'), "something"
1185.10.10 by Aaron Bentley
Handled modified files missing from THIS
426
        print >> file('b.txt', 'ab'), "something"
427
        print >> file('sub/c.txt', 'ab'), "something"
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
428
        self.runbzr(('commit', '-m', 'Modified a.txt'))
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
429
        self.runbzr('merge ../a/', retcode=1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
430
        self.assert_(os.path.exists('sub/a.txt.THIS'))
431
        self.assert_(os.path.exists('sub/a.txt.BASE'))
1185.10.10 by Aaron Bentley
Handled modified files missing from THIS
432
        os.chdir('../a')
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
433
        self.runbzr('merge ../b/', retcode=1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
434
        self.assert_(os.path.exists('sub/a.txt.OTHER'))
435
        self.assert_(os.path.exists('sub/a.txt.BASE'))
1185.10.8 by Aaron Bentley
Conflict handling where OTHER is deleted
436
974.1.71 by Aaron Bentley
Added test for pull
437
    def test_pull(self):
438
        """Pull changes from one branch to another."""
439
        os.mkdir('a')
440
        os.chdir('a')
441
442
        self.example_branch()
974.1.79 by Aaron Bentley
Fixed issues with pull not having a default location after branch
443
        self.runbzr('pull', retcode=1)
444
        self.runbzr('missing', retcode=1)
445
        self.runbzr('missing .')
446
        self.runbzr('missing')
447
        self.runbzr('pull')
448
        self.runbzr('pull /', retcode=1)
449
        self.runbzr('pull')
450
974.1.71 by Aaron Bentley
Added test for pull
451
        os.chdir('..')
452
        self.runbzr('branch a b')
453
        os.chdir('b')
974.1.79 by Aaron Bentley
Fixed issues with pull not having a default location after branch
454
        self.runbzr('pull')
1185.8.5 by Aaron Bentley
Fixed non-tree-root bug in branch, revert, merge
455
        os.mkdir('subdir')
456
        self.runbzr('add subdir')
974.1.71 by Aaron Bentley
Added test for pull
457
        self.runbzr('commit -m blah --unchanged')
458
        os.chdir('../a')
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
459
        a = Branch.open('.')
460
        b = Branch.open('../b')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
461
        self.assertEquals(a.revision_history(), b.revision_history()[:-1])
974.1.71 by Aaron Bentley
Added test for pull
462
        self.runbzr('pull ../b')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
463
        self.assertEquals(a.revision_history(), b.revision_history())
974.1.71 by Aaron Bentley
Added test for pull
464
        self.runbzr('commit -m blah2 --unchanged')
465
        os.chdir('../b')
466
        self.runbzr('commit -m blah3 --unchanged')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
467
        # no overwrite
974.1.71 by Aaron Bentley
Added test for pull
468
        self.runbzr('pull ../a', retcode=1)
1442.1.68 by Robert Collins
'bzr pull' now accepts '--clobber'.
469
        os.chdir('..')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
470
        self.runbzr('branch b overwriteme')
471
        os.chdir('overwriteme')
472
        self.runbzr('pull --overwrite ../a')
473
        overwritten = Branch.open('.')
474
        self.assertEqual(overwritten.revision_history(),
1442.1.68 by Robert Collins
'bzr pull' now accepts '--clobber'.
475
                         a.revision_history())
974.1.74 by Aaron Bentley
Made pull work after remote branch has merged latest revision
476
        os.chdir('../a')
477
        self.runbzr('merge ../b')
478
        self.runbzr('commit -m blah4 --unchanged')
1185.8.5 by Aaron Bentley
Fixed non-tree-root bug in branch, revert, merge
479
        os.chdir('../b/subdir')
480
        self.runbzr('pull ../../a')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
481
        self.assertEquals(a.revision_history()[-1], b.revision_history()[-1])
1185.10.7 by Aaron Bentley
Fixed bug where pull throws DivergedBranches if branch is newer than upstream
482
        self.runbzr('commit -m blah5 --unchanged')
483
        self.runbzr('commit -m blah6 --unchanged')
484
        os.chdir('..')
485
        self.runbzr('pull ../a')
486
        os.chdir('../a')
487
        self.runbzr('commit -m blah7 --unchanged')
488
        self.runbzr('merge ../b')
489
        self.runbzr('commit -m blah8 --unchanged')
490
        self.runbzr('pull ../b')
491
        self.runbzr('pull ../b')
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
492
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
493
    def test_ls(self):
494
        """Test the abilities of 'bzr ls'"""
495
        bzr = self.runbzr
496
        def bzrout(*args, **kwargs):
497
            kwargs['backtick'] = True
498
            return self.runbzr(*args, **kwargs)
499
500
        def ls_equals(value, *args):
501
            out = self.runbzr(['ls'] + list(args), backtick=True)
502
            self.assertEquals(out, value)
503
504
        bzr('init')
505
        open('a', 'wb').write('hello\n')
506
507
        # Can't supply both
508
        bzr('ls --verbose --null', retcode=1)
509
510
        ls_equals('a\n')
511
        ls_equals('?        a\n', '--verbose')
512
        ls_equals('a\n', '--unknown')
513
        ls_equals('', '--ignored')
514
        ls_equals('', '--versioned')
515
        ls_equals('a\n', '--unknown', '--ignored', '--versioned')
516
        ls_equals('', '--ignored', '--versioned')
517
        ls_equals('a\0', '--null')
518
519
        bzr('add a')
520
        ls_equals('V        a\n', '--verbose')
521
        bzr('commit -m add')
522
        
523
        os.mkdir('subdir')
524
        ls_equals('V        a\n'
525
                  '?        subdir/\n'
526
                  , '--verbose')
527
        open('subdir/b', 'wb').write('b\n')
528
        bzr('add')
529
        ls_equals('V        a\n'
530
                  'V        subdir/\n'
531
                  'V        subdir/b\n'
532
                  , '--verbose')
533
        bzr('commit -m subdir')
534
535
        ls_equals('a\n'
536
                  'subdir\n'
537
                  , '--non-recursive')
538
539
        ls_equals('V        a\n'
540
                  'V        subdir/\n'
541
                  , '--verbose', '--non-recursive')
542
543
        # Check what happens in a sub-directory
544
        os.chdir('subdir')
545
        ls_equals('b\n')
546
        ls_equals('b\0'
547
                  , '--null')
548
        ls_equals('a\n'
549
                  'subdir\n'
550
                  'subdir/b\n'
551
                  , '--from-root')
552
        ls_equals('a\0'
553
                  'subdir\0'
554
                  'subdir/b\0'
555
                  , '--from-root', '--null')
556
        ls_equals('a\n'
557
                  'subdir\n'
558
                  , '--from-root', '--non-recursive')
559
560
        os.chdir('..')
561
562
        # Check what happens when we supply a specific revision
563
        ls_equals('a\n', '--revision', '1')
564
        ls_equals('V        a\n'
565
                  , '--verbose', '--revision', '1')
566
567
        os.chdir('subdir')
568
        ls_equals('', '--revision', '1')
569
1185.26.2 by John Arbash Meinel
Added more tests.
570
        # Now try to do ignored files.
571
        os.chdir('..')
572
        open('blah.py', 'wb').write('unknown\n')
573
        open('blah.pyo', 'wb').write('ignored\n')
574
        ls_equals('a\n'
575
                  'blah.py\n'
576
                  'blah.pyo\n'
577
                  'subdir\n'
578
                  'subdir/b\n')
579
        ls_equals('V        a\n'
580
                  '?        blah.py\n'
581
                  'I        blah.pyo\n'
582
                  'V        subdir/\n'
583
                  'V        subdir/b\n'
584
                  , '--verbose')
585
        ls_equals('blah.pyo\n'
586
                  , '--ignored')
587
        ls_equals('blah.py\n'
588
                  , '--unknown')
589
        ls_equals('a\n'
590
                  'subdir\n'
591
                  'subdir/b\n'
592
                  , '--versioned')
593
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
594
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
595
    def test_locations(self):
596
        """Using and remembering different locations"""
597
        os.mkdir('a')
598
        os.chdir('a')
599
        self.runbzr('init')
600
        self.runbzr('commit -m unchanged --unchanged')
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
601
        self.runbzr('pull', retcode=1)
602
        self.runbzr('merge', retcode=1)
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
603
        self.runbzr('branch . ../b')
604
        os.chdir('../b')
605
        self.runbzr('pull')
606
        self.runbzr('branch . ../c')
607
        self.runbzr('pull ../c')
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
608
        self.runbzr('merge')
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
609
        os.chdir('../a')
610
        self.runbzr('pull ../b')
611
        self.runbzr('pull')
612
        self.runbzr('pull ../c')
613
        self.runbzr('branch ../c ../d')
614
        shutil.rmtree('../c')
615
        self.runbzr('pull')
616
        os.chdir('../b')
617
        self.runbzr('pull')
618
        os.chdir('../d')
619
        self.runbzr('pull', retcode=1)
620
        self.runbzr('pull ../a --remember')
621
        self.runbzr('pull')
974.1.74 by Aaron Bentley
Made pull work after remote branch has merged latest revision
622
        
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
623
    def test_add_reports(self):
624
        """add command prints the names of added files."""
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
625
        b = Branch.initialize('.')
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
626
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
1185.1.31 by Robert Collins
Change the use of run_bzr to run_bzr_captured in blackbox tests - inspired by David Clymers patch to change run_bzr usage to runbzr
627
        out = self.run_bzr_captured(['add'], retcode = 0)[0]
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
628
        # the ordering is not defined at the moment
1185.1.31 by Robert Collins
Change the use of run_bzr to run_bzr_captured in blackbox tests - inspired by David Clymers patch to change run_bzr usage to runbzr
629
        results = sorted(out.rstrip('\n').split('\n'))
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
630
        self.assertEquals(['added dir',
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
631
                           'added dir'+os.sep+'sub.txt',
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
632
                           'added top.txt',],
633
                          results)
634
1446 by Robert Collins
fixup the verbose-does-nothing for add - add a --quiet instead
635
    def test_add_quiet_is(self):
636
        """add -q does not print the names of added files."""
637
        b = Branch.initialize('.')
638
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
639
        out = self.run_bzr_captured(['add', '-q'], retcode = 0)[0]
640
        # the ordering is not defined at the moment
641
        results = sorted(out.rstrip('\n').split('\n'))
642
        self.assertEquals([''], results)
643
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
644
    def test_unknown_command(self):
645
        """Handling of unknown command."""
646
        out, err = self.run_bzr_captured(['fluffy-badger'],
647
                                         retcode=1)
648
        self.assertEquals(out, '')
649
        err.index('unknown command')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
650
651
    def test_conflicts(self):
652
        """Handling of merge conflicts"""
653
        os.mkdir('base')
654
        os.chdir('base')
655
        file('hello', 'wb').write("hi world")
656
        file('answer', 'wb').write("42")
657
        self.runbzr('init')
658
        self.runbzr('add')
659
        self.runbzr('commit -m base')
660
        self.runbzr('branch . ../other')
661
        self.runbzr('branch . ../this')
662
        os.chdir('../other')
663
        file('hello', 'wb').write("Hello.")
664
        file('answer', 'wb').write("Is anyone there?")
665
        self.runbzr('commit -m other')
666
        os.chdir('../this')
667
        file('hello', 'wb').write("Hello, world")
668
        self.runbzr('mv answer question')
669
        file('question', 'wb').write("What do you get when you multiply six"
670
                                   "times nine?")
671
        self.runbzr('commit -m this')
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
672
        self.runbzr('merge ../other --show-base', retcode=1)
1185.18.1 by Aaron Bentley
Added --show-base to merge
673
        conflict_text = file('hello').read()
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
674
        self.assert_('<<<<<<<' in conflict_text)
675
        self.assert_('>>>>>>>' in conflict_text)
676
        self.assert_('=======' in conflict_text)
677
        self.assert_('|||||||' in conflict_text)
678
        self.assert_('hi world' in conflict_text)
1185.18.1 by Aaron Bentley
Added --show-base to merge
679
        self.runbzr('revert')
680
        self.runbzr('resolve --all')
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
681
        self.runbzr('merge ../other', retcode=1)
1185.18.1 by Aaron Bentley
Added --show-base to merge
682
        conflict_text = file('hello').read()
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
683
        self.assert_('|||||||' not in conflict_text)
684
        self.assert_('hi world' not in conflict_text)
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
685
        result = self.runbzr('conflicts', backtick=1)
686
        self.assertEquals(result, "hello\nquestion\n")
1185.14.11 by Aaron Bentley
moved conflict listing into status and stopped monkey-patching
687
        result = self.runbzr('status', backtick=1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
688
        self.assert_("conflicts:\n  hello\n  question\n" in result, result)
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
689
        self.runbzr('resolve hello')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
690
        result = self.runbzr('conflicts', backtick=1)
691
        self.assertEquals(result, "question\n")
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
692
        self.runbzr('commit -m conflicts', retcode=1)
693
        self.runbzr('resolve --all')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
694
        result = self.runbzr('conflicts', backtick=1)
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
695
        self.runbzr('commit -m conflicts')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
696
        self.assertEquals(result, "")
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
697
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
698
    def test_resign(self):
699
        """Test re signing of data."""
700
        import bzrlib.gpg
701
        oldstrategy = bzrlib.gpg.GPGStrategy
702
        branch = Branch.initialize('.')
703
        branch.commit("base", allow_pointless=True, rev_id='A')
704
        try:
705
            # monkey patch gpg signing mechanism
706
            from bzrlib.testament import Testament
707
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
708
            self.runbzr('re-sign -r revid:A')
709
            self.assertEqual(Testament.from_revision(branch,'A').as_short_text(),
710
                             branch.revision_store.get('A', 'sig').read())
711
        finally:
712
            bzrlib.gpg.GPGStrategy = oldstrategy
1483 by Robert Collins
BUGFIX: re-sign should accept ranges
713
            
714
    def test_resign_range(self):
715
        import bzrlib.gpg
716
        oldstrategy = bzrlib.gpg.GPGStrategy
717
        branch = Branch.initialize('.')
718
        branch.commit("base", allow_pointless=True, rev_id='A')
719
        branch.commit("base", allow_pointless=True, rev_id='B')
720
        branch.commit("base", allow_pointless=True, rev_id='C')
721
        try:
722
            # monkey patch gpg signing mechanism
723
            from bzrlib.testament import Testament
724
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
725
            self.runbzr('re-sign -r 1..')
726
            self.assertEqual(Testament.from_revision(branch,'A').as_short_text(),
727
                             branch.revision_store.get('A', 'sig').read())
728
            self.assertEqual(Testament.from_revision(branch,'B').as_short_text(),
729
                             branch.revision_store.get('B', 'sig').read())
730
            self.assertEqual(Testament.from_revision(branch,'C').as_short_text(),
731
                             branch.revision_store.get('C', 'sig').read())
732
        finally:
733
            bzrlib.gpg.GPGStrategy = oldstrategy
734
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
735
    def test_push(self):
736
        # create a source branch
737
        os.mkdir('my-branch')
738
        os.chdir('my-branch')
739
        self.example_branch()
740
741
        # with no push target, fail
742
        self.runbzr('push', retcode=1)
743
        # with an explicit target work
744
        self.runbzr('push ../output-branch')
745
        # with an implicit target work
746
        self.runbzr('push')
747
        # nothing missing
748
        self.runbzr('missing ../output-branch')
749
        # advance this branch
750
        self.runbzr('commit --unchanged -m unchanged')
751
752
        os.chdir('../output-branch')
753
        # should be a diff as we have not pushed the tree
754
        self.runbzr('diff', retcode=1)
755
        self.runbzr('revert')
756
        # but not now.
757
        self.runbzr('diff')
758
        # diverge the branches
759
        self.runbzr('commit --unchanged -m unchanged')
760
        os.chdir('../my-branch')
761
        # cannot push now
762
        self.runbzr('push', retcode=1)
763
        # and there are difference
764
        self.runbzr('missing ../output-branch', retcode=1)
765
        # but we can force a push
766
        self.runbzr('push --overwrite')
767
        # nothing missing
768
        self.runbzr('missing ../output-branch')
1495 by Robert Collins
Add a --create-prefix to the new push command.
769
        
770
        # pushing to a new dir with no parent should fail
771
        self.runbzr('push ../missing/new-branch', retcode=1)
772
        # unless we provide --create-prefix
773
        self.runbzr('push --create-prefix ../missing/new-branch')
774
        # nothing missing
775
        self.runbzr('missing ../missing/new-branch')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
776
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
777
1092.2.6 by Robert Collins
symlink support updated to work
778
def listdir_sorted(dir):
779
    L = os.listdir(dir)
780
    L.sort()
781
    return L
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
782
1092.2.12 by Robert Collins
merge from HEAD
783
904 by Martin Pool
- more selftest external-command fixes
784
class OldTests(ExternalBase):
1092.1.39 by Robert Collins
merge from mpool
785
    """old tests moved from ./testbzr."""
786
1102 by Martin Pool
- merge test refactoring from robertc
787
    def test_bzr(self):
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
788
        from os import chdir, mkdir
789
        from os.path import exists
790
904 by Martin Pool
- more selftest external-command fixes
791
        runbzr = self.runbzr
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
792
        capture = self.capture
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
793
        progress = self.log
794
795
        progress("basic branch creation")
904 by Martin Pool
- more selftest external-command fixes
796
        mkdir('branch1')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
797
        chdir('branch1')
898 by Martin Pool
- add new runbzr method for external tests
798
        runbzr('init')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
799
1185.3.25 by Martin Pool
- run blackbox tests in-process
800
        self.assertEquals(capture('root').rstrip(),
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
801
                          os.path.join(self.test_dir, 'branch1'))
802
803
        progress("status of new file")
804
805
        f = file('test.txt', 'wt')
806
        f.write('hello world!\n')
807
        f.close()
808
1185.3.25 by Martin Pool
- run blackbox tests in-process
809
        self.assertEquals(capture('unknowns'), 'test.txt\n')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
810
1185.3.25 by Martin Pool
- run blackbox tests in-process
811
        out = capture("status")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
812
        self.assertEquals(out, 'unknown:\n  test.txt\n')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
813
1185.3.25 by Martin Pool
- run blackbox tests in-process
814
        out = capture("status --all")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
815
        self.assertEquals(out, "unknown:\n  test.txt\n")
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
816
1185.3.25 by Martin Pool
- run blackbox tests in-process
817
        out = capture("status test.txt --all")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
818
        self.assertEquals(out, "unknown:\n  test.txt\n")
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
819
820
        f = file('test2.txt', 'wt')
821
        f.write('goodbye cruel world...\n')
822
        f.close()
823
1185.3.25 by Martin Pool
- run blackbox tests in-process
824
        out = capture("status test.txt")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
825
        self.assertEquals(out, "unknown:\n  test.txt\n")
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
826
1185.3.25 by Martin Pool
- run blackbox tests in-process
827
        out = capture("status")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
828
        self.assertEquals(out, ("unknown:\n" "  test.txt\n" "  test2.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
829
830
        os.unlink('test2.txt')
831
832
        progress("command aliases")
1185.3.25 by Martin Pool
- run blackbox tests in-process
833
        out = capture("st --all")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
834
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
835
1185.3.25 by Martin Pool
- run blackbox tests in-process
836
        out = capture("stat")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
837
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
838
839
        progress("command help")
898 by Martin Pool
- add new runbzr method for external tests
840
        runbzr("help st")
841
        runbzr("help")
842
        runbzr("help commands")
843
        runbzr("help slartibartfast", 1)
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
844
1185.3.25 by Martin Pool
- run blackbox tests in-process
845
        out = capture("help ci")
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
846
        out.index('aliases: ')
847
848
        progress("can't rename unversioned file")
898 by Martin Pool
- add new runbzr method for external tests
849
        runbzr("rename test.txt new-test.txt", 1)
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
850
851
        progress("adding a file")
852
898 by Martin Pool
- add new runbzr method for external tests
853
        runbzr("add test.txt")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
854
        self.assertEquals(capture("unknowns"), '')
855
        self.assertEquals(capture("status --all"), ("added:\n" "  test.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
856
857
        progress("rename newly-added file")
898 by Martin Pool
- add new runbzr method for external tests
858
        runbzr("rename test.txt hello.txt")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
859
        self.assert_(os.path.exists("hello.txt"))
860
        self.assert_(not os.path.exists("test.txt"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
861
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
862
        self.assertEquals(capture("revno"), '0\n')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
863
864
        progress("add first revision")
904 by Martin Pool
- more selftest external-command fixes
865
        runbzr(['commit', '-m', 'add first revision'])
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
866
867
        progress("more complex renames")
868
        os.mkdir("sub1")
898 by Martin Pool
- add new runbzr method for external tests
869
        runbzr("rename hello.txt sub1", 1)
870
        runbzr("rename hello.txt sub1/hello.txt", 1)
871
        runbzr("move hello.txt sub1", 1)
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
872
898 by Martin Pool
- add new runbzr method for external tests
873
        runbzr("add sub1")
874
        runbzr("rename sub1 sub2")
875
        runbzr("move hello.txt sub2")
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
876
        self.assertEqual(capture("relpath sub2/hello.txt"),
877
                         os.path.join("sub2", "hello.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
878
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
879
        self.assert_(exists("sub2"))
880
        self.assert_(exists("sub2/hello.txt"))
881
        self.assert_(not exists("sub1"))
882
        self.assert_(not exists("hello.txt"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
883
898 by Martin Pool
- add new runbzr method for external tests
884
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
885
886
        mkdir("sub1")
898 by Martin Pool
- add new runbzr method for external tests
887
        runbzr('add sub1')
888
        runbzr('move sub2/hello.txt sub1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
889
        self.assert_(not exists('sub2/hello.txt'))
890
        self.assert_(exists('sub1/hello.txt'))
898 by Martin Pool
- add new runbzr method for external tests
891
        runbzr('move sub2 sub1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
892
        self.assert_(not exists('sub2'))
893
        self.assert_(exists('sub1/sub2'))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
894
898 by Martin Pool
- add new runbzr method for external tests
895
        runbzr(['commit', '-m', 'rename nested subdirectories'])
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
896
897
        chdir('sub1/sub2')
1185.3.25 by Martin Pool
- run blackbox tests in-process
898
        self.assertEquals(capture('root')[:-1],
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
899
                          os.path.join(self.test_dir, 'branch1'))
898 by Martin Pool
- add new runbzr method for external tests
900
        runbzr('move ../hello.txt .')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
901
        self.assert_(exists('./hello.txt'))
1185.3.25 by Martin Pool
- run blackbox tests in-process
902
        self.assertEquals(capture('relpath hello.txt'),
903
                          os.path.join('sub1', 'sub2', 'hello.txt') + '\n')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
904
        self.assertEquals(capture('relpath ../../sub1/sub2/hello.txt'), os.path.join('sub1', 'sub2', 'hello.txt\n'))
898 by Martin Pool
- add new runbzr method for external tests
905
        runbzr(['commit', '-m', 'move to parent directory'])
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
906
        chdir('..')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
907
        self.assertEquals(capture('relpath sub2/hello.txt'), os.path.join('sub1', 'sub2', 'hello.txt\n'))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
908
898 by Martin Pool
- add new runbzr method for external tests
909
        runbzr('move sub2/hello.txt .')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
910
        self.assert_(exists('hello.txt'))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
911
912
        f = file('hello.txt', 'wt')
913
        f.write('some nice new content\n')
914
        f.close()
915
916
        f = file('msg.tmp', 'wt')
1185.12.25 by Aaron Bentley
Added one-line log format
917
        f.write('this is my new commit\nand it has multiple lines, for fun')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
918
        f.close()
919
898 by Martin Pool
- add new runbzr method for external tests
920
        runbzr('commit -F msg.tmp')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
921
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
922
        self.assertEquals(capture('revno'), '5\n')
898 by Martin Pool
- add new runbzr method for external tests
923
        runbzr('export -r 5 export-5.tmp')
924
        runbzr('export export.tmp')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
925
898 by Martin Pool
- add new runbzr method for external tests
926
        runbzr('log')
927
        runbzr('log -v')
909.1.5 by Aaron Bentley
Fixed log -v (mostly)
928
        runbzr('log -v --forward')
929
        runbzr('log -m', retcode=1)
1185.3.25 by Martin Pool
- run blackbox tests in-process
930
        log_out = capture('log -m commit')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
931
        self.assert_("this is my new commit\n  and" in log_out)
932
        self.assert_("rename nested" not in log_out)
933
        self.assert_('revision-id' not in log_out)
934
        self.assert_('revision-id' in capture('log --show-ids -m commit'))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
935
1185.12.25 by Aaron Bentley
Added one-line log format
936
        log_out = capture('log --line')
937
        for line in log_out.splitlines():
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
938
            self.assert_(len(line) <= 79, len(line))
939
        self.assert_("this is my new commit and" in log_out)
1185.12.25 by Aaron Bentley
Added one-line log format
940
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
941
942
        progress("file with spaces in name")
943
        mkdir('sub directory')
944
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
898 by Martin Pool
- add new runbzr method for external tests
945
        runbzr('add .')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
946
        runbzr('diff', retcode=1)
898 by Martin Pool
- add new runbzr method for external tests
947
        runbzr('commit -m add-spaces')
948
        runbzr('check')
949
950
        runbzr('log')
951
        runbzr('log --forward')
952
953
        runbzr('info')
1092.1.35 by Robert Collins
merge from mpool up to rev 1110
954
1092.2.6 by Robert Collins
symlink support updated to work
955
        if has_symlinks():
956
            progress("symlinks")
957
            mkdir('symlinks')
958
            chdir('symlinks')
959
            runbzr('init')
960
            os.symlink("NOWHERE1", "link1")
961
            runbzr('add link1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
962
            self.assertEquals(self.capture('unknowns'), '')
1092.2.6 by Robert Collins
symlink support updated to work
963
            runbzr(['commit', '-m', '1: added symlink link1'])
964
    
965
            mkdir('d1')
966
            runbzr('add d1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
967
            self.assertEquals(self.capture('unknowns'), '')
1092.2.6 by Robert Collins
symlink support updated to work
968
            os.symlink("NOWHERE2", "d1/link2")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
969
            self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
1092.2.6 by Robert Collins
symlink support updated to work
970
            # is d1/link2 found when adding d1
971
            runbzr('add d1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
972
            self.assertEquals(self.capture('unknowns'), '')
1092.2.6 by Robert Collins
symlink support updated to work
973
            os.symlink("NOWHERE3", "d1/link3")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
974
            self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
1092.2.6 by Robert Collins
symlink support updated to work
975
            runbzr(['commit', '-m', '2: added dir, symlink'])
976
    
977
            runbzr('rename d1 d2')
978
            runbzr('move d2/link2 .')
979
            runbzr('move link1 d2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
980
            self.assertEquals(os.readlink("./link2"), "NOWHERE2")
981
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
1092.2.6 by Robert Collins
symlink support updated to work
982
            runbzr('add d2/link3')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
983
            runbzr('diff', retcode=1)
1092.2.6 by Robert Collins
symlink support updated to work
984
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
985
    
986
            os.unlink("link2")
987
            os.symlink("TARGET 2", "link2")
988
            os.unlink("d2/link1")
989
            os.symlink("TARGET 1", "d2/link1")
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
990
            runbzr('diff', retcode=1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
991
            self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
1092.2.6 by Robert Collins
symlink support updated to work
992
            runbzr(['commit', '-m', '4: retarget of two links'])
993
    
994
            runbzr('remove d2/link1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
995
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
1092.2.20 by Robert Collins
symlink and weaves, whaddya know
996
            runbzr(['commit', '-m', '5: remove d2/link1'])
1424 by Robert Collins
add rm alias to remove
997
            # try with the rm alias
998
            runbzr('add d2/link1')
999
            runbzr(['commit', '-m', '6: add d2/link1'])
1000
            runbzr('rm d2/link1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1001
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
1424 by Robert Collins
add rm alias to remove
1002
            runbzr(['commit', '-m', '7: remove d2/link1'])
1092.2.6 by Robert Collins
symlink support updated to work
1003
    
1004
            os.mkdir("d1")
1005
            runbzr('add d1')
1006
            runbzr('rename d2/link3 d1/link3new')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1007
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
1424 by Robert Collins
add rm alias to remove
1008
            runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
1092.2.6 by Robert Collins
symlink support updated to work
1009
            
1010
            runbzr(['check'])
1011
            
1012
            runbzr(['export', '-r', '1', 'exp1.tmp'])
1013
            chdir("exp1.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1014
            self.assertEquals(listdir_sorted("."), [ "link1" ])
1015
            self.assertEquals(os.readlink("link1"), "NOWHERE1")
1092.2.6 by Robert Collins
symlink support updated to work
1016
            chdir("..")
1017
            
1018
            runbzr(['export', '-r', '2', 'exp2.tmp'])
1019
            chdir("exp2.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1020
            self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
1092.2.6 by Robert Collins
symlink support updated to work
1021
            chdir("..")
1022
            
1023
            runbzr(['export', '-r', '3', 'exp3.tmp'])
1024
            chdir("exp3.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1025
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
1026
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
1027
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
1028
            self.assertEquals(os.readlink("link2")   , "NOWHERE2")
1092.2.6 by Robert Collins
symlink support updated to work
1029
            chdir("..")
1030
            
1031
            runbzr(['export', '-r', '4', 'exp4.tmp'])
1032
            chdir("exp4.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1033
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
1034
            self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
1035
            self.assertEquals(os.readlink("link2")   , "TARGET 2")
1036
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
1092.2.6 by Robert Collins
symlink support updated to work
1037
            chdir("..")
1038
            
1039
            runbzr(['export', '-r', '5', 'exp5.tmp'])
1040
            chdir("exp5.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1041
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
1042
            self.assert_(os.path.islink("link2"))
1043
            self.assert_(listdir_sorted("d2")== [ "link3" ])
1092.2.6 by Robert Collins
symlink support updated to work
1044
            chdir("..")
1045
            
1424 by Robert Collins
add rm alias to remove
1046
            runbzr(['export', '-r', '8', 'exp6.tmp'])
1092.2.6 by Robert Collins
symlink support updated to work
1047
            chdir("exp6.tmp")
1424 by Robert Collins
add rm alias to remove
1048
            self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
1049
            self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
1050
            self.assertEquals(listdir_sorted("d2"), [])
1051
            self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
1092.2.6 by Robert Collins
symlink support updated to work
1052
            chdir("..")
1053
        else:
1054
            progress("skipping symlink tests")
1400.1.1 by Robert Collins
implement a basic test for the ui branch command from http servers
1055
1056
1057
class HttpTests(TestCaseWithWebserver):
1058
    """Test bzr ui commands against remote branches."""
1059
1060
    def test_branch(self):
1061
        os.mkdir('from')
1062
        branch = Branch.initialize('from')
1063
        branch.commit('empty commit for nonsense', allow_pointless=True)
1064
        url = self.get_remote_url('from')
1065
        self.run_bzr('branch', url, 'to')
1066
        branch = Branch.open('to')
1067
        self.assertEqual(1, len(branch.revision_history()))
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
1068
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
1069
    def test_log(self):
1070
        self.build_tree(['branch/', 'branch/file'])
1071
        branch = Branch.initialize('branch')
1072
        branch.add(['file'])
1073
        branch.commit('add file', rev_id='A')
1074
        url = self.get_remote_url('branch/file')
1075
        output = self.capture('log %s' % url)
1076
        self.assertEqual(7, len(output.split('\n')))
1077
        
1078
1079
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
1080