~bzr-pqm/bzr/bzr.dev

5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2008-2011 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
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
21
from bzrlib import (
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
22
    branch,
4721.2.4 by Vincent Ladeuil
More test cleanup.
23
    bzrdir,
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
24
    controldir,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
25
    errors,
26
    foreign,
27
    lockable_files,
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
28
    lockdir,
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
29
    repository,
4721.2.4 by Vincent Ladeuil
More test cleanup.
30
    revision,
31
    tests,
3920.2.33 by Jelmer Vernooij
Use branch_builder to create revisions in testsuite.
32
    trace,
5815.4.2 by Jelmer Vernooij
split out versionedfile-specific stuff from commitbuilder.
33
    vf_repository,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
34
    )
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
35
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
36
from bzrlib.repofmt import groupcompress_repo
37
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
38
# This is the dummy foreign revision control system, used 
39
# mainly here in the testsuite to test the foreign VCS infrastructure.
40
# It is basically standard Bazaar with some minor modifications to 
41
# make it "foreign". 
42
# 
43
# It has the following differences to "regular" Bazaar:
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
44
# - The control directory is named ".dummy", not ".bzr".
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
45
# - The revision ids are tuples, not strings.
3920.2.20 by Jelmer Vernooij
Fix dpush tests.
46
# - Doesn't support more than one parent natively
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
47
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
48
49
class DummyForeignVcsMapping(foreign.VcsMapping):
50
    """A simple mapping for the dummy Foreign VCS, for use with testing."""
51
52
    def __eq__(self, other):
53
        return type(self) == type(other)
54
55
    def revision_id_bzr_to_foreign(self, bzr_revid):
56
        return tuple(bzr_revid[len("dummy-v1:"):].split("-")), self
57
58
    def revision_id_foreign_to_bzr(self, foreign_revid):
59
        return "dummy-v1:%s-%s-%s" % foreign_revid
60
61
62
class DummyForeignVcsMappingRegistry(foreign.VcsMappingRegistry):
63
64
    def revision_id_bzr_to_foreign(self, revid):
65
        if not revid.startswith("dummy-"):
66
            raise errors.InvalidRevisionId(revid, None)
67
        mapping_version = revid[len("dummy-"):len("dummy-vx")]
68
        mapping = self.get(mapping_version)
69
        return mapping.revision_id_bzr_to_foreign(revid)
70
71
72
class DummyForeignVcs(foreign.ForeignVcs):
73
    """A dummy Foreign VCS, for use with testing.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
74
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
75
    It has revision ids that are a tuple with three strings.
76
    """
77
78
    def __init__(self):
