~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugins/weave_fmt/test_bzrdir.py

merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006-2010 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# 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
 
 
17
"""Tests for the weave-era BzrDir formats.
 
18
 
 
19
For interface contract tests, see tests/per_bzr_dir.
 
20
"""
 
21
 
 
22
import os
 
23
import sys
 
24
 
 
25
from bzrlib import (
 
26
    branch,
 
27
    bzrdir,
 
28
    errors,
 
29
    repository,
 
30
    upgrade,
 
31
    urlutils,
 
32
    workingtree,
 
33
    )
 
34
from bzrlib.osutils import (
 
35
    getcwd,
 
36
    lexists,
 
37
    )
 
38
from bzrlib.tests.test_bundle import V4BundleTester
 
39
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
 
40
from bzrlib.tests import (
 
41
    TestCaseWithTransport,
 
42
    )
 
43
 
 
44
from bzrlib.plugins.weave_fmt.branch import (
 
45
    BzrBranchFormat4,
 
46
    )
 
47
from bzrlib.plugins.weave_fmt.bzrdir import (
 
48
    BzrDirFormat5,
 
49
    BzrDirFormat6,
 
50
    )
 
51
 
 
52
 
 
53
class TestFormat5(TestCaseWithTransport):
 
54
    """Tests specific to the version 5 bzrdir format."""
 
55
 
 
56
    def test_same_lockfiles_between_tree_repo_branch(self):
 
57
        # this checks that only a single lockfiles instance is created
 
58
        # for format 5 objects
 
59
        dir = BzrDirFormat5().initialize(self.get_url())
 
60
        def check_dir_components_use_same_lock(dir):
 
61
            ctrl_1 = dir.open_repository().control_files
 
62
            ctrl_2 = dir.open_branch().control_files
 
63
            ctrl_3 = dir.open_workingtree()._control_files
 
64
            self.assertTrue(ctrl_1 is ctrl_2)
 
65
            self.assertTrue(ctrl_2 is ctrl_3)
 
66
        check_dir_components_use_same_lock(dir)
 
67
        # and if we open it normally.
 
68
        dir = bzrdir.BzrDir.open(self.get_url())
 
69
        check_dir_components_use_same_lock(dir)
 
70
 
 
71
    def test_can_convert(self):
 
72
        # format 5 dirs are convertable
 
73
        dir = BzrDirFormat5().initialize(self.get_url())
 
74
        self.assertTrue(dir.can_convert_format())
 
75
 
 
76
    def test_needs_conversion(self):
 
77
        # format 5 dirs need a conversion if they are not the default,
 
78
        # and they aren't
 
79
        dir = BzrDirFormat5().initialize(self.get_url())
 
80
        # don't need to convert it to itself
 
81
        self.assertFalse(dir.needs_format_conversion(BzrDirFormat5()))
 
82
        # do need to convert it to the current default
 
83
        self.assertTrue(dir.needs_format_conversion(
 
84
            bzrdir.BzrDirFormat.get_default_format()))
 
85
 
 
86
 
 
87
class TestFormat6(TestCaseWithTransport):
 
88
    """Tests specific to the version 6 bzrdir format."""
 
89
 
 
90
    def test_same_lockfiles_between_tree_repo_branch(self):
 
91
        # this checks that only a single lockfiles instance is created
 
92
        # for format 6 objects
 
93
        dir = BzrDirFormat6().initialize(self.get_url())
 
94
        def check_dir_components_use_same_lock(dir):
 
95
            ctrl_1 = dir.open_repository().control_files
 
96
            ctrl_2 = dir.open_branch().control_files
 
97
            ctrl_3 = dir.open_workingtree()._control_files
 
98
            self.assertTrue(ctrl_1 is ctrl_2)
 
99
            self.assertTrue(ctrl_2 is ctrl_3)
 
100
        check_dir_components_use_same_lock(dir)
 
101
        # and if we open it normally.
 
102
        dir = bzrdir.BzrDir.open(self.get_url())
 
103
        check_dir_components_use_same_lock(dir)
 
104
 
 
105
    def test_can_convert(self):
 
106
        # format 6 dirs are convertable
 
107
        dir = BzrDirFormat6().initialize(self.get_url())
 
108
        self.assertTrue(dir.can_convert_format())
 
109
 
 
110
    def test_needs_conversion(self):
 
111
        # format 6 dirs need an conversion if they are not the default.
 
112
        dir = BzrDirFormat6().initialize(self.get_url())
 
113
        self.assertTrue(dir.needs_format_conversion(
 
114
            bzrdir.BzrDirFormat.get_default_format()))
 
115
 
 
116
 
 
117
class TestBreakLockOldBranch(TestCaseWithTransport):
 
118
 
 
119
    def test_break_lock_format_5_bzrdir(self):
 
120
        # break lock on a format 5 bzrdir should just return
 
121
        self.make_branch_and_tree('foo', format=BzrDirFormat5())
 
122
        out, err = self.run_bzr('break-lock foo')
 
