# ==============================================================================
# portsreinstall library script
# - Operations for building the temporary database -
-# Copyright (C) 2013-2014 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
+# Copyright (C) 2013-2016 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
# This software is distributed under the 2-Clause BSD License.
# ==============================================================================
local origin pkg savefile origin_orig
origin=$1
savefile=${DBDIR}/requires/$origin/current_version
- origin_orig=`echo "$origin" \
- | sed -E -f "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern"` || :
- [ "x$origin_orig" = "x$origin" ] && origin_orig=
+ if [ -e "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern" ]
+ then
+ origin_orig=`echo "$origin" \
+ | sed -E -f "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern"` || :
+ [ "x$origin_orig" = "x$origin" ] && origin_orig=
+ else
+ origin_orig=
+ fi
echo "$origin_orig" "$origin" | tr ' ' '\n' | grep -v '^$' | while read orig
do
pkg=`pkg_info_qO "$orig" || :`
fi
[ -n "$pkg" ] && echo "$pkg"
:
- done > $savefile
+ done | sort -u > $savefile
cat "$savefile"
}
# ============= Recursively inspect dependencies of a port and build a node database of the information =============
database_build_inspect_dependencies ()
{
- local origin_orig origin_dependent origin_orig_regexp origin origin_regexp tag stage dbpath origin_id origin_dependency DEPTH_INDEX_orig nlines iline dist_subdir_rpl inspected_level inspected_levels_compatible origin_tmp inspected_level_tmp conf_updated
+ local origin_orig origin_dependent origin_orig_regexp origin origin_regexp tag stage dbpath origin_id origin_dependency DEPTH_INDEX_orig nlines iline dist_subdir_rpl inspected_level inspected_levels_compatible origin_tmp inspected_level_tmp conf_updated tmp_portsdb_work tmp_portopt
origin_orig=$1
origin_dependent=$2
[ -z "$origin_orig" ] && return
cp -R "${DBDIR}/conf/each_port/$origin/"* "$dbpath/" > /dev/null 2>&1 || :
fi
tmp_portsdb_work=${TMPDIR}/database_build_inspect_dependencies:portsdb_work
+ tmp_portopt=${TMPDIR}/database_build_inspect_dependencies:portopt
[ -d "$tmp_portsdb_work" ] || mkdir "$tmp_portsdb_work"
( set -e
export PORT_DBDIR=$tmp_portsdb_work
- database_build_make "$origin" showconfig > $dbpath/ports_options.default
+ export __MAKE_CONF=
+ if database_build_make "$origin" showconfig > $tmp_portopt
+ then
+ cp "$tmp_portopt" "$dbpath"/ports_options.default
+ else
+ cat "$tmp_portopt" >&2
+ message_echo 'Error in detecting the default options.' 2>&1
+ exit 1
+ fi
)
if [ `wc -c < $dbpath/ports_options.default` -gt 0 ]
then
else
database_build_make "$origin" config-conditional
fi
- database_build_make "$origin" showconfig > $dbpath/ports_options.current
+ if database_build_make "$origin" showconfig > $tmp_portopt
+ then
+ cp "$tmp_portopt" "$dbpath"/ports_options.current
+ else
+ cat "$tmp_portopt" >&2
+ message_echo 'Error in detecting the current options.' 2>&1
+ exit 1
+ fi
else
cp /dev/null "$dbpath/ports_options.current"
fi
do
database_build_make "$origin" $tag-depends-list \
| sed -E "s/^`str_escape_regexp "${PORTSDIR}"`\///" \
+ | grep -Ev "`pkgsys_pkgtools_ports_filter_regexp`" \
> $dbpath/requirements.$tag.orig || :
sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern" "$dbpath/requirements.$tag.orig" \
| grep -v '^$' > $dbpath/requirements.$tag.src || :
DEPTH_INDEX=${DEPTH_INDEX_orig}
}
+# ============= Filter ignored dependencies from a list given by the standard input =============
+database_build_filter_ignored_requirements ()
+{
+ local origin pattern
+ origin=$1
+ pattern=${DBDIR}/requires/$origin/ignored_requirements.regexp
+ if [ -e "$pattern" ]
+ then
+ grep -Evq -f "$pattern"
+ else
+ cat
+ fi 2> /dev/null || :
+}
+
# ============= Build and get a list of the complete recursive dependencies of a port =============
database_build_get_complete_recursive_dependency ()
{
- local table origin dbpath suffix dstfile
- table=$1
+ local tag origin suffix tmppath dbpath srcfile dstfile origin_esc num_parents loophead dstfile_tmp tmpdstpath index_loop loop_len origin_target origin_ref dbpath_target origin_ref_esc
+ tag=$1
origin=$2
suffix=$3
+ tmppath=${TMPDIR}/database_build_get_complete_recursive_dependency
dbpath=${DBDIR}/requires/$origin
- [ -e "$dbpath/$table.direct$suffix" ] || return 0
- dstfile=$dbpath/$table.full$suffix
+ srcfile=$dbpath/requirements.${tag}.direct${suffix}
+ dstfile=$dbpath/requirements.${tag}.full${suffix}
+ if [ ! -e "$srcfile" ]
+ then
+ [ -d "$dbpath" ] && rm -f "$dstfile"
+ return 0
+ fi
if [ ! -e "$dstfile" ]
then
- while read origin_requirement
+ origin_esc=`str_escape_regexp "$origin"`
+ touch "$tmppath.parents"
+ num_parents=`wc -l < $tmppath.parents`
+ if grep -Eq "^$origin_esc$" "$tmppath.parents"
+ then
+ loophead=`grep -En "^$origin_esc$" "$tmppath.parents" | tail -n 1 | cut -d : -f 1`
+ if [ "x$opt_force_continuation_for_looped_dependency" = xno ]
+ then
+ message_echo "ERROR: The following loop was found for requirements.${tag}${suffix}:" >&2
+ else
+ message_echo "WARNING: The following loop was found for requirements.${tag}${suffix}:" >&2
+ fi
+ message_echo " $origin" >&2
+ sed -n $(($loophead+1)),\$p "$tmppath.parents" > $tmppath.ports_in_loop.tmp
+ sed 's/^/ -->/' "$tmppath.ports_in_loop.tmp" | message_cat >&2
+ message_echo " -->$origin" >&2
+ if [ "x$opt_disallow_force_continuation_for_looped_dependency" = xyes ]
+ then
+ message_echo 'Resolve the problem manually and then retry by executing' >&2
+ message_echo " ${APPNAME} reset keepopts" >&2
+ message_echo " ${APPNAME}" >&2
+ exit 1
+ else
+ message_echo 'Exploring a node port to terminate the loop by evaluating only build-and-run-time dependencies as essential ones.' >&2
+ echo "$origin" > $tmppath.ports_in_loop
+ cat "$tmppath.ports_in_loop.tmp" >> $tmppath.ports_in_loop
+ echo "$origin" >> $tmppath.ports_in_loop
+ index_loop=1
+ loop_len=`wc -l < $tmppath.ports_in_loop`
+ while [ $index_loop -lt $loop_len ]
+ do
+ origin_target=`sed -n ${index_loop}p "$tmppath.ports_in_loop"`
+ origin_ref=`sed -n $((${index_loop}+1))p "$tmppath.ports_in_loop"`
+ dbpath_target=${DBDIR}/requires/$origin_target
+ origin_ref_esc=`str_escape_regexp "$origin_ref"`
+ if ! grep -Eq "^$origin_ref_esc$" "$dbpath_target/requirements.run.direct${suffix}" 2> /dev/null || \
+ ! grep -Eq "^$origin_ref_esc$" "$dbpath_target/requirements.build.direct${suffix}" 2> /dev/null
+ then
+ message_echo 'INFO: The dependency of '$origin_target' on '$origin_ref' is ignored to terminate the loop.' >&2
+ break
+ fi
+ index_loop=$((${index_loop}+1))
+ done
+ if [ $index_loop -eq $loop_len ]
+ then
+ message_echo 'WARNING: The loop cannot be resolved. Continuing by forcible ignorance of the dependency of '$origin_target' on '$origin_ref'. This may cause confusion in the later processes.' >&2
+ fi
+ for suffix_tmp in '' .orig
+ do
+ for tag_tmp in run build
+ do
+ grep -Eq "^$origin_ref_esc$" "$dbpath_target/requirements.${tag_tmp}.direct${suffix_tmp}" 2> /dev/null && \
+ fileedit_add_a_line_if_new "$origin_ref" "$dbpath_target/ignored_requirements.${tag_tmp}${suffix_tmp}"
+ done
+ cat "$dbpath_target/ignored_requirements.run${suffix_tmp}" "$dbpath_target/ignored_requirements.build${suffix_tmp}" 2> /dev/null | sort -u > $dbpath_target/ignored_requirements.all${suffix_tmp}
+ done
+ cat "$dbpath_target/ignored_requirements.all"* 2> /dev/null | sort -u | str_escape_regexp_filter | sed 's/^/^/;s/$/$/' > $dbpath_target/ignored_requirements.regexp
+ fi
+ fi
+ echo "$origin" >> $tmppath.parents
+ tmpdstpath=${TMPDIR}/requires/$origin
+ dstfile_tmp=$tmpdstpath/requirements.${tag}.full${suffix}
+ [ -d "$tmpdstpath" ] || mkdir -p "$tmpdstpath"
+ database_build_filter_ignored_requirements "$origin" < $srcfile | while read origin_requirement
do
+ database_build_get_complete_recursive_dependency "$tag" "$origin_requirement" "$suffix" > $tmppath.recursive_dependency
+ [ -e "$dbpath/ignored_requirements.regexp" ] && echo "$origin_requirement" | grep -Eq -f "$dbpath/ignored_requirements.regexp" && continue
echo "$origin_requirement"
- database_build_get_complete_recursive_dependency "$table" "$origin_requirement" "$suffix"
- done < $dbpath/$table.direct$suffix | sort -u > $dstfile.tmp
- mv "$dstfile.tmp" "$dstfile"
+ cat "$tmppath.recursive_dependency"
+ done > $dstfile_tmp
+ sed -n ${num_parents}p "$tmppath.parents" > $tmppath.parents.tmp
+ mv "$tmppath.parents.tmp" "$tmppath.parents"
+ if [ ! -e "$dstfile" ]
+ then
+ sort -u "$dstfile_tmp" > $dstfile
+ rm "$dstfile_tmp"
+ fi
fi
cat "$dstfile"
}
sort -u "$dbpath/requirements.build.direct" "$dbpath/requirements.run.${level}" || :
else
cat "$dbpath/requirements.run.${level}" || :
- fi 2> /dev/null > $tmpfile
- if [ `wc -l < $tmpfile` -gt 0 ]
- then
- while read origin_requirement
- do
- database_build_inspect_necessity_for_only_new_upgrade "$origin_requirement" "$level"
- done < $tmpfile
- fi
+ fi 2> /dev/null | database_build_filter_ignored_requirements "$origin" > $tmpfile
+ while read origin_requirement
+ do
+ database_build_inspect_necessity_for_only_new_upgrade "$origin_requirement" "$level"
+ done < $tmpfile
rm "$tmpfile"
touch "$dbpath/necessary_port.${level}"
}
then
for level in direct full
do
- cat "$reqdir/requirements.all.${level}" 2> /dev/null | while read origin_requirement
+ cat "$reqdir/requirements.all.${level}" 2> /dev/null | \
+ database_build_filter_ignored_requirements "$origin" | \
+ while read origin_requirement
do
fileedit_add_a_line_if_new "$origin" \
"${DBDIR}/targets/$origin_requirement/complement_for_new_dependents.${level}"
done
done
- cat "$reqdir/requirements.all.direct" "$reqdir/requirements.all.full" 2> /dev/null \
- | sort -u | while read origin_requirement
+ cat "$reqdir/requirements.all.direct" "$reqdir/requirements.all.full" 2> /dev/null | \
+ sort -u | database_build_filter_ignored_requirements "$origin" | \
+ while read origin_requirement
do
database_build_complement_to_new_dependents_for_targets "$origin_requirement"
done