~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

  • Committer: Martin Pool
  • Date: 2005-07-18 13:12:43 UTC
  • Revision ID: mbp@sourcefrog.net-20050718131243-44532527fd065b31
- update convertinv to work with current weave code

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
 
# Mr. Smoketoomuch: I'm sorry?
19
 
# Mr. Bounder: You'd better cut down a little then.
20
 
# Mr. Smoketoomuch: Oh, I see! Smoke too much so I'd better cut down a little
21
 
#                   then!
22
18
 
23
19
"""Black-box tests for bzr.
24
20
 
25
21
These check that it behaves properly when it's invoked through the regular
26
 
command-line interface. This doesn't actually run a new interpreter but 
27
 
rather starts again from the run_bzr function.
 
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.
28
27
"""
29
28
 
30
 
 
31
 
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
32
 
# Note: Please don't add new tests here, it's too big and bulky.  Instead add
33
 
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
34
 
# UI command/aspect that is being tested.
35
 
 
36
 
 
37
 
from cStringIO import StringIO
38
 
import os
39
 
import re
40
 
import sys
41
 
 
42
 
import bzrlib
43
 
from bzrlib.branch import Branch
44
 
import bzrlib.bzrdir as bzrdir
45
 
from bzrlib.errors import BzrCommandError
46
 
from bzrlib.osutils import (
47
 
    has_symlinks,
48
 
    pathjoin,
49
 
    rmtree,
50
 
    terminal_width,
51
 
    )
52
 
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
53
 
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
54
 
from bzrlib.tests.blackbox import ExternalBase
55
 
from bzrlib.workingtree import WorkingTree
56
 
 
57
 
 
58
 
class TestCommands(ExternalBase):
59
 
 
60
 
    def test_whoami(self):
 
29
# this code was previously in testbzr
 
30
 
 
31
from unittest import TestCase
 
32
from bzrlib.selftest import TestBase, InTempDir
 
33
 
 
34
 
 
35
 
 
36
class ExternalBase(InTempDir):
 
37
    def runbzr(self, args, retcode=0):
 
38
        try:
 
39
            import shutil
 
40
            from subprocess import call
 
41
        except ImportError, e:
 
42
            _need_subprocess()
 
43
            raise
 
44
 
 
45
        if isinstance(args, basestring):
 
46
            args = args.split()
 
47
            
 
48
        return self.runcmd(['python', self.BZRPATH,] + args,
 
49
                           retcode=retcode)
 
50
 
 
51
 
 
52
 
 
53
class TestVersion(ExternalBase):
 
54
    def runTest(self):
 
55
        # output is intentionally passed through to stdout so that we
 
56
        # can see the version being tested
 
57
        self.runbzr(['version'])
 
58
 
 
59
 
 
60
 
 
61
class HelpCommands(ExternalBase):
 
62
    def runTest(self):
 
63
        self.runbzr('--help')
 
64
        self.runbzr('help')
 
65
        self.runbzr('help commands')
 
66
        self.runbzr('help help')
 
67
        self.runbzr('commit -h')
 
68
 
 
69
 
 
70
class InitBranch(ExternalBase):
 
71
    def runTest(self):
 
72
        import os
 
73
        self.runbzr(['init'])
 
74
 
 
75
 
 
76
 
 
77
class UserIdentity(ExternalBase):
 
78
    def runTest(self):
61
79
        # this should always identify something, if only "john@localhost"
62
80
        self.runbzr("whoami")
63
81
        self.runbzr("whoami --email")
64
 
 
65
 
        self.assertEquals(self.runbzr("whoami --email",
66
 
                                      backtick=True).count('@'), 1)
 
82
        self.assertEquals(self.backtick("bzr whoami --email").count('@'),
 
83
                          1)
 
84
 
 
85
 
 
86
class InvalidCommands(ExternalBase):
 
87
    def runTest(self):
 
88
        self.runbzr("pants", retcode=1)
 
89
        self.runbzr("--pants off", retcode=1)
 
90
        self.runbzr("diff --message foo", retcode=1)
 
91
 
 
92
 
 
93
 
 
94
class EmptyCommit(ExternalBase):
 
95
    def runTest(self):
 
96
        self.runbzr("init")
 
97
        self.build_tree(['hello.txt'])
 
98
        self.runbzr("commit -m empty", retcode=1)
 
99
        self.runbzr("add hello.txt")
 
100
        self.runbzr("commit -m added")
 
101
 
 
102
 
 
103
 
 
104
class IgnorePatterns(ExternalBase):
 
105
    def runTest(self):
 
106
        from bzrlib.branch import Branch
67
107
        
68
 
    def test_whoami_branch(self):
69
 
        """branch specific user identity works."""
70
 
        self.runbzr('init')
71
 
        b = bzrlib.branch.Branch.open('.')
72
 
        b.control_files.put_utf8('email', 'Branch Identity <branch@identi.ty>')
73
 
        bzr_email = os.environ.get('BZREMAIL')
74
 
        if bzr_email is not None:
75
 
            del os.environ['BZREMAIL']
76
 
        whoami = self.runbzr("whoami",backtick=True)
77
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
78
 
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
79
 
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
80
 
        # Verify that the environment variable overrides the value 
81
 
        # in the file
82
 
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
83
 
        whoami = self.runbzr("whoami",backtick=True)
84
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
85
 
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
86
 
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
87
 
        if bzr_email is not None:
88
 
            os.environ['BZREMAIL'] = bzr_email
89
 
 
90
 
    def test_nick_command(self):
91
 
        """bzr nick for viewing, setting nicknames"""
92
 
        os.mkdir('me.dev')
93
 
        os.chdir('me.dev')
94
 
        self.runbzr('init')
95
 
        nick = self.runbzr("nick",backtick=True)
96
 
        self.assertEqual(nick, 'me.dev\n')
97
 
        nick = self.runbzr("nick moo")
98
 
        nick = self.runbzr("nick",backtick=True)
99
 
        self.assertEqual(nick, 'moo\n')
100
 
 
101
 
    def test_invalid_commands(self):
102
 
        self.runbzr("pants", retcode=3)
103
 
        self.runbzr("--pants off", retcode=3)
104
 
        self.runbzr("diff --message foo", retcode=3)
105
 
 
106
 
    def test_ignore_patterns(self):