123
        self.assertEqual('', out)
 
124
        self.assertEqual('', err)
 
125
 
 
126
 
 
127
_upgrade1_template = \
 
128
     [
 
129
     ('foo', 'new contents\n'),
 
130
     ('.bzr/',),
 
131
     ('.bzr/README',
 
132
      'This is a Bazaar control directory.\n'
 
133
      'Do not change any files in this directory.\n'
 
134
      'See http://bazaar.canonical.com/ for more information about Bazaar.\n'),
 
135
     ('.bzr/branch-format', 'Bazaar-NG branch, format 0.0.4\n'),
 
136
     ('.bzr/revision-history',
 
137
      'mbp@sourcefrog.net-20051004035611-176b16534b086b3c\n'
 
138
      'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd\n'),
 
139
     ('.bzr/merged-patches', ''),
 
140
     ('.bzr/pending-merged-patches', ''),
 
141
     ('.bzr/branch-name', ''),
 
142
     ('.bzr/branch-lock', ''),
 
143
     ('.bzr/pending-merges', ''),
 
144
     ('.bzr/inventory',
 
145
      '<inventory>\n'
 
146
      '<entry file_id="foo-20051004035605-91e788d1875603ae" kind="file" name="foo" />\n'
 
147
      '</inventory>\n'),
 
148
     ('.bzr/stat-cache',
 
149
      '### bzr hashcache v5\n'
 
150
      'foo// be9f309239729f69a6309e970ef24941d31e042c 13 1128398176 1128398176 303464 770\n'),
 
151
     ('.bzr/text-store/',),
 
152
     ('.bzr/text-store/foo-20051004035611-1591048e9dc7c2d4.gz',
 
153
      '\x1f\x8b\x08\x00[\xfdAC\x02\xff\xcb\xcc\xcb,\xc9L\xccQH\xce\xcf+I\xcd+)\xe6\x02\x00\xdd\xcc\xf90\x11\x00\x00\x00'),
 
154
     ('.bzr/text-store/foo-20051004035756-4081373d897c3453.gz',
 
155
      '\x1f\x8b\x08\x00\xc4\xfdAC\x02\xff\xcbK-WH\xce\xcf+I\xcd+)\xe6\x02\x00g\xc3\xdf\xc9\r\x00\x00\x00'),
 
156
     ('.bzr/inventory-store/',),
 
157
     ('.bzr/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz',
 
158
      '\x1f\x8b\x08\x00[\xfdAC\x02\xffm\x8f\xcd\n\xc20\x10\x84\xef>E\xc8\xbdt7?M\x02\xad\xaf"\xa1\x99`P[\xa8E\xacOo\x14\x05\x0f\xdef\xe1\xfbv\x98\xbeL7L\xeb\xbcl\xfb]_\xc3\xb2\x89\\\xce8\x944\xc8<\xcf\x8d"\xb2LdH\xdb\x8el\x13\x18\xce\xfb\xc4\xde\xd5SGHq*\xd3\x0b\xad\x8e\x14S\xbc\xe0\xadI\xb1\xe2\xbe\xfe}\xc2\xdc\xb0\rL\xc6#\xa4\xd1\x8d*\x99\x0f}=F\x1e$8G\x9d\xa0\x02\xa1rP9\x01c`FV\xda1qg\x98"\x02}\xa5\xf2\xa8\x95\xec\xa4h\xeb\x80\xf6g\xcd\x13\xb3\x01\xcc\x98\xda\x00\x00\x00'),
 
159
     ('.bzr/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz',
 
160
      '\x1f\x8b\x08\x00\xc4\xfdAC\x02\xffm\x8f\xc1\n\xc20\x10D\xef~E\xc8\xbd\xb8\x9bM\x9a,\xb4\xfe\x8a\xc4f\x83Am\xa1\x16\xb1~\xbdQ\x14<x\x9b\x81y3LW\xc6\x9b\x8c\xcb4\xaf\xbbMW\xc5\xbc\xaa\\\xce\xb2/\xa9\xd7y\x9a\x1a\x03\xe0\x10\xc0\x02\xb9\x16\\\xc3(>\x84\x84\xc1WKQ\xb4:\x95\xf1\x15\xad\x8cVc\xbc\xc8\x1b\xd3j\x91\xfb\xf2\xaf\xa4r\x8d\x85\x80\xe4)\x05\xf6\x03YG\x9f\xf4\xf5\x18\xb1\xd7\x07\xe1L\xc0\x86\xd8\x1b\xce-\xc7\xb6:a\x0f\x92\x8de\x8b\x89P\xc0\x9a\xe1\x0b\x95G\x9d\xc4\xda\xb1\xad\x07\xb6?o\x9e\xb5\xff\xf0\xf9\xda\x00\x00\x00'),
 
161
     ('.bzr/revision-store/',),
 
162
     ('.bzr/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz',
 
163
      '\x1f\x8b\x08\x00[\xfdAC\x02\xff\x9d\x8eKj\xc30\x14E\xe7^\x85\xd0 \xb3$\xefI\xd1\x8f\xd8\xa6\x1b(t\x07E?\xbb\x82H\n\xb2\x1ahW\xdfB1\x14:\xeb\xf4r\xee\xbdgl\xf1\x91\xb6T\x0b\xf15\xe7\xd4{l\x13}\xb6\xad\xa7B^j\xbd\x91\xc3\xad_\xb3\xbb?m\xf5\xbd\xf9\xb8\xb4\xba\x9eJ\xec\x87\xb5_)I\xe5\x11K\xaf\xed\xe35\x85\x89\xfe\xa5\x8e\x0c@ \xc0\x05\xb8\x90\x88GT\xd2\xa1\x14\xfc\xe2@K\xc7\xfd\xef\x85\xed\xcd\xe2D\x95\x8d\x1a\xa47<\x02c2\xb0 \xbc\xd0\x8ay\xa3\xbcp\x8a\x83\x12A3\xb7XJv\xef\x7f_\xf7\x94\xe3\xd6m\xbeO\x14\x91in4*<\x812\x88\xc60\xfc\x01>k\x89\x13\xe5\x12\x00\xe8<\x8c\xdf\x8d\xcd\xaeq\xb6!\x90\xa5\xd6\xf1\xbc\x07\xc3x\xde\x85\xe6\xe1\x0b\xc8\x8a\x98\x03T\x01\x00\x00'),
 
164
     ('.bzr/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz',
 
165
      '\x1f\x8b\x08\x00\xc4\xfdAC\x02\xff\x9d\x90Kj\x031\x0c\x86\xf79\xc5\xe0Ev\xe9\xc8o\x9b\xcc\x84^\xa0\xd0\x1b\x14\xbf&5d\xec`\xbb\x81\xf6\xf45\x84\xa4\x81\xaeZ\xa1\x85\x84^\xdf\xaf\xa9\x84K\xac1\xa7\xc1\xe5u\x8d\xad\x852\xa3\x17SZL\xc3k\xce\xa7a{j\xfb\xd5\x9e\x9fk\xfe(.,%\x1f\x9fRh\xdbc\xdb\xa3!\xa6KH-\x97\xcf\xb7\xe8g\xf4\xbbkG\x008\x06`@\xb9\xe4bG(_\x88\x95\xde\xf9n\xca\xfb\xc7\r\xf5\xdd\xe0\x19\xa9\x85)\x81\xf5"\xbd\x04j\xb8\x02b\xa8W\\\x0b\xc9\x14\xf4\xbc\xbb\xd7\xd6H4\xdc\xb8\xff}\xba\xc55\xd4f\xd6\xf3\x8c0&\x8ajE\xa4x\xe2@\xa5\xa6\x9a\xf3k\xc3WNaFT\x00\x00:l\xa6>Q\xcd1\x1cjp9\xf9;\xc34\xde\n\x9b\xe9lJWT{t\',a\xf9\x0b\xae\xc0x\x87\xa5\xb0Xp\xca,(a\xa9{\xd0{}\xd4\x12\x04(\xc5\xbb$\xc5$V\xceaI\x19\x01\xa2\x1dh\xed\x82d\x8c.\xccr@\xc3\xd8Q\xc6\x1f\xaa\xf1\xb6\xe8\xb0\xf9\x06QR\r\xf9\xfc\x01\x00\x00')]
 
