~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: Martin Pool
  • Date: 2005-09-05 05:35:25 UTC
  • mfrom: (974.1.55)
  • Revision ID: mbp@sourcefrog.net-20050905053525-2112bac069dbe331
- merge various bug fixes from aaron

aaron.bentley@utoronto.ca-20050905020131-a2d5b7711dd6cd98

Show diffs side-by-side

added added

removed removed

Lines of Context:
876
876
 
877
877
    def lookup_revision(self, revision):
878
878
        """Return the revision identifier for a given revision information."""
879
 
        revno, info = self.get_revision_info(revision)
 
879
        revno, info = self._get_revision_info(revision)
880
880
        return info
881
881
 
882
882
 
897
897
        revision can also be a string, in which case it is parsed for something like
898
898
            'date:' or 'revid:' etc.
899
899
        """
 
900
        revno, rev_id = self._get_revision_info(revision)
 
901
        if revno is None:
 
902
            raise bzrlib.errors.NoSuchRevision(self, revision)
 
903
        return revno, rev_id
 
904
 
 
905
    def get_rev_id(self, revno, history=None):
 
906
        """Find the revision id of the specified revno."""
 
907
        if revno == 0:
 
908
            return None
 
909
        if history is None:
 
910
            history = self.revision_history()
 
911
        elif revno <= 0 or revno > len(history):
 
912
            raise bzrlib.errors.NoSuchRevision(self, revno)
 
913
        return history[revno - 1]
 
914
 
 
915
    def _get_revision_info(self, revision):
 
916
        """Return (revno, revision id) for revision specifier.
 
917
 
 
918
        revision can be an integer, in which case it is assumed to be revno
 
919
        (though this will translate negative values into positive ones)
 
920
        revision can also be a string, in which case it is parsed for something
 
921
        like 'date:' or 'revid:' etc.
 
922
 
 
923
        A revid is always returned.  If it is None, the specifier referred to
 
924
        the null revision.  If the revid does not occur in the revision
 
925
        history, revno will be None.
 
926
        """
 
927
        
900
928
        if revision is None:
901
929
            return 0, None
902
930
        revno = None
906
934
            pass
907
935
        revs = self.revision_history()
908
936
        if isinstance(revision, int):
909
 
            if revision == 0:
910
 
                return 0, None
911
 
            # Mabye we should do this first, but we don't need it if revision == 0
912
937
            if revision < 0:
913
938
                revno = len(revs) + revision + 1
914
939
            else:
915
940
                revno = revision
 
941
            rev_id = self.get_rev_id(revno, revs)
916
942
        elif isinstance(revision, basestring):
917
943
            for prefix, func in Branch.REVISION_NAMESPACES.iteritems():
918
944
                if revision.startswith(prefix):
919
 
                    revno = func(self, revs, revision)
 
945
                    result = func(self, revs, revision)
 
946
                    if len(result) > 1:
 
947
                        revno, rev_id = result
 
948
                    else:
 
949
                        revno = result[0]
 
950
                        rev_id = self.get_rev_id(revno, revs)
920
951
                    break
921
952
            else:
922
 
                raise BzrError('No namespace registered for string: %r' % revision)
 
953
                raise BzrError('No namespace registered for string: %r' %
 
954
                               revision)
 
955
        else:
 
956
            raise TypeError('Unhandled revision type %s' % revision)
923
957
 
924
 
        if revno is None or revno <= 0 or revno > len(revs):
925
 
            raise BzrError("no such revision %s" % revision)
926
 
        return revno, revs[revno-1]
 
958
        if revno is None:
 
959
            if rev_id is None:
 
960
                raise bzrlib.errors.NoSuchRevision(self, revision)
 
961
        return revno, rev_id
927
962
 
928
963
    def _namespace_revno(self, revs, revision):
929
964
        """Lookup a revision by revision number"""
930
965
        assert revision.startswith('revno:')
931
966
        try:
932
 
            return int(revision[6:])
 
967
            return (int(revision[6:]),)
933
968
        except ValueError:
934
969
            return None
935
970
    REVISION_NAMESPACES['revno:'] = _namespace_revno
936
971
 
937
972
    def _namespace_revid(self, revs, revision):
938
973
        assert revision.startswith('revid:')
 
974
        rev_id = revision[len('revid:'):]
939
975
        try:
940
 
            return revs.index(revision[6:]) + 1
 
976
            return revs.index(rev_id) + 1, rev_id
941
977
        except ValueError:
942
 
            return None
 
978
            return None, rev_id
943
979
    REVISION_NAMESPACES['revid:'] = _namespace_revid
944
980
 
945
981
    def _namespace_last(self, revs, revision):
947
983
        try:
948
984
            offset = int(revision[5:])
949
985
        except ValueError:
950
 
            return None
 
986
            return (None,)
951
987
        else:
952
988
            if offset <= 0:
953
989
                raise BzrError('You must supply a positive value for --revision last:XXX')
954
 
            return len(revs) - offset + 1
 
990
            return (len(revs) - offset + 1,)
955
991
    REVISION_NAMESPACES['last:'] = _namespace_last
956
992
 
957
993
    def _namespace_tag(self, revs, revision):
1032
1068
                # TODO: Handle timezone.
1033
1069
                dt = datetime.datetime.fromtimestamp(r.timestamp)
1034
1070
                if first >= dt and (last is None or dt >= last):
1035
 
                    return i+1
 
1071
                    return (i+1,)
1036
1072
        else:
1037
1073
            for i in range(len(revs)):
1038
1074
                r = self.get_revision(revs[i])
1039
1075
                # TODO: Handle timezone.
1040
1076
                dt = datetime.datetime.fromtimestamp(r.timestamp)
1041
1077
                if first <= dt and (last is None or dt <= last):
1042
 
                    return i+1
 
1078
                    return (i+1,)
1043
1079
    REVISION_NAMESPACES['date:'] = _namespace_date
1044
1080
 
1045
1081
    def revision_tree(self, revision_id):
1312
1348
        finally:
1313
1349
            self.unlock()
1314
1350
 
 
1351
    def check_revno(self, revno):
 
1352
        """\
 
1353
        Check whether a revno corresponds to any revision.
 
1354
        Zero (the NULL revision) is considered valid.
 
1355
        """
 
1356
        if revno != 0:
 
1357
            self.check_real_revno(revno)
 
1358
            
 
1359
    def check_real_revno(self, revno):
 
1360
        """\
 
1361
        Check whether a revno corresponds to a real revision.
 
1362
        Zero (the NULL revision) is considered invalid
 
1363
        """
 
1364
        if revno < 1 or revno > self.revno():
 
1365
            raise InvalidRevisionNumber(revno)
 
1366
        
1315
1367
        
1316
1368
 
1317
1369