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