/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

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

  • Committer: Jelmer Vernooij
  • Date: 2011-03-10 13:29:54 UTC
  • mfrom: (5712.4.3 bzrdir-weave)
  • mto: This revision was merged to the branch mainline in revision 5718.
  • Revision ID: jelmer@samba.org-20110310132954-lgdypdwpu99vyv0q
Merge weave-bzrdir branch.

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 sys
 
23
 
 
24
from bzrlib import (
 
25
    branch,
 
26
    bzrdir,
 
27
    repository,
 
28
    upgrade,
 
29
    workingtree,
 
30
    )
 
31
from bzrlib.osutils import (
 
32
    lexists,
 
33
    )
 
34
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
 
35
from bzrlib.tests import (
 
36
    TestCaseWithTransport,
 
37
    )
 
38
 
 
39
from bzrlib.bzrdir_weave import (
 
40
    BzrDirFormat5,
 
41
    BzrDirFormat6,
 
42
    )
 
43
 
 
44
 
 
45
class TestFormat5(TestCaseWithTransport):
 
46
    """Tests specific to the version 5 bzrdir format."""
 
47
 
 
48
    def test_same_lockfiles_between_tree_repo_branch(self):
 
49
        # this checks that only a single lockfiles instance is created
 
50
        # for format 5 objects
 
51
        dir = BzrDirFormat5().initialize(self.get_url())
 
52
        def check_dir_components_use_same_lock(dir):
 
53
            ctrl_1 = dir.open_repository().control_files
 
54
            ctrl_2 = dir.open_branch().control_files
 
55
            ctrl_3 = dir.open_workingtree()._control_files
 
56
            self.assertTrue(ctrl_1 is ctrl_2)
 
57
            self.assertTrue(ctrl_2 is ctrl_3)
 
58
        check_dir_components_use_same_lock(dir)
 
59
        # and if we open it normally.
 
60
        dir = bzrdir.BzrDir.open(self.get_url())
 
61
        check_dir_components_use_same_lock(dir)
 
62
 
 
63
    def test_can_convert(self):
 
64
        # format 5 dirs are convertable
 
65
        dir = BzrDirFormat5().initialize(self.get_url())
 
66
        self.assertTrue(dir.can_convert_format())
 
67
 
 
68
    def test_needs_conversion(self):
 
69
        # format 5 dirs need a conversion if they are not the default,
 
70
        # and they aren't
 
71
        dir = BzrDirFormat5().initialize(self.get_url())
 
72
        # don't need to convert it to itself
 
73
        self.assertFalse(dir.needs_format_conversion(BzrDirFormat5()))
 
74
        # do need to convert it to the current default
 
75
        self.assertTrue(dir.needs_format_conversion(
 
76
            bzrdir.BzrDirFormat.get_default_format()))
 
77
 
 
78
 
 
79
class TestFormat6(TestCaseWithTransport):
 
80
    """Tests specific to the version 6 bzrdir format."""
 
81
 
 
82
    def test_same_lockfiles_between_tree_repo_branch(self):
 
83
        # this checks that only a single lockfiles instance is created
 
84
        # for format 6 objects
 
85
        dir = BzrDirFormat6().initialize(self.get_url())
 
86
        def check_dir_components_use_same_lock(dir):
 
87
            ctrl_1 = dir.open_repository().control_files
 
88
            ctrl_2 = dir.open_branch().control_files
 
89
            ctrl_3 = dir.open_workingtree()._control_files
 
90
            self.assertTrue(ctrl_1 is ctrl_2)
 
91
            self.assertTrue(ctrl_2 is ctrl_3)
 
92
        check_dir_components_use_same_lock(dir)
 
93
        # and if we open it normally.
 
94
        dir = bzrdir.BzrDir.open(self.get_url())
 
95
        check_dir_components_use_same_lock(dir)
 
96
 
 
97
    def test_can_convert(self):
 
98
        # format 6 dirs are convertable
 
