~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: abentley
  • Date: 2006-04-20 23:47:53 UTC
  • mfrom: (1681 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1683.
  • Revision ID: abentley@lappy-20060420234753-6a6874b76f09f86d
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
197
197
        (copied, failures).
198
198
        """
199
199
        if self.base == from_branch.base:
200
 
            raise Exception("can't fetch from a branch to itself %s, %s" % 
201
 
                            (self.base, to_branch.base))
 
200
            return (0, [])
202
201
        if pb is None:
203
202
            nested_pb = bzrlib.ui.ui_factory.nested_progress_bar()
204
203
            pb = nested_pb
224
223
            from_branch.unlock()
225
224
 
226
225
    def get_bound_location(self):
227
 
        """Return the URL of the rbanch we are bound to.
 
226
        """Return the URL of the branch we are bound to.
228
227
 
229
228
        Older format branches cannot bind, please be sure to use a metadir
230
229
        branch.
334
333
        """
335
334
        raise NotImplementedError('update_revisions is abstract')
336
335
 
337
 
    def pullable_revisions(self, other, stop_revision):
338
 
        raise NotImplementedError('pullable_revisions is abstract')
339
 
        
340
336
    def revision_id_to_revno(self, revision_id):
341
337
        """Given a revision id, return its revno"""
342
338
        if revision_id is None:
567
563
        """Return the ASCII format string that identifies this format."""
568
564
        raise NotImplementedError(self.get_format_string)
569
565
 
 
566
    def get_format_description(self):
 
567
        """Return the short format description for this format."""
 
568
        raise NotImplementedError(self.get_format_string)
 
569
 
570
570
    def initialize(self, a_bzrdir):
571
571
        """Create a branch of this format in a_bzrdir."""
572
572
        raise NotImplementedError(self.initialized)
601
601
        assert klass._formats[format.get_format_string()] is format
602
602
        del klass._formats[format.get_format_string()]
603
603
 
 
604
    def __str__(self):
 
605
        return self.get_format_string().rstrip()
 
606
 
604
607
 
605
608
class BzrBranchFormat4(BranchFormat):
606
609
    """Bzr branch format 4.
610
613
     - a branch-lock lock file [ to be shared with the bzrdir ]
611
614
    """
612
615
 
 
616
    def get_format_description(self):
 
617
        """See BranchFormat.get_format_description()."""
 
618
        return "Branch format 4"
 
619
 
613
620
    def initialize(self, a_bzrdir):
614
621
        """Create a branch of this format in a_bzrdir."""
615
622
        mutter('creating branch in %s', a_bzrdir.transport.base)
646
653
                         a_bzrdir=a_bzrdir,
647
654
                         _repository=a_bzrdir.open_repository())
648
655
 
 
656
    def __str__(self):
 
657
        return "Bazaar-NG branch format 4"
 
658
 
649
659
 
650
660
class BzrBranchFormat5(BranchFormat):
651
661
    """Bzr branch format 5.
663
673
    def get_format_string(self):
664
674
        """See BranchFormat.get_format_string()."""
665
675
        return "Bazaar-NG branch format 5\n"
 
676
 
 
677
    def get_format_description(self):
 
678
        """See BranchFormat.get_format_description()."""
 
679
        return "Branch format 5"
666
680
        
667
681
    def initialize(self, a_bzrdir):
668
682
        """Create a branch of this format in a_bzrdir."""
720
734
    def get_format_string(self):
721
735
        """See BranchFormat.get_format_string()."""
722
736
        return "Bazaar-NG Branch Reference Format 1\n"
 
737
 
 
738
    def get_format_description(self):
 
739
        """See BranchFormat.get_format_description()."""
 
740
        return "Checkout reference format 1"
723
741
        
724
742
    def initialize(self, a_bzrdir, target_branch=None):
725
743
        """Create a branch of this format in a_bzrdir."""
1011
1029
        # transaction.register_clean(history, precious=True)
1012
1030
        return list(history)
1013
1031
 
 
1032
    @needs_write_lock
1014
1033
    def update_revisions(self, other, stop_revision=None):
1015
1034
        """See Branch.update_revisions."""
1016
 
        if stop_revision is None:
1017
 
            stop_revision = other.last_revision()
1018
 
        ### Should this be checking is_ancestor instead of revision_history?
1019
 
        if (stop_revision is not None and 
1020
 
            stop_revision in self.revision_history()):
1021
 
            return
1022
 
        self.fetch(other, stop_revision)
1023
 
        pullable_revs = self.pullable_revisions(other, stop_revision)
1024
 
        if len(pullable_revs) > 0:
1025
 
            self.append_revision(*pullable_revs)
 
1035
        other.lock_read()
 
1036
        try:
 
1037
            if stop_revision is None:
 
1038
                stop_revision = other.last_revision()
 
1039
                if stop_revision is None:
 
1040
                    # if there are no commits, we're done.
 
1041
                    return
 
1042
            # whats the current last revision, before we fetch [and change it
 
1043
            # possibly]
 
1044
            last_rev = self.last_revision()
 
1045
            # we fetch here regardless of whether we need to so that we pickup
 
1046
            # filled in ghosts.
 
1047
            self.fetch(other, stop_revision)
 
1048
            my_ancestry = self.repository.get_ancestry(last_rev)
 
1049
            if stop_revision in my_ancestry:
 
1050
                # last_revision is a descendant of stop_revision
 
1051
                return
 
1052
            # stop_revision must be a descendant of last_revision
 
1053
            stop_graph = self.repository.get_revision_graph(stop_revision)
 
1054
            if last_rev is not None and last_rev not in stop_graph:
 
1055
                # our previous tip is not merged into stop_revision
 
1056
                raise errors.DivergedBranches(self, other)
 
1057
            # make a new revision history from the graph
 
1058
            current_rev_id = stop_revision
 
1059
            new_history = []
 
1060
            while current_rev_id not in (None, NULL_REVISION):
 
1061
                new_history.append(current_rev_id)
 
1062
                current_rev_id_parents = stop_graph[current_rev_id]
 
1063
                try:
 
1064
                    current_rev_id = current_rev_id_parents[0]
 
1065
                except IndexError:
 
1066
                    current_rev_id = None
 
1067
            new_history.reverse()
 
1068
            self.set_revision_history(new_history)
 
1069
        finally:
 
1070
            other.unlock()
1026
1071
 
 
1072
    @deprecated_method(zero_eight)
1027
1073
    def pullable_revisions(self, other, stop_revision):
 
1074
        """Please use bzrlib.missing instead."""
1028
1075
        other_revno = other.revision_id_to_revno(stop_revision)
1029
1076
        try:
1030
1077
            return self.missing_revisions(other, other_revno)
1103
1150
        # FIXUP this and get_parent in a future branch format bump:
1104
1151
        # read and rewrite the file, and have the new format code read
1105
1152
        # using .get not .get_utf8. RBC 20060125
1106
 
        self.control_files.put_utf8('parent', url + '\n')
 
1153
        if url is None:
 
1154
            self.control_files._transport.delete('parent')
 
1155
        else:
 
1156
            self.control_files.put_utf8('parent', url + '\n')
1107
1157
 
1108
1158
    def tree_config(self):
1109
1159
        return TreeConfig(self)