From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <gentoo-commits+bounces-1531756-garchives=archives.gentoo.org@lists.gentoo.org>
Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits))
	(No client certificate requested)
	by finch.gentoo.org (Postfix) with ESMTPS id 367BD158003
	for <garchives@archives.gentoo.org>; Fri, 23 Jun 2023 21:59:24 +0000 (UTC)
Received: from pigeon.gentoo.org (localhost [127.0.0.1])
	by pigeon.gentoo.org (Postfix) with SMTP id 52EB0E07B3;
	Fri, 23 Jun 2023 21:59:23 +0000 (UTC)
Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
	(No client certificate requested)
	by pigeon.gentoo.org (Postfix) with ESMTPS id 2D070E07B3
	for <gentoo-commits@lists.gentoo.org>; Fri, 23 Jun 2023 21:59:23 +0000 (UTC)
Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
	(No client certificate requested)
	by smtp.gentoo.org (Postfix) with ESMTPS id 0B433335D83
	for <gentoo-commits@lists.gentoo.org>; Fri, 23 Jun 2023 21:59:22 +0000 (UTC)
Received: from localhost.localdomain (localhost [IPv6:::1])
	by oystercatcher.gentoo.org (Postfix) with ESMTP id 4B340A66
	for <gentoo-commits@lists.gentoo.org>; Fri, 23 Jun 2023 21:59:20 +0000 (UTC)
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Content-Transfer-Encoding: 8bit
Content-type: text/plain; charset=UTF-8
Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" <sam@gentoo.org>
Message-ID: <1687557451.023b7de83186fbb6e97ea09ded7c6bfdadd4f1da.sam@gentoo>
Subject: [gentoo-commits] repo/gentoo:master commit in: sys-apps/less/files/, sys-apps/less/
X-VCS-Repository: repo/gentoo
X-VCS-Files: sys-apps/less/files/lesspipe-r2.sh sys-apps/less/less-633-r1.ebuild sys-apps/less/less-9999.ebuild
X-VCS-Directories: sys-apps/less/files/ sys-apps/less/
X-VCS-Committer: sam
X-VCS-Committer-Name: Sam James
X-VCS-Revision: 023b7de83186fbb6e97ea09ded7c6bfdadd4f1da
X-VCS-Branch: master
Date: Fri, 23 Jun 2023 21:59:20 +0000 (UTC)
Precedence: bulk
List-Post: <mailto:gentoo-commits@lists.gentoo.org>
List-Help: <mailto:gentoo-commits+help@lists.gentoo.org>
List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org>
List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org>
List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org>
X-BeenThere: gentoo-commits@lists.gentoo.org
X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply
X-Archives-Salt: 9d5561f2-a5cd-4464-bd75-e1c1261bf96e
X-Archives-Hash: 0c67e96cc45aa39f4d810c58fdc59601

commit:     023b7de83186fbb6e97ea09ded7c6bfdadd4f1da
Author:     Alan Swanson <reiver <AT> improbability <DOT> net>
AuthorDate: Fri Jun 23 13:26:06 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Fri Jun 23 21:57:31 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=023b7de8

sys-apps/less: reenable colourisation by default using pygmentize

Previously disabled due to old bug #188835 where code2color consumed
excess memory compared to source file being colourised.

Update LESSCOLORIZER to use pygmentize instead if available. This is
installed with dev-python/pygments which is a common dependency.

Program code2color can still be installed with app-text/lesspipe.

Bug: https://bugs.gentoo.org/188835
Signed-off-by: Alan Swanson <reiver <AT> improbability.net>
Closes: https://github.com/gentoo/gentoo/pull/31584
Signed-off-by: Sam James <sam <AT> gentoo.org>

 sys-apps/less/files/lesspipe-r2.sh                 | 291 +++++++++++++++++++++
 .../less/{less-9999.ebuild => less-633-r1.ebuild}  |   8 +-
 sys-apps/less/less-9999.ebuild                     |   8 +-
 3 files changed, 299 insertions(+), 8 deletions(-)

