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


[-- Attachment #1.1.1: Type: text/plain, Size: 11168 bytes --]

On 09/01/2024 12.23, David Seifert wrote:
> 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.


As I wrote, I do not want this too. I like to merge greadme.eclass 
without _GREADME_COMPRESS, with which removes large parts of the 
complexity of the eclass, I would even say it would be nearly trivial then.

Would you also block a significantly simpler variant of the greadme.eclass?

- Flow



[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 17273 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 618 bytes --]

  reply	other threads:[~2024-01-09 11:30 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       ` [gentoo-dev] [PATCH v2 1/3] greadme.eclass: new eclass David Seifert
2024-01-09 11:30         ` Florian Schmaus [this message]
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=a723658e-d730-4cd5-be49-a92e93b1b9fb@gentoo.org \
    --to=flow@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    --cc=soap@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