~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-11-18 16:50:56 UTC
  • mto: (1185.82.108 w-changeset)
  • mto: This revision was merged to the branch mainline in revision 1738.
  • Revision ID: john@arbash-meinel.com-20051118165056-97f164d958a1886b
Moved testdata code to subdirectory

Show diffs side-by-side

added added

removed removed

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