99
        dir = BzrDirFormat6().initialize(self.get_url())
 
100
        self.assertTrue(dir.can_convert_format())
 
101
 
 
102
    def test_needs_conversion(self):
 
103
        # format 6 dirs need an conversion if they are not the default.
 
104
        dir = BzrDirFormat6().initialize(self.get_url())
 
105
        self.assertTrue(dir.needs_format_conversion(
 
106
            bzrdir.BzrDirFormat.get_default_format()))
 
107
 
 
108
 
 
109
class TestBreakLockOldBranch(TestCaseWithTransport):
 
110
 
 
111
    def test_break_lock_format_5_bzrdir(self):
 
112
        # break lock on a format 5 bzrdir should just return
 
113
        self.make_branch_and_tree('foo', format=BzrDirFormat5())
 
114
        out, err = self.run_bzr('break-lock foo')
 
115
        self.assertEqual('', out)
 
116
        self.assertEqual('', err)
 
117
 
 
118
 
 
119
_upgrade1_template = \
 
120
     [
 
121
     ('foo', 'new contents\n'),
 
122
     ('.bzr/',),
 
123
     ('.bzr/README',
 
124
      'This is a Bazaar control directory.\n'
 
125
      'Do not change any files in this directory.\n'
 
126
      'See http://bazaar.canonical.com/ for more information about Bazaar.\n'),
 
127
     ('.bzr/branch-format', 'Bazaar-NG branch, format 0.0.4\n'),
 
128
     ('.bzr/revision-history',
 
129
      'mbp@sourcefrog.net-20051004035611-176b16534b086b3c\n'
 
130
      'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd\n'),
 
131
     ('.bzr/merged-patches', ''),
 
132
     ('.bzr/pending-merged-patches', ''),
 
133
     ('.bzr/branch-name', ''),
 
134
     ('.bzr/branch-lock', ''),
 
135
     ('.bzr/pending-merges', ''),
 
136
     ('.bzr/inventory',
 
137
      '<inventory>\n'
 
138
      '<entry file_id="foo-20051004035605-91e788d1875603ae" kind="file" name="foo" />\n'
 
139
      '</inventory>\n'),
 
140
     ('.bzr/stat-cache',
 
141
      '### bzr hashcache v5\n'
 
142
      'foo// be9f309239729f69a6309e970ef24941d31e042c 13 1128398176 1128398176 303464 770\n'),
 
143
     ('.bzr/text-store/',),
 
144
     ('.bzr/text-store/foo-20051004035611-1591048e9dc7c2d4.gz',
 
145
      '\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'),
 
146
     ('.bzr/text-store/foo-20051004035756-4081373d897c3453.gz',
 
147
      '\x1f\x8b\x08\x00\xc4\xfdAC\x02\xff\xcbK-WH\xce\xcf+I\xcd+)\xe6\x02\x00g\xc3\xdf\xc9\r\x00\x00\x00'),
 
148
     ('.bzr/inventory-store/',),
 
149
     ('.bzr/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz',
 
150
      '\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'),
 
151
     ('.bzr/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz',
 
152
      '\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'),
 
153
     ('.bzr/revision-store/',),
 
154
     ('.bzr/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz',
 
155
      '\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'),
 
156
     ('.bzr/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz',
 
157
      '\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')]
 