107
 
        self.runbzr('init')
108
 
        self.assertEquals(self.capture('unknowns'), '')
 
108
        b = Branch('.', init=True)
 
109
        self.assertEquals(list(b.unknowns()), [])
109
110
 
110
111
        file('foo.tmp', 'wt').write('tmp files are ignored')
111
 
        self.assertEquals(self.capture('unknowns'), '')
 
112
        self.assertEquals(list(b.unknowns()), [])
 
113
        assert self.backtick('bzr unknowns') == ''
112
114
 
113
115
        file('foo.c', 'wt').write('int main() {}')
114
 
        self.assertEquals(self.capture('unknowns'), 'foo.c\n')
 
116
        self.assertEquals(list(b.unknowns()), ['foo.c'])
 
117
        assert self.backtick('bzr unknowns') == 'foo.c\n'
115
118
 
116
119
        self.runbzr(['add', 'foo.c'])
117
 
        self.assertEquals(self.capture('unknowns'), '')
 
120
        assert self.backtick('bzr unknowns') == ''
118
121
 
119
122
        # 'ignore' works when creating the .bzignore file
120
123
        file('foo.blah', 'wt').write('blah')
121
 
        self.assertEquals(self.capture('unknowns'), 'foo.blah\n')
 
124
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
122
125
        self.runbzr('ignore *.blah')
123
 
        self.assertEquals(self.capture('unknowns'), '')
124
 
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\n')
 
126
        self.assertEquals(list(b.unknowns()), [])
 
127
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
125
128
 
126
129
        # 'ignore' works when then .bzrignore file already exists
127
130
        file('garh', 'wt').write('garh')
128
 
        self.assertEquals(self.capture('unknowns'), 'garh\n')
 
131
        self.assertEquals(list(b.unknowns()), ['garh'])
 
132
        assert self.backtick('bzr unknowns') == 'garh\n'
129
133
        self.runbzr('ignore garh')
130
 
        self.assertEquals(self.capture('unknowns'), '')
131
 
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\ngarh\n')
132
 
 
133
 
    def test_mv_modes(self):
134
 
        """Test two modes of operation for mv"""
135
 
        self.runbzr('init')
136
 
        self.build_tree(['a', 'c', 'subdir/'])
137
 
        self.run_bzr_captured(['add', self.test_dir])
138
 
        self.run_bzr_captured(['mv', 'a', 'b'])
139
 
        self.run_bzr_captured(['mv', 'b', 'subdir'])
140
 
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
141
 
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
142
 
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
143
 
 
144
 
    def test_main_version(self):
145
 
        """Check output from version command and master option is reasonable"""
146
 
        # output is intentionally passed through to stdout so that we
147
 
        # can see the version being tested
148
 
        output = self.runbzr('version', backtick=1)
149
 
        self.log('bzr version output:')
150
 
        self.log(output)
151
 
        self.assert_(output.startswith('bzr (bazaar-ng) '))
152
 
        self.assertNotEqual(output.index('Canonical'), -1)
153
 
        # make sure --version is consistent
154
 
        tmp_output = self.runbzr('--version', backtick=1)
155
 
        self.log('bzr --version output:')
156
 
        self.log(tmp_output)
157
 
        self.assertEquals(output, tmp_output)
158
 
 
159
 
    def example_branch(test):
160
 
        test.runbzr('init')
161
 
        file('hello', 'wt').write('foo')
162
 
        test.runbzr('add hello')
163
 
        test.runbzr('commit -m setup hello')
164
 
        file('goodbye', 'wt').write('baz')
165
 
        test.runbzr('add goodbye')
166
 
        test.runbzr('commit -m setup goodbye')
167
 
 
168
 
    def test_export(self):
169
 
        os.mkdir('branch')
170
 
        os.chdir('branch')
171
 
        self.example_branch()
172
 
        self.runbzr('export ../latest')
173
 
        self.assertEqual(file('../latest/goodbye', 'rt').read(), 'baz')
174
 
        self.runbzr('export ../first -r 1')
175
 
        self.assert_(not os.path.exists('../first/goodbye'))
176
 
        self.assertEqual(file('../first/hello', 'rt').read(), 'foo')
177
 
        self.runbzr('export ../first.gz -r 1')
178
 
        self.assertEqual(file('../first.gz/hello', 'rt').read(), 'foo')
179
 
        self.runbzr('export ../first.bz2 -r 1')
180
 
        self.assertEqual(file('../first.bz2/hello', 'rt').read(), 'foo')
181
 
 
182
 
        from tarfile import TarFile
183
 
        self.runbzr('export ../first.tar -r 1')
184
 
        self.assert_(os.path.isfile('../first.tar'))
185
 
        tf = TarFile('../first.tar')
186
 
        self.assert_('first/hello' in tf.getnames(), tf.getnames())
187
 
        self.assertEqual(tf.extractfile('first/hello').read(), 'foo')
188
 
        self.runbzr('export ../first.tar.gz -r 1')
189
 
        self.assert_(os.path.isfile('../first.tar.gz'))
190
 
        self.runbzr('export ../first.tbz2 -r 1')
191
 
        self.assert_(os.path.isfile('../first.tbz2'))
192
 
        self.runbzr('export ../first.tar.bz2 -r 1')
193
 
        self.assert_(os.path.isfile('../first.tar.bz2'))
194
 
        self.runbzr('export ../first.tar.tbz2 -r 1')
195
 
        self.assert_(os.path.isfile('../first.tar.tbz2'))
196
 
 
197
 
        from bz2 import BZ2File
198
 
        tf = TarFile('../first.tar.tbz2', 
199
 
                     fileobj=BZ2File('../first.tar.tbz2', 'r'))
200
 
        self.assert_('first.tar/hello' in tf.getnames(), tf.getnames())
201
 
        self.assertEqual(tf.extractfile('first.tar/hello').read(), 'foo')
202
 
        self.runbzr('export ../first2.tar -r 1 --root pizza')
203
 
        tf = TarFile('../first2.tar')
204
 
        self.assert_('pizza/hello' in tf.getnames(), tf.getnames())
205
 
 
206
 
        from zipfile import ZipFile
207
 
        self.runbzr('export ../first.zip -r 1')
208
 
        self.failUnlessExists('../first.zip')
