~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

  • Committer: John Arbash Meinel
  • Date: 2005-09-15 21:35:53 UTC
  • mfrom: (907.1.57)
  • mto: (1393.2.1)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: john@arbash-meinel.com-20050915213552-a6c83a5ef1e20897
(broken) Transport work is merged in. Tests do not pass yet.

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
 
29
import sys
38
30
import os
39
 
import re
40
 
import sys
41
31
 
42
 
import bzrlib
 
32
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
43
33
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
 
34
from bzrlib.commands import run_bzr
 
35
 
 
36
 
 
37
class ExternalBase(TestCaseInTempDir):
 
38
    def runbzr(self, args, retcode=0,backtick=False):
 
39
        if isinstance(args, basestring):
 
40
            args = args.split()
 
41
 
 
42
        if backtick:
 
43
            return self.backtick(['python', self.BZRPATH,] + args,
 
44
                           retcode=retcode)
 
45
        else:
 
46
            return self.runcmd(['python', self.BZRPATH,] + args,
 
47
                           retcode=retcode)
56
48
 
57
49
 
58
50
class TestCommands(ExternalBase):
59
51
 
60
 
    def test_nick_command(self):
61
 
        """bzr nick for viewing, setting nicknames"""
62
 
        os.mkdir('me.dev')
63
 
        os.chdir('me.dev')
 
52
    def test_help_commands(self):
 
53
        self.runbzr('--help')
 
54
        self.runbzr('help')
 
55
        self.runbzr('help commands')
 
56
        self.runbzr('help help')
 
57
        self.runbzr('commit -h')
 
58
 
 
59
    def test_init_branch(self):
 
60
        self.runbzr(['init'])
 
61
 
 
62
    def test_whoami(self):
 
63
        # this should always identify something, if only "john@localhost"
 
64
        self.runbzr("whoami")
 
65
        self.runbzr("whoami --email")
 
66
 
 
67
        self.assertEquals(self.runbzr("whoami --email",
 
68
                                      backtick=True).count('@'), 1)
 
69
        
 
70
    def test_whoami_branch(self):
 
71
        """branch specific user identity works."""
64
72
        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')
 
73
        f = file('.bzr/email', 'wt')
 
74
        f.write('Branch Identity <branch@identi.ty>')
 
75
        f.close()
 
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'))
70
80
 
71
81
    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)
 
82
        self.runbzr("pants", retcode=1)
 
83
        self.runbzr("--pants off", retcode=1)
 
84
        self.runbzr("diff --message foo", retcode=1)
 
85
 
 
86
    def test_empty_commit(self):
 
87
        self.runbzr("init")
 
88
        self.build_tree(['hello.txt'])
 
89
        self.runbzr("commit -m empty", retcode=1)
 
90
        self.runbzr("add hello.txt")
 
91
        self.runbzr("commit -m added")
75
92
 
76
93
    def test_ignore_patterns(self):
77
 
        self.runbzr('init')
78
 
        self.assertEquals(self.capture('unknowns'), '')
 
94
        from bzrlib.branch import Branch
 
95
        
 
96
        b = Branch('.', init=True)
 
97
        self.assertEquals(list(b.unknowns()), [])
 
98
 
 
99
        file('foo.tmp', 'wt').write('tmp files are ignored')
 
100
        self.assertEquals(list(b.unknowns()), [])
 
101
        assert self.backtick('bzr unknowns') == ''
79
102
 
80
103
        file('foo.c', 'wt').write('int main() {}')
81
 
        self.assertEquals(self.capture('unknowns'), 'foo.c\n')
 
104
        self.assertEquals(list(b.unknowns()), ['foo.c'])
 
105
        assert self.backtick('bzr unknowns') == 'foo.c\n'
82
106
 
83
107
        self.runbzr(['add', 'foo.c'])
84
 
        self.assertEquals(self.capture('unknowns'), '')
 
108
        assert self.backtick('bzr unknowns') == ''
85
109
 
86
110
        # 'ignore' works when creating the .bzignore file
87
111
        file('foo.blah', 'wt').write('blah')
88
 
        self.assertEquals(self.capture('unknowns'), 'foo.blah\n')
 
112
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
89
113
        self.runbzr('ignore *.blah')
90
 
        self.assertEquals(self.capture('unknowns'), '')
91
 
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\n')
 
114
        self.assertEquals(list(b.unknowns()), [])
 
115
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
92
116
 