158
 
 
159
 
 
160
_ghost_template = [
 
161
    ( './foo',
 
162
        'hello\n'
 
163
    ),
 
164
    ( './.bzr/', ),
 
165
    ( './.bzr/README',
 
166
      'This is a Bazaar control directory.\n'
 
167
      'Do not change any files in this directory.\n'
 
168
      'See http://bazaar.canonical.com/ for more information about Bazaar.\n'
 
169
    ),
 
170
    ( './.bzr/branch-format',
 
171
        'Bazaar-NG branch, format 0.0.4\n'
 
172
    ),
 
173
    ( './.bzr/branch-lock',
 
174
        ''
 
175
    ),
 
176
    ( './.bzr/branch-name',
 
177
        ''
 
178
    ),
 
179
    ( './.bzr/inventory',
 
180
        '<inventory>\n'
 
181
        '<entry file_id="foo-20051004104918-0379cb7c76354cde" kind="file" name="foo" />\n'
 
182
        '</inventory>\n'
 
183
    ),
 
184
    ( './.bzr/merged-patches',
 
185
        ''
 
186
    ),
 
187
    ( './.bzr/pending-merged-patches',
 
188
        ''
 
189
    ),
 
190
    ( './.bzr/pending-merges',
 
191
        ''
 
192
    ),
 
193
    ( './.bzr/revision-history',
 
194
        'mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b\n'
 
195
        'mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d\n'
 
196
    ),
 
197
    ( './.bzr/stat-cache',
 
198
        '### bzr hashcache v5\n'
 
199
        'foo// f572d396fae9206628714fb2ce00f72e94f2258f 6 1128422956 1128422956 306900 770\n'
 
200
    ),
 
201
    ( './.bzr/text-store/', ),
 
202
    ( './.bzr/text-store/foo-20051004104921-8de8118a71be45ba.gz',
 
203
        '\x1f\x8b\x08\x081^BC\x00\x03foo-20051004104921-8de8118a71be45ba\x00\xcbH\xcd\xc9\xc9\xe7\x02\x00 0:6\x06\x00\x00\x00'
 
204
    ),
 
205
    ( './.bzr/inventory-store/', ),
 
206
    ( './.bzr/inventory-store/mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b.gz',
 
207
        '\x1f\x8b\x08\x081^BC\x00\x03mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b\x00m\x8f\xcb\n'
 
208
        '\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'
 
209
        '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'
 
210
    ),
 
211
    ( './.bzr/inventory-store/mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d.gz',
 
212
        '\x1f\x8b\x08\x08A^BC\x00\x03mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d\x00m\x8f\xcb\n'
 
213
        '\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'
 
214
        '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'
 
215
    ),
 
216
    ( './.bzr/revision-store/', ),
 
217
    ( './.bzr/revision-store/mbp@sourcefrog.net-20051004104921-a98be2278dd30b7b.gz',
 
218
        '\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'
 
219
        '\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'
 
220
    ),
 
221
    ( './.bzr/revision-store/mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d.gz',
 
222
        '\x1f\x8b\x08\x08A^BC\x00\x03mbp@sourcefrog.net-20051004104937-c9b7a7bfcc0bb22d\x00\x9d\x90\xc1j\xc30\x0c\x86\xef}\n'
 
223
        "\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"
 
224
        '\x7fJ+EaM\x83$\xa5n\xbc/a\x91~\xd0\xbd\xfd\x135\n'
 
225
        '\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'
 
226
    ),
 
227
]
 
