Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Sep 2013 16:54:39 +0400 (MSK)
From:      Iouri Ivliev <ii@any.com.ru>
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        Ken DEGUCHI <kdeguchi@sz.tokoha-u.ac.jp>
Subject:   ports/182371: ports-mgmt/pkg_replace: fixup pattrn matching in pkg_glob() function
Message-ID:  <201309251254.r8PCsdSn005995@smaug.esterdev.com>
Resent-Message-ID: <201309251300.r8PD02mt011039@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         182371
>Category:       ports
>Synopsis:       ports-mgmt/pkg_replace: fixup pattrn matching in pkg_glob() function
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 25 13:00:01 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Iouri Ivliev
>Release:        FreeBSD 8.4-STABLE amd64
>Organization:
EsterDev, Ltd.
>Environment:
System: FreeBSD smaug.esterdev.com 8.4-STABLE FreeBSD 8.4-STABLE #0: Sun Sep 8 23:02:52 UTC 2013 root@smaug.esterdev.com:/usr/obj/usr/src/sys/SMAUG amd64
>Description:
When an old pkg tools used, pkg_replace trying to find an installed
package looking the subdirectories containing the "+CONTENTS" file
in "${PKG_DBDIR}". Shell pattern used to match subdirectory
corresponding the package. However, some packages may not matches
the pattern. IMHO, more accurate results can be obtained using
pkg_info with the extended regular expression (-X key).
Patch in the "Fix:" section replaces shell pattern matching with
"pkg_info -EX <regex>" command. Also this patch fixes use of unset
variabel (preserved_files).
>How-To-Repeat:
$ pkg_info -Ex pkg_replace
pkg_replace-0.8.0_2
$ for p in python2 liblqr-1 xorg-fonts-75dpi; do echo pkg_replace:; pkg_replace -n $p; echo pkg_info:; pkg_info -EX "^$p-([a-z]?[0-9]+\.)?([a-z]?[0-9]*[a-z]?\.?)*([_,][0-9]+)*\$"; done
pkg_replace:
** No such installed package: python2
pkg_info:
python2-2
pkg_replace:
** No such installed package: liblqr-1
pkg_info:
liblqr-1-0.4.1_5
pkg_replace:
** No such installed package: xorg-fonts-75dpi
pkg_info:
xorg-fonts-75dpi-7.7
>Fix:
--- ports-mgmt__pkg_replace.diff begins here ---
diff -ruN ports-mgmt/pkg_replace.orig/files/patch-pkg_replace_pkgng ports-mgmt/pkg_replace/files/patch-pkg_replace_pkgng
--- ports-mgmt/pkg_replace.orig/files/patch-pkg_replace_pkgng	2013-09-25 14:50:58.577970511 +0400
+++ ports-mgmt/pkg_replace/files/patch-pkg_replace_pkgng	2013-09-25 13:51:52.558672626 +0400
@@ -1,5 +1,5 @@
---- sbin/pkg_replace/pkg_replace.sh.orig	2007-01-25 21:55:46.000000000 +0900
-+++ sbin/pkg_replace/pkg_replace.sh	2013-09-03 06:58:43.000000000 +0900
+--- sbin/pkg_replace/pkg_replace.sh.orig	2007-01-25 12:55:46.000000000 +0000
++++ sbin/pkg_replace/pkg_replace.sh	2013-09-25 09:49:37.926799231 +0000
 @@ -125,14 +125,27 @@
  	: ${PACKAGEROOT="ftp://ftp.NetBSD.org"}
  	: ${PKG_SUFX=".tgz"}
@@ -96,45 +96,66 @@
  
  	pkg_name=$1
  	pkg_pkgdir=${PKG_DBDIR}/$1
-@@ -526,10 +558,27 @@
+@@ -518,7 +550,7 @@
+ }
+ 
+ pkg_glob() {
+-	local p _var _arg _pattern _deps _req_by
++	local p _var _arg _pattern _deps _req_by _pkgs
+ 
+ 	_var=$1; shift
+ 	eval ${_var}=
+@@ -526,30 +558,27 @@
  
  	for _arg in ${1+"$@"}; do
  		_pattern=${_arg#${PKG_DBDIR}/}
 +		if is_yes ${use_pkgng}; then
-+			for p in `${PKG_INFO} -g "${_pattern}" 2>/dev/null`; do
-+				if is_yes ${opt_depends}; then
-+					pkg_depends '_deps' "$p"
-+					eval ${_var}=\"\$${_var} \${_deps}\"
-+				fi
-+
-+				eval ${_var}=\"\$${_var} \$p\"
- 
-+				if is_yes ${opt_required_by}; then
-+					pkg_required_by '_req_by' "$p"
-+					eval ${_var}=\"\$${_var} \${_req_by}\"
-+				fi
-+			done
-+			if [ -z "${pkgs}" ]; then
-+				warn "No such installed package: ${_arg}"
-+			fi
++			_pkgs="$(${PKG_INFO} -g "${_pattern}" 2>/dev/null || :)"
 +		else
- 		case ${_pattern} in
++			_pattern="$(echo "${_pattern}" | sed -Ee 's/(\\)?([.+])/\\\2/g')"
++			_pkgs="$(${PKG_INFO} -EX "^${_pattern}-([a-z]?[0-9]+\.)?([a-z]?[0-9]*[a-z]?\.?)*([_,][0-9]+)*\$" 2>/dev/null || :)"
++		fi
++		if [ -z "${_pkgs}" ]; then
++			warn "No such installed package: ${_arg}"
++			continue
++		fi
++		for p in ${_pkgs}; do
++			if is_yes ${opt_depends}; then
++				pkg_depends '_deps' "$p"
++				eval ${_var}=\"\$${_var} \${_deps}\"
++			fi
+ 
+-		case ${_pattern} in
 -		*\**|*-pl[0-9]*|*-[0-9]*[0-9.][a-z]|*-[0-9]*[0-9]) ;;
 -		*)		_pattern="${_pattern}-[0-9]*[0-9a-z]" ;;
