On Tue, 2019-04-09 at 21:41 +0200, Andreas Sturmlechner wrote:
> On Sonntag, 24. März 2019 19:41:24 CEST Michał Górny wrote:
> > -U9999, please.  This is a huge eclass and probably requires more work
> > than you're showing us ;-).
> 
> As requested, without any changes to v2 - and if this does not receive
> a reply I'll assume silent ack by fonts proj.
> 
> 
> --- a/eclass/font.eclass      2019-04-04 08:28:12.336171811 +0200
> +++ b/eclass/font.eclass      2019-03-25 20:34:15.306062926 +0100
> @@ -1,254 +1,257 @@
> -# Copyright 1999-2015 Gentoo Foundation
> +# Copyright 1999-2019 Gentoo Foundation
>  # Distributed under the terms of the GNU General Public License v2
>  
>  # @ECLASS: font.eclass
>  # @MAINTAINER:
>  # [email protected]
>  # @BLURB: Eclass to make font installation uniform
>  
>  case ${EAPI:-0} in
> -     0|1|2|3|4|5|6) ;;
> -     *)             die "EAPI ${EAPI} is not supported by font.eclass." ;;
> +     0|1|2|3|4|5|6) inherit eutils ;;
> +     7) ;;
> +     *) die "EAPI ${EAPI} is not supported by font.eclass." ;;
>  esac
>  
> -inherit eutils
> -
>  EXPORT_FUNCTIONS pkg_setup src_install pkg_postinst pkg_postrm
>  
>  # @ECLASS-VARIABLE: FONT_SUFFIX
>  # @DEFAULT_UNSET
>  # @REQUIRED
>  # @DESCRIPTION:
>  # Space delimited list of font suffixes to install.
>  FONT_SUFFIX=${FONT_SUFFIX:-}
>  
>  # @ECLASS-VARIABLE: FONT_S
>  # @REQUIRED
>  # @DESCRIPTION:
>  # Space delimited list of directories containing the fonts.
>  FONT_S=${FONT_S:-${S}}
>  
>  # @ECLASS-VARIABLE: FONT_PN
>  # @DESCRIPTION:
>  # Font name (ie. last part of FONTDIR).
>  FONT_PN=${FONT_PN:-${PN}}
>  
>  # @ECLASS-VARIABLE: FONTDIR
>  # @DESCRIPTION:
>  # Full path to installation directory.
>  FONTDIR=${FONTDIR:-/usr/share/fonts/${FONT_PN}}
>  
>  # @ECLASS-VARIABLE: FONT_CONF
>  # @DEFAULT_UNSET
>  # @DESCRIPTION:
>  # Array containing fontconfig conf files to install.
>  FONT_CONF=( "" )
>  
>  # @ECLASS-VARIABLE: DOCS
>  # @DEFAULT_UNSET
>  # @DESCRIPTION:
>  # Space delimited list of docs to install.
>  # We always install these:
>  # COPYRIGHT README{,.txt} NEWS AUTHORS BUGS ChangeLog FONTLOG.txt
>  DOCS=${DOCS:-}
>  
>  IUSE="X"
>  
>  DEPEND="X? (
>               || ( >=x11-apps/mkfontscale-1.2.0 x11-apps/mkfontdir )
>               media-fonts/encodings
>       )"
>  RDEPEND=""
>  
>  # @FUNCTION: font_xfont_config
>  # @DESCRIPTION:
>  # Generate Xorg font files (mkfontscale/mkfontdir).
>  font_xfont_config() {
>       local dir_name
>       if has X ${IUSE//+} && use X ; then

Looks like in_iuse candidate.

>               dir_name="${1:-${FONT_PN}}"
> +             rm -f 
> "${ED%/}/${FONTDIR}/${1//${S}/}"/{fonts.{dir,scale},encodings.dir} \
> +                     || die "failed to prepare ${FONTDIR}/${1//${S}/}"
>               ebegin "Creating fonts.scale & fonts.dir in ${dir_name##*/}"
> -             rm -f 
> "${ED}${FONTDIR}/${1//${S}/}"/{fonts.{dir,scale},encodings.dir}
> -             mkfontscale "${ED}${FONTDIR}/${1//${S}/}"
> +             mkfontscale "${ED%/}/${FONTDIR}/${1//${S}/}" || eerror "failed 
> to create fonts.scale"
>               mkfontdir \
>                       -e ${EPREFIX}/usr/share/fonts/encodings \
>                       -e ${EPREFIX}/usr/share/fonts/encodings/large \
> -                     "${ED}${FONTDIR}/${1//${S}/}"
> -             eend $?
> -             if [[ -e fonts.alias ]] ; then
> -                     doins fonts.alias
> +                     "${ED%/}/${FONTDIR}/${1//${S}/}" || eerror "failed to 
> create fonts.dir"
> +             if ! eend $? ; then
> +                     die "failed to run mkfontscale or mkfontdir"

...but this doesn't catch failure from mkfontscale.

>               fi
> +             [[ -e fonts.alias ]] && doins fonts.alias
>       fi
>  }
>  
>  # @FUNCTION: font_fontconfig
>  # @DESCRIPTION:
>  # Install fontconfig conf files given in FONT_CONF.
>  font_fontconfig() {
>       local conffile
>       if [[ -n ${FONT_CONF[@]} ]]; then
>               insinto /etc/fonts/conf.avail/
>               for conffile in "${FONT_CONF[@]}"; do
>                       [[ -e  ${conffile} ]] && doins ${conffile}
>               done
>       fi
>  }
>  
>  # @FUNCTION: font_cleanup_dirs
>  # @DESCRIPTION:
>  # Remove font directories containing only generated files.
>  font_cleanup_dirs() {
>       local genfiles="encodings.dir fonts.alias fonts.cache-1 fonts.dir 
> fonts.scale"
>       # fonts.alias isn't generated but it's a special case (see below).
>       local d f g generated candidate otherfile
>  
>       ebegin "Cleaning up font directories"
> -     find -L "${EROOT}"usr/share/fonts/ -type d -print0 | while read -d 
> $'\0' d; do
> +     while read d; do

read -d $'\0' -r

>               candidate=false
>               otherfile=false
>               for f in "${d}"/*; do
>                       generated=false
>                       # make sure this is a file and not a subdir
>                       [[ -e ${f} || -L ${f} ]] || continue
>                       for g in ${genfiles}; do

Could you use 'has' here?

>                               if [[ ${f##*/} == ${g} ]]; then
>                                       # this is a generated file
>                                       generated=true
>                                       break
>                               fi
>                       done
>                       # if the file is a generated file then we know this is 
> a font dir (as
>                       # opposed to something like encodings or util) and a 
> candidate for
>                       # removal.  if it's not generated then it's an 
> "otherfile".
>                       ${generated} && candidate=true || otherfile=true
>                       # if the directory is both a candidate for removal and 
> contains at
>                       # least one "otherfile" then don't remove it.
>                       [[ ${candidate} == ${otherfile} ]] && break
>               done
>               # if in the end we only have generated files, purge the 
> directory.
>               if [[ ${candidate} == true && ${otherfile} == false ]]; then
>                       # we don't want to remove fonts.alias files that were 
> installed by
>                       # media-fonts/font-alias. any other fonts.alias files 
> will have
>                       # already been unmerged with their packages.
>                       for g in ${genfiles}; do
> -                             [[ ${g} != fonts.alias && ( -e ${d}/${g} || -L 
> ${d}/${g} ) ]] \
> -                                     && rm "${d}"/${g}
> +                             if [[ ${g} != fonts.alias && ( -e ${d}/${g} || 
> -L ${d}/${g} ) ]] ; then
> +                                     rm "${d}"/${g} || eerror "failed to 
> remove ${d}/${g}"
> +                             fi
>                       done
>                       # if there's nothing left remove the directory
> -                     find "${d}" -maxdepth 0 -type d -empty -exec rmdir '{}' 
> \;
> +                     find "${d}" -maxdepth 0 -type d -empty -delete || 
> eerror "failed to purge ${d}"
>               fi
> -     done
> +     done < <(find -L "${EROOT%/}"/usr/share/fonts/ -type d -print0)
>       eend 0
>  }
>  
>  # @FUNCTION: font_pkg_setup
>  # @DESCRIPTION:
>  # The font pkg_setup function.
>  # Collision protection and Prefix compat for eapi < 3.
>  font_pkg_setup() {
>       # Prefix compat
>       case ${EAPI:-0} in
>               0|1|2)
>                       if ! use prefix; then
>                               EPREFIX=
>                               ED=${D}
>                               EROOT=${ROOT}
>                               [[ ${EROOT} = */ ]] || EROOT+="/"
>                       fi
>                       ;;
>       esac