209
 
        zf = ZipFile('../first.zip')
210
 
        self.assert_('first/hello' in zf.namelist(), zf.namelist())
211
 
        self.assertEqual(zf.read('first/hello'), 'foo')
212
 
 
213
 
        self.runbzr('export ../first2.zip -r 1 --root pizza')
214
 
        zf = ZipFile('../first2.zip')
215
 
        self.assert_('pizza/hello' in zf.namelist(), zf.namelist())
216
 
        
217
 
        self.runbzr('export ../first-zip --format=zip -r 1')
218
 
        zf = ZipFile('../first-zip')
219
 
        self.assert_('first-zip/hello' in zf.namelist(), zf.namelist())
220
 
 
221
 
    def test_inventory(self):
222
 
        bzr = self.runbzr
223
 
        def output_equals(value, *args):
224
 
            out = self.runbzr(['inventory'] + list(args), backtick=True)
225
 
            self.assertEquals(out, value)
226
 
 
227
 
        bzr('init')
228
 
        open('a', 'wb').write('hello\n')
229
 
        os.mkdir('b')
230
 
 
231
 
        bzr('add a b')
232
 
        bzr('commit -m add')
233
 
 
234
 
        output_equals('a\n', '--kind', 'file')
235
 
        output_equals('b\n', '--kind', 'directory')        
236
 
 
237
 
    def test_ls(self):
238
 
        """Test the abilities of 'bzr ls'"""
239
 
        bzr = self.runbzr
240
 
        def bzrout(*args, **kwargs):
241
 
            kwargs['backtick'] = True
242
 
            return self.runbzr(*args, **kwargs)
243
 
 
244
 
        def ls_equals(value, *args):
245
 
            out = self.runbzr(['ls'] + list(args), backtick=True)
246
 
            self.assertEquals(out, value)
247
 
 
248
 
        bzr('init')
249
 
        open('a', 'wb').write('hello\n')
250
 
 
251
 
        # Can't supply both
252
 
        bzr('ls --verbose --null', retcode=3)
253
 
 
254
 
        ls_equals('a\n')
255
 
        ls_equals('?        a\n', '--verbose')
256
 
        ls_equals('a\n', '--unknown')
257
 
        ls_equals('', '--ignored')
258
 
        ls_equals('', '--versioned')
259
 
        ls_equals('a\n', '--unknown', '--ignored', '--versioned')
260
 
        ls_equals('', '--ignored', '--versioned')
261
 
        ls_equals('a\0', '--null')
262
 
 
263
 
        bzr('add a')
264
 
        ls_equals('V        a\n', '--verbose')
265
 
        bzr('commit -m add')
266
 
        
267
 
        os.mkdir('subdir')
268
 
        ls_equals('V        a\n'
269
 
                  '?        subdir/\n'
270
 
                  , '--verbose')
271
 
        open('subdir/b', 'wb').write('b\n')
272
 
        bzr('add')
273
 
        ls_equals('V        a\n'
274
 
                  'V        subdir/\n'
275
 
                  'V        subdir/b\n'
276
 
                  , '--verbose')
277
 
        bzr('commit -m subdir')
278
 
 
279
 
        ls_equals('a\n'
280
 
                  'subdir\n'
281
 
                  , '--non-recursive')
282
 
 
283
 
        ls_equals('V        a\n'
284
 
                  'V        subdir/\n'
285
 
                  , '--verbose', '--non-recursive')
286
 
 
287
 
        # Check what happens in a sub-directory
288
 
        os.chdir('subdir')
289
 
        ls_equals('b\n')
290
 
        ls_equals('b\0'
291
 
                  , '--null')
292
 
        ls_equals('a\n'
293
 
                  'subdir\n'
294
 
                  'subdir/b\n'
295
 
                  , '--from-root')
296
 
        ls_equals('a\0'
297
 
                  'subdir\0'
298
 
                  'subdir/b\0'
299
 
                  , '--from-root', '--null')
300
 
        ls_equals('a\n'
301
 
                  'subdir\n'
302
 
                  , '--from-root', '--non-recursive')
303
 
 
304
 
        os.chdir('..')
305
 
 
306
 
        # Check what happens when we supply a specific revision
307
 
        ls_equals('a\n', '--revision', '1')
308
 
        ls_equals('V        a\n'
309
 
                  , '--verbose', '--revision', '1')
310
 
 
311
 
        os.chdir('subdir')
312
 
        ls_equals('', '--revision', '1')
313
 
 
314
 
        # Now try to do ignored files.
315
 
        os.chdir('..')
316
 
        open('blah.py', 'wb').write('unknown\n')
317
 
        open('blah.pyo', 'wb').write('ignored\n')
318
 
        ls_equals('a\n'
319
 
                  'blah.py\n'
320
 
                  'blah.pyo\n'
321
 
                  'subdir\n'
322
 
                  'subdir/b\n')
323
 
        ls_equals('V        a\n'
324
 
                  '?        blah.py\n'
325
 
                  'I        blah.pyo\n'
326
 
                  'V        subdir/\n'
327
 
                  'V        subdir/b\n'
328
 
                  , '--verbose')
329
 
        ls_equals('blah.pyo\n'
330
 
                  , '--ignored')
331
 
        ls_equals('blah.py\n'
332
 
                  , '--unknown')
333
 
        ls_equals('a\n'
334
 
                  'subdir\n'
335
 
                  'subdir/b\n'
336
 
                  , '--versioned')
337
 
 
338
 
    def test_cat(self):
339
 
        self.runbzr('init')
340
 
        file("myfile", "wb").write("My contents\n")
341
 
        self.runbzr('add')
342
 
        self.runbzr('commit -m myfile')
343
 
        self.run_bzr_captured('cat -r 1 myfile'.split(' '))
344
 
 
345
 
    def test_pull_verbose(self):
346
 
        """Pull changes from one branch to another and watch the output."""
347
 
 
348
 
        os.mkdir('a')
349
 
        os.chdir('a')
350
 
 
351
 
        bzr = self.runbzr
352
 
        self.example_branch()
353
 
 
354
 
        os.chdir('..')
355
 
        bzr('branch a b')
356
 
        os.chdir('b')
357
 
        open('b', 'wb').write('else\n')
358
 
        bzr('add b')
