code: def tag(self, name, user, revision=None, message=None, date=None,
              **kwargs):
          
          if name in self.tags:
              raise TagAlreadyExistError("Tag %s already exists" % name)
          changeset = self.get_changeset(revision)
          message = message or "Added tag %s for commit %s" % (name,
              changeset.raw_id)
          self._repo.refs["refs/tags/%s" % name] = changeset._commit.id
  
          self._parsed_refs = self._get_parsed_refs()
          self.tags = self._get_tags()
          return changeset
docs: Creates and returns a tag for the given ``revision``.
  
          :param name: name for new tag
          :param user: full username, i.e.: "Joe Doe <joe.doe@example.com>"
          :param revision: changeset id for which new tag would be created
          :param message: message of the tag's commit
          :param date: date of tag's commit
  
          :raises TagAlreadyExistError: if tag with same name already exists