-+		*\**|*-[0-9]*|*-[brv.][0-9]*|*-a.[0-9]*|*-pl[0-9]*|*-b.r[0-9]*|*-cr.[a-z]*) ;;
-+		*)		_pattern="${_pattern}-[0-9]*[0-9a-zA-Z]" ;;
- 		esac
- 
- 		for p in ${PKG_DBDIR}/${_pattern}/+CONTENTS; do
-@@ -552,6 +601,7 @@
- 				warn "No such installed package: ${_arg}"
+-		esac
+-
+-		for p in ${PKG_DBDIR}/${_pattern}/+CONTENTS; do
+-			if [ -e "$p" ]; then
+-				p=${p#${PKG_DBDIR}/}
+-				p=${p%/+CONTENTS}
+-
+-				if is_yes ${opt_depends}; then
+-					pkg_depends '_deps' "$p"
+-					eval ${_var}=\"\$${_var} \${_deps}\"
+-				fi
+-
+-				eval ${_var}=\"\$${_var} \$p\"
++			eval ${_var}=\"\$${_var} \$p\"
+ 
+-				if is_yes ${opt_required_by}; then
+-					pkg_required_by '_req_by' "$p"
+-					eval ${_var}=\"\$${_var} \${_req_by}\"
+-				fi
+-			else
+-				warn "No such installed package: ${_arg}"
++			if is_yes ${opt_required_by}; then
++				pkg_required_by '_req_by' "$p"
++				eval ${_var}=\"\$${_var} \${_req_by}\"
  			fi
  		done
-+		fi
  	done
- 
- 	set -f
-@@ -568,6 +618,12 @@
+@@ -568,6 +597,12 @@
  		done < "${PKG_DBDIR}/$2/+REQUIRING"
  	fi
  #else
@@ -147,7 +168,7 @@
  	if [ -r "${PKG_DBDIR}/$2/+CONTENTS" ]; then
  		while read X; do
  			case $X in
-@@ -588,6 +644,12 @@
+@@ -588,6 +623,12 @@
  pkg_required_by() {
  	local X
  
@@ -160,7 +181,7 @@
  	eval $1=
  	if [ -r "${PKG_DBDIR}/$2/+REQUIRED_BY" ]; then
  		while read X; do
-@@ -597,7 +659,7 @@
+@@ -597,7 +638,7 @@
  }
  
  pkg_sort() {
@@ -169,7 +190,7 @@
  
  	_var=$1; shift
  	_sorted=
-@@ -612,7 +674,13 @@
+@@ -612,7 +653,13 @@
  		*" ${_arg} "*)	continue ;;
  		esac
  
@@ -184,7 +205,7 @@
  			pkg_depends '_deps' "${_arg}"
  
  			for p in ${_deps}; do
-@@ -715,7 +783,7 @@
+@@ -715,7 +762,7 @@
  	if empty ${_log}; then
  		try "$@" || return $?
  	else
@@ -193,7 +214,7 @@
  
  		{ try "$@" || echo $? > "${_cookie}"; } | tee -a "${_log}" ||
  			warn "tee(1) failed."
-@@ -757,9 +825,11 @@
+@@ -757,9 +804,11 @@
  	info "Installing '$1'"
  
  	case $1 in
@@ -206,7 +227,7 @@
  
  		xtry "${2-}" ${PKG_ADD} ${install_args} "$1" || return 1
  		;;
-@@ -795,7 +865,11 @@
+@@ -795,7 +844,11 @@
  
  	deinstall_args=
  	is_yes ${opt_force} && deinstall_args="-f"
@@ -218,7 +239,7 @@
  
  #ifdef WITH_PKGSRC
  	if [ -e "${PKG_DBDIR}/$1/+PRESERVE" ]; then
-@@ -915,7 +989,11 @@
+@@ -915,7 +968,11 @@
  		*)		subdir="${OS_MAJOR}-stable" ;;
  		esac
  
@@ -230,7 +251,7 @@
  #endif
  #endif
  		uri="${PACKAGEROOT}${uri_path}${pkg}"
