Get commit logs

        :param revrange: Either a single revision or a range of revisions as a
                         2-element list or tuple.
        :param int limit: Limit the number of log entries.
        :param bool firstparent: Only follow the first parent of merges.
        :param bool merges: True means only merges, False means no merges,
                            None means both merges and non-merges.
        :param str path: Only match commits containing changes on this path.
        :param bool follow: Follow file history across renames.
        :returns: log information
        :rtype: :class:`CommitLogEntry` or list of :class:`CommitLogEntry`

        If revrange is None, return a list of all log entries in reverse
        chronological order.

        If revrange is a single revision, return a single log entry.

        If revrange is a 2 element list [A,B] or tuple (A,B), return a list of log
        entries starting at B and following that branch back to A or one of its
        ancestors (not inclusive. If A is None, follow branch B back to the
        beginning of history. If B is None, list all descendants in reverse
        chronological order.

def log(
        self, revrange=None, limit=None, firstparent=False, merges=None,
        path=None, follow=False
    ):
        """Get commit logs

        :param revrange: Either a single revision or a range of revisions as a
                         2-element list or tuple.
        :param int limit: Limit the number of log entries.
        :param bool firstparent: Only follow the first parent of merges.
        :param bool merges: True means only merges, False means no merges,
                            None means both merges and non-merges.
        :param str path: Only match commits containing changes on this path.
        :param bool follow: Follow file history across renames.
        :returns: log information
        :rtype: :class:`CommitLogEntry` or list of :class:`CommitLogEntry`

        If revrange is None, return a list of all log entries in reverse
        chronological order.

        If revrange is a single revision, return a single log entry.

        If revrange is a 2 element list [A,B] or tuple (A,B), return a list of log
        entries starting at B and following that branch back to A or one of its
        ancestors (not inclusive. If A is None, follow branch B back to the
        beginning of history. If B is None, list all descendants in reverse
        chronological order.

        """
        raise NotImplementedError