/brz/remove-bazaar

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