public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: Florian Schmaus <flow@gentoo.org>
To: Ulrich Mueller <ulm@gentoo.org>, gentoo-dev@lists.gentoo.org
Subject: Re: [gentoo-dev] [PATCH v3 1/1] greadme.eclass: new eclass
Date: Thu, 13 Jun 2024 12:18:51 +0200	[thread overview]
Message-ID: <2962cab0-a95d-48c0-b325-653364540326@gentoo.org> (raw)
In-Reply-To: <ua5jptcig@gentoo.org>


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

On 13/06/2024 11.31, Ulrich Mueller wrote:
>>>>>> On Thu, 13 Jun 2024, Florian Schmaus wrote:
>> +# 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: 8
>> +# @BLURB: install a doc file, that will be conditionally shown via elog messages
>> +# @DESCRIPTION:
>> +# An eclass for installing a README.gentoo doc file with important
>> +# information for the user.  The content of README.gentoo will shown be
>> +# via elog messages either on fresh installations or if the contents of
>> +# the file have changed.  Furthermore, the README.gentoo file will be
>> +# installed under /usr/share/doc/${PF} for later consultation.
>> +#
>> +# This eclass was inspired by readme.gentoo-r1.eclass.  The main
>> +# differences are as follows.  Firstly, it only displays the doc file
>> +# contents if they have changed (unless GREADME_FORCE_SHOW is set).
>> +# Secondly, it provides a convenient API to install the doc file via
>> +# stdin.
>> +#
>> +# @CODE
>> +# inherit greadme
>> +#
>> +# src_install() {
>> +#   …
> 
> I'm not a big fan of using non-ASCII characters in places where they
> aren't strictly necessary. Is there any particular advantage of "…"
> over "..."? The latter is also less awkwardly spaced in teletype fonts.

Switched to "..."

> 
>> +#   greadme_stdin <<-EOF
>> +#   This is the content of the created readme doc file.
>> +#   EOF
>> +#   …
>> +#   if use foo; then
>> +#     greadme_stdin --apend <<-EOF
> 
> Typo?

Fixed, thanks!


>> +#     This is conditional readme content, based on USE=foo.
>> +#     EOF
>> +#   fi
>> +# }
>> +# @CODE
>> +#
>> +# If the ebuild overrides the default pkg_preinst or respectively
>> +# pkg_postinst, then it must call greadme_pkg_preinst and
>> +# greadme_pkg_postinst explicitly.
>> +
>> +if [[ -z ${_GREADME_ECLASS} ]]; then
>> +_GREADME_ECLASS=1
>> +
>> +case ${EAPI} in
>> +	8) ;;
>> +	*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
>> +esac
>> +
>> +_GREADME_FILENAME="README.gentoo"
>> +_GREADME_TMP_FILE="${T}/${_GREADME_FILENAME}"
>> +_GREADME_DOC_DIR="usr/share/doc/${PF}"
> 
> It is somewhat unusual to call insinto or docompress with a relative
> path. I'd use "/usr/share/doc/${PF}" here.
> 
>> +_GREADME_REL_PATH="${_GREADME_DOC_DIR}/${_GREADME_FILENAME}"
> 
> Why must this be a relative path? AFAICS it could be an absolute path in
> everywhere it is used. (You even add an explicit slash in places like
> ${ED}/${_GREADME_REL_PATH}).

My idea was to denote relative paths by not including an initial slash 
(/). This allows to write "${ED}/${_GREADME_REL_PATH}" without a 
duplicate slash in the middle. I find

${ED}/${_GREADME_REL_PATH}"

more readable when compared to

${ED}${_GREADME_REL_PATH}"

which seems to be in-line with 
https://mgorny.pl/articles/the-ultimate-guide-to-eapi-7.html#d-ed-root-eroot-no-longer-have-a-trailing-slash

But maybe I misunderstand what you are suggesting. You want

_GREADME_DOC_DIR="/usr/share/doc/${PF}"

instead of

_GREADME_DOC_DIR="usr/share/doc/${PF}"

right? Then I'd also have to change to ${ED}${_GREADME_REL_PATH}", to 
avoid the double slash. :(


>> +
>> +# @ECLASS_VARIABLE: GREADME_FORCE
>> +# @DEFAULT_UNSET
>> +# @DESCRIPTION:
>> +# If set, then uncondiionally show the contents of the readme file in
>> +# pkg_postinst via elog.
>> +
>> +# @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
> 
> $ [[ foo-bar =~ --* ]]; echo $?
> 0
> 
> This is not what is intended here, I guess?

Good catch, switched to [[ ${1} == --* ]].


>> +		case ${1} in
>> +			--append)
>> +				append=true
>> +				shift
>> +				;;
>> +		esac
>> +	done
>> +
>> +	if $append; then
> 
> Please use the conventional coding style, i.e. ${append}.

Changed to [[ -n ${append} ]]


