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