/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

Changed error status to 3

Show diffs side-by-side

added added

removed removed

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