93
117
        # 'ignore' works when then .bzrignore file already exists
94
118
        file('garh', 'wt').write('garh')
95
 
        self.assertEquals(self.capture('unknowns'), 'garh\n')
 
119
        self.assertEquals(list(b.unknowns()), ['garh'])
 
120
        assert self.backtick('bzr unknowns') == 'garh\n'
96
121
        self.runbzr('ignore garh')
97
 
        self.assertEquals(self.capture('unknowns'), '')
98
 
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\ngarh\n')
 
122
        self.assertEquals(list(b.unknowns()), [])
 
123
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
99
124
 
100
125
    def test_revert(self):
101
126
        self.runbzr('init')
107
132
        file('goodbye', 'wt').write('baz')
108
133
        self.runbzr('add goodbye')
109
134
        self.runbzr('commit -m setup goodbye')
110
 
 
 
135
        
111
136
        file('hello', 'wt').write('bar')
112
137
        file('goodbye', 'wt').write('qux')
113
138
        self.runbzr('revert hello')
122
147
        os.rmdir('revertdir')
123
148
        self.runbzr('revert')
124
149
 
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('..')
 
150
    def test_mv_modes(self):
 
151
        """Test two modes of operation for mv"""
 
152
        from bzrlib.branch import Branch
 
153
        b = Branch('.', init=True)
 
154
        self.build_tree(['a', 'c', 'subdir/'])
 
155
        self.run_bzr('add', self.test_dir)
 
156
        self.run_bzr('mv', 'a', 'b')
 
157
        self.run_bzr('mv', 'b', 'subdir')
 
158
        self.run_bzr('mv', 'subdir/b', 'a')
 
159
        self.run_bzr('mv', 'a', 'c', 'subdir')
 
160
        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
 
161
 
149
162
 
150
163
    def test_main_version(self):
151
164
        """Check output from version command and master option is reasonable"""
171
184
        test.runbzr('add goodbye')
172
185
        test.runbzr('commit -m setup goodbye')
173
186
 
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')
 
187
    def test_revert(self):
 
188
        self.example_branch()
 
189
        file('hello', 'wt').write('bar')
 
190
        file('goodbye', 'wt').write('qux')
 
191
        self.runbzr('revert hello')
 
192
        self.check_file_contents('hello', 'foo')
 
193
        self.check_file_contents('goodbye', 'qux')
 
194
        self.runbzr('revert')
 
195
        self.check_file_contents('goodbye', 'baz')
 
196
 
 
197
    def test_merge(self):
 
198
        from bzrlib.branch import Branch
 
199
        
 
200
        os.mkdir('a')
 
201
        os.chdir('a')
 
202
        self.example_branch()
 
203
        os.chdir('..')
 
204
        self.runbzr('branch a b')
 
205
        os.chdir('b')
 
206
        file('goodbye', 'wt').write('quux')
 
207
        self.runbzr(['commit',  '-m',  "more u's are always good"])
 
208
 
 
209
        os.chdir('../a')
 
210
        file('hello', 'wt').write('quuux')
 
211
        # We can't merge when there are in-tree changes
 
212
        self.runbzr('merge ../b', retcode=1)
 
213
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
 
214
        self.runbzr('merge ../b')
 
215
        self.check_file_contents('goodbye', 'quux')
 
216
        # Merging a branch pulls its revision into the tree
 
217
        a = Branch('.')
 
218
        b = Branch('../b')
 
219
        a.get_revision_xml(b.last_patch())
 
220
        self.log('pending merges: %s', a.pending_merges())
 
221
        #        assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
 
222
        #        % (a.pending_merges(), b.last_patch())
 
223
 
 
224
    def test_pull(self):
 
225
        """Pull changes from one branch to another."""
 
226
        os.mkdir('a')
 
227
        os.chdir('a')
 
228
 
 
229
        self.example_branch()
 
230
        self.runbzr('pull', retcode=1)
 
231
        self.runbzr('missing', retcode=1)
 
232
        self.runbzr('missing .')
 
233
        self.runbzr('missing')
 
234
        self.runbzr('pull')
 
235
        self.runbzr('pull /', retcode=1)
 
236
        self.runbzr('pull')
 
237
 
 
238
        os.chdir('..')
 
239
        self.runbzr('branch a b')
 
240
        os.chdir('b')
 
241
        self.runbzr('pull')
 
242
        self.runbzr('commit -m blah --unchanged')
 
243
        os.chdir('../a')
 