166
 
 
167
 
 
168
_ghost_template = [
 
169
    ( './foo',
 
170
        'hello\n'
 
171
    ),
 
172
    ( './.bzr/', ),
 
173
    ( './.bzr/README',
 
174
      'This is a Bazaar control directory.\n'
 
175
      'Do not change any files in this directory.\n'
 
176
      'See http://bazaar.canonical.com/ for more information about Bazaar.\n'
 
177
    ),
 
178
    ( './.bzr/branch-format',
 
179
        'Bazaar-NG branch, format 0.0.4\n'
 
180
    ),
 
181
    ( './.bzr/branch-lock',
 
182
        ''
 
183
    ),
 
184
    ( './.bzr/branch-name',
 
185
        ''
 
186
    ),
 
187
    ( './.bzr/inventory',
 
188
        '<inventory>\n'
 
189
        '<entry file_id="foo-20051004104918-0379cb7c76354cde" kind="file" name="foo" />\n'
 
190
        '</inventory>\n'
 
191
    ),
 
192
    ( './.bzr/merged-patches',
 
193
        ''
 
194
    ),
 
195
    ( './.bzr/pending-merged-patches',
 
196
        ''
 
197
    ),
 
198
    ( './.bzr/pending-merges',
 
199
        ''
 
200
    ),
 
201
    ( './.bzr/revision-history',
 
202
        'mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b\n'
 
203
        'mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d\n'
 
204
    ),
 
205
    ( './.bzr/stat-cache',
 
206
        '### bzr hashcache v5\n'
 
207
        'foo// f572d396fae9206628714fb2ce00f72e94f2258f 6 1128422956 1128422956 306900 770\n'
 
208
    ),
 
209
    ( './.bzr/text-store/', ),
 
210
    ( './.bzr/text-store/foo-20051004104921-8de8118a71be45ba.gz',
 
211
        '\x1f\x8b\x08\x081^BC\x00\x03foo-20051004104921-8de8118a71be45ba\x00\xcbH\xcd\xc9\xc9\xe7\x02\x00 0:6\x06\x00\x00\x00'
 
212
    ),
 
213
    ( './.bzr/inventory-store/', ),
 
214
    ( './.bzr/inventory-store/mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b.gz',
 
215
        '\x1f\x8b\x08\x081^BC\x00\x03mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b\x00m\x8f\xcb\n'
 
216
        '\xc20\x10E\xf7~E\xc8\xbe83\xcd\x13\xaa\xbf"yL0\xa8-\xd4"\xd6\xaf7\x8a\x82\x0bw\xb38\xe7\xde;C\x1do<.\xd3\xbc\xee7C;\xe6U\x94z\xe6C\xcd;Y\xa6\xa9#\x00\x8d\x00\n'
 
217
        'Ayt\x1d\xf4\xd6\xa7h\x935\xbdV)\xb3\x14\xa7:\xbe\xd0\xe6H1\x86\x0b\xbf5)\x16\xbe/\x7fC\x08;\x97\xd9!\xba`1\xb2\xd21|\xe8\xeb1`\xe3\xb5\xa5\xdc{S\x02{\x02c\xc8YT%Rb\x80b\x89\xbd*D\xda\x95\xafT\x1f\xad\xd2H\xb1m\xfb\xb7?\xcf<\x01W}\xb5\x8b\xd9\x00\x00\x00'
 
218
    ),
 
219
    ( './.bzr/inventory-store/mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d.gz',
 
220
        '\x1f\x8b\x08\x08A^BC\x00\x03mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d\x00m\x8f\xcb\n'
 
221
        '\xc20\x10E\xf7~E\xc8\xbe83\xcd\x13\xaa\xbf"yL0\xa8-\xd4"\xd6\xaf7\x8a\x82\x0bw\xb38\xe7\xde;C\x1do<.\xd3\xbc\xee7C;\xe6U\x94z\xe6C\xcd;Y\xa6\xa9#\x00\x8d\x00\n'
 
222
        'Ayt\x1d\xf4\xd6\xa7h\x935\xbdV)\xb3\x14\xa7:\xbe\xd0\xe6H1\x86\x0b\xbf5)\x16\xbe/\x7fC\x08;\x97\xd9!\xba`1\xb2\xd21|\xe8\xeb1`\xe3\xb5\xa5\xdc{S\x02{\x02c\xc8YT%Rb\x80b\x89\xbd*D\xda\x95\xafT\x1f\xad\xd2H\xb1m\xfb\xb7?\xcf<\x01W}\xb5\x8b\xd9\x00\x00\x00'
 
223
    ),
 
224
    ( './.bzr/revision-store/', ),
 
225
    ( './.bzr/revision-store/mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b.gz',
 
226
        '\x1f\x8b\x08\x081^BC\x00\x03mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b\x00\x9d\x8eMj\xc30\x14\x84\xf7>\x85\xd0"\xbb$\xef\xc9\xb6,\x11\xdb\xf4\x02\x85\xde\xa0\xe8\xe7\xd9\x11\xc4R\x90\xd4@{\xfa\x06\x8a\xa1\xd0]\x97\x03\xdf\xcc|c\xa6G(!E\xe6\xd2\xb6\x85Z)O\xfc\xd5\xe4\x1a"{K\xe9\xc6\x0e\xb7z\xd9\xec\xfd\xa5\xa4\x8f\xech\xc9i=E\xaa\x87\xb5^8\x0b\xf1A\xb1\xa6\xfc\xf9\x1e\xfc\xc4\xffRG\x01\xd0#@\x87\xd0i\x81G\xa3\x95%!\x06\xe5}\x0bv\xb0\xbf\x17\xca\xd5\xe0\xc4-\xa0\xb1\x8b\xb6`\xc0I\xa4\xc5\xf4\x9el\xef\x95v [\x94\xcf\x8e\xd5\xcay\xe4l\xf7\xfe\xf7u\r'
 
227
        '\x1b\x95j\xb6\xfb\xc4\x11\x85\xea\x84\xd0\x12O\x03t\x83D\xad\xc4\x0f\xf0\x95"M\xbc\x95\x00\xc0\xe7f|6\x8aYi^B.u<\xef\xb1\x19\xcf\xbb\xce\xdc|\x038=\xc7\xe6R\x01\x00\x00'
 
228
    ),
 
229
    ( './.bzr/revision-store/mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d.gz',
 
230
        '\x1f\x8b\x08\x08A^BC\x00\x03mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d\x00\x9d\x90\xc1j\xc30\x0c\x86\xef}\n'
 
231
        "\xe3Coie'\xb1c\x9a\x94\xbe\xc0`o0,[N\x03M\\\x1c\xafe{\xfae\x94n\x85\xc1`;Y\x88O\xd2\xff\xb9Mt\x19\xe6!N\xcc\xc5q\x1cr\xa6\xd4\xf1'\x9b\xf20\xb1\xe7\x18Ol}\xca\xbb\x11\xcf\x879\xbe&G!\xc5~3Q^\xf7y\xc7\xd90]h\xca1\xbd\xbd\x0c\xbe\xe3?\xa9B\x02\xd4\x02\xa0\x12P\x99R\x17\xce\xa0\xb6\x1a\x83s\x80(\xa5\x7f\xdc0\x1f\xad\xe88\x82\xb0\x18\x0c\x82\x05\xa7\x04\x05[{\xc2\xda7\xc6\x81*\x85B\x8dh\x1a\xe7\x05g\xf7\xdc\xff>\x9d\x87\x91\xe6l\xc7s\xc7\x85\x90M%\xa5\xd1z#\x85\xa8\x9b\x1a\xaa\xfa\x06\xbc\xc7\x89:^*\x00\xe0\xfbU\xbbL\xcc\xb6\xa7\xfdH\xa9'\x16\x03\xeb\x8fq\xce\xed\xf6\xde_\xb5g\x9b\x16\xa1y\xa9\xbe\x02&\n"
 
232
        '\x7fJ+EaM\x83$\xa5n\xbc/a\x91~\xd0\xbd\xfd\x135\n'
 
233
        '\xd0\x9a`\x0c*W\x1aR\xc1\x94du\x08(\t\xb0\x91\xdeZ\xa3\x9cU\x9cm\x7f\x8dr\x1d\x10Ot\xb8\xc6\xcf\xa7\x907|\xfb-\xb1\xbd\xd3\xfb\xd5\x07\xeeD\xee\x08*\x02\x00\x00'
 
234
    ),
 
235
]
 
