OSDN Git Service

[BUG FIX] Error messages from failed detection of option configuration were not output.
[portsreinstall/current.git] / lib / libdatabase_build.sh
index 7446ed0..0b83431 100644 (file)
@@ -2,7 +2,7 @@
 # ==============================================================================
 # 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.
 # ==============================================================================
 
@@ -342,9 +342,14 @@ database_build_update_pkgname ()
        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" || :`
@@ -355,7 +360,7 @@ database_build_update_pkgname ()
                fi
                [ -n "$pkg" ] && echo "$pkg"
                :
-       done > $savefile
+       done | sort -u > $savefile
        cat "$savefile"
 }
 
@@ -454,7 +459,7 @@ database_build_is_currentpkg_latest ()
 # ============= 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
@@ -498,10 +503,19 @@ database_build_inspect_dependencies ()
                                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
@@ -514,7 +528,14 @@ database_build_inspect_dependencies ()
                                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
@@ -527,6 +548,7 @@ database_build_inspect_dependencies ()
                        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 || :
@@ -617,24 +639,115 @@ database_build_inspect_dependencies ()
        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"
 }
@@ -655,14 +768,11 @@ database_build_inspect_necessity_for_only_new_upgrade ()
                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}"
 }
@@ -680,14 +790,17 @@ database_build_complement_to_new_dependents_for_targets ()
        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