244
        a = Branch('.')
 
245
        b = Branch('../b')
 
246
        assert a.revision_history() == b.revision_history()[:-1]
427
247
        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
 
248
        assert a.revision_history() == b.revision_history()
 
249
        self.runbzr('commit -m blah2 --unchanged')
 
250
        os.chdir('../b')
 
251
        self.runbzr('commit -m blah3 --unchanged')
 
252
        self.runbzr('pull ../a', retcode=1)
 
253
        os.chdir('../a')
 
254
        self.runbzr('merge ../b')
 
255
        self.runbzr('commit -m blah4 --unchanged')
 
256
        os.chdir('../b')
 
257
        self.runbzr('pull ../a')
 
258
        assert a.revision_history()[-1] == b.revision_history()[-1]
 
259
        
 
260
 
 
261
    def test_add_reports(self):
 
262
        """add command prints the names of added files."""
 
263
        b = Branch('.', init=True)
 
264
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
 
265
 
 
266
        from cStringIO import StringIO
 
267
        out = StringIO()
 
268
 
 
269
        ret = self.apply_redirected(None, out, None,
 
270
                                    run_bzr,
 
271
                                    ['add'])
 
272
        self.assertEquals(ret, 0)
 
273
 
 
274
        # the ordering is not defined at the moment
 
275
        results = sorted(out.getvalue().rstrip('\n').split('\n'))
 
276
        self.assertEquals(['added dir',
 
277
                           'added dir/sub.txt',
 
278
                           'added top.txt',],
 
279
                          results)
609
280
 
610
281
 
611
282
class OldTests(ExternalBase):
616
287
        from os.path import exists
617
288
 
618
289
        runbzr = self.runbzr
619
 
        capture = self.capture
 
290
        backtick = self.backtick
620
291
        progress = self.log
621
292
 
622
293
        progress("basic branch creation")
624
295
        chdir('branch1')
625
296
        runbzr('init')
626
297
 
627
 
        self.assertEquals(capture('root').rstrip(),
628
 
                          pathjoin(self.test_dir, 'branch1'))
 
298
        self.assertEquals(backtick('bzr root').rstrip(),
 
299
                          os.path.join(self.test_dir, 'branch1'))
629
300
 
630
301
        progress("status of new file")
631
302
 
633
304
        f.write('hello world!\n')
634
305
        f.close()
635
306
 
636
 
        self.assertEquals(capture('unknowns'), 'test.txt\n')
637
 
 
638
 
        out = capture("status")
639
 
        self.assertEquals(out, 'unknown:\n  test.txt\n')
 
307
        out = backtick("bzr unknowns")
 
308
        self.assertEquals(out, 'test.txt\n')
 
309
 
 
310
        out = backtick("bzr status")
 
311
        assert out == 'unknown:\n  test.txt\n'
 
312
 
 
313
        out = backtick("bzr status --all")
 
314
        assert out == "unknown:\n  test.txt\n"
 
315
 
 
316
        out = backtick("bzr status test.txt --all")
 
317
        assert out == "unknown:\n  test.txt\n"
640
318
 
641
319
        f = file('test2.txt', 'wt')
642
320
        f.write('goodbye cruel world...\n')
643
321
        f.close()
644
322
 
645
 
        out = capture("status test.txt")
646
 
        self.assertEquals(out, "unknown:\n  test.txt\n")
 
323
        out = backtick("bzr status test.txt")
 
324
        assert out == "unknown:\n  test.txt\n"
647
325
 
648
 
        out = capture("status")
649
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n" "  test2.txt\n"))
 
326
        out = backtick("bzr status")
 
327
        assert out == ("unknown:\n"
 
328
                       "  test.txt\n"
 
329
                       "  test2.txt\n")
650
330
 
651
331
        os.unlink('test2.txt')
652
332
 
653
333
        progress("command aliases")
654
 
        out = capture("st")
655
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
 
334
        out = backtick("bzr st --all")
 
335
        assert out == ("unknown:\n"
 
336
                       "  test.txt\n")
656
337
 
657
 
        out = capture("stat")
658
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
 
338
        out = backtick("bzr stat")
 
339
        assert out == ("unknown:\n"
 
340
                       "  test.txt\n")
659
341
 
660
342
        progress("command help")
661
343
        runbzr("help st")
662
344
        runbzr("help")
663
345
        runbzr("help commands")
664
 
        runbzr("help slartibartfast", 3)
 
