/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: Martin Pool
  • Date: 2005-07-29 22:21:25 UTC
  • Revision ID: mbp@sourcefrog.net-20050729222125-f1143d5c05e6707d
- split TreeDelta and compare_trees out into new module bzrlib.delta

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
import sys
19
 
import os
 
18
import sys, os
20
19
 
21
20
import bzrlib
 
21
 
22
22
from bzrlib.trace import mutter, note
23
 
from bzrlib.osutils import isdir, quotefn, compact_date, rand_bytes, \
24
 
     splitpath, \
 
23
from bzrlib.osutils import isdir, quotefn, compact_date, rand_bytes, splitpath, \
25
24
     sha_file, appendpath, file_kind
26
 
from bzrlib.errors import BzrError, InvalidRevisionNumber, InvalidRevisionId
27
 
import bzrlib.errors
 
25
from bzrlib.errors import BzrError
28
26
from bzrlib.textui import show_status
29
 
from bzrlib.revision import Revision
30
 
from bzrlib.xml import unpack_xml
31
 
from bzrlib.delta import compare_trees
32
 
from bzrlib.tree import EmptyTree, RevisionTree
33
27
        
34
28
BZR_BRANCH_FORMAT = "Bazaar-NG branch, format 0.0.4\n"
35
29
## TODO: Maybe include checks for common corruption of newlines, etc?
36
30
 
37
31
 
38
 
# TODO: Some operations like log might retrieve the same revisions
39
 
# repeatedly to calculate deltas.  We could perhaps have a weakref
40
 
# cache in memory to make this faster.
41
 
 
42
32
 
43
33
def find_branch(f, **args):
44
34
    if f and (f.startswith('http://') or f.startswith('https://')):
130
120
        Exception.__init__(self, "These branches have diverged.")
131
121
 
132
122
 
 
123
class NoSuchRevision(BzrError):
 
124
    def __init__(self, branch, revision):
 
125
        self.branch = branch
 
126
        self.revision = revision
 
127
        msg = "Branch %s has no revision %d" % (branch, revision)
 
128
        BzrError.__init__(self, msg)
 
129
 
 
130
 
133
131
######################################################################
134
132
# branch objects
135
133
 
584
582
            f.close()
585
583
 
586
584
 
587
 
    def get_revision_xml(self, revision_id):
588
 
        """Return XML file object for revision object."""
589
 
        if not revision_id or not isinstance(revision_id, basestring):
590
 
            raise InvalidRevisionId(revision_id)
591
 
 
592
 
        self.lock_read()
593
 
        try:
594
 
            try:
595
 
                return self.revision_store[revision_id]
596
 
            except IndexError:
597
 
                raise bzrlib.errors.NoSuchRevision(revision_id)
598
 
        finally:
599
 
            self.unlock()
600
 
 
601
 
 
602
585
    def get_revision(self, revision_id):
603
586
        """Return the Revision object for a named revision"""
604
 
        xml_file = self.get_revision_xml(revision_id)
 
587
        from bzrlib.revision import Revision
 
588
        from bzrlib.xml import unpack_xml
605
589
 
 
590
        self.lock_read()
606
591
        try:
607
 
            r = unpack_xml(Revision, xml_file)
608
 
        except SyntaxError, e:
609
 
            raise bzrlib.errors.BzrError('failed to unpack revision_xml',
610
 
                                         [revision_id,
611
 
                                          str(e)])
 
592
            if not revision_id or not isinstance(revision_id, basestring):
 
593
                raise ValueError('invalid revision-id: %r' % revision_id)
 
594
            r = unpack_xml(Revision, self.revision_store[revision_id])
 
595
        finally:
 
596
            self.unlock()
612
597
            
613
598
        assert r.revision_id == revision_id
614
599
        return r
615
 
 
616
 
 
617
 
    def get_revision_delta(self, revno):
618
 
        """Return the delta for one revision.
619
 
 
620
 
        The delta is relative to its mainline predecessor, or the
621
 
        empty tree for revision 1.
622
 
        """
623
 
        assert isinstance(revno, int)
624
 
        rh = self.revision_history()
625
 
        if not (1 <= revno <= len(rh)):
626
 
            raise InvalidRevisionNumber(revno)
627
 
 
628
 
        # revno is 1-based; list is 0-based
629
 
 
630
 
        new_tree = self.revision_tree(rh[revno-1])
631
 
        if revno == 1:
632
 
            old_tree = EmptyTree()
633
 
        else:
634
 
            old_tree = self.revision_tree(rh[revno-2])
635
 
 
636
 
        return compare_trees(old_tree, new_tree)
637
 
 
638
600
        
639
601
 
640
602
    def get_revision_sha1(self, revision_id):
645
607
        # the revision, (add signatures/remove signatures) and still
646
608
        # have all hash pointers stay consistent.
647
609
        # But for now, just hash the contents.
648
 
        return bzrlib.osutils.sha_file(self.get_revision_xml(revision_id))
 
610
        return sha_file(self.revision_store[revision_id])
649
611
 
650
612
 
651
613
    def get_inventory(self, inventory_id):
735
697
                return r+1, my_history[r]
736
698
        return None, None
737
699
 
 
700
    def enum_history(self, direction):
 
701
        """Return (revno, revision_id) for history of branch.
 
702
 
 
703
        direction
 
704
            'forward' is from earliest to latest
 
705
            'reverse' is from latest to earliest
 
706
        """
 
707
        rh = self.revision_history()
 
708
        if direction == 'forward':
 
709
            i = 1
 
710
            for rid in rh:
 
711
                yield i, rid
 
712
                i += 1
 
713
        elif direction == 'reverse':
 
714
            i = len(rh)
 
715
            while i > 0:
 
716
                yield i, rh[i-1]
 
717
                i -= 1
 
718
        else:
 
719
            raise ValueError('invalid history direction', direction)
 
720
 
738
721
 
739
722
    def revno(self):
740
723
        """Return current revision number for this branch.
1035
1018
 
1036
1019
        `revision_id` may be None for the null revision, in which case
1037
1020
        an `EmptyTree` is returned."""
 
1021
        from bzrlib.tree import EmptyTree, RevisionTree
1038
1022
        # TODO: refactor this to use an existing revision object
1039
1023
        # so we don't need to read it in twice.
1040
1024
        if revision_id == None:
1041
 
            return EmptyTree()
 
1025
            return EmptyTree(self.get_root_id())
1042
1026
        else:
1043
1027
            inv = self.get_revision_inventory(revision_id)
1044
1028
            return RevisionTree(self.text_store, inv)
1055
1039
 
1056
1040
        If there are no revisions yet, return an `EmptyTree`.
1057
1041
        """
 
1042
        from bzrlib.tree import EmptyTree, RevisionTree
1058
1043
        r = self.last_patch()
1059
1044
        if r == None:
1060
 
            return EmptyTree()
 
1045
            return EmptyTree(self.get_root_id())
1061
1046
        else:
1062
1047
            return RevisionTree(self.text_store, self.get_revision_inventory(r))
1063
1048