359
 
        bzr(['commit', '-m', 'added b'])
360
 
 
361
 
        os.chdir('../a')
362
 
        out = bzr('pull --verbose ../b', backtick=True)
363
 
        self.failIfEqual(out.find('Added Revisions:'), -1)
364
 
        self.failIfEqual(out.find('message:\n  added b'), -1)
365
 
        self.failIfEqual(out.find('added b'), -1)
366
 
 
367
 
        # Check that --overwrite --verbose prints out the removed entries
368
 
        bzr('commit -m foo --unchanged')
369
 
        os.chdir('../b')
370
 
        bzr('commit -m baz --unchanged')
371
 
        bzr('pull ../a', retcode=3)
372
 
        out = bzr('pull --overwrite --verbose ../a', backtick=1)
373
 
 
374
 
        remove_loc = out.find('Removed Revisions:')
375
 
        self.failIfEqual(remove_loc, -1)
376
 
        added_loc = out.find('Added Revisions:')
377
 
        self.failIfEqual(added_loc, -1)
378
 
 
379
 
        removed_message = out.find('message:\n  baz')
380
 
        self.failIfEqual(removed_message, -1)
381
 
        self.failUnless(remove_loc < removed_message < added_loc)
382
 
 
383
 
        added_message = out.find('message:\n  foo')
384
 
        self.failIfEqual(added_message, -1)
385
 
        self.failUnless(added_loc < added_message)
386
 
        
387
 
    def test_locations(self):
388
 
        """Using and remembering different locations"""
389
 
        os.mkdir('a')
390
 
        os.chdir('a')
391
 
        self.runbzr('init')
392
 
        self.runbzr('commit -m unchanged --unchanged')
393
 
        self.runbzr('pull', retcode=3)
394
 
        self.runbzr('merge', retcode=3)
395
 
        self.runbzr('branch . ../b')
396
 
        os.chdir('../b')
397
 
        self.runbzr('pull')
398
 
        self.runbzr('branch . ../c')
399
 
        self.runbzr('pull ../c')
400
 
        self.runbzr('merge')
401
 
        os.chdir('../a')
402
 
        self.runbzr('pull ../b')
403
 
        self.runbzr('pull')
404
 
        self.runbzr('pull ../c')
405
 
        self.runbzr('branch ../c ../d')
406
 
        rmtree('../c')
407
 
        self.runbzr('pull')
408
 
        os.chdir('../b')
409
 
        self.runbzr('pull')
410
 
        os.chdir('../d')
411
 
        self.runbzr('pull', retcode=3)
412
 
        self.runbzr('pull ../a --remember')
413
 
        self.runbzr('pull')
414
 
        
415
 
    def test_unknown_command(self):
416
 
        """Handling of unknown command."""
417
 
        out, err = self.run_bzr_captured(['fluffy-badger'],
418
 
                                         retcode=3)
419
 
        self.assertEquals(out, '')
420
 
        err.index('unknown command')
421
 
 
422
 
    def create_conflicts(self):
423
 
        """Create a conflicted tree"""
424
 
        os.mkdir('base')
425
 
        os.chdir('base')
426
 
        file('hello', 'wb').write("hi world")
427
 
        file('answer', 'wb').write("42")
428
 
        self.runbzr('init')
429
 
        self.runbzr('add')
430
 
        self.runbzr('commit -m base')
431
 
        self.runbzr('branch . ../other')
432
 
        self.runbzr('branch . ../this')
433
 
        os.chdir('../other')
434
 
        file('hello', 'wb').write("Hello.")
435
 
        file('answer', 'wb').write("Is anyone there?")
436
 
        self.runbzr('commit -m other')
437
 
        os.chdir('../this')
438
 
        file('hello', 'wb').write("Hello, world")
439
 
        self.runbzr('mv answer question')
440
 
        file('question', 'wb').write("What do you get when you multiply six"
441
 
                                   "times nine?")
442
 
        self.runbzr('commit -m this')
443
 
 
444
 
    def test_status(self):
445
 
        os.mkdir('branch1')
446
 
        os.chdir('branch1')
447
 
        self.runbzr('init')
448
 
        self.runbzr('commit --unchanged --message f')
449
 
        self.runbzr('branch . ../branch2')
450
 
        self.runbzr('branch . ../branch3')
451
 
        self.runbzr('commit --unchanged --message peter')
452
 
        os.chdir('../branch2')
453
 
        self.runbzr('merge ../branch1')
454
 
        self.runbzr('commit --unchanged --message pumpkin')
455
 
        os.chdir('../branch3')
456
 
        self.runbzr('merge ../branch2')
457
 
        message = self.capture('status')
458
 
 
459
 
 
460
 
    def test_conflicts(self):
461
 
        """Handling of merge conflicts"""
462
 
        self.create_conflicts()
463
 
        self.runbzr('merge ../other --show-base', retcode=1)
464
 
        conflict_text = file('hello').read()
465
 
        self.assert_('<<<<<<<' in conflict_text)
466
 
        self.assert_('>>>>>>>' in conflict_text)
467
 
        self.assert_('=======' in conflict_text)
468
 
        self.assert_('|||||||' in conflict_text)
469
 
        self.assert_('hi world' in conflict_text)
470
 
        self.runbzr('revert')
471
 
        self.runbzr('resolve --all')
472
 
        self.runbzr('merge ../other', retcode=1)
473
 
        conflict_text = file('hello').read()
474
 
        self.assert_('|||||||' not in conflict_text)
475
 
        self.assert_('hi world' not in conflict_text)
476
 
        result = self.runbzr('conflicts', backtick=1)
477
 
        self.assertEquals(result, "Text conflict in hello\nText conflict in"
478
 
                                  " question\n")
479
 
        result = self.runbzr('status', backtick=1)
480
 
        self.assert_("conflicts:\n  Text conflict in hello\n"
481
 
                     "  Text conflict in question\n" in result, result)
482
 
        self.runbzr('resolve hello')
483
 
        result = self.runbzr('conflicts', backtick=1)
484
 
        self.assertEquals(result, "Text conflict in question\n")
485
 
        self.runbzr('commit -m conflicts', retcode=3)
486
 
        self.runbzr('resolve --all')
487
 
        result = self.runbzr('conflicts', backtick=1)