236
 
 
237
_upgrade_dir_template = [
 
238
    ( './.bzr/', ),
 
239
    ( './.bzr/README',
 
240
      'This is a Bazaar control directory.\n'
 
241
      'Do not change any files in this directory.\n'
 
242
      'See http://bazaar.canonical.com/ for more information about Bazaar.\n'
 
243
    ),
 
244
    ( './.bzr/branch-format',
 
245
        'Bazaar-NG branch, format 0.0.4\n'
 
246
    ),
 
247
    ( './.bzr/branch-lock',
 
248
        ''
 
249
    ),
 
250
    ( './.bzr/branch-name',
 
251
        ''
 
252
    ),
 
253
    ( './.bzr/inventory',
 
254
        '<inventory>\n'
 
255
        '<entry file_id="dir-20051005095101-da1441ea3fa6917a" kind="directory" name="dir" />\n'
 
256
        '</inventory>\n'
 
257
    ),
 
258
    ( './.bzr/merged-patches',
 
259
        ''
 
260
    ),
 
261
    ( './.bzr/pending-merged-patches',
 
262
        ''
 
263
    ),
 
264
    ( './.bzr/pending-merges',
 
265
        ''
 
266
    ),
 
267
    ( './.bzr/revision-history',
 
268
        'robertc@robertcollins.net-20051005095108-6065fbd8e7d8617e\n'
 
269
    ),
 
270
    ( './.bzr/stat-cache',
 
271
        '### bzr hashcache v5\n'
 
272
    ),
 
273
    ( './.bzr/text-store/', ),
 
274
    ( './.bzr/inventory-store/', ),
 
275
    ( './.bzr/inventory-store/robertc@robertcollins.net-20051005095108-6065fbd8e7d8617e.gz',
 
276
        '\x1f\x8b\x08\x00\x0c\xa2CC\x02\xff\xb3\xc9\xcc+K\xcd+\xc9/\xaa\xb4\xe3\xb2\x012\x8a*\x15\xd22sR\xe33Sl\x95R2\x8bt\x8d\x0c\x0cL\r'
 
277
        "\x81\xd8\xc0\x12H\x19\xea\xa6$\x1a\x9a\x98\x18\xa6&\x1a\xa7%\x9aY\x1a\x9a'*)dg\xe6A\x94\xa6&\x83LQR\xc8K\xccM\x05\x0b()\xe8\x03\xcd\xd4G\xb2\x00\x00\xc2<\x94\xb1m\x00\x00\x00"
 
278
    ),
 
279
    ( './.bzr/revision-store/', ),
 
280
    ( './.bzr/revision-store/robertc@robertcollins.net-20051005095108-6065fbd8e7d8617e.gz',
 
281
        '\x1f\x8b\x08\x00\x0c\xa2CC\x02\xff\xa5OKj\xc30\x14\xdc\xfb\x14B\x8b\xec\x92<I\xd6\xc7\xc42\x85\xde\xa0\x17(\xb6\xf4\x9c\n'
 
282
        'l\xa9H"\x90\x9c\xbe\xa6\xa9\xa1\x9b\xae\xbax\x0c\xcc\xe71\xd3g\xbc\x85\x12R$.\xadk\xa8\x15\xb3\xa5oi\xc2\\\xc9kZ\x96\x10\x0b9,\xf5\x92\xbf)\xf7\xf2\x83O\xe5\x14\xb1\x1e\xae\xf5BI\x887\x8c5\xe5\xfb{\xf0\x96\xfei>r\x00\xc9\xb6\x83n\x03sT\xa0\xe4<y\x83\xda\x1b\xc54\xfe~T>Ff\xe9\xcc:\xdd\x8e\xa6E\xc7@\xa2\x82I\xaaNL\xbas\\313)\x00\xb9\xe6\xe0(\xd9\x87\xfc\xb7A\r'
 
283
        "+\x96:\xae\x9f\x962\xc6\x8d\x04i\x949\x01\x97R\xb7\x1d\x17O\xc3#E\xb4T(\x00\xa0C\xd3o\x892^q\x18\xbd'>\xe4\xfe\xbc\x13M\x7f\xde{\r"
 
284
        '\xcd\x17\x85\xea\xba\x03l\x01\x00\x00'
 
285
    ),
 
286
    ( './dir/', ),
 
287
]
 