79
        self.mapping_registry = DummyForeignVcsMappingRegistry()
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
80
        self.mapping_registry.register("v1", DummyForeignVcsMapping(self),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
81
                                       "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.
82
        self.abbreviation = "dummy"
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
83
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
84
    def show_foreign_revid(self, foreign_revid):
85
        return { "dummy ding": "%s/%s\\%s" % foreign_revid }
86
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
87
    def serialize_foreign_revid(self, foreign_revid):
88
        return "%s|%s|%s" % foreign_revid
89
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
90
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
91
class DummyForeignVcsBranch(branch.BzrBranch6,foreign.ForeignBranch):
92
    """A Dummy VCS Branch."""
93
6240.2.12 by Jelmer Vernooij
Fix foreign tests.
94
    @property
95
    def user_transport(self):
96
        return self.bzrdir.user_transport
97
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
98
    def __init__(self, _format, _control_files, a_bzrdir, *args, **kwargs):
99
        self._format = _format
100
        self._base = a_bzrdir.transport.base
3920.2.29 by Jelmer Vernooij
Fix dpush tests.
101
        self._ignore_fallbacks = False
5158.6.10 by Martin Pool
Update more code to use user_transport when it should
102
        self.bzrdir = a_bzrdir
5777.6.6 by Jelmer Vernooij
Add lossy tests.
103
        foreign.ForeignBranch.__init__(self,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
104
            DummyForeignVcsMapping(DummyForeignVcs()))
5777.6.6 by Jelmer Vernooij
Add lossy tests.
105
        branch.BzrBranch6.__init__(self, _format, _control_files, a_bzrdir,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
106
            *args, **kwargs)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
107
6127.1.10 by Jelmer Vernooij
Fix foreign test.
108
    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.
109
        """Return the most suitable metadir for a checkout of this branch.
110
        Weaves are used if this branch's repository uses weaves.
111
        """
112
        return self.bzrdir.checkout_metadir()
113
114
    def import_last_revision_info_and_tags(self, source, revno, revid,
115
                                           lossy=False):
116
        interbranch = InterToDummyVcsBranch(source, self)
5853.2.7 by Jelmer Vernooij
Fix foreign test.
117
        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.
118
        if lossy:
119
            revid = result.revidmap[revid]
120
        return (revno, revid)
121
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
122
5815.4.2 by Jelmer Vernooij
split out versionedfile-specific stuff from commitbuilder.
123
class DummyForeignCommitBuilder(vf_repository.VersionedFileRootCommitBuilder):
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
124
125
    def _generate_revision_if_needed(self):
5777.6.6 by Jelmer Vernooij
Add lossy tests.
126
        mapping = DummyForeignVcsMapping(DummyForeignVcs())
127
        if self._lossy:
128
            self._new_revision_id = mapping.revision_id_foreign_to_bzr(
129
                (str(self._timestamp), str(self._timezone), "UNKNOWN"))
130
            self.random_revid = False
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
131
        elif self._new_revision_id is not None:
132
            self.random_revid = False
5777.6.6 by Jelmer Vernooij
Add lossy tests.
133
        else:
5777.6.11 by Jelmer Vernooij
Fix revision id generation.
134
            self._new_revision_id = self._gen_revision_id()
5777.6.6 by Jelmer Vernooij
Add lossy tests.
135
            self.random_revid = True
136
137
138
class DummyForeignVcsRepository(groupcompress_repo.CHKInventoryRepository,
139
    foreign.ForeignRepository):
140
    """Dummy foreign vcs repository."""
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
141
142
143
class DummyForeignVcsRepositoryFormat(groupcompress_repo.RepositoryFormat2a):
144
5777.6.6 by Jelmer Vernooij
Add lossy tests.
145
    repository_class = DummyForeignVcsRepository
146
    _commit_builder_class = DummyForeignCommitBuilder
147
6213.1.18 by Jelmer Vernooij
Fix some more tests.
148
    @classmethod
149
    def get_format_string(cls):
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
150
        return "Dummy Foreign Vcs Repository"
151
152
    def get_format_description(self):
153
        return "Dummy Foreign Vcs Repository"
154
155
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
156
def branch_history(graph, revid):
157
    ret = list(graph.iter_lefthand_ancestry(revid,
158
        (revision.NULL_REVISION,)))
159
    ret.reverse()
160
    return ret
161
162
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
163
class InterToDummyVcsBranch(branch.GenericInterBranch):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
164
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
165
    @staticmethod
166
    def is_compatible(source, target):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
167
        return isinstance(target, DummyForeignVcsBranch)
168
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
169
    def push(self, overwrite=False, stop_revision=None, lossy=False):
170
        if not lossy:
171
            raise errors.NoRoundtrippingSupport(self.source, self.target)
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
172
        result = branch.BranchPushResult()
173
        result.source_branch = self.source
174
        result.target_branch = self.target
175
        result.old_revno, result.old_revid = self.target.last_revision_info()
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
176
        self.source.lock_read()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
177
        try:
5972.2.1 by Jelmer Vernooij
Deprecate Repository.iter_reverse_revision_history.
178
            graph = self.source.repository.get_graph()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
179
            # This just handles simple cases, but that's good enough for tests
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
180
            my_history = branch_history(self.target.repository.get_graph(),
181
                result.old_revid)
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
182
            if stop_revision is None:
183
                stop_revision = self.source.last_revision()
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
184
            their_history = branch_history(graph, stop_revision)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
185
            if their_history[:min(len(my_history), len(their_history))] != my_history:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
186
                raise errors.DivergedBranches(self.target, self.source)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
187
            todo = their_history[len(my_history):]
188
            revidmap = {}
189
            for revid in todo:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
190
                rev = self.source.repository.get_revision(revid)
191
                tree = self.source.repository.revision_tree(revid)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
192
                def get_file_with_stat(file_id, path=None):
193
                    return (tree.get_file(file_id), None)
194
                tree.get_file_with_stat = get_file_with_stat
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
195
                new_revid = self.target.mapping.revision_id_foreign_to_bzr(
5972.2.1 by Jelmer Vernooij
Deprecate Repository.iter_reverse_revision_history.
196
                    (str(rev.timestamp), str(rev.timezone),
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
197
                        str(self.target.revno())))
198
                parent_revno, parent_revid= self.target.last_revision_info()
4721.2.4 by Vincent Ladeuil
More test cleanup.
199
                if parent_revid == revision.NULL_REVISION:
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
200
                    parent_revids = []
201
                else:
202
                    parent_revids = [parent_revid]
203
                builder = self.target.get_commit_builder(parent_revids, 
6351.3.3 by Jelmer Vernooij
Convert more stuff to use config stacks.
204
                        self.target.get_config_stack(), rev.timestamp,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
205
                        rev.timezone, rev.committer, rev.properties,
206
                        new_revid)
207
                try:
6405.2.7 by Jelmer Vernooij
Fix more tests.
208
                    parent_tree = self.target.repository.revision_tree(
209
                        parent_revid)
210
                    for path, ie in tree.iter_entries_by_dir():
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
211
                        new_ie = ie.copy()
212
                        new_ie.revision = None
213
                        builder.record_entry_contents(new_ie, 
6405.2.7 by Jelmer Vernooij
Fix more tests.
214
                            [parent_tree.root_inventory],
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
215
                            path, tree, 
216
                            (ie.kind, ie.text_size, ie.executable, ie.text_sha1))
217
                    builder.finish_inventory()
218
                except:
219
                    builder.abort()
220
                    raise
221
                revidmap[revid] = builder.commit(rev.message)
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
222
                self.target.set_last_revision_info(parent_revno+1, 
223
                    revidmap[revid])
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
224
                trace.mutter('lossily pushed revision %s -> %s', 
225
                    revid, revidmap[revid])
226
        finally:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
227
            self.source.unlock()
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
228
        result.new_revno, result.new_revid = self.target.last_revision_info()
229
        result.revidmap = revidmap
230
        return result
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
231
232
233
class DummyForeignVcsBranchFormat(branch.BzrBranchFormat6):
234
6213.1.18 by Jelmer Vernooij
Fix some more tests.
235
    @classmethod
236
    def get_format_string(cls):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
237
        return "Branch for Testing"
238
6207.3.9 by Jelmer Vernooij
Fix _matchingbzrdir.
239
    @property
240
    def _matchingbzrdir(self):
241
        return DummyForeignVcsDirFormat()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
242
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
243
    def open(self, a_bzrdir, name=None, _found=False, ignore_fallbacks=False,
244
            found_repository=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
245
        if name is None:
246
            name = a_bzrdir._get_selected_branch()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
247
        if not _found:
248
            raise NotImplementedError
249
        try:
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
250
            transport = a_bzrdir.get_branch_transport(None, name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
251
            control_files = lockable_files.LockableFiles(transport, 'lock',
252
                                                         lockdir.LockDir)
5535.3.9 by Andrew Bennetts
Fix test failures.
253
            if found_repository is None:
254
                found_repository = a_bzrdir.find_repository()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
255
            return DummyForeignVcsBranch(_format=self,
256
                              _control_files=control_files,
257
                              a_bzrdir=a_bzrdir,
6436.1.2 by Jelmer Vernooij
Fix some tests.
258
                              _repository=found_repository,
259
                              name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
260
        except errors.NoSuchFile:
261
            raise errors.NotBranchError(path=transport.base)
262
263
4721.2.4 by Vincent Ladeuil
More test cleanup.
264
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
265
    """BzrDirFormat for the dummy foreign VCS."""
266
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
267
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
268
    def get_format_string(cls):
269
        return "A Dummy VCS Dir"
270
271
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
272
    def get_format_description(cls):
273
        return "A Dummy VCS Dir"
274
275
    @classmethod
276
    def is_supported(cls):
277
        return True
278
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
279
    def get_branch_format(self):
280
        return DummyForeignVcsBranchFormat()
281
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
282
    @property
283
    def repository_format(self):
284
        return DummyForeignVcsRepositoryFormat()
285
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
286
    def initialize_on_transport(self, transport):
287
        """Initialize a new bzrdir in the base directory of a Transport."""
288
        # Since we don't have a .bzr directory, inherit the
289
        # mode from the root directory
290
        temp_control = lockable_files.LockableFiles(transport,
291
                            '', lockable_files.TransportLock)
292
        temp_control._transport.mkdir('.dummy',
293
                                      # FIXME: RBC 20060121 don't peek under
294
                                      # the covers
295
                                      mode=temp_control._dir_mode)
296
        del temp_control
297
        bzrdir_transport = transport.clone('.dummy')
298
        # NB: no need to escape relative paths that are url safe.
299
        control_files = lockable_files.LockableFiles(bzrdir_transport,
300
            self._lock_file_name, self._lock_class)
301
        control_files.create_lock()
302
        return self.open(transport, _found=True)
303
304
    def _open(self, transport):
305
        return DummyForeignVcsDir(transport, self)
306
307
4721.2.4 by Vincent Ladeuil
More test cleanup.
308
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
309
310
    def __init__(self, _transport, _format):
311
        self._format = _format
312
        self.transport = _transport.clone('.dummy')
313
        self.root_transport = _transport
314
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
315
        self._control_files = lockable_files.LockableFiles(self.transport,
316
            "lock", lockable_files.TransportLock)
317
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
318
    def create_workingtree(self):
319
        # dirstate requires a ".bzr" entry to exist
320
        self.root_transport.put_bytes(".bzr", "foo")
321
        return super(DummyForeignVcsDir, self).create_workingtree()
322
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
323
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True,
324
            possible_transports=None):
6436.1.2 by Jelmer Vernooij
Fix some tests.
325
        if name is None:
326
            name = self._get_selected_branch()
327
        if name != "":
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
328
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
329
        return self._format.get_branch_format().open(self, _found=True)
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
330
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
331
    def cloning_metadir(self, stacked=False):
332
        """Produce a metadir suitable for cloning with."""
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
333
        return controldir.format_registry.make_bzrdir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
334
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
335
    def checkout_metadir(self):
336
        return self.cloning_metadir()
337
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
338
    def sprout(self, url, revision_id=None, force_new_repo=False,
339
               recurse='down', possible_transports=None,
340
               accelerator_tree=None, hardlink=False, stacked=False,
341
               source_branch=None):
342
        # dirstate doesn't cope with accelerator_trees well 
343
        # that have a different control dir
344
        return super(DummyForeignVcsDir, self).sprout(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)
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,
353
        DummyForeignProber)
5777.6.6 by Jelmer Vernooij
Add lossy tests.
354
    repository.format_registry.register(DummyForeignVcsRepositoryFormat())
355
    testcase.addCleanup(repository.format_registry.remove,
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,
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):
378
        return set([DummyForeignVcsDirFormat()])
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")
5777.6.6 by Jelmer Vernooij
Add lossy tests.
398
        self.assertEquals((
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")
410
        self.assertEquals("", rev.inventory_sha1)
411
        self.assertEquals(("a", "foreign", "revid"), rev.foreign_revid)
412
        self.assertEquals(mapp, rev.mapping)
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()
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
424
        target = wt.bzrdir.sprout('br2').open_workingtree()
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:
6405.2.10 by Jelmer Vernooij
Fix more tests.
434
            self.assertEquals(set([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")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
450
        self.assertEquals("A Dummy VCS Dir", dir._format.get_format_string())
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")
4721.2.4 by Vincent Ladeuil
More test cleanup.
460
        self.assertNotEquals("A Dummy VCS Dir",
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")
465
        target_tree = self.make_branch_and_tree("target", 
466
            format=DummyForeignVcsDirFormat())
467
        self.assertRaises(errors.NoRoundtrippingSupport, 
468
            source_tree.branch.push, target_tree.branch)
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")
472
        target_tree = self.make_branch_and_tree("target", 
473
            format=DummyForeignVcsDirFormat())
5853.2.3 by Jelmer Vernooij
Fix lossy tests.
474
        pushresult = source_tree.branch.push(target_tree.branch, lossy=True)
4721.2.4 by Vincent Ladeuil
More test cleanup.
475
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
476
        self.assertEquals(revision.NULL_REVISION, pushresult.new_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
477
        self.assertEquals({}, pushresult.revidmap)
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")
484
        target_tree = self.make_branch_and_tree("target", 
485
            format=DummyForeignVcsDirFormat())
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()
4721.2.4 by Vincent Ladeuil
More test cleanup.
492
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
493
        self.assertEquals({revid1:target_tree.branch.last_revision()}, 
494
                           pushresult.revidmap)
495
        self.assertEquals(pushresult.revidmap[revid1], pushresult.new_revid)