> 
>> +		if [[ ! -f "${_GREADME_TMP_FILE}" ]]; then
> 
> Quotation marks inside [[ ]] are generally not necessary (also several
> times below).

Dropped quotation marks inside [[ ]] everywhere.


>> +			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} "${@}"
>> +
>> +	# Subshell to avoid pollution of calling environment.
>> +	(
>> +		insinto "${_GREADME_DOC_DIR}"
>> +		doins "${_GREADME_TMP_FILE}"
>> +	)
> 
> Why not a simple dodoc here?

This was inspired by readme.gentoo-r1.eclass, which does

	( # subshell to avoid pollution of calling environment
		docinto .
		dodoc "${T}"/README.gentoo
	) || die

I guess we could also switch to docinto & dodoc, but since we already 
need and have _GREADME_DOC_DIR, I went with that. Also the number of 
lines doesn't get any less.

However, if you feel strongly about it, then I am happy to switch to 
docinto & dodoc.


>> +	# Exclude the readme file from compression, so that its contents can
>> +	# be easily compared.
>> +	docompress -x "${_GREADME_REL_PATH}"
>> +}
>> +
>> +# @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() {
>> +	debug-print-function ${FUNCNAME} "${@}"
>> +
>> +	if [[ -z ${REPLACING_VERSIONS} ]]; then
>> +		_GREADME_SHOW="fresh-install"
>> +		return
>> +	fi
>> +
>> +	if [[ -v GREADME_FORCE_SHOW ]]; then
> 
> This is technically valid, but I think it would be surprising when empty
> GREADME_FORCE_SHOW triggered the behaviour. I suggest testing for
> [[ -n ${GREADME_FORCE_SHOW} ]] instead; this is also how most other
> eclasses perform such tests.

I did a last-minute change to that, which accidentally did not make it 
into the patch. This actually is now

# @ECLASS_VARIABLE: GREADME_SHOW
# @DEFAULT_UNSET
# @DESCRIPTION:
# If set to "yes" then unconditionally show the contents of the readme
# file in pkg_postinst via elog. If set to "no", then do not show the
# contents of the readme file, even if they have changed.
...
if [[ -v GREADME_SHOW ]]; then
	case ${GREADME_SHOW} in
		yes)
			_GREADME_SHOW="forced"
			;;
		no)
			_GREADME_SHOW=""
			;;
		*)
			die "Invalid argument of GREADME_SHOW"
			;;
	esac
	return
fi


where I would argue that the [[ -v ]] test is sensible.


>> +		_GREADME_SHOW="forced"
>> +		return
>> +	fi
>> +
>> +	local image_greadme_file="${ED}/${_GREADME_REL_PATH}"
>> +	if [[ ! -f "${image_greadme_file}" ]]; then
>> +		# No README file was created by the ebuild.
>> +		_GREADME_SHOW=""
>> +		return
>> +	fi
>> +
>> +	check_live_doc_file() {
>> +		local cur_pvr=$1
>> +		local live_greadme_file="${EROOT}/usr/share/doc/${PN}-${cur_pvr}/${_GREADME_FILENAME}"
>> +
>> +		if [[ ! -f ${live_greadme_file} ]]; then
>> +			_GREADME_SHOW="no-current-greadme"
>> +			return
>> +		fi
>> +
>> +		cmp -s "${live_greadme_file}" "${image_greadme_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}
>> +
>> +		# Once _GREADME_SHOW is non empty, we found a reason to show the
>> +		# readme and we can abort the loop.
>> +		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 line
>> +	while read -r line; do elog "${line}"; done < "${EROOT}/${_GREADME_REL_PATH}"
> 
> It is not guaranteed that the file exists in ${EROOT} at this point.
> See FEATURES="nodoc" in make.conf(5).

Fair point. Fixed.

Thanks for your review. Adjusted accordingly 
(https://gitlab.com/flow/flow-s-ebuilds/-/commit/ef307612a676c7810e823ff6e38dac41bebd9dde).

- Flow


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

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

  parent reply	other threads:[~2024-06-13 10:19 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-13  8:39 [gentoo-dev] [PATCH v3 0/1] greadme.eclass: new eclass Florian Schmaus
2024-06-13  8:39 ` [gentoo-dev] [PATCH v3 1/1] " Florian Schmaus
2024-06-13  9:31   ` Ulrich Mueller
2024-06-13  9:48     ` Ulrich Mueller
2024-06-13 10:18     ` Florian Schmaus [this message]
2024-06-13 10:42       ` Ulrich Mueller
2024-06-13 10:57         ` Florian Schmaus
2024-06-13 11:59 ` [gentoo-dev] [PATCH v3 0/1] " Ionen Wolkens
2024-06-13 12:53   ` 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=2962cab0-a95d-48c0-b325-653364540326@gentoo.org \
    --to=flow@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    --cc=ulm@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