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