-@@ -987,7 +1065,11 @@
+@@ -987,7 +1044,11 @@
  		return 1
  	fi
  #else
@@ -242,7 +263,7 @@
  #endif
  #endif
  }
-@@ -1031,12 +1113,17 @@
+@@ -1031,12 +1092,17 @@
  }
  
  preserve_libs() {
@@ -262,7 +283,16 @@
  		case ${file##*/} in
  		lib*.so.[0-9]*)
  			if [ -f "${file}" ]; then
-@@ -1080,20 +1167,30 @@
+@@ -1055,7 +1121,7 @@
+ clean_libs() {
+ 	local delete_files file dest
+ 
+-	if empty ${preserved_files} || ! is_yes ${opt_preserve_libs}; then
++	if ! is_yes ${opt_preserve_libs} || empty ${preserved_files}; then
+ 		return 0
+ 	fi
+ 
+@@ -1080,20 +1146,30 @@
  fix_dependencies() {
  #ifndef WITH_PKGSRC
  #ifndef WITH_OPENBSD
@@ -295,7 +325,7 @@
  			fi
  		fi
  	done
-@@ -1102,6 +1199,11 @@
+@@ -1102,6 +1178,11 @@
  }
  
  update_dependencies() {
@@ -307,7 +337,7 @@
  	local p req_by
  
  	pkg_required_by 'req_by' "$2"
-@@ -1114,6 +1216,7 @@
+@@ -1114,6 +1195,7 @@
  			update_pkgdep "$p" "$1-[^-]*" "$2" || return 1
  		done
  	fi
@@ -315,7 +345,7 @@
  }
  
  have_pkgdep() {
-@@ -1122,7 +1225,7 @@
+@@ -1122,7 +1204,7 @@
  	if [ -r "${PKG_DBDIR}/$1/+CONTENTS" ]; then
  		while read X; do
  			case $X in
@@ -324,7 +354,7 @@
  				return 0 ;;
  			[!@]*)	break ;;
  			esac
-@@ -1134,7 +1237,7 @@
+@@ -1134,7 +1216,7 @@
  
  update_pkgdep() {
  	update_file "${PKG_DBDIR}/$1/+CONTENTS" \
@@ -333,7 +363,7 @@
  }
  
  delete_pkgdep() {
-@@ -1325,7 +1428,7 @@
+@@ -1325,7 +1407,7 @@
  
  init_install() {
  	case $1 in
@@ -342,7 +372,7 @@
  		set_pkg_vars_for_binary "$1" || return 1 ;;
  	/*)	set_port_vars "$1" || return 1 ;;
  	*)	set_port_vars "${PORTSDIR}/$1" || return 1 ;;
-@@ -1351,7 +1454,7 @@
+@@ -1351,7 +1433,7 @@
  	done
  
  	case ${replace_with} in
@@ -351,7 +381,7 @@
  		pkg_binary=${replace_with} ;;
  	?*)
  		pkg_portdir=${replace_with}
-@@ -1428,6 +1531,12 @@
+@@ -1428,6 +1510,12 @@
  do_replace() {
  	local pkg_log pkg_tmpdir old_package old_required_by preserved_files
  
@@ -364,7 +394,7 @@
  	init_replace "$1" || { status=skipped; return 0; }
  
  	if [ "${cur_pkg_name}" != "${pkg_name}" ]; then
-@@ -1482,7 +1591,9 @@
+@@ -1482,7 +1570,9 @@
  	fi
  
  	pkg_tmpdir="${tmpdir}/${cur_pkg_name}"
@@ -374,7 +404,7 @@
  
  	if ! find_package 'old_package' "${cur_pkg_name}"; then
  		old_package="${pkg_tmpdir}/${cur_pkg_name}${PKG_SUFX}"
-@@ -1491,7 +1602,11 @@
+@@ -1491,7 +1581,11 @@
  	if ! {
  		create_dir "${pkg_tmpdir}" &&
  		backup_package "${cur_pkg_name}" "${old_package}" &&
@@ -387,7 +417,7 @@
  		preserve_libs "${cur_pkg_name}"
  	}; then
  		log="backup error"
-@@ -1503,6 +1618,9 @@
+@@ -1503,6 +1597,9 @@
  		if install_package "${pkg_binary:-${pkg_portdir}}" "${pkg_log}"; then
  			status=done
  			cur_pkg_pkgdir=${PKG_DBDIR}/${pkg_name}
@@ -397,7 +427,7 @@
  		else
  			log="install error"
  			restore_package "${old_package}" || {
-@@ -1515,8 +1633,10 @@
+@@ -1515,8 +1612,10 @@
  		log="deinstall error"
  	fi
  
@@ -408,7 +438,7 @@
  	process_package "${old_package}" ||
  		warn "Failed to keep the old version."
  	clean_libs ||
-@@ -1527,7 +1647,11 @@
+@@ -1527,7 +1626,11 @@
  	case ${status} in
  	done)
  		fix_dependencies "${pkg_name}" || return 1
--- ports-mgmt__pkg_replace.diff ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309251254.r8PCsdSn005995>