488
 
        self.runbzr('commit -m conflicts')
489
 
        self.assertEquals(result, "")
490
 
 
491
 
    def test_push(self):
492
 
        # create a source branch
493
 
        os.mkdir('my-branch')
494
 
        os.chdir('my-branch')
495
 
        self.example_branch()
496
 
 
497
 
        # with no push target, fail
498
 
        self.runbzr('push', retcode=3)
499
 
        # with an explicit target work
500
 
        self.runbzr('push ../output-branch')
501
 
        # with an implicit target work
502
 
        self.runbzr('push')
503
 
        # nothing missing
504
 
        self.runbzr('missing ../output-branch')
505
 
        # advance this branch
506
 
        self.runbzr('commit --unchanged -m unchanged')
507
 
 
508
 
        os.chdir('../output-branch')
509
 
        # There is no longer a difference as long as we have
510
 
        # access to the working tree
511
 
        self.runbzr('diff')
512
 
 
513
 
        # But we should be missing a revision
514
 
        self.runbzr('missing ../my-branch', retcode=1)
515
 
 
516
 
        # diverge the branches
517
 
        self.runbzr('commit --unchanged -m unchanged')
518
 
        os.chdir('../my-branch')
519
 
        # cannot push now
520
 
        self.runbzr('push', retcode=3)
521
 
        # and there are difference
522
 
        self.runbzr('missing ../output-branch', retcode=1)
523
 
        self.runbzr('missing --verbose ../output-branch', retcode=1)
524
 
        # but we can force a push
525
 
        self.runbzr('push --overwrite')
526
 
        # nothing missing
527
 
        self.runbzr('missing ../output-branch')
528
 
        
529
 
        # pushing to a new dir with no parent should fail
530
 
        self.runbzr('push ../missing/new-branch', retcode=3)
531
 
        # unless we provide --create-prefix
532
 
        self.runbzr('push --create-prefix ../missing/new-branch')
533
 
        # nothing missing
534
 
        self.runbzr('missing ../missing/new-branch')
535
 
 
536
 
    def test_external_command(self):
537
 
        """Test that external commands can be run by setting the path
538
 
        """
539
 
        # We don't at present run bzr in a subprocess for blackbox tests, and so 
540
 
        # don't really capture stdout, only the internal python stream.
541
 
        # Therefore we don't use a subcommand that produces any output or does
542
 
        # anything -- we just check that it can be run successfully.  
543
 
        cmd_name = 'test-command'
544
 
        if sys.platform == 'win32':
545
 
            cmd_name += '.bat'
546
 
        oldpath = os.environ.get('BZRPATH', None)
547
 
        bzr = self.capture
548
 
        try:
549
 
            if os.environ.has_key('BZRPATH'):
550
 
                del os.environ['BZRPATH']
551
 
 
552
 
            f = file(cmd_name, 'wb')
553
 
            if sys.platform == 'win32':
554
 
                f.write('@echo off\n')
555
 
            else:
556
 
                f.write('#!/bin/sh\n')
557
 
            # f.write('echo Hello from test-command')
558
 
            f.close()
559
 
            os.chmod(cmd_name, 0755)
560
 
 
561
 
            # It should not find the command in the local 
562
 
            # directory by default, since it is not in my path
563
 
            bzr(cmd_name, retcode=3)
564
 
 
565
 
            # Now put it into my path
566
 
            os.environ['BZRPATH'] = '.'
567
 
 
568
 
            bzr(cmd_name)
569
 
 
570
 
            # Make sure empty path elements are ignored
571
 
            os.environ['BZRPATH'] = os.pathsep
572
 
 
573
 
            bzr(cmd_name, retcode=3)
574
 
 
575
 
        finally:
576
 
            if oldpath:
577
 
                os.environ['BZRPATH'] = oldpath
578
 
 
579
 
 
580
 
def listdir_sorted(dir):
581
 
    L = os.listdir(dir)
582
 
    L.sort()
583
 
    return L
 
134
        self.assertEquals(list(b.unknowns()), [])
 
135
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
 
136
        
 
137
 
584
138
 
585
139
 
586
140
class OldTests(ExternalBase):
587
 
    """old tests moved from ./testbzr."""
588
 
 
589
 
    def test_bzr(self):
 
141
    # old tests moved from ./testbzr
 
142
    def runTest(self):
590
143
        from os import chdir, mkdir
591
144
        from os.path import exists
 
145
        import os
592
146
 
593
147
        runbzr = self.runbzr
594
 
        capture = self.capture
 
148
        backtick = self.backtick
595
149
        progress = self.log
596
150
 
597
151
        progress("basic branch creation")
599
153
        chdir('branch1')
600
154
        runbzr('init')
601
155
 
602
 
        self.assertEquals(capture('root').rstrip(),
603
 
                          pathjoin(self.test_dir, 'branch1'))
 
156
        self.assertEquals(backtick('bzr root').rstrip(),
 
157
                          os.path.join(self.test_dir, 'branch1'))
604
158
 
605
159
        progress("status of new file")
606
160
 
608
162
        f.write('hello world!\n')
609
163
        f.close()
610
164
 
611
 
        self.assertEquals(capture('unknowns'), 'test.txt\n')
612
 
 
613
 
        out = capture("status")
614
 
        self.assertEquals(out, 'unknown:\n  test.txt\n')
 
165
        out = backtick("bzr unknowns")
 
166
        self.assertEquals(out, 'test.txt\n')
 
167
 
 
168
        out = backtick("bzr status")
 
169
        assert out == 'unknown:\n  test.txt\n'
 
170
 
 
171
        out = backtick("bzr status --all")
 
172
        assert out == "unknown:\n  test.txt\n"
 
173
 
 
174
        out = backtick("bzr status test.txt --all")
 
175
        assert out == "unknown:\n  test.txt\n"
615
176
 
616
177
        f = file('test2.txt', 'wt')
617
178
        f.write('goodbye cruel world...\n')
618
179
        f.close()
619
180
 
620
 
        out = capture("status test.txt")
621
 
        self.assertEquals(out, "unknown:\n  test.txt\n")
 
181
        out = backtick("bzr status test.txt")
 
182
        assert out == "unknown:\n  test.txt\n"
622
183
 
623
 
        out = capture("status")
624
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n" "  test2.txt\n"))
 
