/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]
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)
213
                    for path, ie in tree.iter_entries_by_dir():
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
214
                        new_ie = ie.copy()
215
                        new_ie.revision = None
216
                        builder.record_entry_contents(new_ie, 
6405.2.7 by Jelmer Vernooij
Fix more tests.
217
                            [parent_tree.root_inventory],
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
218
                            path, tree, 
219
                            (ie.kind, ie.text_size, ie.executable, ie.text_sha1))
220
                    builder.finish_inventory()
221
                except:
222
                    builder.abort()
223
                    raise
224
                revidmap[revid] = builder.commit(rev.message)
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
225
                self.target.set_last_revision_info(parent_revno+1, 
226
                    revidmap[revid])
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
227
                trace.mutter('lossily pushed revision %s -> %s', 
228
                    revid, revidmap[revid])
229
        finally:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
230
            self.source.unlock()
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
231
        result.new_revno, result.new_revid = self.target.last_revision_info()
232
        result.revidmap = revidmap
233
        return result
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
234
235
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
236
class DummyForeignVcsBranchFormat(bzrbranch.BzrBranchFormat6):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
237
6213.1.18 by Jelmer Vernooij
Fix some more tests.
238
    @classmethod
239
    def get_format_string(cls):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
240
        return "Branch for Testing"
241
6207.3.9 by Jelmer Vernooij
Fix _matchingbzrdir.
242
    @property
243
    def _matchingbzrdir(self):
244
        return DummyForeignVcsDirFormat()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
245
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
246
    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.
247
            found_repository=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
248
        if name is None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
249
            name = a_controldir._get_selected_branch()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
250
        if not _found:
251
            raise NotImplementedError
