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