228
 
 
229
_upgrade_dir_template = [
 
230
    ( './.bzr/', ),
 
231
    ( './.bzr/README',
 
232
      'This is a Bazaar control directory.\n'
 
233
      'Do not change any files in this directory.\n'
 
234
      'See http://bazaar.canonical.com/ for more information about Bazaar.\n'
 
235
    ),
 
236
    ( './.bzr/branch-format',
 
237
        'Bazaar-NG branch, format 0.0.4\n'
 
238
    ),
 
239
    ( './.bzr/branch-lock',
 
240
        ''
 
241
    ),
 
242
    ( './.bzr/branch-name',
 
243
        ''
 
244
    ),
 
245
    ( './.bzr/inventory',
 
246
        '<inventory>\n'
 
247
        '<entry file_id="dir-20051005095101-da1441ea3fa6917a" kind="directory" name="dir" />\n'
 
248
        '</inventory>\n'
 
249
    ),
 
250
    ( './.bzr/merged-patches',
 
251
        ''
 
252
    ),
 
253
    ( './.bzr/pending-merged-patches',
 
254
        ''
 
255
    ),
 
256
    ( './.bzr/pending-merges',
 
257
        ''
 
258
    ),
 
259
    ( './.bzr/revision-history',
 
260
        'robertc@robertcollins.net-20051005095108-6065fbd8e7d8617e\n'
 
261
    ),
 
262
    ( './.bzr/stat-cache',
 
263
        '### bzr hashcache v5\n'
 
264
    ),
 
265
    ( './.bzr/text-store/', ),
 
266
    ( './.bzr/inventory-store/', ),
 
267
    ( './.bzr/inventory-store/robertc@robertcollins.net-20051005095108-6065fbd8e7d8617e.gz',
 
268
        '\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'
 
269
        "\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"
 
270
    ),
 
271
    ( './.bzr/revision-store/', ),
 
272
    ( './.bzr/revision-store/robertc@robertcollins.net-20051005095108-6065fbd8e7d8617e.gz',
 
273
        '\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'
 
274
        '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'
 
275
        "+\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"
 
276
        '\xcd\x17\x85\xea\xba\x03l\x01\x00\x00'
 
277
    ),
 
278
    ( './dir/', ),
 
279
]
 
280
 
 
281
 
 
282
class TestUpgrade(TestCaseWithTransport):
 
283
 
 
284
    def test_upgrade_v6_to_meta_no_workingtree(self):
 
285
        # Some format6 branches do not have checkout files. Upgrading
 
286
        # such a branch to metadir must not setup a working tree.
 
287
        self.build_tree_contents(_upgrade1_template)
 
288
        upgrade.upgrade('.', BzrDirFormat6())
 
289
        t = self.get_transport('.')
 
290
        t.delete_multi(['.bzr/pending-merges', '.bzr/inventory'])
 
291
        self.assertFalse(t.has('.bzr/stat-cache'))
 
292
        # XXX: upgrade fails if a backup.bzr is already present
 
293
        # -- David Allouche 2006-08-11
 
294
        t.delete_tree('backup.bzr.~1~')
 
295
        # At this point, we have a format6 branch without checkout files.
 
296
        upgrade.upgrade('.', bzrdir.BzrDirMetaFormat1())
 
297
        # The upgrade should not have set up a working tree.
 
298
        control = bzrdir.BzrDir.open('.')
 
299
        self.assertFalse(control.has_workingtree())
 
300
        # We have covered the scope of this test, we may as well check that
 
301
        # upgrade has not eaten our data, even if it's a bit redundant with
 
302
        # other tests.
 
303
        self.failUnless(isinstance(control._format, bzrdir.BzrDirMetaFormat1))
 
304
        b = control.open_branch()
 