184
        out = backtick("bzr status")
 
185
        assert out == ("unknown:\n"
 
186
                       "  test.txt\n"
 
187
                       "  test2.txt\n")
625
188
 
626
189
        os.unlink('test2.txt')
627
190
 
628
191
        progress("command aliases")
629
 
        out = capture("st")
630
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
 
192
        out = backtick("bzr st --all")
 
193
        assert out == ("unknown:\n"
 
194
                       "  test.txt\n")
631
195
 
632
 
        out = capture("stat")
633
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
 
196
        out = backtick("bzr stat")
 
197
        assert out == ("unknown:\n"
 
198
                       "  test.txt\n")
634
199
 
635
200
        progress("command help")
636
201
        runbzr("help st")
637
202
        runbzr("help")
638
203
        runbzr("help commands")
639
 
        runbzr("help slartibartfast", 3)
 
204
        runbzr("help slartibartfast", 1)
640
205
 
641
 
        out = capture("help ci")
 
206
        out = backtick("bzr help ci")
642
207
        out.index('aliases: ')
643
208
 
644
209
        progress("can't rename unversioned file")
645
 
        runbzr("rename test.txt new-test.txt", 3)
 
210
        runbzr("rename test.txt new-test.txt", 1)
646
211
 
647
212
        progress("adding a file")
648
213
 
649
214
        runbzr("add test.txt")
650
 
        self.assertEquals(capture("unknowns"), '')
 
215
        assert backtick("bzr unknowns") == ''
 
216
        assert backtick("bzr status --all") == ("added:\n"
 
217
                                                "  test.txt\n")
651
218
 
652
219
        progress("rename newly-added file")
653
220
        runbzr("rename test.txt hello.txt")
654
 
        self.assert_(os.path.exists("hello.txt"))
655
 
        self.assert_(not os.path.exists("test.txt"))
 
221
        assert os.path.exists("hello.txt")
 
222
        assert not os.path.exists("test.txt")
656
223
 
657
 
        self.assertEquals(capture("revno"), '0\n')
 
224
        assert backtick("bzr revno") == '0\n'
658
225
 
659
226
        progress("add first revision")
660
227
        runbzr(['commit', '-m', 'add first revision'])
661
228
 
662
229
        progress("more complex renames")
663
230
        os.mkdir("sub1")
664
 
        runbzr("rename hello.txt sub1", 3)
665
 
        runbzr("rename hello.txt sub1/hello.txt", 3)
666
 
        runbzr("move hello.txt sub1", 3)
 
231
        runbzr("rename hello.txt sub1", 1)
 
232
        runbzr("rename hello.txt sub1/hello.txt", 1)
 
233
        runbzr("move hello.txt sub1", 1)
667
234
 
668
235
        runbzr("add sub1")
669
236
        runbzr("rename sub1 sub2")
670
237
        runbzr("move hello.txt sub2")
671
 
        self.assertEqual(capture("relpath sub2/hello.txt"),
672
 
                         pathjoin("sub2", "hello.txt\n"))
 
238
        assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
673
239
 
674
 
        self.assert_(exists("sub2"))
675
 
        self.assert_(exists("sub2/hello.txt"))
676
 
        self.assert_(not exists("sub1"))
677
 
        self.assert_(not exists("hello.txt"))
 
240
        assert exists("sub2")
 
241
        assert exists("sub2/hello.txt")
 
242
        assert not exists("sub1")
 
243
        assert not exists("hello.txt")
678
244
 
679
245
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
680
246
 
681
247
        mkdir("sub1")
682
248
        runbzr('add sub1')
683
249
        runbzr('move sub2/hello.txt sub1')
684
 
        self.assert_(not exists('sub2/hello.txt'))
685
 
        self.assert_(exists('sub1/hello.txt'))
 
250
        assert not exists('sub2/hello.txt')
 
251
        assert exists('sub1/hello.txt')
686
252
        runbzr('move sub2 sub1')
687
 
        self.assert_(not exists('sub2'))
688
 
        self.assert_(exists('sub1/sub2'))
 
253
        assert not exists('sub2')
 
254
        assert exists('sub1/sub2')
689
255
 
690
256
        runbzr(['commit', '-m', 'rename nested subdirectories'])
691
257
 
692
258
        chdir('sub1/sub2')
693
 
        self.assertEquals(capture('root')[:-1],
694
 
                          pathjoin(self.test_dir, 'branch1'))
 
259
        self.assertEquals(backtick('bzr root')[:-1],
 
260
                          os.path.join(self.test_dir, 'branch1'))
695
261
        runbzr('move ../hello.txt .')
696
 
        self.assert_(exists('./hello.txt'))
697
 
        self.assertEquals(capture('relpath hello.txt'),
698
 
                          pathjoin('sub1', 'sub2', 'hello.txt') + '\n')
699
 
        self.assertEquals(capture('relpath ../../sub1/sub2/hello.txt'), pathjoin('sub1', 'sub2', 'hello.txt\n'))
 
262
        assert exists('./hello.txt')
 
263
        assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
264
        assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
700
265
        runbzr(['commit', '-m', 'move to parent directory'])
701
266
        chdir('..')
702
 
        self.assertEquals(capture('relpath sub2/hello.txt'), pathjoin('sub1', 'sub2', 'hello.txt\n'))
 
267
        assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
703
268
 
704
269
        runbzr('move sub2/hello.txt .')
705
 
        self.assert_(exists('hello.txt'))
 
270
        assert exists('hello.txt')
706
271
 
707
272
        f = file('hello.txt', 'wt')
708
273
        f.write('some nice new content\n')
709
274
        f.close()
710
275
 
711
276
        f = file('msg.tmp', 'wt')
712
 
        f.write('this is my new commit\nand it has multiple lines, for fun')
 
277
        f.write('this is my new commit\n')
713
278
        f.close()
714
279
 
715
280
        runbzr('commit -F msg.tmp')
716
281
 
717
 
        self.assertEquals(capture('revno'), '5\n')
 
282
        assert backtick('bzr revno') == '5\n'
718
283
        runbzr('export -r 5 export-5.tmp')
719
284
        runbzr('export export.tmp')
720
285
 
721
286
        runbzr('log')
722
287
        runbzr('log -v')
