New commits:
commit a63bda148e7a1b0a5a908254242d1f4902d78aaf
Author: Remko van der Vossen <wich AT sourcemage.org>
Commit: Remko van der Vossen <wich AT sourcemage.org>
graphics-libs/libpng: use find_depends.function in UP_TRIGGERS
commit 1a331b88c284d388491e39101b2df8072645c2a8
Author: Remko van der Vossen <wich AT sourcemage.org>
Commit: Remko van der Vossen <wich AT sourcemage.org>
Created some dependency discovery functions. These functions can be used
to find libtool and shared object dependencies between spells that are
not necessarily recorded in sorcery's administration.
diff --git a/ChangeLog b/ChangeLog
index 3a11229..e2adbef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2017-08-14 Remko van der Vossen <wich AT sourcemage.org>
+ * find_depends.function: dependency discovery functions
+
2017-08-14 Treeve Jelbert <treeve AT sourcemage.org>
* kirigami2: move to kde-frameworks
* kde5-extra/kirigami: deleted
diff --git a/find_depends.function b/find_depends.function
new file mode 100644
index 0000000..21756ef
--- /dev/null
+++ b/find_depends.function
@@ -0,0 +1,244 @@
+#---------------------------------------------------------------------
+## @Synopsis Set of functions for dependency discovery
+##
+## @Copyright Source Mage Team
+#---------------------------------------------------------------------
+
+#---------------------------------------------------------------------
+## Find all spells that depend on at least one of a given list of
+## libtool archives and a given list of shared objects.
+##
+## @param dependencies_var: output variable name
+## @param libtool_names: a list of libtool archive names
+## @param so_names: a list of shared object names
+## @param excluded_spells: a list of spells to be excluded
+## @stdout progress messages
+#---------------------------------------------------------------------
+function find_libtool_so_dependencies() {
+ local dependencies_var="$1" &&
+ local libtool_names="$2" &&
+ local so_names="$3" &&
+ local excluded_spells="$4" &&
+
+ LANG= &&
+ local spells=$(gaze installed | cut -d: -f1) &&
+ local spell_count=$(wc -l <<< "$spells") &&
+ local spell_index=0 &&
+ for spell in $spells; do
+ ((spell_index++)) &&
+ message -n "${DEFAULT_COLOR}[${spell_index}/${spell_count}
${spell}]\e[K\r" &&
+ if list_find "$excluded_spells" "$spell"; then
+ continue
+ fi &&
+ if spell_has_libtool_dependency $spell "$libtool_names"; then
+ list_add "$dependencies_var" $spell &&
+ continue
+ fi &&
+ if spell_has_shared_object_dependency $spell "$so_names"; then
+ list_add "$dependencies_var" "$spell"
+ fi
+ done &&
+ message
+}
+
+#---------------------------------------------------------------------
+## Find all spells that depend on at least one of a given list of
+## libtool archives
+##
+## @param dependencies_var: output variable name
+## @param libtool_names: a list of libtool archive names
+## @param excluded_spells: a list of spells to be excluded
+## @stdout progress messages
+#---------------------------------------------------------------------
+function find_libtool_dependencies() {
+ local dependencies_var="$1" &&
+ local libtool_names="$2" &&
+ local excluded_spells="$3" &&
+
+ LANG= &&
+ local spells=$(gaze installed | cut -d: -f1) &&
+ local spell_count=$(wc -l <<< "$spells") &&
+ local spell_index=0 &&
+ for spell in $spells; do
+ ((spell_index++)) &&
+ message "${DEFAULT_COLOR}[${spell_index}/${spell_count} ${spell}]\e[K\r"
&&
+ if list_find "$excluded_spells" "$spell"; then
+ continue
+ fi &&
+ if spell_has_libtool_dependency $spell "$libtool_names"; then
+ list_add "$dependencies_var" $spell
+ fi
+ done &&
+ message
+}
+
+#---------------------------------------------------------------------
+## Find all spells that depend on at least one of a given list of
+## shared objects.
+##
+## @param dependencies_var: output variable name
+## @param so_names: a list of shared object names
+## @param excluded_spells: a list of spells to be excluded
+## @stdout progress messages
+#---------------------------------------------------------------------
+function find_shared_object_dependencies() {
+ local dependencies_var="$1" &&
+ local so_names="$2" &&
+ local excluded_spells="$3" &&
+
+ LANG= &&
+ local spells=$(gaze installed | cut -d: -f1) &&
+ local spell_count=$(wc -l <<< "$spells") &&
+ local spell_index=0 &&
+ for spell in $spells; do
+ ((spell_index++)) &&
+ message "${DEFAULT_COLOR}[${spell_index}/${spell_count} ${spell}]\e[K\r"
&&
+ if list_find "$excluded_spells" "$spell"; then
+ continue
+ fi &&
+ if spell_has_shared_object_dependency $spell "$so_names"; then
+ list_add "$dependencies_var" "$spell"
+ fi
+ done &&
+ message
+}
+
+#---------------------------------------------------------------------
+## Determine whether the given spell depends on at least one of a
+## given list of libtool archives
+##
+## @param spell: spell to check for dependency
+## @param libtool_names: a list of libtool archive names
+##
+## @return 0 if the given spell depends on any of the given libtool archives
+## @return 1 if the given spell does not depend on any of the given libtool
archives
+## @return 2 if any error occurs
+#---------------------------------------------------------------------
+function spell_has_libtool_dependency() {
+ local spell="$1"
+ local libtool_names="$2"
+
+ find_spell_libtool_archives "$spell" \
+ | xargs grep --quiet --basic-regexp --file=<(sed -e 's/[.[^$\*]/\\&/g' -e
's/.*/^dependency_libs.*&/' <<< "$libtool_names")
+
+ return $(( ${PIPESTATUS[0]} > 0 ? 2 : ${PIPESTATUS[-1]} ))
+}
+
+#---------------------------------------------------------------------
+## Determine whether the given spell depends on at least one of a
+## given list of shared objects
+##
+## @param spell: spell to check for dependency
+## @param so_names: a list of shared object names
+##
+## @return 0 if the given spell depends on any of the given shared objects
+## @return 1 if the given spell does not depend on any of the given shared
objects
+## @return 2 if any error occurs
+#---------------------------------------------------------------------
+function spell_has_shared_object_dependency() {
+ local spell="$1"
+ local so_names="$2"
+
+ find_spell_dynamically_linked_ELF_objects "$spell" \
+ | xargs readelf -d 2> /dev/null \
+ | grep --quiet --basic-regexp --file=<(sed -e 's/[.[^$\*]/\\&/g' -e
's/.*/NEEDED)[[:space:]]*Shared library: \\[&/' <<< "$so_names")
+
+ return $(( (${PIPESTATUS[0]} > 0 || ${PIPESTATUS[1]} > 0) ? 2 :
${PIPESTATUS[-1]} ))
+}
+
+#---------------------------------------------------------------------
+## List all libtool archives installed by a spell
+##
+## @param spell: spell to list libtool archives for
+## @stdout a list of all libtool archives installed by the spell
+#---------------------------------------------------------------------
+function find_spell_libtool_archives() {
+ local -a file_opts
+ OPTIND=1
+ while getopts ':L' opt; do
+ case "$opt" in
+ L)
+ file_opts+=("--dereference")
+ ;;
+ \?)
+ return 1
+ ;;
+ esac
+ done
+ shift $((OPTIND - 1))
+ local spell="$1"
+
+ local magic="\
+0 search/80 .la\ -\ a\ libtool\ library\ file libtool
library file"
+
+ LANG=
+ gaze install "$spell" \
+ | file --magic-file <(echo "$magic") "${file_opts[@]}" --files-from - \
+ | sed -n -e '/\<libtool library file\>/s/:.*//p'
+}
+
+#---------------------------------------------------------------------
+## List all shared objects installed by a spell
+##
+## @param spell: spell to list shared objects for
+## @stdout a list of all shared objects installed by the spell
+#---------------------------------------------------------------------
+function find_spell_shared_objects() {
+ local -a file_opts
+ OPTIND=1
+ while getopts ':L' opt; do
+ case $opt in
+ L)
+ file_opts+=("--dereference")
+ ;;
+ \?)
+ return 1
+ ;;
+ esac
+ done
+ shift $((OPTIND - 1))
+ local spell="$1"
+
+ local magic="\
+0 string \177ELF ELF
+>5 byte 1 LSB
+>>16 leshort 3 shared object,
+>5 byte 2 MSB
+>>16 beshort 3 shared object,"
+
+ LANG=
+ gaze install "$spell" \
+ | file --magic-file <(echo "$magic") "${file_opts[@]}" --files-from - \
+ | sed -n -e '/\<ELF\>.*\<shared object\>/s/:.*//p'
+}
+
+#---------------------------------------------------------------------
+## List all dynamically linked ELF objects installed by a spell
+##
+## @param spell: spell to list dynamically linked ELF objects for
+## @stdout a list of all dynamically linked ELF objects installed by the
spell
+#---------------------------------------------------------------------
+function find_spell_dynamically_linked_ELF_objects() {
+ local -a file_opts
+ OPTIND=1
+ while getopts ':L' opt; do
+ case "$opt" in
+ L)
+ file_opts+=("--dereference")
+ ;;
+ \?)
+ return 1
+ ;;
+ esac
+ done
+ shift $((OPTIND - 1))
+ local spell="$1"
+
+ local magic="\
+0 string \177ELF ELF"
+
+ LANG=
+ gaze install "$spell" \
+ | file --magic-file <(echo "$magic") "${file_opts[@]}" --files-from - \
+ | sed -n -e '/\<ELF\>.*\<dynamically linked\>/s/:.*//p'
+}
diff --git a/graphics-libs/libpng/HISTORY b/graphics-libs/libpng/HISTORY
index 7102a55..20026a0 100644
--- a/graphics-libs/libpng/HISTORY
+++ b/graphics-libs/libpng/HISTORY
@@ -1,3 +1,6 @@
+2017-08-14 Remko van der Vossen <wich AT sourcemage.org>
+ * UP_TRIGGERS: use find_depends.function
+
2017-07-30 Treeve Jelbert <treeve AT sourcemage.org>
* DETAILS: version 1.6.31
diff --git a/graphics-libs/libpng/UP_TRIGGERS
b/graphics-libs/libpng/UP_TRIGGERS
index cea76ff..8776834 100755
--- a/graphics-libs/libpng/UP_TRIGGERS
+++ b/graphics-libs/libpng/UP_TRIGGERS
@@ -1,40 +1,18 @@
-
if spell_ok $SPELL; then
+ . "$GRIMOIRE/find_depends.function"
+
local OLD_SPELL_VERSION="$(installed_version $SPELL)" &&
if [[ "${VERSION%.*}" != "${OLD_SPELL_VERSION%.*}" ]]; then
message
message "${MESSAGE_COLOR}This is an ABI incompatible update of
${SPELL_COLOR}${SPELL}${MESSAGE_COLOR}..." &&
message "Determining which spells need to be recast, this may take a
while." &&
- LANG= &&
- local spells=$(gaze installed | cut -d: -f1) &&
- local spell_count=$(wc -w <<< "$spells") &&
- local spell_index=0 &&
- local recast_list= &&
- for other_spell in $spells; do
- ((spell_index++)) &&
- echo -ne "[${spell_index}/${spell_count} ${other_spell}]\e[K\r" &&
- if [[ "$other_spell" == "$SPELL" ]]; then
- continue
- fi &&
- if gaze install $other_spell \
- | file -f - -e apptype -e cdf -e compress -e elf -e encoding -e
soft -e tar \
- | grep '\<libtool library file\>' \
- | cut -d: -f1 \
- | xargs cat 2> /dev/null \
- | grep -q "^dependency_libs.*${SPELL}[0-9]*\.la"; then
- list_add recast_list $other_spell &&
- continue
- fi &&
- if gaze install $other_spell \
- | file -f - -e apptype -e ascii -e cdf -e compress -e encoding -e
soft -e tar \
- | grep '\<ELF\>.*\<dynamically linked\>' \
- | cut -d: -f1 \
- | xargs readelf -d 2> /dev/null \
- | grep -q "NEEDED)[[:space:]]*Shared library: \[$SPELL"; then
- list_add recast_list $other_spell
- fi
- done
+ local recast_list &&
+ local libtool_names="$(find_spell_libtool_archives -L "$SPELL" | xargs
basename -a)"
+ local so_names="$(find_spell_shared_objects "$SPELL" | xargs readelf -d
| sed -n -e '/SONAME/s/^.*\[\([^]]*\).*/\1/p')"
+
+ find_libtool_so_dependencies recast_list "$libtool_names" "$so_names"
"$SPELL"
+
if [[ -n "${recast_list}" ]]; then
message "
${SPELL_COLOR}${PROBLEM_COLOR}You are about to upgrade (downgrade)
${SPELL_COLOR}${SPELL}${PROBLEM_COLOR} to a different major version.
@@ -47,6 +25,7 @@ cast." &&
message "${MESSAGE_COLOR}The following spells will be dispelled and
recast:" &&
message $(fold -s -w 72 <<< "${SPELL_COLOR}${recast_list}") &&
query "${QUERY_COLOR}Do you wish to upgrade (downgrade)
${SPELL_COLOR}${SPELL}${QUERY_COLOR} now?" n &&
+ local other_spell &&
for other_spell in $recast_list; do
dispel $other_spell &&
up_trigger $other_spell cast_self
[SM-Commit] GIT changes to master grimoire by Remko van der Vossen (d7f8ec1a3ee101319b3fdf2c1787121d5a361adc),
Remko van der Vossen, 08/15/2017