252
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
253
            transport = a_controldir.get_branch_transport(None, name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
254
            control_files = lockable_files.LockableFiles(transport, 'lock',
255
                                                         lockdir.LockDir)
5535.3.9 by Andrew Bennetts
Fix test failures.
256
            if found_repository is None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
257
                found_repository = a_controldir.find_repository()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
258
            return DummyForeignVcsBranch(_format=self,
259
                              _control_files=control_files,
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
260
                              a_controldir=a_controldir,
6436.1.2 by Jelmer Vernooij
Fix some tests.
261
                              _repository=found_repository,
262
                              name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
263
        except errors.NoSuchFile:
264
            raise errors.NotBranchError(path=transport.base)
265
266
4721.2.4 by Vincent Ladeuil
More test cleanup.
267
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
268
    """BzrDirFormat for the dummy foreign VCS."""
269
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
270
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
271
    def get_format_string(cls):
272
        return "A Dummy VCS Dir"
273
274
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
275
    def get_format_description(cls):
276
        return "A Dummy VCS Dir"
277
278
    @classmethod
279
    def is_supported(cls):
280
        return True
281
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
282
    def get_branch_format(self):
283
        return DummyForeignVcsBranchFormat()
284
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
285
    @property
286
    def repository_format(self):
287
        return DummyForeignVcsRepositoryFormat()
288
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
289
    def initialize_on_transport(self, transport):
290
        """Initialize a new bzrdir in the base directory of a Transport."""
291
        # Since we don't have a .bzr directory, inherit the
292
        # mode from the root directory
293
        temp_control = lockable_files.LockableFiles(transport,
294
                            '', lockable_files.TransportLock)
295
        temp_control._transport.mkdir('.dummy',
296
                                      # FIXME: RBC 20060121 don't peek under
297
                                      # the covers
298
                                      mode=temp_control._dir_mode)
299
        del temp_control
300
        bzrdir_transport = transport.clone('.dummy')
301
        # NB: no need to escape relative paths that are url safe.
302
        control_files = lockable_files.LockableFiles(bzrdir_transport,
303
            self._lock_file_name, self._lock_class)
304
        control_files.create_lock()
305
        return self.open(transport, _found=True)
306
307
    def _open(self, transport):
308
        return DummyForeignVcsDir(transport, self)
309
310
4721.2.4 by Vincent Ladeuil
More test cleanup.
311
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
312
313
    def __init__(self, _transport, _format):
314
        self._format = _format
315
        self.transport = _transport.clone('.dummy')
316
        self.root_transport = _transport
317
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
318
        self._control_files = lockable_files.LockableFiles(self.transport,
319
            "lock", lockable_files.TransportLock)
320
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
321
    def create_workingtree(self):
322
        # dirstate requires a ".bzr" entry to exist
323
        self.root_transport.put_bytes(".bzr", "foo")
324
        return super(DummyForeignVcsDir, self).create_workingtree()
325
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
326
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
327
                    possible_transports=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
328
        if name is None:
329
            name = self._get_selected_branch()
330
        if name != "":
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
331
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
332
        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.
333
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
334
    def cloning_metadir(self, stacked=False):
335
        """Produce a metadir suitable for cloning with."""
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
336
        return controldir.format_registry.make_controldir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
337
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
338
    def checkout_metadir(self):
339
        return self.cloning_metadir()
340
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
341
    def sprout(self, url, revision_id=None, force_new_repo=False,
342
               recurse='down', possible_transports=None,
343
               accelerator_tree=None, hardlink=False, stacked=False,
344
               source_branch=None):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
345
        # 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.
346
        # that have a different control dir
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
347
        return super(DummyForeignVcsDir, self).sprout(
348
            url=url,
349
            revision_id=revision_id, force_new_repo=force_new_repo,
350
            recurse=recurse, possible_transports=possible_transports,
351
            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.
352
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
353
4721.2.5 by Vincent Ladeuil
Some refactoring.
354
def register_dummy_foreign_for_test(testcase):
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
355
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
356
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
357
                        DummyForeignProber)
5777.6.6 by Jelmer Vernooij
Add lossy tests.
358
    repository.format_registry.register(DummyForeignVcsRepositoryFormat())
359
    testcase.addCleanup(repository.format_registry.remove,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
360
                        DummyForeignVcsRepositoryFormat())
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
361
    branch.format_registry.register(DummyForeignVcsBranchFormat())
362
    testcase.addCleanup(branch.format_registry.remove,
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
363
                        DummyForeignVcsBranchFormat())
4721.2.5 by Vincent Ladeuil
Some refactoring.
364
    # We need to register the optimiser to make the dummy appears really
365
    # different from a regular bzr repository.
366
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
367
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
368
                        InterToDummyVcsBranch)
369
370
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
371
class DummyForeignProber(controldir.Prober):
372
373
    @classmethod
374
    def probe_transport(klass, transport):
375
        """Return the .bzrdir style format present in a directory."""
376
        if not transport.has('.dummy'):
377
            raise errors.NotBranchError(path=transport.base)
378
        return DummyForeignVcsDirFormat()
379
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
380
    @classmethod
381
    def known_formats(cls):
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
382
        return {DummyForeignVcsDirFormat()}
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
383
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
384
4721.2.4 by Vincent Ladeuil
More test cleanup.
385
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
386
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
387
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
388
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
389
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
390
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
391
                          reg.parse_revision_id, "invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
392
393
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
394
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
395
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
396
                          reg.parse_revision_id, "unknown-foreignrevid")
397
398
    def test_parse_revision_id(self):
399
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
400
        vcs = DummyForeignVcs()
401
        reg.register("dummy", vcs, "Dummy VCS")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
402
        self.assertEqual((
5777.6.6 by Jelmer Vernooij
Add lossy tests.
403
            ("some", "foreign", "revid"), DummyForeignVcsMapping(vcs)),
404
            reg.parse_revision_id("dummy-v1:some-foreign-revid"))
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
405
406
4721.2.4 by Vincent Ladeuil
More test cleanup.
407
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
408
    """Tests for the ForeignRevision class."""
409
410
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
411
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
412
        rev = foreign.ForeignRevision(("a", "foreign", "revid"),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
413
                                      mapp, "roundtripped-revid")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