This is really ugly but I guess you can ignore it.

>  
>       # make sure we get no collisions
>       # setup is not the nicest place, but preinst doesn't cut it
> -     [[ -e "${EROOT}/${FONTDIR}/fonts.cache-1" ]] && rm -f 
> "${EROOT}/${FONTDIR}/fonts.cache-1"
> +     if [[ -e "${EROOT%/}/${FONTDIR}/fonts.cache-1" ]] ; then
> +             rm "${EROOT%/}/${FONTDIR}/fonts.cache-1" || die "failed to 
> remove fonts.cache-1"
> +     fi
>  }
>  
>  # @FUNCTION: font_src_install
>  # @DESCRIPTION:
>  # The font src_install function.
>  font_src_install() {
>       local dir suffix commondoc
>  
>       set -- ${FONT_S:-${S}}
>       if [[ $# -gt 1 ]]; then
>               # if we have multiple FONT_S elements then we want to recreate 
> the dir
>               # structure
>               for dir in ${FONT_S}; do
>                       pushd "${dir}" > /dev/null
>                       insinto "${FONTDIR}/${dir//${S}/}"
>                       for suffix in ${FONT_SUFFIX}; do
>                               doins *.${suffix}

Old EAPIs need ||die.

>                       done
>                       font_xfont_config "${dir}"
>                       popd > /dev/null
>               done
>       else
>               pushd "${FONT_S}" > /dev/null
>               insinto "${FONTDIR}"
>               for suffix in ${FONT_SUFFIX}; do
>                       doins *.${suffix}

Likewise.

>               done
>               font_xfont_config
>               popd > /dev/null
>       fi
>  
>       font_fontconfig
>  
> -     [[ -n ${DOCS} ]] && { dodoc ${DOCS} || die "docs installation failed" ; 
> }
> +     [[ -n ${DOCS} ]] && dodoc ${DOCS}

I suppose this kills proper support for old EAPIs.

>  
>       # install common docs
>       for commondoc in COPYRIGHT README{,.txt} NEWS AUTHORS BUGS ChangeLog 
> FONTLOG.txt; do
>               [[ -s ${commondoc} ]] && dodoc ${commondoc}
>       done
>  }
>  
> +# @FUNCTION: _update_fontcache
> +# @DESCRIPTION:
> +# Updates fontcache if !prefix and media-libs/fontconfig installed
> +_update_fontcache() {
> +     # unreadable font files = fontconfig segfaults
> +     find "${EROOT%/}"/usr/share/fonts/ -type f '!' -perm 0644 \
> +             -exec chmod -v 0644 2>/dev/null {} + || die "failed to fix font 
> files perms"
> +
> +     if [[ -z ${ROOT%/} ]] ; then
> +             if has_version media-libs/fontconfig ; then
> +                     ebegin "Updating global fontcache"
> +                     fc-cache -fs
> +                     if ! eend $? ; then
> +                             die "failed to update global fontcache"
> +                     fi
> +             else
> +                     einfo "Skipping fontcache update (media-libs/fontconfig 
> not installed)"
> +             fi
> +     else
> +             einfo "Skipping fontcache update (ROOT != /)"
> +     fi
> +}
> +
>  # @FUNCTION: font_pkg_postinst
>  # @DESCRIPTION:
>  # The font pkg_postinst function.
>  font_pkg_postinst() {
> -     # unreadable font files = fontconfig segfaults
> -     find "${EROOT}"usr/share/fonts/ -type f '!' -perm 0644 -print0 \
> -             | xargs -0 chmod -v 0644 2>/dev/null
> -
>       if [[ -n ${FONT_CONF[@]} ]]; then
>               local conffile
> -             echo
>               elog "The following fontconfig configuration files have been 
> installed:"
>               elog
>               for conffile in "${FONT_CONF[@]}"; do
> -                     if [[ -e ${EROOT}etc/fonts/conf.avail/$(basename 
> ${conffile}) ]]; then
> -                             elog "  $(basename ${conffile})"
> +                     if [[ -e 
> "${EROOT%/}"/etc/fonts/conf.avail/${conffile##*/} ]]; then
> +                             elog "  ${conffile##*/}"
>                       fi
>               done
>               elog
>               elog "Use \`eselect fontconfig\` to enable/disable them."
> -             echo
>       fi
>  
> -     if has_version media-libs/fontconfig && [[ ${ROOT} == / ]]; then
> -             ebegin "Updating global fontcache"
> -             fc-cache -fs
> -             eend $?
> -     else
> -             einfo "Skipping fontcache update (media-libs/fontconfig is not 
> installed or ROOT != /)"
> -     fi
> +     _update_fontcache
>  }
>  
>  # @FUNCTION: font_pkg_postrm
>  # @DESCRIPTION:
>  # The font pkg_postrm function.
>  font_pkg_postrm() {
>       font_cleanup_dirs
> -
> -     # unreadable font files = fontconfig segfaults
> -     find "${EROOT}"usr/share/fonts/ -type f '!' -perm 0644 -print0 \
> -             | xargs -0 chmod -v 0644 2>/dev/null
> -
> -     if has_version media-libs/fontconfig && [[ ${ROOT} == / ]]; then
> -             ebegin "Updating global fontcache"
> -             fc-cache -fs
> -             eend $?
> -     else
> -             einfo "Skipping fontcache update (media-libs/fontconfig is not 
> installed or ROOT != /)"
> -     fi
> +     _update_fontcache
>  }
> 
> 
> 
> 

-- 
Best regards,
Michał Górny

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to