~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""Foreign branch utilities."""
19
19
 
20
20
 
21
 
from bzrlib.branch import Branch
 
21
from bzrlib.branch import (
 
22
    Branch,
 
23
    InterBranch,
 
24
    )
22
25
from bzrlib.commands import Command, Option
23
26
from bzrlib.repository import Repository
24
27
from bzrlib.revision import Revision
253
256
        self.mapping = mapping
254
257
        super(ForeignBranch, self).__init__()
255
258
 
256
 
    def dpull(self, source, stop_revision=None):
257
 
        """Pull deltas from another branch.
258
 
 
259
 
        :note: This does not, like pull, retain the revision ids from 
260
 
            the source branch and will, rather than adding bzr-specific 
261
 
            metadata, push only those semantics of the revision that can be 
262
 
            natively represented by this branch' VCS.
263
 
 
264
 
        :param source: Source branch
265
 
        :param stop_revision: Revision to pull, defaults to last revision.
266
 
        :return: Dictionary mapping revision ids from the source branch 
267
 
            to new revision ids in the target branch, for each 
268
 
            revision that was pull.
269
 
        """
270
 
        raise NotImplementedError(self.dpull)
271
 
 
272
259
 
273
260
def update_workingtree_fileids(wt, target_tree):
274
261
    """Update the file ids in a working tree based on another tree.
295
282
 
296
283
 
297
284
class cmd_dpush(Command):
298
 
    """Push diffs into a foreign version control system without any 
299
 
    Bazaar-specific metadata.
 
285
    """Push into a foreign VCS without any custom bzr metadata.
300
286
 
301
287
    This will afterwards rebase the local Bazaar branch on the remote
302
288
    branch unless the --no-rebase option is used, in which case 
303
 
    the two branches will be out of sync. 
 
289
    the two branches will be out of sync after the push. 
304
290
    """
305
291
    hidden = True
306
292
    takes_args = ['location?']
340
326
 
341
327
        bzrdir = BzrDir.open(location)
342
328
        target_branch = bzrdir.open_branch()
343
 
        dpull = getattr(target_branch, "dpull", None)
344
 
        if dpull is None:
345
 
            raise BzrCommandError("%r is not a foreign branch, use "
346
 
                                  "regular push." % target_branch)
347
329
        target_branch.lock_write()
348
330
        try:
349
 
            revid_map = dpull(source_branch)
 
331
            try:
 
332
                revid_map = source_branch.lossy_push(target_branch)
 
333
            except errors.LossyPushToSameVCS:
 
334
                raise BzrCommandError("%r is not a foreign branch, use regular "
 
335
                                      "push." % target_branch)
350
336
            # We successfully created the target, remember it
351
337
            if source_branch.get_push_location() is None or remember:
352
338
                source_branch.set_push_location(target_branch.base)
364
350
                        source_wt.unlock()
365
351
        finally:
366
352
            target_branch.unlock()
 
353
 
 
354
 
 
355
class InterToForeignBranch(InterBranch):
 
356
 
 
357
    def lossy_push(self, stop_revision=None):
 
358
        """Push deltas into another branch.
 
359
 
 
360
        :note: This does not, like push, retain the revision ids from 
 
361
            the source branch and will, rather than adding bzr-specific 
 
362
            metadata, push only those semantics of the revision that can be 
 
363
            natively represented by this branch' VCS.
 
364
 
 
365
        :param target: Target branch
 
366
        :param stop_revision: Revision to push, defaults to last revision.
 
367
        :return: Dictionary mapping revision ids from the target branch 
 
368
            to new revision ids in the target branch, for each 
 
369
            revision that was pushed.
 
370
        """
 
371
        raise NotImplementedError(self.lossy_push)