288
 
 
289
 
 
290
class TestUpgrade(TestCaseWithTransport):
 
291
 
 
292
    def test_upgrade_v6_to_meta_no_workingtree(self):
 
293
        # Some format6 branches do not have checkout files. Upgrading
 
294
        # such a branch to metadir must not setup a working tree.
 
295
        self.build_tree_contents(_upgrade1_template)
 
296
        upgrade.upgrade('.', BzrDirFormat6())
 
297
        t = self.get_transport('.')
 
298
        t.delete_multi(['.bzr/pending-merges', '.bzr/inventory'])
 
299
        self.assertFalse(t.has('.bzr/stat-cache'))
 
300
        # XXX: upgrade fails if a backup.bzr is already present
 
301
        # -- David Allouche 2006-08-11
 
302
        t.delete_tree('backup.bzr.~1~')
 
303
        # At this point, we have a format6 branch without checkout files.
 
304
        upgrade.upgrade('.', bzrdir.BzrDirMetaFormat1())
 
305
        # The upgrade should not have set up a working tree.
 
306
        control = bzrdir.BzrDir.open('.')
 
307
        self.assertFalse(control.has_workingtree())
 
308
        # We have covered the scope of this test, we may as well check that
 
309
        # upgrade has not eaten our data, even if it's a bit redundant with
 
