ports/182371: ports-mgmt/pkg_replace: fixup pattrn matching in pkg_glob() function
Iouri Ivliev
ii at any.com.ru
Wed Sep 25 13:00:03 UTC 2013
>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 at 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:
More information about the freebsd-ports-bugs
mailing list