346
        runbzr("help slartibartfast", 1)
665
347
 
666
 
        out = capture("help ci")
 
348
        out = backtick("bzr help ci")
667
349
        out.index('aliases: ')
668
350
 
 
351
        progress("can't rename unversioned file")
 
352
        runbzr("rename test.txt new-test.txt", 1)
 
353
 
 
354
        progress("adding a file")
 
355
 
 
356
        runbzr("add test.txt")
 
357
        assert backtick("bzr unknowns") == ''
 
358
        assert backtick("bzr status --all") == ("added:\n"
 
359
                                                "  test.txt\n")
 
360
 
 
361
        progress("rename newly-added file")
 
362
        runbzr("rename test.txt hello.txt")
 
363
        assert os.path.exists("hello.txt")
 
364
        assert not os.path.exists("test.txt")
 
365
 
 
366
        assert backtick("bzr revno") == '0\n'
 
367
 
 
368
        progress("add first revision")
 
369
        runbzr(['commit', '-m', 'add first revision'])
 
370
 
 
371
        progress("more complex renames")
 
372
        os.mkdir("sub1")
 
373
        runbzr("rename hello.txt sub1", 1)
 
374
        runbzr("rename hello.txt sub1/hello.txt", 1)
 
375
        runbzr("move hello.txt sub1", 1)
 
376
 
 
377
        runbzr("add sub1")
 
378
        runbzr("rename sub1 sub2")
 
379
        runbzr("move hello.txt sub2")
 
380
        assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
 
381
 
 
382
        assert exists("sub2")
 
383
        assert exists("sub2/hello.txt")
 
384
        assert not exists("sub1")
 
385
        assert not exists("hello.txt")
 
386
 
 
387
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
388
 
 
389
        mkdir("sub1")
 
390
        runbzr('add sub1')
 
391
        runbzr('move sub2/hello.txt sub1')
 
392
        assert not exists('sub2/hello.txt')
 
393
        assert exists('sub1/hello.txt')
 
394
        runbzr('move sub2 sub1')
 
395
        assert not exists('sub2')
 
396
        assert exists('sub1/sub2')
 
397
 
 
398
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
399
 
 
400
        chdir('sub1/sub2')
 
401
        self.assertEquals(backtick('bzr root')[:-1],
 
402
                          os.path.join(self.test_dir, 'branch1'))
 
403
        runbzr('move ../hello.txt .')
 
404
        assert exists('./hello.txt')
 
405
        assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
406
        assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
407
        runbzr(['commit', '-m', 'move to parent directory'])
 
408
        chdir('..')
 
409
        assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
410
 
 
411
        runbzr('move sub2/hello.txt .')
 
412
        assert exists('hello.txt')
 
413
 
669
414
        f = file('hello.txt', 'wt')
670
415
        f.write('some nice new content\n')
671
416
        f.close()
672
417
 
673
 
        runbzr("add hello.txt")
674
 
        
675
418
        f = file('msg.tmp', 'wt')
676
 
        f.write('this is my new commit\nand it has multiple lines, for fun')
 
419
        f.write('this is my new commit\n')
677
420
        f.close()
678
421
 
679
422
        runbzr('commit -F msg.tmp')
680
423
 
681
 
        self.assertEquals(capture('revno'), '1\n')
682
 
        runbzr('export -r 1 export-1.tmp')
 
424
        assert backtick('bzr revno') == '5\n'
 
425
        runbzr('export -r 5 export-5.tmp')
683
426
        runbzr('export export.tmp')
684
427
 
685
428
        runbzr('log')
686
429
        runbzr('log -v')
687
430
        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'))
 
431
        runbzr('log -m', retcode=1)
 
432
        log_out = backtick('bzr log -m commit')
 
433
        assert "this is my new commit" in log_out
 
434
        assert "rename nested" not in log_out
 
435
        assert 'revision-id' not in log_out
 
436
        assert 'revision-id' in backtick('bzr log --show-ids -m commit')
694
437
 
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
438
 
703
439
        progress("file with spaces in name")
704
440
        mkdir('sub directory')
705
441
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
706
442
        runbzr('add .')
707
 
        runbzr('diff', retcode=1)
 
443
        runbzr('diff')
708
444
        runbzr('commit -m add-spaces')
709
445
        runbzr('check')
710
446
 
713
449
 
714
450
        runbzr('info')
715
451
 
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')))
841
 
        
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')
855
 
        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