/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
1
# Copyright (C) 2008-2012, 2016 Canonical Ltd
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
16
17
18
"""Tests for foreign VCS utility code."""
19
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
20
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
21
from .. import (
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
22
    branch,
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
23
    controldir,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
24
    errors,
25
    foreign,
26
    lockable_files,
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
27
    lockdir,
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
28
    repository,
4721.2.4 by Vincent Ladeuil
More test cleanup.
29
    revision,
30
    tests,
3920.2.33 by Jelmer Vernooij
Use branch_builder to create revisions in testsuite.
31
    trace,
6670.4.1 by Jelmer Vernooij
Update imports.
32
    )
33
from ..bzr import (
34
    branch as bzrbranch,
35
    bzrdir,
5815.4.2 by Jelmer Vernooij
split out versionedfile-specific stuff from commitbuilder.
36
    vf_repository,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
37
    )
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
38
6670.4.5 by Jelmer Vernooij
Move breezy.repofmt contents to breezy.bzr.
39
from ..bzr import groupcompress_repo
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
40
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
41
# This is the dummy foreign revision control system, used 
42
# mainly here in the testsuite to test the foreign VCS infrastructure.
43
# It is basically standard Bazaar with some minor modifications to 
44
# make it "foreign". 
45
# 
46
# It has the following differences to "regular" Bazaar:
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
47
# - The control directory is named ".dummy", not ".bzr".
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
48
# - The revision ids are tuples, not strings.
3920.2.20 by Jelmer Vernooij
Fix dpush tests.
49
# - Doesn't support more than one parent natively
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
50
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
51
52
class DummyForeignVcsMapping(foreign.VcsMapping):
53
    """A simple mapping for the dummy Foreign VCS, for use with testing."""
54
55
    def __eq__(self, other):
6619.3.18 by Jelmer Vernooij
Run 2to3 idioms fixer.
56
        return isinstance(self, type(other))
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
57
58
    def revision_id_bzr_to_foreign(self, bzr_revid):
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
59
        return tuple(bzr_revid[len(b"dummy-v1:"):].split(b"-")), self
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
60
61
    def revision_id_foreign_to_bzr(self, foreign_revid):
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
62
        return b"dummy-v1:%s-%s-%s" % foreign_revid
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
63
64
65
class DummyForeignVcsMappingRegistry(foreign.VcsMappingRegistry):
66
67
    def revision_id_bzr_to_foreign(self, revid):
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
68
        if not revid.startswith(b"dummy-"):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
69
            raise errors.InvalidRevisionId(revid, None)
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
70
        mapping_version = revid[len(b"dummy-"):len(b"dummy-vx")]
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
71
        mapping = self.get(mapping_version)
72
        return mapping.revision_id_bzr_to_foreign(revid)
73
74
75
class DummyForeignVcs(foreign.ForeignVcs):
76
    """A dummy Foreign VCS, for use with testing.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
77
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
78
    It has revision ids that are a tuple with three strings.
79
    """
80
81
    def __init__(self):
82
        self.mapping_registry = DummyForeignVcsMappingRegistry()
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
83
        self.mapping_registry.register(b"v1", DummyForeignVcsMapping(self),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
84
                                       "Version 1")
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
85
        self.abbreviation = "dummy"
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
86
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
87
    def show_foreign_revid(self, foreign_revid):
88
        return { "dummy ding": "%s/%s\\%s" % foreign_revid }
89
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
90
    def serialize_foreign_revid(self, foreign_revid):
91
        return "%s|%s|%s" % foreign_revid
92
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
93
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
94
class DummyForeignVcsBranch(bzrbranch.BzrBranch6, foreign.ForeignBranch):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
95
    """A Dummy VCS Branch."""
96
6240.2.12 by Jelmer Vernooij
Fix foreign tests.
97
    @property
98
    def user_transport(self):
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
99
        return self.controldir.user_transport
6240.2.12 by Jelmer Vernooij
Fix foreign tests.
100
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
101
    def __init__(self, _format, _control_files, a_controldir, *args, **kwargs):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
102
        self._format = _format
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
103
        self._base = a_controldir.transport.base
3920.2.29 by Jelmer Vernooij
Fix dpush tests.
104
        self._ignore_fallbacks = False
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
105
        self.controldir = a_controldir
5777.6.6 by Jelmer Vernooij
Add lossy tests.
106
        foreign.ForeignBranch.__init__(self,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
107
            DummyForeignVcsMapping(DummyForeignVcs()))
