code: def _get_revision(self, revision):
          
  
          is_null = lambda o: len(o) == revision.count('0')
  
          try:
              self.revisions[0]
          except (KeyError, IndexError):
              raise EmptyRepositoryError("There are no changesets yet")
  
          if revision in (None, '', 'tip', 'HEAD', 'head', -1):
              return self.revisions[-1]
  
          is_bstr = isinstance(revision, (str, unicode))
          if ((is_bstr and revision.isdigit() and len(revision) < 12)
              or isinstance(revision, int) or is_null(revision)):
              try:
                  revision = self.revisions[int(revision)]
              except Exception:
                  raise ChangesetDoesNotExistError("Revision %s does not exist "
                      "for this repository" % (revision))
  
          elif is_bstr:
              # get by branch/tag name
              _ref_revision = self._parsed_refs.get(revision)
              if _ref_revision:  # and _ref_revision[1] in ['H', 'RH', 'T']:
                  return _ref_revision[0]
  
              _tags_shas = self.tags.values()
              # maybe it's a tag ? we don't have them in self.revisions
              if revision in _tags_shas:
                  return _tags_shas[_tags_shas.index(revision)]
  
              elif not SHA_PATTERN.match(revision) or revision not in self.revisions:
                  raise ChangesetDoesNotExistError("Revision %s does not exist "
                      "for this repository" % (revision))
  
          # Ensure we return full id
          if not SHA_PATTERN.match(str(revision)):
              raise ChangesetDoesNotExistError("Given revision %s not recognized"
                  % revision)
          return revision
docs: For git backend we always return integer here. This way we ensure
          that changset's revision attribute would become integer.