/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

  • Committer: Robert Collins
  • Date: 2005-09-28 05:25:54 UTC
  • mfrom: (1185.1.42)
  • mto: (1092.2.18)
  • mto: This revision was merged to the branch mainline in revision 1397.
  • Revision ID: robertc@robertcollins.net-20050928052554-beb985505f77ea6a
update symlink branch to integration

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.
 
23
 
 
24
This always reinvokes bzr through a new Python interpreter, which is a
 
25
bit inefficient but arguably tests in a way more representative of how
 
26
it's normally invoked.
 
27
"""
 
28
 
 
29
from cStringIO import StringIO
 
30
import os
 
31
import sys
 
32
import os
 
33
 
 
34
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
 
35
from bzrlib.branch import Branch
 
36
 
 
37
 
 
38
class ExternalBase(TestCaseInTempDir):
 
39
 
 
40
    def runbzr(self, args, retcode=0, backtick=False):
 
41
        if isinstance(args, basestring):
 
42
            args = args.split()
 
43
 
 
44
        if backtick:
 
45
            return self.run_bzr_captured(args, retcode=retcode)[0]
 
46
        else:
 
47
            return self.run_bzr_captured(args, retcode=retcode)
 
48
 
 
49
 
 
50
class TestCommands(ExternalBase):
 
51
 
 
52
    def test_help_commands(self):
 
53
        self.runbzr('--help')
 
54
        self.runbzr('help')
 
55
        self.runbzr('help commands')
 
56
        self.runbzr('help help')
 
57
        self.runbzr('commit -h')
 
58
 
 
59
    def test_init_branch(self):
 
60
        self.runbzr(['init'])
 
61
 
 
62
    def test_whoami(self):
 
63
        # this should always identify something, if only "john@localhost"
 
64
        self.runbzr("whoami")
 
65
        self.runbzr("whoami --email")
 
66
 
 
67
        self.assertEquals(self.runbzr("whoami --email",
 
68
                                      backtick=True).count('@'), 1)
 
69
        
 
70
    def test_whoami_branch(self):
 
71
        """branch specific user identity works."""
 
72
        self.runbzr('init')
 
73
        f = file('.bzr/email', 'wt')
 
74
        f.write('Branch Identity <branch@identi.ty>')
 
75
        f.close()
 
76
        bzr_email = os.environ.get('BZREMAIL')
 
77
        if bzr_email is not None:
 
78
            del os.environ['BZREMAIL']
 
79
        whoami = self.runbzr("whoami",backtick=True)
 
80
        whoami_email = self.runbzr("whoami --email",backtick=True)
 
81
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
 
82
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
 
83
        # Verify that the environment variable overrides the value 
 
84
        # in the file
 
85
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
 
86
        whoami = self.runbzr("whoami",backtick=True)
 
87
        whoami_email = self.runbzr("whoami --email",backtick=True)
 
88
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
 
89
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
 
90
        if bzr_email is not None:
 
91
            os.environ['BZREMAIL'] = bzr_email
 
92
 
 
93
    def test_invalid_commands(self):
 
94
        self.runbzr("pants", retcode=1)
 
95
        self.runbzr("--pants off", retcode=1)
 
96
        self.runbzr("diff --message foo", retcode=1)
 
97
 
 
98
    def test_empty_commit(self):
 
99
        self.runbzr("init")
 
100
        self.build_tree(['hello.txt'])
 
101
        self.runbzr("commit -m empty", retcode=1)
 
102
        self.runbzr("add hello.txt")
 
103
        self.runbzr("commit -m added")
 
104
 
 
105
    def test_ignore_patterns(self):
 
106
        from bzrlib.branch import Branch
 
107
        
 
108
        b = Branch.initialize('.')
 
109
        self.assertEquals(list(b.unknowns()), [])
 
110
 
 
111
        file('foo.tmp', 'wt').write('tmp files are ignored')
 
112
        self.assertEquals(list(b.unknowns()), [])
 
113
        assert self.capture('unknowns') == ''
 
114
 
 
115
        file('foo.c', 'wt').write('int main() {}')
 
116
        self.assertEquals(list(b.unknowns()), ['foo.c'])
 
117
        assert self.capture('unknowns') == 'foo.c\n'
 
118
 
 
119
        self.runbzr(['add', 'foo.c'])
 
120
        assert self.capture('unknowns') == ''
 
121
 
 
122
        # 'ignore' works when creating the .bzignore file
 
123
        file('foo.blah', 'wt').write('blah')
 
124
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
 
125
        self.runbzr('ignore *.blah')
 
126
        self.assertEquals(list(b.unknowns()), [])
 
127
        assert file('.bzrignore', 'rU').read() == '*.blah\n'
 
128
 
 
129
        # 'ignore' works when then .bzrignore file already exists
 
130
        file('garh', 'wt').write('garh')
 
131
        self.assertEquals(list(b.unknowns()), ['garh'])
 
132
        assert self.capture('unknowns') == 'garh\n'
 
133
        self.runbzr('ignore garh')
 
134
        self.assertEquals(list(b.unknowns()), [])
 
135
        assert file('.bzrignore', 'rU').read() == '*.blah\ngarh\n'
 
136
 
 
137
    def test_revert(self):
 
138
        self.runbzr('init')
 
139
 
 
140
        file('hello', 'wt').write('foo')
 
141
        self.runbzr('add hello')
 
142
        self.runbzr('commit -m setup hello')
 
143
 
 
144
        file('goodbye', 'wt').write('baz')
 
145
        self.runbzr('add goodbye')
 
146
        self.runbzr('commit -m setup goodbye')
 
147
        
 
148
        file('hello', 'wt').write('bar')
 
149
        file('goodbye', 'wt').write('qux')
 
150
        self.runbzr('revert hello')
 
151
        self.check_file_contents('hello', 'foo')
 
152
        self.check_file_contents('goodbye', 'qux')
 
153
        self.runbzr('revert')
 
154
        self.check_file_contents('goodbye', 'baz')
 
155
 
 
156
        os.mkdir('revertdir')
 
157
        self.runbzr('add revertdir')
 
158
        self.runbzr('commit -m f')
 
159
        os.rmdir('revertdir')
 
160
        self.runbzr('revert')
 
161
 
 
162
        file('hello', 'wt').write('xyz')
 
163
        self.runbzr('commit -m xyz hello')
 
164
        self.runbzr('revert -r 1 hello')
 
165
        self.check_file_contents('hello', 'foo')
 
166
        self.runbzr('revert hello')
 
167
        self.check_file_contents('hello', 'xyz')
 
168
        os.chdir('revertdir')
 
169
        self.runbzr('revert')
 
170
        os.chdir('..')
 
171
 
 
172
 
 
173
    def test_mv_modes(self):
 
174
        """Test two modes of operation for mv"""
 
175
        from bzrlib.branch import Branch
 
176
        b = Branch.initialize('.')
 
177
        self.build_tree(['a', 'c', 'subdir/'])
 
178
        self.run_bzr_captured(['add', self.test_dir])
 
179
        self.run_bzr_captured(['mv', 'a', 'b'])
 
180
        self.run_bzr_captured(['mv', 'b', 'subdir'])
 
181
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
 
182
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
 
183
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
 
184
 
 
185
 
 
186
    def test_main_version(self):
 
187
        """Check output from version command and master option is reasonable"""
 
188
        # output is intentionally passed through to stdout so that we
 
189
        # can see the version being tested
 
190
        output = self.runbzr('version', backtick=1)
 
191
        self.log('bzr version output:')
 
192
        self.log(output)
 
193
        self.assert_(output.startswith('bzr (bazaar-ng) '))
 
194
        self.assertNotEqual(output.index('Canonical'), -1)
 
195
        # make sure --version is consistent
 
196
        tmp_output = self.runbzr('--version', backtick=1)
 
197
        self.log('bzr --version output:')
 
198
        self.log(tmp_output)
 
199
        self.assertEquals(output, tmp_output)
 
200
 
 
201
    def example_branch(test):
 
202
        test.runbzr('init')
 
203
        file('hello', 'wt').write('foo')
 
204
        test.runbzr('add hello')
 
205
        test.runbzr('commit -m setup hello')
 
206
        file('goodbye', 'wt').write('baz')
 
207
        test.runbzr('add goodbye')
 
208
        test.runbzr('commit -m setup goodbye')
 
209
 
 
210
    def test_diff(self):
 
211
        self.example_branch()
 
212
        file('hello', 'wt').write('hello world!')
 
213
        self.runbzr('commit -m fixing hello')
 
214
        output = self.runbzr('diff -r 2..3', backtick=1)
 
215
        self.assert_('\n+hello world!' in output)
 
216
        output = self.runbzr('diff -r last:3..last:1', backtick=1)
 
217
        self.assert_('\n+baz' in output)
 
218
 
 
219
    def test_branch(self):
 
220
        """Branch from one branch to another."""
 
221
        os.mkdir('a')
 
222
        os.chdir('a')
 
223
        self.example_branch()
 
224
        os.chdir('..')
 
225
        self.runbzr('branch a b')
 
226
        self.runbzr('branch a c -r 1')
 
227
 
 
228
    def test_merge(self):
 
229
        from bzrlib.branch import Branch
 
230
        
 
231
        os.mkdir('a')
 
232
        os.chdir('a')
 
233
        self.example_branch()
 
234
        os.chdir('..')
 
235
        self.runbzr('branch a b')
 
236
        os.chdir('b')
 
237
        file('goodbye', 'wt').write('quux')
 
238
        self.runbzr(['commit',  '-m',  "more u's are always good"])
 
239
 
 
240
        os.chdir('../a')
 
241
        file('hello', 'wt').write('quuux')
 
242
        # We can't merge when there are in-tree changes
 
243
        self.runbzr('merge ../b', retcode=1)
 
244
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
 
245
        self.runbzr('merge ../b')
 
246
        self.check_file_contents('goodbye', 'quux')
 
247
        # Merging a branch pulls its revision into the tree
 
248
        a = Branch.open('.')
 
249
        b = Branch.open('../b')
 
250
        a.get_revision_xml(b.last_patch())
 
251
        self.log('pending merges: %s', a.pending_merges())
 
252
        #        assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
 
253
        #        % (a.pending_merges(), b.last_patch())
 
254
 
 
255
    def test_pull(self):
 
256
        """Pull changes from one branch to another."""
 
257
        os.mkdir('a')
 
258
        os.chdir('a')
 
259
 
 
260
        self.example_branch()
 
261
        self.runbzr('pull', retcode=1)
 
262
        self.runbzr('missing', retcode=1)
 
263
        self.runbzr('missing .')
 
264
        self.runbzr('missing')
 
265
        self.runbzr('pull')
 
266
        self.runbzr('pull /', retcode=1)
 
267
        self.runbzr('pull')
 
268
 
 
269
        os.chdir('..')
 
270
        self.runbzr('branch a b')
 
271
        os.chdir('b')
 
272
        self.runbzr('pull')
 
273
        os.mkdir('subdir')
 
274
        self.runbzr('add subdir')
 
275
        self.runbzr('commit -m blah --unchanged')
 
276
        os.chdir('../a')
 
277
        a = Branch.open('.')
 
278
        b = Branch.open('../b')
 
279
        assert a.revision_history() == b.revision_history()[:-1]
 
280
        self.runbzr('pull ../b')
 
281
        assert a.revision_history() == b.revision_history()
 
282
        self.runbzr('commit -m blah2 --unchanged')
 
283
        os.chdir('../b')
 
284
        self.runbzr('commit -m blah3 --unchanged')
 
285
        self.runbzr('pull ../a', retcode=1)
 
286
        os.chdir('../a')
 
287
        self.runbzr('merge ../b')
 
288
        self.runbzr('commit -m blah4 --unchanged')
 
289
        os.chdir('../b/subdir')
 
290
        self.runbzr('pull ../../a')
 
291
        assert a.revision_history()[-1] == b.revision_history()[-1]
 
292
        
 
293
    def test_add_reports(self):
 
294
        """add command prints the names of added files."""
 
295
        b = Branch.initialize('.')
 
296
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
 
297
        out = self.run_bzr_captured(['add'], retcode = 0)[0]
 
298
        # the ordering is not defined at the moment
 
299
        results = sorted(out.rstrip('\n').split('\n'))
 
300
        self.assertEquals(['added dir',
 
301
                           'added dir'+os.sep+'sub.txt',
 
302
                           'added top.txt',],
 
303
                          results)
 
304
 
 
305
    def test_unknown_command(self):
 
306
        """Handling of unknown command."""
 
307
        out, err = self.run_bzr_captured(['fluffy-badger'],
 
308
                                         retcode=1)
 
309
        self.assertEquals(out, '')
 
310
        err.index('unknown command')
 
311
        
 
312
 
 
313
 
 
314
def has_symlinks():
 
315
    if hasattr(os, 'symlink'):
 
316
        return True
 
317
    else:
 
318
        return False
 
319
 
 
320
def listdir_sorted(dir):
 
321
    L = os.listdir(dir)
 
322
    L.sort()
 
323
    return L
 
324
 
 
325
 
 
326
class OldTests(ExternalBase):
 
327
    """old tests moved from ./testbzr."""
 
328
 
 
329
    def test_bzr(self):
 
330
        from os import chdir, mkdir
 
331
        from os.path import exists
 
332
 
 
333
        runbzr = self.runbzr
 
334
        capture = self.capture
 
335
        progress = self.log
 
336
 
 
337
        progress("basic branch creation")
 
338
        mkdir('branch1')
 
339
        chdir('branch1')
 
340
        runbzr('init')
 
341
 
 
342
        self.assertEquals(capture('root').rstrip(),
 
343
                          os.path.join(self.test_dir, 'branch1'))
 
344
 
 
345
        progress("status of new file")
 
346
 
 
347
        f = file('test.txt', 'wt')
 
348
        f.write('hello world!\n')
 
349
        f.close()
 
350
 
 
351
        self.assertEquals(capture('unknowns'), 'test.txt\n')
 
352
 
 
353
        out = capture("status")
 
354
        assert out == 'unknown:\n  test.txt\n'
 
355
 
 
356
        out = capture("status --all")
 
357
        assert out == "unknown:\n  test.txt\n"
 
358
 
 
359
        out = capture("status test.txt --all")
 
360
        assert out == "unknown:\n  test.txt\n"
 
361
 
 
362
        f = file('test2.txt', 'wt')
 
363
        f.write('goodbye cruel world...\n')
 
364
        f.close()
 
365
 
 
366
        out = capture("status test.txt")
 
367
        assert out == "unknown:\n  test.txt\n"
 
368
 
 
369
        out = capture("status")
 
370
        assert out == ("unknown:\n"
 
371
                       "  test.txt\n"
 
372
                       "  test2.txt\n")
 
373
 
 
374
        os.unlink('test2.txt')
 
375
 
 
376
        progress("command aliases")
 
377
        out = capture("st --all")
 
378
        assert out == ("unknown:\n"
 
379
                       "  test.txt\n")
 
380
 
 
381
        out = capture("stat")
 
382
        assert out == ("unknown:\n"
 
383
                       "  test.txt\n")
 
384
 
 
385
        progress("command help")
 
386
        runbzr("help st")
 
387
        runbzr("help")
 
388
        runbzr("help commands")
 
389
        runbzr("help slartibartfast", 1)
 
390
 
 
391
        out = capture("help ci")
 
392
        out.index('aliases: ')
 
393
 
 
394
        progress("can't rename unversioned file")
 
395
        runbzr("rename test.txt new-test.txt", 1)
 
396
 
 
397
        progress("adding a file")
 
398
 
 
399
        runbzr("add test.txt")
 
400
        assert capture("unknowns") == ''
 
401
        assert capture("status --all") == ("added:\n"
 
402
                                                "  test.txt\n")
 
403
 
 
404
        progress("rename newly-added file")
 
405
        runbzr("rename test.txt hello.txt")
 
406
        assert os.path.exists("hello.txt")
 
407
        assert not os.path.exists("test.txt")
 
408
 
 
409
        assert capture("revno") == '0\n'
 
410
 
 
411
        progress("add first revision")
 
412
        runbzr(['commit', '-m', 'add first revision'])
 
413
 
 
414
        progress("more complex renames")
 
415
        os.mkdir("sub1")
 
416
        runbzr("rename hello.txt sub1", 1)
 
417
        runbzr("rename hello.txt sub1/hello.txt", 1)
 
418
        runbzr("move hello.txt sub1", 1)
 
419
 
 
420
        runbzr("add sub1")
 
421
        runbzr("rename sub1 sub2")
 
422
        runbzr("move hello.txt sub2")
 
423
        assert capture("relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
 
424
 
 
425
        assert exists("sub2")
 
426
        assert exists("sub2/hello.txt")
 
427
        assert not exists("sub1")
 
428
        assert not exists("hello.txt")
 
429
 
 
430
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
431
 
 
432
        mkdir("sub1")
 
433
        runbzr('add sub1')
 
434
        runbzr('move sub2/hello.txt sub1')
 
435
        assert not exists('sub2/hello.txt')
 
436
        assert exists('sub1/hello.txt')
 
437
        runbzr('move sub2 sub1')
 
438
        assert not exists('sub2')
 
439
        assert exists('sub1/sub2')
 
440
 
 
441
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
442
 
 
443
        chdir('sub1/sub2')
 
444
        self.assertEquals(capture('root')[:-1],
 
445
                          os.path.join(self.test_dir, 'branch1'))
 
446
        runbzr('move ../hello.txt .')
 
447
        assert exists('./hello.txt')
 
448
        self.assertEquals(capture('relpath hello.txt'),
 
449
                          os.path.join('sub1', 'sub2', 'hello.txt') + '\n')
 
450
        assert capture('relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
451
        runbzr(['commit', '-m', 'move to parent directory'])
 
452
        chdir('..')
 
453
        assert capture('relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
454
 
 
455
        runbzr('move sub2/hello.txt .')
 
456
        assert exists('hello.txt')
 
457
 
 
458
        f = file('hello.txt', 'wt')
 
459
        f.write('some nice new content\n')
 
460
        f.close()
 
461
 
 
462
        f = file('msg.tmp', 'wt')
 
463
        f.write('this is my new commit\n')
 
464
        f.close()
 
465
 
 
466
        runbzr('commit -F msg.tmp')
 
467
 
 
468
        assert capture('revno') == '5\n'
 
469
        runbzr('export -r 5 export-5.tmp')
 
470
        runbzr('export export.tmp')
 
471
 
 
472
        runbzr('log')
 
473
        runbzr('log -v')
 
474
        runbzr('log -v --forward')
 
475
        runbzr('log -m', retcode=1)
 
476
        log_out = capture('log -m commit')
 
477
        assert "this is my new commit" in log_out
 
478
        assert "rename nested" not in log_out
 
479
        assert 'revision-id' not in log_out
 
480
        assert 'revision-id' in capture('log --show-ids -m commit')
 
481
 
 
482
 
 
483
        progress("file with spaces in name")
 
484
        mkdir('sub directory')
 
485
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
 
486
        runbzr('add .')
 
487
        runbzr('diff')
 
488
        runbzr('commit -m add-spaces')
 
489
        runbzr('check')
 
490
 
 
491
        runbzr('log')
 
492
        runbzr('log --forward')
 
493
 
 
494
        runbzr('info')
 
495
 
 
496
        if has_symlinks():
 
497
            progress("symlinks")
 
498
            mkdir('symlinks')
 
499
            chdir('symlinks')
 
500
            runbzr('init')
 
501
            os.symlink("NOWHERE1", "link1")
 
502
            runbzr('add link1')
 
503
            assert self.capture('unknowns') == ''
 
504
            runbzr(['commit', '-m', '1: added symlink link1'])
 
505
    
 
506
            mkdir('d1')
 
507
            runbzr('add d1')
 
508
            assert self.capture('unknowns') == ''
 
509
            os.symlink("NOWHERE2", "d1/link2")
 
510
            assert self.capture('unknowns') == 'd1/link2\n'
 
511
            # is d1/link2 found when adding d1
 
512
            runbzr('add d1')
 
513
            assert self.capture('unknowns') == ''
 
514
            os.symlink("NOWHERE3", "d1/link3")
 
515
            assert self.capture('unknowns') == 'd1/link3\n'
 
516
            runbzr(['commit', '-m', '2: added dir, symlink'])
 
517
    
 
518
            runbzr('rename d1 d2')
 
519
            runbzr('move d2/link2 .')
 
520
            runbzr('move link1 d2')
 
521
            assert os.readlink("./link2") == "NOWHERE2"
 
522
            assert os.readlink("d2/link1") == "NOWHERE1"
 
523
            runbzr('add d2/link3')
 
524
            runbzr('diff')
 
525
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
 
526
    
 
527
            os.unlink("link2")
 
528
            os.symlink("TARGET 2", "link2")
 
529
            os.unlink("d2/link1")
 
530
            os.symlink("TARGET 1", "d2/link1")
 
531
            runbzr('diff')
 
532
            assert self.capture("relpath d2/link1") == "d2/link1\n"
 
533
            runbzr(['commit', '-m', '4: retarget of two links'])
 
534
    
 
535
            runbzr('remove d2/link1')
 
536
            assert self.capture('unknowns') == 'd2/link1\n'
 
537
            runbzr(['commit', '--unchanged', '-m', '5: remove d2/link1'])
 
538
            print ("commit --uchanged is needed to delete a file with no other"
 
539
                   " changes. this is a bug.")
 
540
    
 
541
            os.mkdir("d1")
 
542
            runbzr('add d1')
 
543
            runbzr('rename d2/link3 d1/link3new')
 
544
            assert self.capture('unknowns') == 'd2/link1\n'
 
545
            runbzr(['commit', '-m', '6: remove d2/link1, move/rename link3'])
 
546
            
 
547
            runbzr(['check'])
 
548
            
 
549
            runbzr(['export', '-r', '1', 'exp1.tmp'])
 
550
            chdir("exp1.tmp")
 
551
            assert listdir_sorted(".") == [ "link1" ]
 
552
            assert os.readlink("link1") == "NOWHERE1"
 
553
            chdir("..")
 
554
            
 
555
            runbzr(['export', '-r', '2', 'exp2.tmp'])
 
556
            chdir("exp2.tmp")
 
557
            assert listdir_sorted(".") == [ "d1", "link1" ]
 
558
            chdir("..")
 
559
            
 
560
            runbzr(['export', '-r', '3', 'exp3.tmp'])
 
561
            chdir("exp3.tmp")
 
562
            assert listdir_sorted(".") == [ "d2", "link2" ]
 
563
            assert listdir_sorted("d2") == [ "link1", "link3" ]
 
564
            assert os.readlink("d2/link1") == "NOWHERE1"
 
565
            assert os.readlink("link2")    == "NOWHERE2"
 
566
            chdir("..")
 
567
            
 
568
            runbzr(['export', '-r', '4', 'exp4.tmp'])
 
569
            chdir("exp4.tmp")
 
570
            assert listdir_sorted(".") == [ "d2", "link2" ]
 
571
            assert os.readlink("d2/link1") == "TARGET 1"
 
572
            assert os.readlink("link2")    == "TARGET 2"
 
573
            assert listdir_sorted("d2") == [ "link1", "link3" ]
 
574
            chdir("..")
 
575
            
 
576
            runbzr(['export', '-r', '5', 'exp5.tmp'])
 
577
            chdir("exp5.tmp")
 
578
            assert listdir_sorted(".") == [ "d2", "link2" ]
 
579
            assert os.path.islink("link2")
 
580
            assert listdir_sorted("d2")== [ "link3" ]
 
581
            chdir("..")
 
582
            
 
583
            runbzr(['export', '-r', '6', 'exp6.tmp'])
 
584
            chdir("exp6.tmp")
 
585
            assert listdir_sorted(".") == [ "d1", "d2", "link2" ]
 
586
            assert listdir_sorted("d1") == [ "link3new" ]
 
587
            assert listdir_sorted("d2") == []
 
588
            assert os.readlink("d1/link3new") == "NOWHERE3"
 
589
            chdir("..")
 
590
        else:
 
591
            progress("skipping symlink tests")
 
592