~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Vincent Ladeuil
  • Date: 2011-07-06 09:22:00 UTC
  • mfrom: (6008 +trunk)
  • mto: (6012.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 6013.
  • Revision ID: v.ladeuil+lp@free.fr-20110706092200-7iai2mwzc0sqdsvf
MergingĀ inĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006-2011 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
        t.delete_tree('backup.bzr.~1~')
 
301
        # At this point, we have a format6 branch without checkout files.
 
302
        upgrade.upgrade('.', bzrdir.BzrDirMetaFormat1())
 
303
        # The upgrade should not have set up a working tree.
 
304
        control = bzrdir.BzrDir.open('.')
 
305
        self.assertFalse(control.has_workingtree())
 
306
        # We have covered the scope of this test, we may as well check that
 
307
        # upgrade has not eaten our data, even if it's a bit redundant with
 
308
        # other tests.
 
309
        self.assertIsInstance(control._format, bzrdir.BzrDirMetaFormat1)
 
310
        b = control.open_branch()
 
311
        self.assertEquals(b.revision_history(),
 
312
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
 
313
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
 
314
 
 
315
    def test_upgrade_simple(self):
 
316
        """Upgrade simple v0.0.4 format to latest format"""
 
317
        eq = self.assertEquals
 
318
        self.build_tree_contents(_upgrade1_template)
 
319
        upgrade.upgrade(u'.')
 
320
        control = bzrdir.BzrDir.open('.')
 
321
        b = control.open_branch()
 
322
        # tsk, peeking under the covers.
 
323
        self.assertIsInstance(
 
324
            control._format,
 
325
            bzrdir.BzrDirFormat.get_default_format().__class__)
 
326
        rh = b.revision_history()
 
327
        eq(rh,
 
328
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
 
329
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
 
330
        rt = b.repository.revision_tree(rh[0])
 
331
        foo_id = 'foo-20051004035605-91e788d1875603ae'
 
332
        rt.lock_read()
 
333
        try:
 
334
            eq(rt.get_file_text(foo_id), 'initial contents\n')
 
335
        finally:
 
336
            rt.unlock()
 
337
        rt = b.repository.revision_tree(rh[1])
 
338
        rt.lock_read()
 
339
        try:
 
340
            eq(rt.get_file_text(foo_id), 'new contents\n')
 
341
        finally:
 
342
            rt.unlock()
 
343
        # check a backup was made:
 
344
        backup_dir = 'backup.bzr.~1~'
 
345
        t = self.get_transport('.')
 
346
        t.stat(backup_dir)
 
347
        t.stat(backup_dir + '/README')
 
348
        t.stat(backup_dir + '/branch-format')
 
349
        t.stat(backup_dir + '/revision-history')
 
350
        t.stat(backup_dir + '/merged-patches')
 
351
        t.stat(backup_dir + '/pending-merged-patches')
 
352
        t.stat(backup_dir + '/pending-merges')
 
353
        t.stat(backup_dir + '/branch-name')
 
354
        t.stat(backup_dir + '/branch-lock')
 
355
        t.stat(backup_dir + '/inventory')
 
356
        t.stat(backup_dir + '/stat-cache')
 
357
        t.stat(backup_dir + '/text-store')
 
358
        t.stat(backup_dir + '/text-store/foo-20051004035611-1591048e9dc7c2d4.gz')
 
359
        t.stat(backup_dir + '/text-store/foo-20051004035756-4081373d897c3453.gz')
 
360
        t.stat(backup_dir + '/inventory-store/')
 
361
        t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
 
362
        t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
 
363
        t.stat(backup_dir + '/revision-store/')
 
364
        t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
 
365
        t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
 
366
 
 
367
    def test_upgrade_with_ghosts(self):
 
368
        """Upgrade v0.0.4 tree containing ghost references.
 
369
 
 
370
        That is, some of the parents of revisions mentioned in the branch
 
371
        aren't present in the branch's storage.
 
372
 
 
373
        This shouldn't normally happen in branches created entirely in
 
374
        bzr, but can happen in branches imported from baz and arch, or from
 
375
        other systems, where the importer knows about a revision but not
 
376
        its contents."""
 
377
        eq = self.assertEquals
 
378
        self.build_tree_contents(_ghost_template)
 
379
        upgrade.upgrade(u'.')
 
380
        b = branch.Branch.open(u'.')
 
381
        revision_id = b.revision_history()[1]
 
382
        rev = b.repository.get_revision(revision_id)
 
383
        eq(len(rev.parent_ids), 2)
 
384
        eq(rev.parent_ids[1], 'wibble@wobble-2')
 
385
 
 
386
    def test_upgrade_makes_dir_weaves(self):
 
387
        self.build_tree_contents(_upgrade_dir_template)
 
388
        old_repodir = bzrdir.BzrDir.open_unsupported('.')
 
389
        old_repo_format = old_repodir.open_repository()._format
 
390
        upgrade.upgrade('.')
 
391
        # this is the path to the literal file. As format changes
 
392
        # occur it needs to be updated. FIXME: ask the store for the
 
393
        # path.
 
394
        repo = repository.Repository.open('.')
 
395
        # it should have changed the format
 
396
        self.assertNotEqual(old_repo_format.__class__, repo._format.__class__)
 
397
        # and we should be able to read the names for the file id
 
398
        # 'dir-20051005095101-da1441ea3fa6917a'
 
399
        repo.lock_read()
 
400
        self.addCleanup(repo.unlock)
 
401
        text_keys = repo.texts.keys()
 
402
        dir_keys = [key for key in text_keys if key[0] ==
 
403
                'dir-20051005095101-da1441ea3fa6917a']
 
404
        self.assertNotEqual([], dir_keys)
 
405
 
 
406
    def test_upgrade_to_meta_sets_workingtree_last_revision(self):
 
407
        self.build_tree_contents(_upgrade_dir_template)
 
408
        upgrade.upgrade('.', bzrdir.BzrDirMetaFormat1())
 
409
        tree = workingtree.WorkingTree.open('.')
 
410
        self.assertEqual([tree.branch.revision_history()[-1]],
 
411
            tree.get_parent_ids())
 
412
 
 
413
 
 
414
class SFTPBranchTest(TestCaseWithSFTPServer):
 
415
    """Test some stuff when accessing a bzr Branch over sftp"""
 
416
 
 
417
    def test_lock_file(self):
 
418
        # old format branches use a special lock file on sftp.
 
419
        b = self.make_branch('', format=BzrDirFormat6())
 
420
        b = branch.Branch.open(self.get_url())
 
421
        self.assertPathExists('.bzr/')
 
422
        self.assertPathExists('.bzr/branch-format')
 
423
        self.assertPathExists('.bzr/branch-lock')
 
424
 
 
425
        self.assertPathDoesNotExist('.bzr/branch-lock.write-lock')
 
426
        b.lock_write()
 
427
        self.assertPathExists('.bzr/branch-lock.write-lock')
 
428
        b.unlock()
 
429
        self.assertPathDoesNotExist('.bzr/branch-lock.write-lock')
 
430
 
 
431
 
 
432
class TestInfo(TestCaseWithTransport):
 
433
 
 
434
    def test_info_locking_oslocks(self):
 
435
        if sys.platform == "win32":
 
436
            self.skip("don't use oslocks on win32 in unix manner")
 
437
        # This test tests old (all-in-one, OS lock using) behaviour which
 
438
        # simply cannot work on windows (and is indeed why we changed our
 
439
        # design. As such, don't try to remove the thisFailsStrictLockCheck
 
440
        # call here.
 
441
        self.thisFailsStrictLockCheck()
 
442
 
 
443
        tree = self.make_branch_and_tree('branch',
 
444
                                         format=BzrDirFormat6())
 
445
 
 
446
        # Test all permutations of locking the working tree, branch and repository
 
447
        # XXX: Well not yet, as we can't query oslocks yet. Currently, it's
 
448
        # implemented by raising NotImplementedError and get_physical_lock_status()
 
449
        # always returns false. This makes bzr info hide the lock status.  (Olaf)
 
450
        # W B R
 
451
 
 
452
        # U U U
 
453
        out, err = self.run_bzr('info -v branch')
 
454
        self.assertEqualDiff(
 
455
"""Standalone tree (format: weave)
 
456
Location:
 
457
  branch root: %s
 
458
 
 
459
Format:
 
460
       control: All-in-one format 6
 
461
  working tree: Working tree format 2
 
462
        branch: Branch format 4
 
463
    repository: %s
 
464
 
 
465
In the working tree:
 
466
         0 unchanged
 
467
         0 modified
 
468
         0 added
 
469
         0 removed
 
470
         0 renamed
 
471
         0 unknown
 
472
         0 ignored
 
473
         0 versioned subdirectories
 
474
 
 
475
Branch history:
 
476
         0 revisions
 
477
 
 
478
Repository:
 
479
         0 revisions
 
480
""" % ('branch', tree.branch.repository._format.get_format_description(),
 
481
       ), out)
 
482
        self.assertEqual('', err)
 
483
        # L L L
 
484
        tree.lock_write()
 
485
        out, err = self.run_bzr('info -v branch')
 
486
        self.assertEqualDiff(
 
487
"""Standalone tree (format: weave)
 
488
Location:
 
489
  branch root: %s
 
490
 
 
491
Format:
 
492
       control: All-in-one format 6
 
493
  working tree: Working tree format 2
 
494
        branch: Branch format 4
 
495
    repository: %s
 
496
 
 
497
In the working tree:
 
498
         0 unchanged
 
499
         0 modified
 
500
         0 added
 
501
         0 removed
 
502
         0 renamed
 
503
         0 unknown
 
504
         0 ignored
 
505
         0 versioned subdirectories
 
506
 
 
507
Branch history:
 
508
         0 revisions
 
509
 
 
510
Repository:
 
511
         0 revisions
 
512
""" % ('branch', tree.branch.repository._format.get_format_description(),
 
513
       ), out)
 
514
        self.assertEqual('', err)
 
515
        tree.unlock()
 
516
 
 
517
 
 
518
class TestBranchFormat4(TestCaseWithTransport):
 
519
    """Tests specific to branch format 4"""
 
520
 
 
521
    def test_no_metadir_support(self):
 
522
        url = self.get_url()
 
523
        bdir = bzrdir.BzrDirMetaFormat1().initialize(url)
 
524
        bdir.create_repository()
 
525
        self.assertRaises(errors.IncompatibleFormat,
 
526
            BzrBranchFormat4().initialize, bdir)
 
527
 
 
528
    def test_supports_bzrdir_6(self):
 
529
        url = self.get_url()
 
530
        bdir = BzrDirFormat6().initialize(url)
 
531
        bdir.create_repository()
 
532
        BzrBranchFormat4().initialize(bdir)
 
533
 
 
534
 
 
535
class TestBoundBranch(TestCaseWithTransport):
 
536
 
 
537
    def setUp(self):
 
538
        super(TestBoundBranch, self).setUp()
 
539
        self.build_tree(['master/', 'child/'])
 
540
        self.make_branch_and_tree('master')
 
541
        self.make_branch_and_tree('child',
 
542
                        format=bzrdir.format_registry.make_bzrdir('weave'))
 
543
        os.chdir('child')
 
544
 
 
545
    def test_bind_format_6_bzrdir(self):
 
546
        # bind on a format 6 bzrdir should error
 
547
        out,err = self.run_bzr('bind ../master', retcode=3)
 
548
        self.assertEqual('', out)
 
549
        # TODO: jam 20060427 Probably something like this really should
 
550
        #       print out the actual path, rather than the URL
 
551
        cwd = urlutils.local_path_to_url(getcwd())
 
552
        self.assertEqual('bzr: ERROR: To use this feature you must '
 
553
                         'upgrade your branch at %s/.\n' % cwd, err)
 
554
 
 
555
    def test_unbind_format_6_bzrdir(self):
 
556
        # bind on a format 6 bzrdir should error
 
557
        out,err = self.run_bzr('unbind', retcode=3)
 
558
        self.assertEqual('', out)
 
559
        cwd = urlutils.local_path_to_url(getcwd())
 
560
        self.assertEqual('bzr: ERROR: To use this feature you must '
 
561
                         'upgrade your branch at %s/.\n' % cwd, err)
 
562
 
 
563
 
 
564
class TestInit(TestCaseWithTransport):
 
565
 
 
566
    def test_init_weave(self):
 
567
        # --format=weave should be accepted to allow interoperation with
 
568
        # old releases when desired.
 
569
        out, err = self.run_bzr('init --format=weave')
 
570
        self.assertEqual("""Created a standalone tree (format: weave)\n""",
 
571
            out)
 
572
        self.assertEqual('', err)
 
573
 
 
574
 
 
575
class V4WeaveBundleTester(V4BundleTester):
 
576
 
 
577
    def bzrdir_format(self):
 
578
        return 'metaweave'