6653.6.4 by Jelmer Vernooij
Merge trunk.
108
        bzrbranch.BzrBranch6.__init__(self, _format, _control_files, a_controldir,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
109
            *args, **kwargs)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
110
6127.1.10 by Jelmer Vernooij
Fix foreign test.
111
    def _get_checkout_format(self, lightweight=False):
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
112
        """Return the most suitable metadir for a checkout of this branch.
113
        Weaves are used if this branch's repository uses weaves.
114
        """
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
115
        return self.controldir.checkout_metadir()
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
116
117
    def import_last_revision_info_and_tags(self, source, revno, revid,
118
                                           lossy=False):
119
        interbranch = InterToDummyVcsBranch(source, self)
5853.2.7 by Jelmer Vernooij
Fix foreign test.
120
        result = interbranch.push(stop_revision=revid, lossy=True)
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
121
        if lossy:
122
            revid = result.revidmap[revid]
123
        return (revno, revid)
124
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
125
6997.4.1 by Jelmer Vernooij
Remove distinction between regular and root commit builders.
126
class DummyForeignCommitBuilder(vf_repository.VersionedFileCommitBuilder):
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
127
6746.1.1 by Jelmer Vernooij
setting-revision-ids
128
    def _generate_revision_if_needed(self, revid):
5777.6.6 by Jelmer Vernooij
Add lossy tests.
129
        mapping = DummyForeignVcsMapping(DummyForeignVcs())
130
        if self._lossy:
131
            self._new_revision_id = mapping.revision_id_foreign_to_bzr(
132
                (str(self._timestamp), str(self._timezone), "UNKNOWN"))
133
            self.random_revid = False
6746.1.1 by Jelmer Vernooij
setting-revision-ids
134
        elif revid is not None:
135
            self._new_revision_id = revid
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
136
            self.random_revid = False
5777.6.6 by Jelmer Vernooij
Add lossy tests.
137
        else:
5777.6.11 by Jelmer Vernooij
Fix revision id generation.
138
            self._new_revision_id = self._gen_revision_id()
5777.6.6 by Jelmer Vernooij
Add lossy tests.
139
            self.random_revid = True
140
141
142
class DummyForeignVcsRepository(groupcompress_repo.CHKInventoryRepository,
143
    foreign.ForeignRepository):
144
    """Dummy foreign vcs repository."""
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
145
146
147
class DummyForeignVcsRepositoryFormat(groupcompress_repo.RepositoryFormat2a):
148
5777.6.6 by Jelmer Vernooij
Add lossy tests.
149
    repository_class = DummyForeignVcsRepository
150
    _commit_builder_class = DummyForeignCommitBuilder
151
6213.1.18 by Jelmer Vernooij
Fix some more tests.
152
    @classmethod
153
    def get_format_string(cls):
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
154
        return b"Dummy Foreign Vcs Repository"
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
155
156
    def get_format_description(self):
157
        return "Dummy Foreign Vcs Repository"
158
159
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
160
def branch_history(graph, revid):
161
    ret = list(graph.iter_lefthand_ancestry(revid,
162
        (revision.NULL_REVISION,)))
163
    ret.reverse()
164
    return ret
165
166
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
167
class InterToDummyVcsBranch(branch.GenericInterBranch):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
168
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
169
    @staticmethod
170
    def is_compatible(source, target):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
171
        return isinstance(target, DummyForeignVcsBranch)
172
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
173
    def push(self, overwrite=False, stop_revision=None, lossy=False):
174
        if not lossy:
175
            raise errors.NoRoundtrippingSupport(self.source, self.target)
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
176
        result = branch.BranchPushResult()
177
        result.source_branch = self.source
178
        result.target_branch = self.target
179
        result.old_revno, result.old_revid = self.target.last_revision_info()
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
180
        self.source.lock_read()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
181
        try:
5972.2.1 by Jelmer Vernooij
Deprecate Repository.iter_reverse_revision_history.
182
            graph = self.source.repository.get_graph()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
183
            # This just handles simple cases, but that's good enough for tests
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
184
            my_history = branch_history(self.target.repository.get_graph(),
185
                result.old_revid)
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
186
            if stop_revision is None:
187
                stop_revision = self.source.last_revision()
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
188
            their_history = branch_history(graph, stop_revision)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