723
288
        runbzr('log -v --forward')
724
 
        runbzr('log -m', retcode=3)
725
 
        log_out = capture('log -m commit')
726
 
        self.assert_("this is my new commit\n  and" in log_out)
727
 
        self.assert_("rename nested" not in log_out)
728
 
        self.assert_('revision-id' not in log_out)
729
 
        self.assert_('revision-id' in capture('log --show-ids -m commit'))
 
289
        runbzr('log -m', retcode=1)
 
290
        log_out = backtick('bzr log -m commit')
 
291
        assert "this is my new commit" in log_out
 
292
        assert "rename nested" not in log_out
 
293
        assert 'revision-id' not in log_out
 
294
        assert 'revision-id' in backtick('bzr log --show-ids -m commit')
730
295
 
731
 
        log_out = capture('log --line')
732
 
        # determine the widest line we want
733
 
        max_width = terminal_width() - 1
734
 
        for line in log_out.splitlines():
735
 
            self.assert_(len(line) <= max_width, len(line))
736
 
        self.assert_("this is my new commit and" not in log_out)
737
 
        self.assert_("this is my new commit" in log_out)
738
296
 
739
297
        progress("file with spaces in name")
740
298
        mkdir('sub directory')
741
299
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
742
300
        runbzr('add .')
743
 
        runbzr('diff', retcode=1)
 
301
        runbzr('diff')
744
302
        runbzr('commit -m add-spaces')
745
303
        runbzr('check')
746
304
 
749
307
 
750
308
        runbzr('info')
751
309
 
752
 
        if has_symlinks():
753
 
            progress("symlinks")
754
 
            mkdir('symlinks')
755
 
            chdir('symlinks')
756
 
            runbzr('init')
757
 
            os.symlink("NOWHERE1", "link1")
758
 
            runbzr('add link1')
759
 
            self.assertEquals(self.capture('unknowns'), '')
760
 
            runbzr(['commit', '-m', '1: added symlink link1'])
761
 
    
762
 
            mkdir('d1')
763
 
            runbzr('add d1')
764
 
            self.assertEquals(self.capture('unknowns'), '')
765
 
            os.symlink("NOWHERE2", "d1/link2")
766
 
            self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
767
 
            # is d1/link2 found when adding d1
768
 
            runbzr('add d1')
769
 
            self.assertEquals(self.capture('unknowns'), '')
770
 
            os.symlink("NOWHERE3", "d1/link3")
771
 
            self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
772
 
            runbzr(['commit', '-m', '2: added dir, symlink'])
773
 
    
774
 
            runbzr('rename d1 d2')
775
 
            runbzr('move d2/link2 .')
776
 
            runbzr('move link1 d2')
777
 
            self.assertEquals(os.readlink("./link2"), "NOWHERE2")
778
 
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
779
 
            runbzr('add d2/link3')
780
 
            runbzr('diff', retcode=1)
781
 
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
782
 
    
783
 
            os.unlink("link2")
784
 
            os.symlink("TARGET 2", "link2")
785
 
            os.unlink("d2/link1")
786
 
            os.symlink("TARGET 1", "d2/link1")
787
 
            runbzr('diff', retcode=1)
788
 
            self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
789
 
            runbzr(['commit', '-m', '4: retarget of two links'])
790
 
    
791
 
            runbzr('remove d2/link1')
792
 
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
793
 
            runbzr(['commit', '-m', '5: remove d2/link1'])
794
 
            # try with the rm alias
795
 
            runbzr('add d2/link1')
796
 
            runbzr(['commit', '-m', '6: add d2/link1'])
797
 
            runbzr('rm d2/link1')
798
 
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
799
 
            runbzr(['commit', '-m', '7: remove d2/link1'])
800
 
    
801
 
            os.mkdir("d1")
802
 
            runbzr('add d1')
803
 
            runbzr('rename d2/link3 d1/link3new')
804
 
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
805
 
            runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
806
 
            
807
 
            runbzr(['check'])
808
 
            
809
 
            runbzr(['export', '-r', '1', 'exp1.tmp'])
810
 
            chdir("exp1.tmp")
811
 
            self.assertEquals(listdir_sorted("."), [ "link1" ])
812
 
            self.assertEquals(os.readlink("link1"), "NOWHERE1")
813
 
            chdir("..")
814
 
            
815
 
            runbzr(['export', '-r', '2', 'exp2.tmp'])
816
 
            chdir("exp2.tmp")
817
 
            self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
818
 
            chdir("..")
819
 
            
820
 
            runbzr(['export', '-r', '3', 'exp3.tmp'])
821
 
            chdir("exp3.tmp")
822
 
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
823
 
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
824
 
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
825
 
            self.assertEquals(os.readlink("link2")   , "NOWHERE2")
826
 
            chdir("..")
827
 
            
828
 
            runbzr(['export', '-r', '4', 'exp4.tmp'])
829
 
            chdir("exp4.tmp")
830
 
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
831
 
            self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
832
 
            self.assertEquals(os.readlink("link2")   , "TARGET 2")
833
 
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
834
 
            chdir("..")
835
 
            
836
 
            runbzr(['export', '-r', '5', 'exp5.tmp'])
837
 
            chdir("exp5.tmp")
838
 
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
839
 
            self.assert_(os.path.islink("link2"))
840
 
            self.assert_(listdir_sorted("d2")== [ "link3" ])
841
 
            chdir("..")
842
 
            
843
 
            runbzr(['export', '-r', '8', 'exp6.tmp'])
844
 
            chdir("exp6.tmp")
845
 
            self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
846
 
            self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
847
 
            self.assertEquals(listdir_sorted("d2"), [])
848
 
            self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
849
 
            chdir("..")
850
 
        else:
851
 
            progress("skipping symlink tests")
852
 
 
853
 
 
854
 
class RemoteTests(object):
855
 
    """Test bzr ui commands against remote branches."""
856
 
 
857
 
    def test_branch(self):
858
 
        os.mkdir('from')
859
 
        wt = self.make_branch_and_tree('from')
860
 
        branch = wt.branch
861
 
        wt.commit('empty commit for nonsense', allow_pointless=True)
862
 
        url = self.get_readonly_url('from')
863
 
        self.run_bzr('branch', url, 'to')
864
 
        branch = Branch.open('to')
