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)
          local = kwargs.setdefault('local', False)
  
          if message is None:
              message = "Added tag %s for changeset %s" % (name,
                  changeset.short_id)
  
          if date is None:
              date = datetime.datetime.now().ctime()
  
          try:
              self._repo.tag(name, changeset._ctx.node(), message, local, user,
                  date)
          except Abort, e:
              raise RepositoryError(e.message)
  
          # Reinitialize tags
          self.tags = self._get_tags()
          tag_id = self.tags[name]
  
          return self.get_changeset(revision=tag_id)
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