189
            if their_history[:min(len(my_history), len(their_history))] != my_history:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
190
                raise errors.DivergedBranches(self.target, self.source)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
191
            todo = their_history[len(my_history):]
192
            revidmap = {}
193
            for revid in todo:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
194
                rev = self.source.repository.get_revision(revid)
195
                tree = self.source.repository.revision_tree(revid)
6809.4.5 by Jelmer Vernooij
Swap arguments for get_file_*.
196
                def get_file_with_stat(path, file_id=None):
197
                    return (tree.get_file(path, file_id), None)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
198
                tree.get_file_with_stat = get_file_with_stat
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
199
                new_revid = self.target.mapping.revision_id_foreign_to_bzr(
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
200
                    (str(rev.timestamp).encode('ascii'), str(rev.timezone).encode('ascii'),
201
                        str(self.target.revno()).encode('ascii')))
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
202
                parent_revno, parent_revid= self.target.last_revision_info()
4721.2.4 by Vincent Ladeuil
More test cleanup.
203
                if parent_revid == revision.NULL_REVISION:
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
204
                    parent_revids = []
205
                else:
206
                    parent_revids = [parent_revid]
6700.2.2 by Jelmer Vernooij
Fix test_foreign use of record_entry_contents.
207
                builder = self.target.get_commit_builder(parent_revids,
6351.3.3 by Jelmer Vernooij
Convert more stuff to use config stacks.
208
                        self.target.get_config_stack(), rev.timestamp,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
209
                        rev.timezone, rev.committer, rev.properties,
210
                        new_revid)
211
                try:
6405.2.7 by Jelmer Vernooij
Fix more tests.
212
                    parent_tree = self.target.repository.revision_tree(
213
                        parent_revid)
6700.2.2 by Jelmer Vernooij
Fix test_foreign use of record_entry_contents.
214
                    iter_changes = tree.iter_changes(parent_tree)
215
                    list(builder.record_iter_changes(
216
                        tree, parent_revid, iter_changes))
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
217
                    builder.finish_inventory()
218
                except:
219
                    builder.abort()
220
                    raise
221
                revidmap[revid] = builder.commit(rev.message)
6700.2.2 by Jelmer Vernooij
Fix test_foreign use of record_entry_contents.
222
                self.target.set_last_revision_info(parent_revno+1,
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
223
                    revidmap[revid])
6700.2.2 by Jelmer Vernooij
Fix test_foreign use of record_entry_contents.
224
                trace.mutter('lossily pushed revision %s -> %s',
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
225
                    revid, revidmap[revid])
226
        finally:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
227
            self.source.unlock()
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
228
        result.new_revno, result.new_revid = self.target.last_revision_info()
229
        result.revidmap = revidmap
230
        return result
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
231
232
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
233
class DummyForeignVcsBranchFormat(bzrbranch.BzrBranchFormat6):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
234
6213.1.18 by Jelmer Vernooij
Fix some more tests.
235
    @classmethod
236
    def get_format_string(cls):
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
237
        return b"Branch for Testing"
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
238
6207.3.9 by Jelmer Vernooij
Fix _matchingbzrdir.
239
    @property
6746.2.1 by Jelmer Vernooij
Rename matchingbzrdir to matchingcontroldir.
240
    def _matchingcontroldir(self):
6207.3.9 by Jelmer Vernooij
Fix _matchingbzrdir.
241
        return DummyForeignVcsDirFormat()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
