public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: David Seifert <soap@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: Florian Schmaus <flow@gentoo.org>
Subject: Re: [gentoo-dev] [PATCH v2 1/3] greadme.eclass: new eclass
Date: Tue, 09 Jan 2024 12:23:41 +0100	[thread overview]
Message-ID: <2c8a4a000d790d446d86971b58096f3ff4820b20.camel@gentoo.org> (raw)
In-Reply-To: <20240109083914.242561-1-flow@gentoo.org>

On Tue, 2024-01-09 at 09:39 +0100, Florian Schmaus wrote:
> This new eclass is similar to readme.gentoo-r1.eclass. The main
> differences are as follows. Firstly, it also displays the doc file
> contents if they have changed. Secondly, it provides a convenient API
> to
> install the doc file via stdin.
> 
> Furthermore, this eclass dos not store the doc file's contents in an
> environment variable, which helps to keep the environment size of
> ebuilds using the eclass small.
> 
> Signed-off-by: Florian Schmaus <flow@gentoo.org>
> ---
>  eclass/greadme.eclass | 307
> ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 307 insertions(+)
>  create mode 100644 eclass/greadme.eclass
> 
> diff --git a/eclass/greadme.eclass b/eclass/greadme.eclass
> new file mode 100644
> index 000000000000..25e0210406c1
> --- /dev/null
> +++ b/eclass/greadme.eclass
> @@ -0,0 +1,307 @@
> +# Copyright 1999-2024 Gentoo Authors
> +# Distributed under the terms of the GNU General Public License v2
> +
> +# @ECLASS: greadme.eclass
> +# @MAINTAINER:
> +# Florian Schmaus <flow@gentoo.org>
> +# @AUTHOR:
> +# Author: Florian Schmaus <flow@gentoo.org>
> +# @SUPPORTED_EAPIS: 6 7 8
> +# @BLURB: install a doc file, that will be conditionally shown via
> elog messages
> +# @DESCRIPTION:
> +# An eclass for installing a README.gentoo doc file recording tips
> +# shown via elog messages.  With this eclass, those elog messages
> will only be
> +# shown at first package installation or if the contents of the file
> have changed.
> +# Furthermore, a file for later reviewing will be installed under
> +# /usr/share/doc/${PF}
> +#
> +# This eclass is similar to readme.gentoo-r1.eclass.  The main
> +# differences are as follows.  Firstly, it also displays the doc file
> +# contents if they have changed.  Secondly, it provides a convenient
> API to
> +# install the doc file via stdin.
> +#
> +# @CODE
> +# inherit greadme
> +#
> +# src_install() {
> +#   …
> +#   greadme_stdin <<- EOF
> +#   This is the content of the created readme doc file.
> +#   EOF
> +#   …
> +#   if use foo; then
> +#     greadme_stdin --apend <<-EOF
> +#     This is conditional readme content, based on USE=foo.
> +#     EOF
> +#   fi
> +# }
> +# @CODE
> +#
> +# You must call greadme_pkg_preinst and greadme_pkg_postinst
> explicitly, if
> +# you override the default pkg_preinst or respectively pkg_postinst.
> +#
> +# TODO:
> +# - Should this be named README.Distribution instead of
> README.Gentoo?
> +#   Would that make things easier for Gentoo derivates?
> +#   Similary, (g → d)readme, (G → D)README?
> +# - Incooperate changes into readme.gentoo-r1.elcass?
> +# - Compressing the readme doc file is probably fragile, as it is not
> +#   guaranteed that the required binaries for decompression are
> installed
> +#   in pkg_preinst/pkg_postinst. Note that it is even possible that
> two
> +#   different compression algorithms are used, in case of binpkgs.
> +
> +if [[ -z ${_README_GENTOO_ECLASS} ]]; then
> +_README_GENTOO_ECLASS=1
> +
> +case ${EAPI} in
> +	6|7|8) ;;
> +	*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
> +esac
> +
> +if [[ ${_GREADME_COMPRESS} ]]; then
> +	inherit unpacker
> +fi
> +
> +_GREADME_FILENAME="README.gentoo"
> +_GREADME_TMP_FILE="${T}/${_GREADME_FILENAME}"
> +_GREADME_REL_PATH="usr/share/doc/${PF}/${_GREADME_FILENAME}"
> +
> +# @FUNCTION: greadme_stdin
> +# @USAGE: [--append]
> +# @DESCRIPTION:
> +# Create the readme doc via stdin.  You can use --append to append to
> an
> +# existing readme doc.
> +greadme_stdin() {
> +	debug-print-function ${FUNCNAME} "${@}"
> +
> +	local append=false
> +	while [[ -n ${1} ]] && [[ ${1} =~ --* ]]; do
> +		case ${1} in
> +			--append)
> +				append=true
> +				shift
> +				;;
> +		esac
> +	done
> +
> +	if $append; then
> +		if [[ ! -f "${_GREADME_TMP_FILE}" ]]; then
> +			die "Gentoo README does not exist when trying
> to append to it"
> +		fi
> +
> +		cat >> "${_GREADME_TMP_FILE}" || die
> +	else
> +		if [[ -f "${_GREADME_TMP_FILE}" ]]; then
> +			die "Gentoo README already exists while
> trying to create it"
> +		fi
> +
> +		cat > "${_GREADME_TMP_FILE}" || die
> +	fi
> +
> +	_greadme_install_doc
> +}
> +
> +# @FUNCTION: greadme_file
> +# @USAGE: <file>
> +# @DESCRIPTION:
> +# Installs the provided file as readme doc.
> +greadme_file() {
> +	debug-print-function ${FUNCNAME} "${@}"
> +
> +	local input_doc_file="${1}"
> +	if [[ -z "${input_doc_file}" ]]; then
> +		die "No file specified"
> +	fi
> +
> +	if [[ -f "${_GREADME_TMP_FILE}" ]]; then
> +		die "Gentoo README already exists"
> +	fi
> +
> +	cp "${input_doc_file}" "${_GREADME_TMP_FILE}" || die
> +
> +	_greadme_install_doc
> +}
> +
> +# @FUNCTION: _greadme_install_doc
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Installs the readme file from the temp directory into the image.
> +_greadme_install_doc() {
> +	debug-print-function ${FUNCNAME} "${@}"
> +
> +	if [[ ! -f "${_GREADME_TMP_FILE}" ]]; then
> +		die "Gentoo README does not exist"
> +	fi
> +
> +	if ! [[ ${_GREADME_COMPRESS} ]]; then
> +		docompress -x "${_GREADME_REL_PATH}"
> +	fi
> +
> +	( # subshell to avoid pollution of calling environment
> +		docinto .
> +		dodoc "${_GREADME_TMP_FILE}"
> +	) || die
> +
> +}
> +
> +# @FUNCTION: greadme_pkg_preinst
> +# @DESCRIPTION:
> +# Performs checks like comparing the readme doc from the image with a
> +# potentially existing one in the live system.
> +greadme_pkg_preinst() {
> +	local image_doc_file="${ED}/${_GREADME_REL_PATH}"
> +
> +	if [[ ${_GREADME_COMPRESS} ]]; then
> +		local greadme_tmpdir="${T}/greadme"
> +
> +		mkdir -p "${greadme_tmpdir}/image" || die
> +
> +		local image_doc_files=( $(ls -1 ${image_doc_file}*) )
> +		case ${#image_doc_files[@]} in
> +			0)
> +				die "No Gentoo README found in image"
> +				;;
> +			1)
> +				image_doc_file="${image_doc_files[0]}
> "
> +				;;
> +			*)
> +				die "unpexpected number of Gentoo
> README files found"
> +				;;
> +		esac
> +
> +		pushd "${T}/greadme/image" > /dev/null
> +		local image_doc_file_basename="$(basename
> "${image_doc_file}")"
> +		if [[ "${image_doc_file_basename}" ==
> "${_GREADME_FILENAME}" ]]; then
> +			cp "${image_doc_file}" . || die
> +		else
> +			nonfatal unpacker "${image_doc_file}"
> +			if [[ $? -gt 0 ]]; then
> +				# We failed to unpack the readme doc
> from the
> +				# image, therefore, we can't show it
> (unless we
> +				# would save it's content in a env
> variable like
> +				# gentoo.readme-r1 does).
> +				_GREADME_SHOW=""
> +				return
> +			fi
> +		fi
> +		popd > /dev/null
> +	fi
> +
> +	if [[ -z ${REPLACING_VERSIONS} ]]; then
> +		_GREADME_SHOW="fresh-install"
> +		return
> +	fi
> +
> +	check_live_doc_file() {
> +		local cur_pvr=$1
> +		local live_doc_file="${EROOT}/usr/share/doc/${PN}-
> ${cur_pvr}/${_GREADME_FILENAME}"
> +
> +		if [[ ${_GREADME_COMPRESS} ]]; then
> +			local live_doc_files=( $(ls -1
> ${live_doc_file}*) )
> +			case ${#live_doc_files[@]} in
> +				0)
> +					_GREADME_SHOW="no-current-
> greadme"
> +					return
> +					;;
> +				1)
> +					live_doc_file="${live_doc_fil
> es[0]}"
> +					;;
> +				*)
> +					die "unpexpected number of
> Gentoo README files found"
> +					;;
> +			esac
> +
> +			if [[ -d "${greadme_tmpdir}/live" ]]; then
> +				rm -rf "${greadme_tmpdir}"/live/* ||
> die
> +			else
> +				mkdir "${T}/greadme/live"
> +			fi
> +
> +			pushd "${T}/greadme/live" > /dev/null
> +			local live_doc_file_basename="$(basename
> "${live_doc_file}")"
> +			if [[ "${live_doc_file_basename}" ==
> "${_GREADME_FILENAME}" ]]; then
> +				cp "${live_doc_file}" .
> +			else
> +				nonfatal unpacker "${live_doc_file}"
> +				if [[ $? -gt 0 ]]; then
> +					# We failed to unpack the
> live readme doc, fallback
> +					# to show the new readme
> contents.
> +					_GREADME_SHOW="failed-to-
> unpack-live-readme-doc"
> +					return
> +				fi
> +			fi
> +			popd > /dev/null
> +
> +			live_doc_file="${T}/greadme/live/${_GREADME_F
> ILENAME}"
> +			image_doc_file="${T}/greadme/image/${_GREADME
> _FILENAME}"
> +			# Store the unpacked greadme in a global
> variable so that it can
> +			# be used in greadme_pkg_postinst.
> +			_GREADME_UNPACKED="${image_doc_file}"
> +		else
> +			if [[ ! -f ${live_doc_file} ]]; then
> +				_GREADME_SHOW="no-current-greadme"
> +				return
> +			fi
> +		fi
> +
> +		cmp -s "${live_doc_file}" "${image_doc_file}"
> +		local ret=$?
> +		case ${ret} in
> +			0)
> +				_GREADME_SHOW=""
> +				;;
> +			1)
> +				_GREADME_SHOW="content-differs"
> +				;;
> +			*)
> +				die "cmp failed with ${ret}"
> +				;;
> +		esac
> +	}
> +
> +	local replaced_version
> +	for replaced_version in ${REPLACING_VERSIONS}; do
> +		check_live_doc_file ${replaced_version}
> +		if [[ -n ${_GREADME_SHOW} ]]; then
> +			break
> +		fi
> +	done
> +}
> +
> +# @FUNCTION: greadme_pkg_postinst
> +# @DESCRIPTION:
> +# Conditionally shows the contents of the readme doc via elog.
> +greadme_pkg_postinst() {
> +	debug-print-function ${FUNCNAME} "${@}"
> +
> +	if [[ ! -v _GREADME_SHOW ]]; then
> +		die "_GREADME_SHOW not set. Did you call
> greadme_pkg_preinst?"
> +	fi
> +
> +	if [[ -z "${_GREADME_SHOW}" ]]; then
> +		# If _GREADME_SHOW is empty, then there is no reason
> to show the contents.
> +		return
> +	fi
> +
> +	local greadme_path
> +	if [[ ${_GREADME_COMPRESS} ]]; then
> +		if [[ -z ${_GREADME_UNPACKED} ]]; then
> +			# We failed to decompress the readme doc from
> the image.
> +			return
> +		fi
> +		greadme_path="${_GREADME_UNPACKED}"
> +	else
> +		greadme_path="${EROOT}/${_GREADME_REL_PATH}"
> +	fi
> +
> +	local line
> +	while read -r line; do elog "${line}"; done <
> "${greadme_path}"
> +	elog ""
> +	elog "(Note: Above message is only printed the first time
> package is"
> +	elog "installed or if the the message changed. Please look
> at"
> +	elog "${EPREFIX}/${_GREADME_REL_PATH} for future reference)"
> +}
> +
> +EXPORT_FUNCTIONS pkg_preinst pkg_postinst
> +
> +fi

Sorry, but this is definitely too much complexity for installing a
README file. As is, I will block merging this to the tree.


  parent reply	other threads:[~2024-01-09 11:23 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-06 17:01 [gentoo-dev] [PATCH 0/1] [RFC] greadme.eclass Florian Schmaus
2024-01-06 17:01 ` [gentoo-dev] [PATCH 1/1] greadme.eclass: new eclass Florian Schmaus
2024-01-06 17:21 ` [gentoo-dev] [PATCH 0/1] [RFC] greadme.eclass Michał Górny
2024-01-09  8:30   ` Florian Schmaus
2024-01-09  8:39     ` [gentoo-dev] [PATCH v2 1/3] greadme.eclass: new eclass Florian Schmaus
2024-01-09  8:39       ` [gentoo-dev] [PATCH v2 2/3] add UNPACKER_NO_BANNER variable Florian Schmaus
2024-01-09  8:45         ` [gentoo-dev] " Florian Schmaus
2024-01-09  8:39       ` [gentoo-dev] [PATCH v2 3/3] greadme.eclass: set UNPACKER_NO_BANNER Florian Schmaus
2024-01-09 11:23       ` David Seifert [this message]
2024-01-09 11:30         ` [gentoo-dev] [PATCH v2 1/3] greadme.eclass: new eclass Florian Schmaus
2024-06-02 13:57       ` [gentoo-dev] [PATCH 0/4] Improve readme.gentoo-r1.eclass Florian Schmaus
2024-06-02 13:57         ` [gentoo-dev] [PATCH 1/4] readme.gentoo-r1.eclass: display readme if content changed (or fresh install) Florian Schmaus
2024-06-02 15:34           ` Ulrich Mueller
2024-06-02 15:48             ` Eli Schwartz
2024-06-02 16:28               ` Ulrich Mueller
2024-06-02 17:48                 ` Florian Schmaus
2024-06-02 17:51                 ` Eli Schwartz
2024-06-02 18:24                   ` Ulrich Mueller
2024-06-04 15:15                     ` Florian Schmaus
2024-06-04 17:45                       ` Ulrich Mueller
2024-06-04 18:28                         ` Florian Schmaus
2024-06-04 18:33                           ` Eli Schwartz
2024-06-04 18:40                           ` Ulrich Mueller
2024-06-04 18:37                         ` Ionen Wolkens
2024-06-04 18:59                           ` Ionen Wolkens
2024-06-02 16:16             ` Florian Schmaus
2024-06-02 13:57         ` [gentoo-dev] [PATCH 2/4] readme.gentoo-r1.eclass: use _GREADME_TMP_FILE in existing code Florian Schmaus
2024-06-02 13:57         ` [gentoo-dev] [PATCH 3/4] readme.gentoo-r1.eclass: add readme.gentoo_stdin() Florian Schmaus
2024-06-02 13:57         ` [gentoo-dev] [PATCH 4/4] readme.gentoo-r1.eclass: add readme.gentoo_file() Florian Schmaus
2024-06-02 15:25         ` [gentoo-dev] [PATCH 0/4] Improve readme.gentoo-r1.eclass Ulrich Mueller
2024-06-02 16:12           ` Florian Schmaus
2024-06-02 16:40             ` Ulrich Mueller
2024-06-02 17:34               ` Florian Schmaus
2024-01-09  9:59     ` [gentoo-dev] [PATCH 0/1] [RFC] greadme.eclass Michał Górny
2024-01-09 10:39       ` Florian Schmaus
2024-01-09 10:43         ` Michał Górny
2024-01-09 10:47           ` Florian Schmaus
2024-01-10 11:04 ` Sam James
2024-01-10 13:23   ` Florian Schmaus
2024-01-10 13:58     ` Ulrich Mueller
2024-01-10 14:30       ` Florian Schmaus
2024-01-10 15:10         ` Ulrich Mueller
2024-01-10 15:54           ` Florian Schmaus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2c8a4a000d790d446d86971b58096f3ff4820b20.camel@gentoo.org \
    --to=soap@gentoo.org \
    --cc=flow@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox