~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: Martin Pool
  • Date: 2005-09-01 02:34:38 UTC
  • Revision ID: mbp@sourcefrog.net-20050901023437-bf791a0ef5edae8d
- old docs: clarify that this is not mainly descended from arch anymore

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
 
        
928
900
        if revision is None:
929
901
            return 0, None
930
902
        revno = None
934
906
            pass
935
907
        revs = self.revision_history()
936
908
        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
937
912
            if revision < 0:
938
913
                revno = len(revs) + revision + 1
939
914
            else:
940
915
                revno = revision
941
 
            rev_id = self.get_rev_id(revno, revs)
942
916
        elif isinstance(revision, basestring):
943
917
            for prefix, func in Branch.REVISION_NAMESPACES.iteritems():
944
918
                if revision.startswith(prefix):
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)
 
919
                    revno = func(self, revs, revision)
951
920
                    break
952
921
            else:
953
 
                raise BzrError('No namespace registered for string: %r' %
954
 
                               revision)
955
 
        else:
956
 
            raise TypeError('Unhandled revision type %s' % revision)
 
922
                raise BzrError('No namespace registered for string: %r' % revision)
957
923
 
958
 
        if revno is None:
959
 
            if rev_id is None:
960
 
                raise bzrlib.errors.NoSuchRevision(self, revision)
961
 
        return revno, rev_id
 
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]
962
927
 
963
928
    def _namespace_revno(self, revs, revision):
964
929
        """Lookup a revision by revision number"""
965
930
        assert revision.startswith('revno:')
966
931
        try:
967
 
            return (int(revision[6:]),)
 
932
            return int(revision[6:])
968
933
        except ValueError:
969
934
            return None
970
935
    REVISION_NAMESPACES['revno:'] = _namespace_revno
971
936
 
972
937
    def _namespace_revid(self, revs, revision):
973
938
        assert revision.startswith('revid:')
974
 
        rev_id = revision[len('revid:'):]
975
939
        try:
976
 
            return revs.index(rev_id) + 1, rev_id
 
940
            return revs.index(revision[6:]) + 1
977
941
        except ValueError:
978
 
            return None, rev_id
 
942
            return None
979
943
    REVISION_NAMESPACES['revid:'] = _namespace_revid
980
944
 
981
945
    def _namespace_last(self, revs, revision):
983
947
        try:
984
948
            offset = int(revision[5:])
985
949
        except ValueError:
986
 
            return (None,)
 
950
            return None
987
951
        else:
988
952
            if offset <= 0:
989
953
                raise BzrError('You must supply a positive value for --revision last:XXX')
990
 
            return (len(revs) - offset + 1,)
 
954
            return len(revs) - offset + 1
991
955
    REVISION_NAMESPACES['last:'] = _namespace_last
992
956
 
993
957
    def _namespace_tag(self, revs, revision):
1068
1032
                # TODO: Handle timezone.
1069
1033
                dt = datetime.datetime.fromtimestamp(r.timestamp)
1070
1034
                if first >= dt and (last is None or dt >= last):
1071
 
                    return (i+1,)
 
1035
                    return i+1
1072
1036
        else:
1073
1037
            for i in range(len(revs)):
1074
1038
                r = self.get_revision(revs[i])
1075
1039
                # TODO: Handle timezone.
1076
1040
                dt = datetime.datetime.fromtimestamp(r.timestamp)
1077
1041
                if first <= dt and (last is None or dt <= last):
1078
 
                    return (i+1,)
 
1042
                    return i+1
1079
1043
    REVISION_NAMESPACES['date:'] = _namespace_date
1080
1044
 
1081
1045
    def revision_tree(self, revision_id):
1348
1312
        finally:
1349
1313
            self.unlock()
1350
1314
 
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
 
        
1367
1315
        
1368
1316
 
1369
1317