414
        self.assertEqual("", rev.inventory_sha1)
415
        self.assertEqual(("a", "foreign", "revid"), rev.foreign_revid)
416
        self.assertEqual(mapp, rev.mapping)
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
417
418
4721.2.4 by Vincent Ladeuil
More test cleanup.
419
class WorkingTreeFileUpdateTests(tests.TestCaseWithTransport):
4285.3.2 by Jelmer Vernooij
Remove unused functions for updating the file ids of a tree.
420
    """Tests for update_workingtree_fileids()."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
421
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
422
    def test_update_workingtree(self):
423
        wt = self.make_branch_and_tree('br1')
424
        self.build_tree_contents([('br1/bla', 'original contents\n')])
425
        wt.add('bla', 'bla-a')
426
        wt.commit('bla-a')
4606.2.1 by Robert Collins
Fix test_foreign for 2a as default.
427
        root_id = wt.get_root_id()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
428
        target = wt.controldir.sprout('br2').open_workingtree()
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
429
        target.unversion(['bla-a'])
430
        target.add('bla', 'bla-b')
431
        target.commit('bla-b')
432
        target_basis = target.basis_tree()
433
        target_basis.lock_read()
434
        self.addCleanup(target_basis.unlock)
435
        foreign.update_workingtree_fileids(wt, target_basis)
436
        wt.lock_read()
437
        try:
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
438
            self.assertEqual({root_id, "bla-b"}, set(wt.all_file_ids()))
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
439
        finally:
440
            wt.unlock()
441
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
442
4721.2.4 by Vincent Ladeuil
More test cleanup.
443
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
444
    """Very basic test for DummyForeignVcs."""
445
446
    def setUp(self):
447
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
448
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
449
450
    def test_create(self):
451
        """Test we can create dummies."""
452
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
453
        dir = controldir.ControlDir.open("d")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
454
        self.assertEqual("A Dummy VCS Dir", dir._format.get_format_string())
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
455
        dir.open_repository()
456
        dir.open_branch()
457
        dir.open_workingtree()
458
459
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
460
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
461
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
462
        dir = controldir.ControlDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
463
        newdir = dir.sprout("e")
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
464
        self.assertNotEqual("A Dummy VCS Dir",
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
465
                            newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
466
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
467
    def test_push_not_supported(self):
468
        source_tree = self.make_branch_and_tree("source")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
469
        target_tree = self.make_branch_and_tree(
470
            "target", format=DummyForeignVcsDirFormat())
471
        self.assertRaises(errors.NoRoundtrippingSupport,
472
                          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
473
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
474
    def test_lossy_push_empty(self):
475
        source_tree = self.make_branch_and_tree("source")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
476
        target_tree = self.make_branch_and_tree(
477
            "target", format=DummyForeignVcsDirFormat())
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
478
        pushresult = source_tree.branch.push(target_tree.branch, lossy=True)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
479
        self.assertEqual(revision.NULL_REVISION, pushresult.old_revid)
480
        self.assertEqual(revision.NULL_REVISION, pushresult.new_revid)
481
        self.assertEqual({}, pushresult.revidmap)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
482
483
    def test_lossy_push_simple(self):
484
        source_tree = self.make_branch_and_tree("source")
485
        self.build_tree(['source/a', 'source/b'])
486
        source_tree.add(['a', 'b'])
487
        revid1 = source_tree.commit("msg")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
488
        target_tree = self.make_branch_and_tree(
489
            "target", format=DummyForeignVcsDirFormat())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
490
        target_tree.branch.lock_write()
491
        try:
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
492
            pushresult = source_tree.branch.push(
493
                target_tree.branch, lossy=True)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
494
        finally:
495
            target_tree.branch.unlock()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
496
        self.assertEqual(revision.NULL_REVISION, pushresult.old_revid)
497
        self.assertEqual({revid1: target_tree.branch.last_revision()},
498
                         pushresult.revidmap)
499
        self.assertEqual(pushresult.revidmap[revid1], pushresult.new_revid)