/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
7143.15.2 by Jelmer Vernooij
Run autopep8.
41
# This is the dummy foreign revision control system, used
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
42
# mainly here in the testsuite to test the foreign VCS infrastructure.
7143.15.2 by Jelmer Vernooij
Run autopep8.
43
# It is basically standard Bazaar with some minor modifications to
44
# make it "foreign".
45
#
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
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):
7143.15.2 by Jelmer Vernooij
Run autopep8.
88
        return {"dummy ding": "%s/%s\\%s" % foreign_revid}
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
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,
7143.15.2 by Jelmer Vernooij
Run autopep8.
107
                                       DummyForeignVcsMapping(DummyForeignVcs()))
6653.6.4 by Jelmer Vernooij
Merge trunk.
108
        bzrbranch.BzrBranch6.__init__(self, _format, _control_files, a_controldir,
7143.15.2 by Jelmer Vernooij
Run autopep8.
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(
7058.4.1 by Jelmer Vernooij
Fix another 40 tests.
132
                (b'%d' % self._timestamp,
7045.3.1 by Jelmer Vernooij
Fix another ~500 tests.
133
                 str(self._timezone).encode('ascii'), b"UNKNOWN"))
5777.6.6 by Jelmer Vernooij
Add lossy tests.
134
            self.random_revid = False
6746.1.1 by Jelmer Vernooij
setting-revision-ids
135
        elif revid is not None:
136
            self._new_revision_id = revid
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
137
            self.random_revid = False
5777.6.6 by Jelmer Vernooij
Add lossy tests.
138
        else:
5777.6.11 by Jelmer Vernooij
Fix revision id generation.
139
            self._new_revision_id = self._gen_revision_id()
5777.6.6 by Jelmer Vernooij
Add lossy tests.
140
            self.random_revid = True
141
142
143
class DummyForeignVcsRepository(groupcompress_repo.CHKInventoryRepository,
7143.15.2 by Jelmer Vernooij
Run autopep8.
144
                                foreign.ForeignRepository):
5777.6.6 by Jelmer Vernooij
Add lossy tests.
145
    """Dummy foreign vcs repository."""
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
146
147
148
class DummyForeignVcsRepositoryFormat(groupcompress_repo.RepositoryFormat2a):
149
5777.6.6 by Jelmer Vernooij
Add lossy tests.
150
    repository_class = DummyForeignVcsRepository
151
    _commit_builder_class = DummyForeignCommitBuilder
152
6213.1.18 by Jelmer Vernooij
Fix some more tests.
153
    @classmethod
154
    def get_format_string(cls):
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
155
        return b"Dummy Foreign Vcs Repository"
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
156
157
    def get_format_description(self):
158
        return "Dummy Foreign Vcs Repository"
159
160
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
161
def branch_history(graph, revid):
162
    ret = list(graph.iter_lefthand_ancestry(revid,
7143.15.2 by Jelmer Vernooij
Run autopep8.
163
                                            (revision.NULL_REVISION,)))
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
164
    ret.reverse()
165
    return ret
166
167
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
168
class InterToDummyVcsBranch(branch.GenericInterBranch):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
169
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
170
    @staticmethod
171
    def is_compatible(source, target):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
172
        return isinstance(target, DummyForeignVcsBranch)
173
7489.4.2 by Jelmer Vernooij
Plumb through tag_selector.
174
    def push(self, overwrite=False, stop_revision=None, lossy=False, tag_selector=None):
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
175
        if not lossy:
176
            raise errors.NoRoundtrippingSupport(self.source, self.target)
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
177
        result = branch.BranchPushResult()
178
        result.source_branch = self.source
179
        result.target_branch = self.target
180
        result.old_revno, result.old_revid = self.target.last_revision_info()
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
181
        self.source.lock_read()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
182
        try:
5972.2.1 by Jelmer Vernooij
Deprecate Repository.iter_reverse_revision_history.
183
            graph = self.source.repository.get_graph()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
184
            # This just handles simple cases, but that's good enough for tests
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
185
            my_history = branch_history(self.target.repository.get_graph(),
7143.15.2 by Jelmer Vernooij
Run autopep8.
186
                                        result.old_revid)
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
187
            if stop_revision is None:
188
                stop_revision = self.source.last_revision()
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
189
            their_history = branch_history(graph, stop_revision)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
190
            if their_history[:min(len(my_history), len(their_history))] != my_history:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
191
                raise errors.DivergedBranches(self.target, self.source)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
192
            todo = their_history[len(my_history):]
193
            revidmap = {}
194
            for revid in todo:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
195
                rev = self.source.repository.get_revision(revid)
196
                tree = self.source.repository.revision_tree(revid)
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
197
                def get_file_with_stat(path):
198
                    return (tree.get_file(path), None)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
199
                tree.get_file_with_stat = get_file_with_stat
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
200
                new_revid = self.target.mapping.revision_id_foreign_to_bzr(
7058.4.1 by Jelmer Vernooij
Fix another 40 tests.
201
                    (b'%d' % rev.timestamp, str(rev.timezone).encode('ascii'),
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
202
                        str(self.target.revno()).encode('ascii')))
7143.15.2 by Jelmer Vernooij
Run autopep8.
203
                parent_revno, parent_revid = self.target.last_revision_info()
4721.2.4 by Vincent Ladeuil
More test cleanup.
204
                if parent_revid == revision.NULL_REVISION:
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
205
                    parent_revids = []
206
                else:
207
                    parent_revids = [parent_revid]
7206.6.1 by Jelmer Vernooij
Drop file_id from record_iter_changes return value.
208
                builder = self.target.get_commit_builder(
209
                    parent_revids, self.target.get_config_stack(), rev.timestamp,
210
                    rev.timezone, rev.committer, rev.properties,
211
                    new_revid)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
212
                try:
6405.2.7 by Jelmer Vernooij
Fix more tests.
213
                    parent_tree = self.target.repository.revision_tree(
214
                        parent_revid)
6700.2.2 by Jelmer Vernooij
Fix test_foreign use of record_entry_contents.
215
                    iter_changes = tree.iter_changes(parent_tree)
216
                    list(builder.record_iter_changes(
217
                        tree, parent_revid, iter_changes))
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
218
                    builder.finish_inventory()
219
                except:
220
                    builder.abort()
221
                    raise
222
                revidmap[revid] = builder.commit(rev.message)
7143.15.2 by Jelmer Vernooij
Run autopep8.
223
                self.target.set_last_revision_info(parent_revno + 1,
224
                                                   revidmap[revid])
6700.2.2 by Jelmer Vernooij
Fix test_foreign use of record_entry_contents.
225
                trace.mutter('lossily pushed revision %s -> %s',
7143.15.2 by Jelmer Vernooij
Run autopep8.
226
                             revid, revidmap[revid])
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
227
        finally:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
228
            self.source.unlock()
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
229
        result.new_revno, result.new_revid = self.target.last_revision_info()
230
        result.revidmap = revidmap
231
        return result
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
232
233
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
234
class DummyForeignVcsBranchFormat(bzrbranch.BzrBranchFormat6):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
235
6213.1.18 by Jelmer Vernooij
Fix some more tests.
236
    @classmethod
237
    def get_format_string(cls):
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
238
        return b"Branch for Testing"
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
239
6207.3.9 by Jelmer Vernooij
Fix _matchingbzrdir.
240
    @property
6746.2.1 by Jelmer Vernooij
Rename matchingbzrdir to matchingcontroldir.
241
    def _matchingcontroldir(self):
6207.3.9 by Jelmer Vernooij
Fix _matchingbzrdir.
242
        return DummyForeignVcsDirFormat()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
243
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
244
    def open(self, a_controldir, name=None, _found=False, ignore_fallbacks=False,
7143.15.2 by Jelmer Vernooij
Run autopep8.
245
             found_repository=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
246
        if name is None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
247
            name = a_controldir._get_selected_branch()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
248
        if not _found:
249
            raise NotImplementedError
250
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
251
            transport = a_controldir.get_branch_transport(None, name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
252
            control_files = lockable_files.LockableFiles(transport, 'lock',
253
                                                         lockdir.LockDir)
5535.3.9 by Andrew Bennetts
Fix test failures.
254
            if found_repository is None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
255
                found_repository = a_controldir.find_repository()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
256
            return DummyForeignVcsBranch(_format=self,
7143.15.2 by Jelmer Vernooij
Run autopep8.
257
                                         _control_files=control_files,
258
                                         a_controldir=a_controldir,
259
                                         _repository=found_repository,
260
                                         name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
261
        except errors.NoSuchFile:
262
            raise errors.NotBranchError(path=transport.base)
263
264
4721.2.4 by Vincent Ladeuil
More test cleanup.
265
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
266
    """BzrDirFormat for the dummy foreign VCS."""
267
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
268
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
269
    def get_format_string(cls):
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
270
        return b"A Dummy VCS Dir"
5363.2.9 by Jelmer Vernooij
Fix some tests.
271
272
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
273
    def get_format_description(cls):
274
        return "A Dummy VCS Dir"
275
276
    @classmethod
277
    def is_supported(cls):
278
        return True
279
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
280
    def get_branch_format(self):
281
        return DummyForeignVcsBranchFormat()
282
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
283
    @property
284
    def repository_format(self):
285
        return DummyForeignVcsRepositoryFormat()
286
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
287
    def initialize_on_transport(self, transport):
288
        """Initialize a new bzrdir in the base directory of a Transport."""
289
        # Since we don't have a .bzr directory, inherit the
290
        # mode from the root directory
291
        temp_control = lockable_files.LockableFiles(transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
292
                                                    '', lockable_files.TransportLock)
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
293
        temp_control._transport.mkdir('.dummy',
294
                                      # FIXME: RBC 20060121 don't peek under
295
                                      # the covers
296
                                      mode=temp_control._dir_mode)
297
        del temp_control
298
        bzrdir_transport = transport.clone('.dummy')
299
        # NB: no need to escape relative paths that are url safe.
300
        control_files = lockable_files.LockableFiles(bzrdir_transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
301
                                                     self._lock_file_name, self._lock_class)
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
302
        control_files.create_lock()
303
        return self.open(transport, _found=True)
304
305
    def _open(self, transport):
306
        return DummyForeignVcsDir(transport, self)
307
308
4721.2.4 by Vincent Ladeuil
More test cleanup.
309
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
310
311
    def __init__(self, _transport, _format):
312
        self._format = _format
313
        self.transport = _transport.clone('.dummy')
314
        self.root_transport = _transport
315
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
316
        self._control_files = lockable_files.LockableFiles(self.transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
317
                                                           "lock", lockable_files.TransportLock)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
318
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
319
    def create_workingtree(self):
320
        # dirstate requires a ".bzr" entry to exist
6973.12.3 by Jelmer Vernooij
Fixes.
321
        self.root_transport.put_bytes(".bzr", b"foo")
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
322
        return super(DummyForeignVcsDir, self).create_workingtree()
323
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
324
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
325
                    possible_transports=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
326
        if name is None:
327
            name = self._get_selected_branch()
328
        if name != "":
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
329
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
330
        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.
331
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
332
    def cloning_metadir(self, stacked=False):
333
        """Produce a metadir suitable for cloning with."""
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
334
        return controldir.format_registry.make_controldir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
335
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
336
    def checkout_metadir(self):
337
        return self.cloning_metadir()
338
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
339
    def sprout(self, url, revision_id=None, force_new_repo=False,
340
               recurse='down', possible_transports=None,
341
               accelerator_tree=None, hardlink=False, stacked=False,
342
               source_branch=None):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
343
        # 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.
344
        # that have a different control dir
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
345
        return super(DummyForeignVcsDir, self).sprout(
346
            url=url,
347
            revision_id=revision_id, force_new_repo=force_new_repo,
348
            recurse=recurse, possible_transports=possible_transports,
349
            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.
350
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
351
4721.2.5 by Vincent Ladeuil
Some refactoring.
352
def register_dummy_foreign_for_test(testcase):
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
353
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
354
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
355
                        DummyForeignProber)
5777.6.6 by Jelmer Vernooij
Add lossy tests.
356
    repository.format_registry.register(DummyForeignVcsRepositoryFormat())
357
    testcase.addCleanup(repository.format_registry.remove,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
358
                        DummyForeignVcsRepositoryFormat())
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
359
    branch.format_registry.register(DummyForeignVcsBranchFormat())
360
    testcase.addCleanup(branch.format_registry.remove,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
361
                        DummyForeignVcsBranchFormat())
4721.2.5 by Vincent Ladeuil
Some refactoring.
362
    # We need to register the optimiser to make the dummy appears really
363
    # different from a regular bzr repository.
364
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
365
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
366
                        InterToDummyVcsBranch)
367
368
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
369
class DummyForeignProber(controldir.Prober):
370
371
    @classmethod
372
    def probe_transport(klass, transport):
373
        """Return the .bzrdir style format present in a directory."""
374
        if not transport.has('.dummy'):
375
            raise errors.NotBranchError(path=transport.base)
376
        return DummyForeignVcsDirFormat()
377
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
378
    @classmethod
379
    def known_formats(cls):
6973.12.9 by Jelmer Vernooij
More fixes.
380
        return [DummyForeignVcsDirFormat()]
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
381
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
382
4721.2.4 by Vincent Ladeuil
More test cleanup.
383
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
384
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
385
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
386
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
387
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
388
        self.assertRaises(errors.InvalidRevisionId,
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
389
                          reg.parse_revision_id, b"invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
390
391
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
392
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
393
        self.assertRaises(errors.InvalidRevisionId,
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
394
                          reg.parse_revision_id, b"unknown-foreignrevid")
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
395
396
    def test_parse_revision_id(self):
397
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
398
        vcs = DummyForeignVcs()
7143.14.2 by Jelmer Vernooij
Fix test.
399
        reg.register("dummy", vcs, "Dummy VCS")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
400
        self.assertEqual((
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
401
            (b"some", b"foreign", b"revid"), DummyForeignVcsMapping(vcs)),
402
            reg.parse_revision_id(b"dummy-v1:some-foreign-revid"))
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
403
404
4721.2.4 by Vincent Ladeuil
More test cleanup.
405
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
406
    """Tests for the ForeignRevision class."""
407
408
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
409
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
7045.2.9 by Jelmer Vernooij
Fix some foreign branch tests.
410
        rev = foreign.ForeignRevision((b"a", b"foreign", b"revid"),
411
                                      mapp, b"roundtripped-revid")
412
        self.assertEqual(b"", rev.inventory_sha1)
413
        self.assertEqual((b"a", b"foreign", b"revid"), rev.foreign_revid)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
414
        self.assertEqual(mapp, rev.mapping)
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
415
416
4721.2.4 by Vincent Ladeuil
More test cleanup.
417
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
418
    """Very basic test for DummyForeignVcs."""
419
420
    def setUp(self):
421
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
422
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
423
424
    def test_create(self):
425
        """Test we can create dummies."""
426
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
427
        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.
428
        self.assertEqual(b"A Dummy VCS Dir", dir._format.get_format_string())
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
429
        dir.open_repository()
430
        dir.open_branch()
431
        dir.open_workingtree()
432
433
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
434
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
435
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
436
        dir = controldir.ControlDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
437
        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.
438
        self.assertNotEqual(b"A Dummy VCS Dir",
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
439
                            newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
440
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
441
    def test_push_not_supported(self):
442
        source_tree = self.make_branch_and_tree("source")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
443
        target_tree = self.make_branch_and_tree(
444
            "target", format=DummyForeignVcsDirFormat())
445
        self.assertRaises(errors.NoRoundtrippingSupport,
446
                          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
447
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
448
    def test_lossy_push_empty(self):
449
        source_tree = self.make_branch_and_tree("source")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
450
        target_tree = self.make_branch_and_tree(
451
            "target", format=DummyForeignVcsDirFormat())
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
452
        pushresult = source_tree.branch.push(target_tree.branch, lossy=True)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
453
        self.assertEqual(revision.NULL_REVISION, pushresult.old_revid)
454
        self.assertEqual(revision.NULL_REVISION, pushresult.new_revid)
455
        self.assertEqual({}, pushresult.revidmap)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
456
457
    def test_lossy_push_simple(self):
458
        source_tree = self.make_branch_and_tree("source")
459
        self.build_tree(['source/a', 'source/b'])
460
        source_tree.add(['a', 'b'])
461
        revid1 = source_tree.commit("msg")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
462
        target_tree = self.make_branch_and_tree(
463
            "target", format=DummyForeignVcsDirFormat())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
464
        target_tree.branch.lock_write()
465
        try:
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
466
            pushresult = source_tree.branch.push(
467
                target_tree.branch, lossy=True)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
468
        finally:
469
            target_tree.branch.unlock()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
470
        self.assertEqual(revision.NULL_REVISION, pushresult.old_revid)
471
        self.assertEqual({revid1: target_tree.branch.last_revision()},
472
                         pushresult.revidmap)
473
        self.assertEqual(pushresult.revidmap[revid1], pushresult.new_revid)