diff --git a/sys-apps/less/files/lesspipe-r2.sh b/sys-apps/less/files/lesspipe-r2.sh
new file mode 100644
index 000000000000..fc54d5b21306
--- /dev/null
+++ b/sys-apps/less/files/lesspipe-r2.sh
@@ -0,0 +1,291 @@
+#!/bin/bash
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# Preprocessor for 'less'. Used when this environment variable is set:
+# LESSOPEN="|lesspipe %s"
+
+# TODO: handle compressed files better
+
+[[ -n ${LESSDEBUG+set} ]] && set -x
+
+trap 'exit 0' PIPE
+
+guesscompress() {
+	case "$1" in
+		*.gz|*.z)   echo "gunzip -c" ;;
+		*.bz2|*.bz) echo "bunzip2 -c" ;;
+		*.lz)       echo "lzip -dc" ;;
+		*.lzma)     echo "unlzma -c" ;;
+		*.lzo)      echo "lzop -dc" ;;
+		*.xz)       echo "xzdec" ;;
+		*.zst)      echo "zstdcat" ;;
+		*)          echo "cat" ;;
+	esac
+}
+
+lesspipe_file() {
+	local out=$(file -L -- "$1")
+	local suffix
+	case ${out} in
+		*" 7-zip archive"*) suffix="7z";;
+		*" ar archive"*)    suffix="a";;
+		*" CAB-Installer"*) suffix="cab";;
+		*" cpio archive"*)  suffix="cpio";;
+		*" ELF "*)          suffix="elf";;
+		*" LHa"*archive*)   suffix="lha";;
+		*" troff "*)        suffix="man";;
+		*" script text"*)   suffix="sh";;
+		*" shared object"*) suffix="so";;
+		*" tar archive"*)   suffix="tar";;
+		*" Zip archive"*)   suffix="zip";;
+		*": data")          hexdump -C -- "$1"; return 0;;
+		*)                  return 1;;
+	esac
+	lesspipe "$1" ".${suffix}"
+	return 0
+}
+
+lesspipe() {
+	local match=$2
+	[[ -z ${match} ]] && match=$1
+
+	local DECOMPRESSOR=$(guesscompress "${match}")
+
+	# User filters
+	if [[ -x ~/.lessfilter ]] ; then
+		~/.lessfilter "$1" && exit 0
+	fi
+
+	local ignore
+	for ignore in ${LESSIGNORE} ; do
+		[[ ${match} == *.${ignore} ]] && exit 0
+	done
+
+	# Handle non-regular file types.
+	if [[ -d $1 ]] ; then
+		ls -alF -- "$1"
+		return
+	elif [[ ! -f $1 ]] ; then
+		# Only return if the stat passes.  This is needed to handle pseudo
+		# arguments like URIs.
+		stat -- "$1" && return
+	fi
+
+	case "${match}" in
+
+	### Doc files ###
+	*.[0-9n]|*.man|\
+	*.[0-9n].bz2|*.man.bz2|\
+	*.[0-9n].gz|*.man.gz|\
+	*.[0-9n].lzma|*.man.lzma|\
+	*.[0-9n].xz|*.man.xz|\
+	*.[0-9n].zst|*.man.zst|\
+	*.[0-9][a-z].gz|*.[0-9][a-z].gz)
+		local out=$(${DECOMPRESSOR} -- "$1" | file -)
+		case ${out} in
+			*troff*)
+				# Need to make sure we pass path to man or it will try
+				# to locate "$1" in the man search paths
+				if [[ $1 == /* ]] ; then
+					man -- "$1"
+				else
+					man -- "./$1"
+				fi
+				;;
+			*text*)
+				${DECOMPRESSOR} -- "$1"
+				;;
+			*)
+				# We could have matched a library (libc.so.6), so let
+				# `file` figure out what the hell this thing is
+				lesspipe_file "$1"
+				;;
+		esac
+		;;
+	*.dvi)      dvi2tty "$1" ;;
+	*.ps)       ps2ascii "$1" || pstotext "$1" ;;
+	*.pdf)      pdftotext "$1" - || ps2ascii "$1" || pstotext "$1" ;;
+	*.doc)      antiword "$1" || catdoc "$1" ;;
+	*.rtf)      unrtf --nopict --text "$1" ;;
+	*.conf|*.txt|*.log) ;; # force less to work on these directly #150256
+	*.json)     python -mjson.tool "$1" ;;
+
+	### URLs ###
+	ftp://*|http://*|https://|*.htm|*.html)
+		for b in elinks links2 links lynx ; do
+			${b} -dump "$1" && exit 0
+		done
+		html2text -style pretty "$1"
+		;;
+
+	### Tar files ###
+	*.tar|\
+	*.tar.bz2|*.tar.bz|*.tar.gz|*.tar.z|*.tar.zst|\
+	*.tar.lz|*.tar.tlz|\
+	*.tar.lzma|*.tar.xz)
+		${DECOMPRESSOR} -- "$1" | tar tvvf -;;
+	*.tbz2|*.tbz|*.tgz|*.tlz|*.txz)
+		lesspipe "$1" "$1.tar.${1##*.t}" ;;
+
+	### Misc archives ###
+	*.bz2|\
+	*.gz|*.z|\
+	*.zst|\
+	*.lz|\
+	*.lzma|*.xz)  ${DECOMPRESSOR} -- "$1" ;;
+	*.rpm)        rpm -qpivl --changelog -- "$1" || rpm2tar -O "$1" | tar tvvf -;;
+	*.cpi|*.cpio) cpio -itv < "$1" ;;
+	*.ace)        unace l "$1" ;;
+	*.arc)        arc v "$1" ;;
+	*.arj)        arj l -- "$1" || unarj l "$1" ;;
+	*.cab)        cabextract -l -- "$1" ;;
+	*.lha|*.lzh)  lha v "$1" ;;
+	*.zoo)        zoo -list "$1" || unzoo -l "$1" ;;
+	*.7z|*.exe)   7z l -- "$1" || 7za l -- "$1" || 7zr l -- "$1" ;;
+	*.a)          ar tv "$1" ;;
+	*.elf)        readelf -a -W -- "$1" ;;
+	*.so)         readelf -h -d -s -W -- "$1" ;;
+	*.mo|*.gmo)   msgunfmt -- "$1" ;;
+
+	*.rar|.r[0-9][0-9])  unrar l -- "$1" ;;
+
+	*.jar|*.war|*.ear|*.xpi|*.zip)
+		unzip -v "$1" || miniunzip -l "$1" || miniunz -l "$1" || zipinfo -v "$1"
+		;;
+
+	*.deb|*.udeb)
+		if type -P dpkg > /dev/null ; then
+			dpkg --info "$1"
+			dpkg --contents "$1"
+		else
+			ar tv "$1"
+			ar p "$1" data.tar.gz | tar tzvvf -
+		fi
+		;;
+
+	### Filesystems ###
+	*.squashfs)   unsquashfs -s "$1" && unsquashfs -ll "$1" ;;
+
+	### Media ###
+	*.bmp|*.gif|*.jpeg|*.jpg|*.ico|*.pcd|*.pcx|*.png|*.ppm|*.tga|*.tiff|*.tif|*.webp)
+		identify -verbose -- "$1" || file -L -- "$1"
+		;;
+	*.asf|*.avi|*.flv|*.mkv|*.mov|*.mp4|*.mpeg|*.mpg|*.qt|*.ram|*.rm|*.webm|*.wmv)
+		midentify "$1" || file -L -- "$1"
+		;;
+	*.mp3)        mp3info "$1" || id3info "$1" ;;
+	*.ogg)        ogginfo "$1" ;;
+	*.flac)       metaflac --list "$1" ;;
+	*.torrent)    torrentinfo "$1" || torrentinfo-console "$1" || ctorrent -x "$1" ;;
+	*.bin|*.cue|*.raw)
+		# not all .bin/.raw files are cd images #285507
+		# fall back to lesspipe_file if .cue doesn't exist, or if
+		# cd-info failed to parse things sanely
+		[[ -e ${1%.*}.cue ]] \
+			&& cd-info --no-header --no-device-info "$1" \
+			|| lesspipe_file "$1"
+		;;
+	*.iso)
+		iso_info=$(isoinfo -d -i "$1")
+		echo "${iso_info}"
+		# Joliet output overrides Rock Ridge, so prefer the better Rock
+		case ${iso_info} in
+			*$'\n'"Rock Ridge"*) iso_opts="-R";;
+			*$'\n'"Joliet"*)     iso_opts="-J";;
+			*)                   iso_opts="";;
+		esac
+		isoinfo -l ${iso_opts} -i "$1"
+		;;
+
+	### Encryption stuff ###
+	*.crl) openssl crl -hash -text -noout -in "$1" ;;
+	*.csr) openssl req -text -noout -in "$1" ;;
+	*.crt|*.pem) openssl x509 -hash -text -noout -in "$1" ;;
+
+# May not be such a good idea :)
+#	### Device nodes ###
+#	/dev/[hs]d[a-z]*)
+#		fdisk -l "${1:0:8}"
+#		[[ $1 == *hd* ]] && hdparm -I "${1:0:8}"
+#		;;
+
+	### Everything else ###
+	*)
+		case $(( recur++ )) in
+			# Maybe we didn't match due to case issues ...
+			0) lesspipe "$1" "$(echo "$1" | LC_ALL=C tr '[:upper:]' '[:lower:]')" ;;
+
+			# Maybe we didn't match because the file is named weird ...
+			1) lesspipe_file "$1" ;;
+		esac
+
+		# So no matches from above ... finally fall back to an external
+		# coloring package.  No matching here so we don't have to worry
+		# about keeping in sync with random packages.  Any coloring tool
+		# you use should not output errors about unsupported files to
+		# stdout.  If it does, it's your problem.
+
+		# Allow people to flip color off if they dont want it
+		case ${LESSCOLOR} in
+			always)                   LESSCOLOR=2;;
+			[yY][eE][sS]|[yY]|1|true) LESSCOLOR=1;;
+			[nN][oO]|[nN]|0|false)    LESSCOLOR=0;;
+			*)                        LESSCOLOR=1;;
+		esac
+		if [[ ${LESSCOLOR} != "0" ]] && [[ -n ${LESSCOLORIZER=pygmentize} ]] ; then
+			# 2: Only colorize if user forces it ...
+			# 1: ... or we know less will handle raw codes -- this will
+			#    not detect -seiRM, so set LESSCOLORIZER yourself
+			if [[ ${LESSCOLOR} == "2" ]] || [[ " ${LESS} " == *" -"[rR]" "* ]] ; then
+				LESSQUIET=true ${LESSCOLORIZER} "$1"
+			fi
+		fi
+
+		# Nothing left to do but let less deal
+		exit 0
+		;;
+	esac
+}
+
+if [[ $# -eq 0 ]] ; then
+	echo "Usage: lesspipe <file>"
+elif [[ $1 == "-V" || $1 == "--version" ]] ; then
+	cat <<-EOF
+		lesspipe (git)
+		Copyright 1999-2019 Gentoo Authors
+		Mike Frysinger <vapier@gentoo.org>
+		     (with plenty of ideas stolen from other projects/distros)
+
+	EOF
+	less -V
+elif [[ $1 == "-h" || $1 == "--help" ]] ; then
+	cat <<-EOF
+		lesspipe: preprocess files before sending them to less
+
+		Usage: lesspipe <file>
+
+		lesspipe specific settings:
+		  LESSCOLOR env     - toggle colorizing of output (no/yes/always; default: no)
+		  LESSCOLORIZER env - program used to colorize output (default: pygmentize)
+		  LESSIGNORE        - list of extensions to ignore (don't do anything fancy)
+
+		You can create per-user filters as well by creating the executable file:
+		  ~/.lessfilter
+		One argument is passed to it: the file to display.  The script should exit 0
+		to indicate it handled the file, or non-zero to tell lesspipe to handle it.
+
+		To use lesspipe, simply add to your environment:
+		  export LESSOPEN="|lesspipe %s"
+
+		For colorization, install dev-python/pygments for the pygmentize program. Note,
+		if using alternative code2color from sys app-text/lesspipe you may run out of
+		memory due to #188835.
+
+		Run 'less --help' or 'man less' for more info.
+	EOF
+else
+	recur=0
+	[[ -z ${LESSDEBUG+set} ]] && exec 2>/dev/null
+	lesspipe "$1"
+fi

diff --git a/sys-apps/less/less-9999.ebuild b/sys-apps/less/less-633-r1.ebuild
similarity index 91%
copy from sys-apps/less/less-9999.ebuild
copy to sys-apps/less/less-633-r1.ebuild
index 40f831510273..c6edffba45d8 100644
--- a/sys-apps/less/less-9999.ebuild
+++ b/sys-apps/less/less-633-r1.ebuild
@@ -11,7 +11,7 @@ if [[ ${PV} == 9999 ]]; then
 	inherit git-r3
 fi
 
-inherit autotools
+inherit autotools optfeature
 
 # Releases are usually first a beta then promoted to stable if no
 # issues were found. Upstream explicitly ask "to not generally distribute"
@@ -66,15 +66,15 @@ src_test() {
 src_install() {
 	default
 
-	newbin "${FILESDIR}"/lesspipe-r1.sh lesspipe
+	newbin "${FILESDIR}"/lesspipe-r2.sh lesspipe
 	newenvd "${FILESDIR}"/less.envd 70less
 }
 
 pkg_preinst() {
+	optfeature "Colorized output supprt" dev-python/pygments
+
 	if has_version "<${CATEGORY}/${PN}-483-r1" ; then
 		elog "The lesspipe.sh symlink has been dropped.  If you are still setting"
 		elog "LESSOPEN to that, you will need to update it to '|lesspipe %s'."
-		elog "Colorization support has been dropped.  If you want that, check out"
-		elog "the new app-text/lesspipe package."
 	fi
 }

diff --git a/sys-apps/less/less-9999.ebuild b/sys-apps/less/less-9999.ebuild
index 40f831510273..c6edffba45d8 100644
--- a/sys-apps/less/less-9999.ebuild
+++ b/sys-apps/less/less-9999.ebuild
@@ -11,7 +11,7 @@ if [[ ${PV} == 9999 ]]; then
 	inherit git-r3
 fi
 
-inherit autotools
+inherit autotools optfeature
 
 # Releases are usually first a beta then promoted to stable if no
 # issues were found. Upstream explicitly ask "to not generally distribute"
@@ -66,15 +66,15 @@ src_test() {
 src_install() {
 	default
 
-	newbin "${FILESDIR}"/lesspipe-r1.sh lesspipe
+	newbin "${FILESDIR}"/lesspipe-r2.sh lesspipe
 	newenvd "${FILESDIR}"/less.envd 70less
 }
 
 pkg_preinst() {
+	optfeature "Colorized output supprt" dev-python/pygments
+
 	if has_version "<${CATEGORY}/${PN}-483-r1" ; then
 		elog "The lesspipe.sh symlink has been dropped.  If you are still setting"
 		elog "LESSOPEN to that, you will need to update it to '|lesspipe %s'."
-		elog "Colorization support has been dropped.  If you want that, check out"
-		elog "the new app-text/lesspipe package."
 	fi
 }