310
        # other tests.
 
311
        self.failUnless(isinstance(control._format, bzrdir.BzrDirMetaFormat1))
 
312
        b = control.open_branch()
 
313
        self.assertEquals(b.revision_history(),
 
314
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
 
315
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
 
316
 
 
317
    def test_upgrade_simple(self):
 
318
        """Upgrade simple v0.0.4 format to latest format"""
 
319
        eq = self.assertEquals
 
320
        self.build_tree_contents(_upgrade1_template)
 
321
        upgrade.upgrade(u'.')
 
322
        control = bzrdir.BzrDir.open('.')
 
323
        b = control.open_branch()
 
324
        # tsk, peeking under the covers.
 
325
        self.failUnless(
 
326
            isinstance(
 
327
                control._format,
 
328
                bzrdir.BzrDirFormat.get_default_format().__class__))
 
329
        rh = b.revision_history()
 
330
        eq(rh,
 
331
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
 
332
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
 
333
        rt = b.repository.revision_tree(rh[0])
 
334
        foo_id = 'foo-20051004035605-91e788d1875603ae'
 
335
        rt.lock_read()
 
336
        try:
 
337
            eq(rt.get_file_text(foo_id), 'initial contents\n')
 
338
        finally:
 
339
            rt.unlock()
 
340
        rt = b.repository.revision_tree(rh[1])
 
341
        rt.lock_read()
 
342
        try:
 
343
            eq(rt.get_file_text(foo_id), 'new contents\n')
 
344
        finally:
 
345
            rt.unlock()
 
346
        # check a backup was made:
 
347
        backup_dir = 'backup.bzr.~1~'
 
348
        t = self.get_transport('.')
 
349
        t.stat(backup_dir)
 
350
        t.stat(backup_dir + '/README')
 
351
        t.stat(backup_dir + '/branch-format')
 
352
        t.stat(backup_dir + '/revision-history')
 
353
        t.stat(backup_dir + '/merged-patches')
 
354
        t.stat(backup_dir + '/pending-merged-patches')
 
355
        t.stat(backup_dir + '/pending-merges')
 
356
        t.stat(backup_dir + '/branch-name')
 
357
        t.stat(backup_dir + '/branch-lock')
 
358
        t.stat(backup_dir + '/inventory')
 
359
        t.stat(backup_dir + '/stat-cache')
 
360
        t.stat(backup_dir + '/text-store')
 
361
        t.stat(backup_dir + '/text-store/foo-20051004035611-1591048e9dc7c2d4.gz')
 
362
        t.stat(backup_dir + '/text-store/foo-20051004035756-4081373d897c3453.gz')
 
363
        t.stat(backup_dir + '/inventory-store/')
 
364
        t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
 
365
        t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
 
366
        t.stat(backup_dir + '/revision-store/')
 
367
        t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
 
368
        t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
 
369
 
 
370
    def test_upgrade_with_ghosts(self):
 
371
        """Upgrade v0.0.4 tree containing ghost references.
 
372
 
 
373
        That is, some of the parents of revisions mentioned in the branch
 
374
        aren't present in the branch's storage.
 
375
 
 
376
        This shouldn't normally happen in branches created entirely in
 
377
        bzr, but can happen in branches imported from baz and arch, or from
 
378
        other systems, where the importer knows about a revision but not
 
379
        its contents."""
 
380
        eq = self.assertEquals
 
381
        self.build_tree_contents(_ghost_template)
 
382
        upgrade.upgrade(u'.')
 
383
        b = branch.Branch.open(u'.')
 
384
        revision_id = b.revision_history()[1]
 
385
        rev = b.repository.get_revision(revision_id)
 
386
        eq(len(rev.parent_ids), 2)
 
387
        eq(rev.parent_ids[1], 'wibble@wobble-2')
 
388
 
 
389
    def test_upgrade_makes_dir_weaves(self):
 
390
        self.build_tree_contents(_upgrade_dir_template)
 
391
        old_repodir = bzrdir.BzrDir.open_unsupported('.')
 
392
        old_repo_format = old_repodir.open_repository()._format
 
393
        upgrade.upgrade('.')
 
394
        # this is the path to the literal file. As format changes
 
395
        # occur it needs to be updated. FIXME: ask the store for the
 
396
        # path.
 
397
        repo = repository.Repository.open('.')
 
398
        # it should have changed the format
 
399
        self.assertNotEqual(old_repo_format.__class__, repo._format.__class__)
 
400
        # and we should be able to read the names for the file id
 
401
        # 'dir-20051005095101-da1441ea3fa6917a'
 
402
        repo.lock_read()
 
403
        self.addCleanup(repo.unlock)
 
404
        text_keys = repo.texts.keys()
 
405
        dir_keys = [key for key in text_keys if key[0] ==
 
406
                'dir-20051005095101-da1441ea3fa6917a']
 
407
        self.assertNotEqual([], dir_keys)
 
408
 
 
409
    def test_upgrade_to_meta_sets_workingtree_last_revision(self):
 
410
        self.build_tree_contents(_upgrade_dir_template)
 
411
        upgrade.upgrade('.', bzrdir.BzrDirMetaFormat1())
 
412
        tree = workingtree.WorkingTree.open('.')
 
413
        self.assertEqual([tree.branch.revision_history()[-1]],
 
414
            tree.get_parent_ids())
 
415
 
 
416
 
 
417
class SFTPBranchTest(TestCaseWithSFTPServer):
 
418
    """Test some stuff when accessing a bzr Branch over sftp"""
 
419
 
 
420
    def test_lock_file(self):
 
421
        # old format branches use a special lock file on sftp.
 
422
        b = self.make_branch('', format=BzrDirFormat6())
 
423
        b = branch.Branch.open(self.get_url())
 
424
        self.failUnlessExists('.bzr/')
 
425
        self.failUnlessExists('.bzr/branch-format')
 
426
        self.failUnlessExists('.bzr/branch-lock')
 
427
 
 
428
        self.failIf(lexists('.bzr/branch-lock.write-lock'))
 
429
        b.lock_write()
 
430
        self.failUnlessExists('.bzr/branch-lock.write-lock')
 
431
        b.unlock()
 
432
        self.failIf(lexists('.bzr/branch-lock.write-lock'))
 
433
 
 
434
 
 
435
class TestInfo(TestCaseWithTransport):
 
436
 
 
437
    def test_info_locking_oslocks(self):
 
438
        if sys.platform == "win32":
 
439
            self.skip("don't use oslocks on win32 in unix manner")
 
440
        # This test tests old (all-in-one, OS lock using) behaviour which
 
441
        # simply cannot work on windows (and is indeed why we changed our
 
442
        # design. As such, don't try to remove the thisFailsStrictLockCheck
 
443
        # call here.
 
444
        self.thisFailsStrictLockCheck()
 
445
 
 
446
        tree = self.make_branch_and_tree('branch',
 
447
                                         format=BzrDirFormat6())
 
448
 
 
449
        # Test all permutations of locking the working tree, branch and repository
 
450
        # XXX: Well not yet, as we can't query oslocks yet. Currently, it's
 
451
        # implemented by raising NotImplementedError and get_physical_lock_status()
 
452
        # always returns false. This makes bzr info hide the lock status.  (Olaf)
 
453
        # W B R
 
454
 
 
455
        # U U U
 
456
        out, err = self.run_bzr('info -v branch')
 
457
        self.assertEqualDiff(
 
458
"""Standalone tree (format: weave)
 
459
Location:
 
460
  branch root: %s
 
461
 
 
462
Format:
 
463
       control: All-in-one format 6
 
464
  working tree: Working tree format 2
 
465
        branch: Branch format 4
 
466
    repository: %s
 
467
 
 
468
In the working tree:
 
469
         0 unchanged
 
470
         0 modified
 
471
         0 added
 
472
         0 removed
 
473
         0 renamed
 
474
         0 unknown
 
475
         0 ignored
 
476
         0 versioned subdirectories
 
477
 
 
478
Branch history:
 
479
         0 revisions
 
480
 
 
481
Repository:
 
482
         0 revisions
 
483
""" % ('branch', tree.branch.repository._format.get_format_description(),
 
484
       ), out)
 
485
        self.assertEqual('', err)
 
486
        # L L L
 
487
        tree.lock_write()
 
488
        out, err = self.run_bzr('info -v branch')
 
489
        self.assertEqualDiff(
 
490
"""Standalone tree (format: weave)
 
491
Location:
 
492
  branch root: %s
 
493
 
 
494
Format:
 
495
       control: All-in-one format 6
 
496
  working tree: Working tree format 2
 
497
        branch: Branch format 4
 
498
    repository: %s
 
499
 
 
500
In the working tree:
 
501
         0 unchanged
 
502
         0 modified
 
503
         0 added
 
504
         0 removed
 
505
         0 renamed
 
506
         0 unknown
 
507
         0 ignored
 
508
         0 versioned subdirectories
 
509
 
 
510
Branch history:
 
511
         0 revisions
 
512
 
 
513
Repository:
 
514
         0 revisions
 
515
""" % ('branch', tree.branch.repository._format.get_format_description(),
 
516
       ), out)
 
517
        self.assertEqual('', err)
 
518
        tree.unlock()
 
519
 
 
520
 
 
521
class TestBranchFormat4(TestCaseWithTransport):
 
522
    """Tests specific to branch format 4"""
 
523
 
 
524
    def test_no_metadir_support(self):
 
525
        url = self.get_url()
 
526
        bdir = bzrdir.BzrDirMetaFormat1().initialize(url)
 
527
        bdir.create_repository()
 
528
        self.assertRaises(errors.IncompatibleFormat,
 
529
            BzrBranchFormat4().initialize, bdir)
 
530
 
 
531
    def test_supports_bzrdir_6(self):
 
532
        url = self.get_url()
 
533
        bdir = BzrDirFormat6().initialize(url)
 
534
        bdir.create_repository()
 
535
        BzrBranchFormat4().initialize(bdir)
 
536
 
 
537
 
 
538
class TestBoundBranch(TestCaseWithTransport):
 
539
 
 
540
    def setUp(self):
 
541
        super(TestBoundBranch, self).setUp()
 
542
        self.build_tree(['master/', 'child/'])
 
543
        self.make_branch_and_tree('master')
 
544
        self.make_branch_and_tree('child',
 
545
                        format=bzrdir.format_registry.make_bzrdir('weave'))
 
546
        os.chdir('child')
 
547
 
 
548
    def test_bind_format_6_bzrdir(self):
 
549
        # bind on a format 6 bzrdir should error
 
550
        out,err = self.run_bzr('bind ../master', retcode=3)
 
551
        self.assertEqual('', out)
 
552
        # TODO: jam 20060427 Probably something like this really should
 
553
        #       print out the actual path, rather than the URL
 
554
        cwd = urlutils.local_path_to_url(getcwd())
 
555
        self.assertEqual('bzr: ERROR: To use this feature you must '
 
556
                         'upgrade your branch at %s/.\n' % cwd, err)
 
557
 
 
558
    def test_unbind_format_6_bzrdir(self):
 
559
        # bind on a format 6 bzrdir should error
 
560
        out,err = self.run_bzr('unbind', retcode=3)
 
561
        self.assertEqual('', out)
 
562
        cwd = urlutils.local_path_to_url(getcwd())
 
563
        self.assertEqual('bzr: ERROR: To use this feature you must '
 
564
                         'upgrade your branch at %s/.\n' % cwd, err)
 
565
 
 
566
 
 
567
class TestInit(TestCaseWithTransport):
 
568
 
 
569
    def test_init_weave(self):
 
570
        # --format=weave should be accepted to allow interoperation with
 
571
        # old releases when desired.
 
572
        out, err = self.run_bzr('init --format=weave')
 
573
        self.assertEqual("""Created a standalone tree (format: weave)\n""",
 
574
            out)
 
575
        self.assertEqual('', err)
 
576
 
 
577
 
 
578
class V4WeaveBundleTester(V4BundleTester):
 
579
 
 
580
    def bzrdir_format(self):
 
581
        return 'metaweave'