865
 
        self.assertEqual(1, len(branch.revision_history()))
866
 
        # the branch should be set in to to from
867
 
        self.assertEqual(url + '/', branch.get_parent())
868
 
 
869
 
    def test_log(self):
870
 
        self.build_tree(['branch/', 'branch/file'])
871
 
        self.capture('init branch')
872
 
        self.capture('add branch/file')
873
 
        self.capture('commit -m foo branch')
874
 
        url = self.get_readonly_url('branch/file')
875
 
        output = self.capture('log %s' % url)
876
 
        self.assertEqual(8, len(output.split('\n')))
 
310
 
 
311
 
 
312
 
 
313
 
 
314
 
 
315
        chdir('..')
 
316
        chdir('..')
 
317
        progress('branch')
 
318
        assert os.path.exists('branch1')
 
319
        assert not os.path.exists('branch2')
 
320
        # Can't create a branch if it already exists
 
321
        runbzr('branch branch1', retcode=1)
 
322
        # Can't create a branch if its parent doesn't exist
 
323
        runbzr('branch /unlikely/to/exist', retcode=1)
 
324
        runbzr('branch branch1 branch2')
 
325
        assert exists('branch2')
 
326
        assert exists('branch2/sub1')
 
327
        assert exists('branch2/sub1/hello.txt')
877
328
        
878
 
    def test_check(self):
879
 
        self.build_tree(['branch/', 'branch/file'])
880
 
        self.capture('init branch')
881
 
        self.capture('add branch/file')
882
 
        self.capture('commit -m foo branch')
883
 
        url = self.get_readonly_url('branch/')
884
 
        self.run_bzr('check', url)
885
 
    
886
 
    def test_push(self):
887
 
        # create a source branch
888
 
        os.mkdir('my-branch')
889
 
        os.chdir('my-branch')
890
 
        self.run_bzr('init')
 
329
        runbzr('branch --revision 0 branch1 branch3')
 
330
        assert not exists('branch3/sub1/hello.txt')
 
331
        runbzr('branch --revision 0..3 branch1 branch4', retcode=1)
 
332
 
 
333
        progress("pull")
 
334
        chdir('branch1')
 
335
        runbzr('pull', retcode=1)
 
336
        runbzr('pull ../branch2')
 
337
        chdir('.bzr')
 
338
        runbzr('pull')
 
339
        runbzr('commit --unchanged -m empty')
 
340
        runbzr('pull')
 
341
        chdir('../../branch2')
 
342
        runbzr('pull')
 
343
        runbzr('commit --unchanged -m empty')
 
344
        chdir('../branch1')
 
345
        runbzr('commit --unchanged -m empty')
 
346
        runbzr('pull', retcode=1)
 
347
        chdir ('..')
 
348
 
 
349
        progress('status after remove')
 
350
        mkdir('status-after-remove')
 
351
        # see mail from William Dodé, 2005-05-25
 
352
        # $ bzr init; touch a; bzr add a; bzr commit -m "add a"
 
353
        #     * looking for changes...
 
354
        #     added a
 
355
        #     * commited r1
 
356
        #     $ bzr remove a
 
357
        #     $ bzr status
 
358
        #     bzr: local variable 'kind' referenced before assignment
 
359
        #     at /vrac/python/bazaar-ng/bzrlib/diff.py:286 in compare_trees()
 
360
        #     see ~/.bzr.log for debug information
 
361
        chdir('status-after-remove')
 
362
        runbzr('init')
 
363
        file('a', 'w').write('foo')
 
364
        runbzr('add a')
 
365
        runbzr(['commit', '-m', 'add a'])
 
366
        runbzr('remove a')
 
367
        runbzr('status')
 
368
 
 
369
        chdir('..')
 
370
 
 
371
 
 
372
 
 
373
        progress("recursive and non-recursive add")
 
374
        mkdir('no-recurse')
 
375
        chdir('no-recurse')
 
376
        runbzr('init')
 
377
        mkdir('foo')
 
378
        fp = os.path.join('foo', 'test.txt')
 
379
        f = file(fp, 'w')
 
380
        f.write('hello!\n')
 
381
        f.close()
 
382
        runbzr('add --no-recurse foo')
 
383
        runbzr('file-id foo')
 
384
        runbzr('file-id ' + fp, 1)      # not versioned yet
 
385
        runbzr('commit -m add-dir-only')
 
386
 
 
387
        self.runbzr('file-id ' + fp, 1)      # still not versioned 
 
388
 
 
389
        self.runbzr('add foo')
 
390
        self.runbzr('file-id ' + fp)
 
391
        self.runbzr('commit -m add-sub-file')
 
392
 
 
393
        chdir('..')
 
394
 
 
395
 
 
396
 
 
397
class RevertCommand(ExternalBase):
 
398
    def runTest(self):
 
399
        self.runbzr('init')
 
400
 
891
401
        file('hello', 'wt').write('foo')
892
 
        self.run_bzr('add', 'hello')
893
 
        self.run_bzr('commit', '-m', 'setup')
894
 
 
895
 
        # with an explicit target work
896
 
        self.run_bzr('push', self.get_url('output-branch'))
897
 
 
898
 
    
899
 
class HTTPTests(TestCaseWithWebserver, RemoteTests):
900
 
    """Test various commands against a HTTP server."""
901
 
    
902
 
    
903
 
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
904
 
    """Test various commands against a SFTP server using abs paths."""
905
 
 
906
 
    
907
 
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
908
 
    """Test various commands against a SFTP server using abs paths."""
909
 
 
910
 
    def setUp(self):
911
 
        super(SFTPTestsAbsoluteSibling, self).setUp()
912
 
        self._override_home = '/dev/noone/runs/tests/here'
913
 
 
914
 
    
915
 
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
916
 
    """Test various commands against a SFTP server using homedir rel paths."""
917
 
 
918
 
    def setUp(self):
919
 
        super(SFTPTestsRelative, self).setUp()
920
 
        self._get_remote_is_absolute = False
 
402
        self.runbzr('add hello')
 
403
        self.runbzr('commit -m setup hello')
 
404
        
 
405
        file('hello', 'wt').write('bar')
 
406
        self.runbzr('revert hello')
 
407
        self.check_file_contents('hello', 'foo')
 
408