305
        self.assertEquals(b.revision_history(),
 
306
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
 
307
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
 
308
 
 
309
    def test_upgrade_simple(self):
 
310
        """Upgrade simple v0.0.4 format to latest format"""
 
311
        eq = self.assertEquals
 
312
        self.build_tree_contents(_upgrade1_template)
 
313
        upgrade.upgrade(u'.')
 
314
        control = bzrdir.BzrDir.open('.')
 
315
        b = control.open_branch()
 
316
        # tsk, peeking under the covers.
 
317
        self.failUnless(
 
318
            isinstance(
 
319
                control._format,
 
320
                bzrdir.BzrDirFormat.get_default_format().__class__))
 
321
        rh = b.revision_history()
 
322
        eq(rh,
 
323
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
 
324
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
 
325
        rt = b.repository.revision_tree(rh[0])
 
326
        foo_id = 'foo-20051004035605-91e788d1875603ae'
 
327
        rt.lock_read()
 
328
        try:
 
329
            eq(rt.get_file_text(foo_id), 'initial contents\n')
 
330
        finally:
 
331
            rt.unlock()
 
332
        rt = b.repository.revision_tree(rh[1])
 
333
        rt.lock_read()
 
334
        try:
 
335
            eq(rt.get_file_text(foo_id), 'new contents\n')
 
336
        finally:
 
337
            rt.unlock()
 
338
        # check a backup was made:
 
339
        backup_dir = 'backup.bzr.~1~'
 
340
        t = self.get_transport('.')
 
341
        t.stat(backup_dir)
 
342
        t.stat(backup_dir + '/README')
 
343
        t.stat(backup_dir + '/branch-format')
 
344
        t.stat(backup_dir + '/revision-history')
 
345
        t.stat(backup_dir + '/merged-patches')
 
346
        t.stat(backup_dir + '/pending-merged-patches')
 
347
        t.stat(backup_dir + '/pending-merges')
 
348
        t.stat(backup_dir + '/branch-name')
 
349
        t.stat(backup_dir + '/branch-lock')
 
350
        t.stat(backup_dir + '/inventory')
 
351
        t.stat(backup_dir + '/stat-cache')
 
352
        t.stat(backup_dir + '/text-store')
 
353
        t.stat(backup_dir + '/text-store/foo-20051004035611-1591048e9dc7c2d4.gz')
 
354
        t.stat(backup_dir + '/text-store/foo-20051004035756-4081373d897c3453.gz')
 
355
        t.stat(backup_dir + '/inventory-store/')
 
356
        t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
 
357
        t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
 
358
        t.stat(backup_dir + '/revision-store/')
 
359
        t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
 
360
        t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
 
361
 
 
362
    def test_upgrade_with_ghosts(self):
 
363
        """Upgrade v0.0.4 tree containing ghost references.
 
364
 
 
365
        That is, some of the parents of revisions mentioned in the branch
 
366
        aren't present in the branch's storage.
 
367
 
 
368
        This shouldn't normally happen in branches created entirely in
 
369
        bzr, but can happen in branches imported from baz and arch, or from
 
370
        other systems, where the importer knows about a revision but not
 
371
        its contents."""
 
372
        eq = self.assertEquals
 
373
        self.build_tree_contents(_ghost_template)
 
374
        upgrade.upgrade(u'.')
 
375
        b = branch.Branch.open(u'.')
 
376
        revision_id = b.revision_history()[1]
 
377
        rev = b.repository.get_revision(revision_id)
 
378
        eq(len(rev.parent_ids), 2)
 
379
        eq(rev.parent_ids[1], 'wibble@wobble-2')
 
380
 
 
381
    def test_upgrade_makes_dir_weaves(self):
 
382
        self.build_tree_contents(_upgrade_dir_template)
 
383
        old_repodir = bzrdir.BzrDir.open_unsupported('.')
 
384
        old_repo_format = old_repodir.open_repository()._format
 
385
        upgrade.upgrade('.')
 
386
        # this is the path to the literal file. As format changes
 
387
        # occur it needs to be updated. FIXME: ask the store for the
 
388
        # path.
 
389
        repo = repository.Repository.open('.')
 
390
        # it should have changed the format
 
391
        self.assertNotEqual(old_repo_format.__class__, repo._format.__class__)
 
392
        # and we should be able to read the names for the file id
 
393
        # 'dir-20051005095101-da1441ea3fa6917a'
 
394
        repo.lock_read()
 
395
        self.addCleanup(repo.unlock)
 
396
        text_keys = repo.texts.keys()
 
397
        dir_keys = [key for key in text_keys if key[0] ==
 
398
                'dir-20051005095101-da1441ea3fa6917a']
 
399
        self.assertNotEqual([], dir_keys)
 
400
 
 
401
    def test_upgrade_to_meta_sets_workingtree_last_revision(self):
 
402
        self.build_tree_contents(_upgrade_dir_template)
 
403
        upgrade.upgrade('.', bzrdir.BzrDirMetaFormat1())
 
404
        tree = workingtree.WorkingTree.open('.')
 
405
        self.assertEqual([tree.branch.revision_history()[-1]],
 
406
            tree.get_parent_ids())
 
407
 
 
408
 
 
409
class SFTPBranchTest(TestCaseWithSFTPServer):
 
410
    """Test some stuff when accessing a bzr Branch over sftp"""
 
411
 
 
412
    def test_lock_file(self):
 
413
        # old format branches use a special lock file on sftp.
 
414
        b = self.make_branch('', format=BzrDirFormat6())
 
415
        b = branch.Branch.open(self.get_url())
 
416
        self.failUnlessExists('.bzr/')
 
417
        self.failUnlessExists('.bzr/branch-format')
 
418
        self.failUnlessExists('.bzr/branch-lock')
 
419
 
 
420
        self.failIf(lexists('.bzr/branch-lock.write-lock'))
 
421
        b.lock_write()
 
422
        self.failUnlessExists('.bzr/branch-lock.write-lock')
 
423
        b.unlock()
 
424
        self.failIf(lexists('.bzr/branch-lock.write-lock'))
 
425
 
 
426
 
 
427
class TestInfo(TestCaseWithTransport):
 
428
 
 
429
    def test_info_locking_oslocks(self):
 
430
        if sys.platform == "win32":
 
431
            self.skip("don't use oslocks on win32 in unix manner")
 
432
        # This test tests old (all-in-one, OS lock using) behaviour which
 
433
        # simply cannot work on windows (and is indeed why we changed our
 
434
        # design. As such, don't try to remove the thisFailsStrictLockCheck
 
435
        # call here.
 
436
        self.thisFailsStrictLockCheck()
 
437
 
 
438
        tree = self.make_branch_and_tree('branch',
 
439
                                         format=BzrDirFormat6())
 
440
 
 
441
        # Test all permutations of locking the working tree, branch and repository
 
442
        # XXX: Well not yet, as we can't query oslocks yet. Currently, it's
 
443
        # implemented by raising NotImplementedError and get_physical_lock_status()
 
444
        # always returns false. This makes bzr info hide the lock status.  (Olaf)
 
445
        # W B R
 
446
 
 
447
        # U U U
 
448
        out, err = self.run_bzr('info -v branch')
 
449
        self.assertEqualDiff(
 
450
"""Standalone tree (format: weave)
 
451
Location:
 
452
  branch root: %s
 
453
 
 
454
Format:
 
455
       control: All-in-one format 6
 
456
  working tree: Working tree format 2
 
457
        branch: Branch format 4
 
458
    repository: %s
 
459
 
 
460
In the working tree:
 
461
         0 unchanged
 
462
         0 modified
 
463
         0 added
 
464
         0 removed
 
465
         0 renamed
 
466
         0 unknown
 
467
         0 ignored
 
468
         0 versioned subdirectories
 
469
 
 
470
Branch history:
 
471
         0 revisions
 
472
 
 
473
Repository:
 
474
         0 revisions
 
475
""" % ('branch', tree.branch.repository._format.get_format_description(),
 
476
       ), out)
 
477
        self.assertEqual('', err)
 
478
        # L L L
 
479
        tree.lock_write()
 
480
        out, err = self.run_bzr('info -v branch')
 
481
        self.assertEqualDiff(
 
482
"""Standalone tree (format: weave)
 
483
Location:
 
484
  branch root: %s
 
485
 
 
486
Format:
 
487
       control: All-in-one format 6
 
488
  working tree: Working tree format 2
 
489
        branch: Branch format 4
 
490
    repository: %s
 
491
 
 
492
In the working tree:
 
493
         0 unchanged
 
494
         0 modified
 
495
         0 added
 
496
         0 removed
 
497
         0 renamed
 
498
         0 unknown
 
499
         0 ignored
 
500
         0 versioned subdirectories
 
501
 
 
502
Branch history:
 
503
         0 revisions
 
504
 
 
505
Repository:
 
506
         0 revisions
 
507
""" % ('branch', tree.branch.repository._format.get_format_description(),
 
508
       ), out)
 
509
        self.assertEqual('', err)
 
510
        tree.unlock()
 
511
 
 
512