242
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
243
    def open(self, a_controldir, name=None, _found=False, ignore_fallbacks=False,
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
244
            found_repository=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
245
        if name is None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
246
            name = a_controldir._get_selected_branch()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
247
        if not _found:
248
            raise NotImplementedError
249
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
250
            transport = a_controldir.get_branch_transport(None, name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
251
            control_files = lockable_files.LockableFiles(transport, 'lock',
252
                                                         lockdir.LockDir)
5535.3.9 by Andrew Bennetts
Fix test failures.
253
            if found_repository is None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
254
                found_repository = a_controldir.find_repository()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
255
            return DummyForeignVcsBranch(_format=self,
256
                              _control_files=control_files,
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
257
                              a_controldir=a_controldir,
6436.1.2 by Jelmer Vernooij
Fix some tests.
258
                              _repository=found_repository,
259
                              name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
260
        except errors.NoSuchFile:
261
            raise errors.NotBranchError(path=transport.base)
262
263
4721.2.4 by Vincent Ladeuil
More test cleanup.
264
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
265
    """BzrDirFormat for the dummy foreign VCS."""
266
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
267
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
268
    def get_format_string(cls):
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
269
        return b"A Dummy VCS Dir"
5363.2.9 by Jelmer Vernooij
Fix some tests.
270
271
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
272
    def get_format_description(cls):
273
        return "A Dummy VCS Dir"
274
275
    @classmethod
276
    def is_supported(cls):
277
        return True
278
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
279
    def get_branch_format(self):
280
        return DummyForeignVcsBranchFormat()
281
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
282
    @property
283
    def repository_format(self):
284
        return DummyForeignVcsRepositoryFormat()
285
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
286
    def initialize_on_transport(self, transport):
287
        """Initialize a new bzrdir in the base directory of a Transport."""
288
        # Since we don't have a .bzr directory, inherit the
289
        # mode from the root directory
290
        temp_control = lockable_files.LockableFiles(transport,
291
                            '', lockable_files.TransportLock)
292
        temp_control._transport.mkdir('.dummy',
293
                                      # FIXME: RBC 20060121 don't peek under
294
                                      # the covers
295
                                      mode=temp_control._dir_mode)
296
        del temp_control
297
        bzrdir_transport = transport.clone('.dummy')
298
        # NB: no need to escape relative paths that are url safe.
299
        control_files = lockable_files.LockableFiles(bzrdir_transport,
300
            self._lock_file_name, self._lock_class)
301
        control_files.create_lock()
302
        return self.open(transport, _found=True)
303
304
    def _open(self, transport):
305
        return DummyForeignVcsDir(transport, self)
306
307
4721.2.4 by Vincent Ladeuil
More test cleanup.
308
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
309
310
    def __init__(self, _transport, _format):
311
        self._format = _format
312
        self.transport = _transport.clone('.dummy')
313
        self.root_transport = _transport
314
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
315
        self._control_files = lockable_files.LockableFiles(self.transport,
316
            "lock", lockable_files.TransportLock)
317
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
318
    def create_workingtree(self):
319
        # dirstate requires a ".bzr" entry to exist
6973.12.3 by Jelmer Vernooij
Fixes.
320
        self.root_transport.put_bytes(".bzr", b"foo")
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
321
        return super(DummyForeignVcsDir, self).create_workingtree()
322
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
323
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
324
                    possible_transports=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
325
        if name is None:
326
            name = self._get_selected_branch()
327
        if name != "":
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
328
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
329
        return self._format.get_branch_format().open(self, _found=True)
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
330
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
331
    def cloning_metadir(self, stacked=False):
332
        """Produce a metadir suitable for cloning with."""
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
333
        return controldir.format_registry.make_controldir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
334
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
335
    def checkout_metadir(self):
336
        return self.cloning_metadir()
337
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
338
    def sprout(self, url, revision_id=None, force_new_repo=False,
339
               recurse='down', possible_transports=None,
340
               accelerator_tree=None, hardlink=False, stacked=False,
341
               source_branch=None):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
342
        # dirstate doesn't cope with accelerator_trees well
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
343
        # that have a different control dir
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
344
        return super(DummyForeignVcsDir, self).sprout(
345
            url=url,
346
            revision_id=revision_id, force_new_repo=force_new_repo,
347
            recurse=recurse, possible_transports=possible_transports,
348
            hardlink=hardlink, stacked=stacked, source_branch=source_branch)
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
349
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
350
4721.2.5 by Vincent Ladeuil
Some refactoring.
351
def register_dummy_foreign_for_test(testcase):
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
352
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
353
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
354
                        DummyForeignProber)
5777.6.6 by Jelmer Vernooij
Add lossy tests.
355
    repository.format_registry.register(DummyForeignVcsRepositoryFormat())
356
    testcase.addCleanup(repository.format_registry.remove,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
357
                        DummyForeignVcsRepositoryFormat())
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
358
    branch.format_registry.register(DummyForeignVcsBranchFormat())
359
    testcase.addCleanup(branch.format_registry.remove,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
360
                        DummyForeignVcsBranchFormat())
4721.2.5 by Vincent Ladeuil
Some refactoring.
361
    # We need to register the optimiser to make the dummy appears really
362
    # different from a regular bzr repository.
363
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
364
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
365
                        InterToDummyVcsBranch)
366
367
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
368
class DummyForeignProber(controldir.Prober):
369
370
    @classmethod
371
    def probe_transport(klass, transport):
372
        """Return the .bzrdir style format present in a directory."""
373
        if not transport.has('.dummy'):
374
            raise errors.NotBranchError(path=transport.base)
375
        return DummyForeignVcsDirFormat()
376
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
377
    @classmethod
378
    def known_formats(cls):
6973.12.9 by Jelmer Vernooij
More fixes.
379
        return [DummyForeignVcsDirFormat()]
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
380
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
381
4721.2.4 by Vincent Ladeuil
More test cleanup.
382
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
383
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
384
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
385
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
386
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
387
        self.assertRaises(errors.InvalidRevisionId,
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
388
                          reg.parse_revision_id, b"invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
389
390
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
391
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
392
        self.assertRaises(errors.InvalidRevisionId,
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
393
                          reg.parse_revision_id, b"unknown-foreignrevid")
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
394
395
    def test_parse_revision_id(self):
396
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
397
        vcs = DummyForeignVcs()
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
398
        reg.register(b"dummy", vcs, "Dummy VCS")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
399
        self.assertEqual((
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
400
            (b"some", b"foreign", b"revid"), DummyForeignVcsMapping(vcs)),
401
            reg.parse_revision_id(b"dummy-v1:some-foreign-revid"))
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
402
403
4721.2.4 by Vincent Ladeuil
More test cleanup.
404
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
405
    """Tests for the ForeignRevision class."""
406
407
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
408
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
409
        rev = foreign.ForeignRevision((b"a", b"foreign", b"revid"),
410
                                      mapp, b"roundtripped-revid")
411
        self.assertEqual(b"", rev.inventory_sha1)
412
        self.assertEqual((b"a", b"foreign", b"revid"), rev.foreign_revid)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
413
        self.assertEqual(mapp, rev.mapping)
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
414
415
4721.2.4 by Vincent Ladeuil
More test cleanup.
416
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
417
    """Very basic test for DummyForeignVcs."""
418
419
    def setUp(self):
420
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
421
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
422
423
    def test_create(self):
424
        """Test we can create dummies."""
425
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
426
        dir = controldir.ControlDir.open("d")
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
427
        self.assertEqual(b"A Dummy VCS Dir", dir._format.get_format_string())
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
428
        dir.open_repository()
429
        dir.open_branch()
430
        dir.open_workingtree()
431
432
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
433
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
434
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
435
        dir = controldir.ControlDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
436
        newdir = dir.sprout("e")
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
437
        self.assertNotEqual(b"A Dummy VCS Dir",
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
438
                            newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
439
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
440
    def test_push_not_supported(self):
441
        source_tree = self.make_branch_and_tree("source")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
442
        target_tree = self.make_branch_and_tree(
443
            "target", format=DummyForeignVcsDirFormat())
444
        self.assertRaises(errors.NoRoundtrippingSupport,
445
                          source_tree.branch.push, target_tree.branch)
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
446
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
447
    def test_lossy_push_empty(self):
448
        source_tree = self.make_branch_and_tree("source")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
449
        target_tree = self.make_branch_and_tree(
450
            "target", format=DummyForeignVcsDirFormat())
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
451
        pushresult = source_tree.branch.push(target_tree.branch, lossy=True)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
452
        self.assertEqual(revision.NULL_REVISION, pushresult.old_revid)
453
        self.assertEqual(revision.NULL_REVISION, pushresult.new_revid)
454
        self.assertEqual({}, pushresult.revidmap)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
455
456
    def test_lossy_push_simple(self):
457
        source_tree = self.make_branch_and_tree("source")
458
        self.build_tree(['source/a', 'source/b'])
459
        source_tree.add(['a', 'b'])
460
        revid1 = source_tree.commit("msg")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
461
        target_tree = self.make_branch_and_tree(
462
            "target", format=DummyForeignVcsDirFormat())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
463
        target_tree.branch.lock_write()
464
        try:
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
465
            pushresult = source_tree.branch.push(
466
                target_tree.branch, lossy=True)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
467
        finally:
468
            target_tree.branch.unlock()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
469
        self.assertEqual(revision.NULL_REVISION, pushresult.old_revid)
470
        self.assertEqual({revid1: target_tree.branch.last_revision()},
471
                         pushresult.revidmap)
472
        self.assertEqual(pushresult.revidmap[revid1], pushresult.new_revid)