OSDN Git Service

Some bug fix related to thw workaround for the looped dependencies.
[portsreinstall/current.git] / lib / libdatabase_build.sh
index 22e9ed6..5097269 100644 (file)
@@ -2,7 +2,7 @@
 # ==============================================================================
 # portsreinstall library script
 # - Operations for building the temporary database -
-# Copyright (C) 2013 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.
 # ==============================================================================
 
@@ -17,7 +17,7 @@ database_build_create ()
        misc_lock_duplicated_executions "${DBDIR}/.lock"
        if [ -e "${DBDIR}/MYVERSION" ]
        then
-               if ! grep -m 1 -E "$COMPATIBLE_VERSIONS" "${DBDIR}/MYVERSION" > /dev/null 2>&1
+               if ! grep -q -E "$COMPATIBLE_VERSIONS" "${DBDIR}/MYVERSION" 2> /dev/null
                then
                        message_echo "ERROR: The current temporary database is incompatible. You must delete it by" >&2
                        message_echo "        ${APPNAME} clean force" >&2
@@ -98,7 +98,8 @@ database_build_register_obsolete_port ()
                do
                        for tag in all run build
                        do
-                               ln -f "${DBDIR}/initial/$origin/${table}.${tag}.${level}" "$dbpath/${table}.${tag}.${level}.src"
+                               srcfile=${DBDIR}/initial/$origin/${table}.${tag}.${level}
+                               [ -e "$srcfile" ] && ln -f "$srcfile" "$dbpath/${table}.${tag}.${level}.src"
                        done
                done
        done
@@ -159,9 +160,16 @@ database_build_setup_make_args ()
                do
                        eval echo $key=\$$key
                done
-               echo 'FORCE_PKG_REGISTER=yes'
                echo 'DISABLE_VULNERABILITIES=yes'
-               [ $opt_apply_default_config = yes ] && echo 'BATCH=yes'
+               if [ $opt_apply_default_config = yes ]
+               then
+                       if pkgsys_is_dialog4ports_used
+                       then
+                               echo 'NO_DIALOG=yes'
+                       else
+                               echo 'BATCH=yes'
+                       fi
+               fi
                dbdir=${DBDIR}/requires/$origin
                [ -d "$dbdir" ] || dbdir=${DBDIR}/conf/each_port/$origin
                cat "$dbdir/MARG.conf" 2> /dev/null || :
@@ -207,11 +215,13 @@ database_build_setup_initial_node ()
                do
                        origin_requirement=`pkgsys_init_pkg_orig_by_ambiguous_matching "$requirement" || :`
                        [ -n "$origin_requirement" ] && echo "$origin_requirement"
+                       :
                done > $dbpath/requirements.all.full
                pkg_info_qR "$pkg" | while read dependent
                do
                        origin_dependent=`pkgsys_init_pkg_orig_by_ambiguous_matching "$dependent" || :`
                        [ -n "$origin_dependent" ] && echo "$origin_dependent"
+                       :
                done > $dbpath/dependents.all.full
                for table in dependents requirements
                do
@@ -246,7 +256,7 @@ database_build_setup_replace_node ()
                rm -rf "$dbpath"
                mkdir -p "$dbpath"
                origin=$origin_orig
-               if echo "$origin_orig" | grep -m 1 -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern" > /dev/null
+               if echo "$origin_orig" | grep -q -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern"
                then
                        origin=`echo "$origin_orig" | sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern"`
                        if [ "x$origin_orig" != "x$origin" ]
@@ -318,8 +328,8 @@ database_build_is_port_already_inspected_in_required_level ()
        [ -n "$origin_actual" ] || origin_actual=$origin
        origin_esc='^'`str_escape_regexp "$origin_actual"`'$'
        inspected_level=`database_build_get_inspected_level "$origin_actual" "$origin_dependent"`
-       grep -m 1 -E "^$origin_esc$" "${DBDIR}/ports.inspected.${inspected_level}.list" \
-               "${DBDIR}/obsolete_ports" > /dev/null 2>&1 || return
+       grep -q -E "^$origin_esc$" "${DBDIR}/ports.inspected.${inspected_level}.list" \
+               "${DBDIR}/obsolete_ports" 2> /dev/null || return
        fileedit_rm_a_line "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
        [ "x$origin" = "$origin_actual" ] || \
                fileedit_rm_a_line "$origin_actual" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
@@ -329,16 +339,28 @@ database_build_is_port_already_inspected_in_required_level ()
 # ============= Update the current package name of a port =============
 database_build_update_pkgname ()
 {
-       local origin pkg savefile
+       local origin pkg savefile origin_orig
        origin=$1
        savefile=${DBDIR}/requires/$origin/current_version
-       pkg=`pkg_info_qO "$origin" || :`
-       if [ -z "$pkg" -a -e "${DBDIR}/requires/$origin/initial_orig" ]
+       if [ -e "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern" ]
        then
-               origin_orig=`cat "${DBDIR}/requires/$origin/initial_orig"`
-               pkg=`pkg_info_qO "$origin_orig" || :`
+               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 -n "$pkg" > $savefile
+       echo "$origin_orig" "$origin" | tr ' ' '\n' | grep -v '^$' | while read orig
+       do
+               pkg=`pkg_info_qO "$orig" || :`
+               if [ -z "$pkg" -a -e "${DBDIR}/requires/$orig/initial_orig" ]
+               then
+                       orig_init=`cat "${DBDIR}/requires/$orig/initial_orig"`
+                       pkg=`pkg_info_qO "$orig_init" || :`
+               fi
+               [ -n "$pkg" ] && echo "$pkg"
+               :
+       done > $savefile
        cat "$savefile"
 }
 
@@ -404,9 +426,9 @@ database_build_update_pkgtag ()
 {
        local origin pkg_init pkg_bak pkg_cur detail pkgtag
        origin=$1
-       pkg_init=`cat "${DBDIR}/requires/$origin/installed_version" 2> /dev/null || :`
-       pkg_bak=`cat "${DBDIR}/requires/$origin/backedup_version" 2> /dev/null || :`
-       pkg_cur=`database_build_get_pkgname "$origin"`
+       pkg_init=`cat "${DBDIR}/requires/$origin/installed_version" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
+       pkg_bak=`cat "${DBDIR}/requires/$origin/backedup_version" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
+       pkg_cur=`database_build_get_pkgname "$origin" | tr '\n' ' ' | sed 's/ *$//'`
        detail=
        if [ "x$pkg_init" != "x$pkg_cur" ]
        then
@@ -429,7 +451,7 @@ database_build_is_currentpkg_latest ()
 {
        local origin pkg_cur pkg_new
        origin=$1
-       pkg_cur=`database_build_get_pkgname "$origin"`
+       pkg_cur=`database_build_get_pkgname "$origin" | tr '\n' ' ' | sed 's/ *$//'`
        pkg_new=`database_build_get_new_pkgname "$origin"`
        [ "x$pkg_cur" = "x$pkg_new" ]
 }
@@ -465,7 +487,7 @@ database_build_inspect_dependencies ()
                if [ ! -e "$dbpath/complete_as_node" ]
                then
                        conf_updated=
-                       if grep -m 1 -E -e "^$origin_orig_regexp$" -e "^$origin_regexp$" "${DBDIR}/to_be_reconf" > /dev/null 2>&1
+                       if grep -q -E -e "^$origin_orig_regexp$" -e "^$origin_regexp$" "${DBDIR}/to_be_reconf" 2> /dev/null
                        then
                                message_echo "${DEPTH_INDEX}  ===> Reconfigured"
                                conf_updated=y
@@ -490,17 +512,8 @@ database_build_inspect_dependencies ()
                        then
                                if [ $opt_apply_default_config = yes ]
                                then
-                                       if pkgsys_is_dialog4ports_used
+                                       if pkgsys_is_dialog4ports_used
                                        then
-                                               if [ -n "$SCRIPT" ]
-                                               then
-                                                       message_echo "ERROR: script(1) prevents automatic configurations of port options via dialog4ports(1) (at least found for dialog4ports-0.1.3)." >&2
-                                                       message_echo "If you want to enable the automatic configurations, rerun outside of script(1) environment at least until the end of section [Inspecting dependencies of the all installed packages]." >&2
-                                                       message_echo "If you can accept interactive configurations, disable -C option with the aid of -M option." >&2
-                                                       exit 1
-                                               fi
-                                               printf '\n' | database_build_make "$origin" config-conditional
-                                       else
                                                printf '\t\n' | database_build_make "$origin" config-conditional > /dev/null
                                        fi
                                else
@@ -515,11 +528,11 @@ database_build_inspect_dependencies ()
                                cp "${DBDIR}/initial/$origin_orig/installed_version" "$dbpath" 2> /dev/null || :
                        fi
                        database_build_create_pkgtag "$origin"
-#                      for tag in all run build
                        for tag in run build
                        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 || :
@@ -528,13 +541,9 @@ database_build_inspect_dependencies ()
                        do
                                sort -u "$dbpath/requirements.run.${stage}" "$dbpath/requirements.build.${stage}" \
                                        > $dbpath/requirements.all.direct.${stage}
-#                              mv "$dbpath/requirements.all.${stage}" "$dbpath/requirements.all.full.${stage}"
                                mv "$dbpath/requirements.build.${stage}" "$dbpath/requirements.build.direct.${stage}"
                                mv "$dbpath/requirements.run.${stage}" "$dbpath/requirements.run.direct.${stage}"
                        done
-       #                       grep -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern" "$dbpath/requirements.all.full.orig" \
-       #                               | grep -v -E "^`str_escape_regexp \"$origin\"`$" \
-       #                               | fileedit_add_lines_if_new "${DBDIR}/replaced_dest_ports.list" || :
                        touch "$dbpath/complete_as_node"
                        fileedit_rm_a_line "$origin_orig" "${DBDIR}/to_be_reconf"
                        fileedit_rm_a_line "$origin" "${DBDIR}/to_be_reconf"
@@ -557,8 +566,6 @@ database_build_inspect_dependencies ()
                inspected_level=`database_build_get_inspected_level "$origin" "$origin_dependent"`
                case $inspected_level in
                full)
-#                      grep -v -E -f "${DBDIR}/installed_ports.grep_pattern" \
-#                              "$dbpath/requirements.all.full.src" > ${TMPDIR}/missing.$origin_id || :
                        grep -v -E -f "${DBDIR}/installed_ports.grep_pattern" \
                                "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || :
                        inspected_levels_compatible='full direct node'
@@ -566,7 +573,6 @@ database_build_inspect_dependencies ()
                direct)
                        grep -v -E -f "${DBDIR}/installed_ports.grep_pattern" \
                                "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || :
-#                      cp "$dbpath/requirements.all.direct.src" "${TMPDIR}/missing.$origin_id"
                        inspected_levels_compatible='direct node'
                        ;;
                node)
@@ -580,8 +586,8 @@ database_build_inspect_dependencies ()
                do
                        origin_dependency=`sed -n ${iline}p "${TMPDIR}/missing.$origin_id"`
                        iline=$(($iline+1))
-                       grep -m 1 -E '^'`str_escape_regexp "$origin_dependency"`'$' \
-                               "${DBDIR}/ports.inspected.list" > /dev/null 2>&1 && \
+                       grep -q -E '^'`str_escape_regexp "$origin_dependency"`'$' \
+                               "${DBDIR}/ports.inspected.list" 2> /dev/null && \
                                        continue
                        database_build_inspect_dependencies "$origin_dependency" "$origin"
                done
@@ -617,23 +623,112 @@ 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_dependencies_to_break_loops.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 dstfile
+       local table 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
        table=$1
-       origin=$2
+       tag=$2
+       origin=$3
+       suffix=$4
+       tmppath=${TMPDIR}/database_build_get_complete_recursive_dependency
        dbpath=${DBDIR}/requires/$origin
-       [ -e "$dbpath/$table.direct" ] || return 0
-       dstfile=$dbpath/$table.full
-       if [ ! -e "$dbpath/$table" -a ! -e "$dstfile" ]
+       srcfile=$dbpath/${table}.${tag}.direct${suffix}
+       dstfile=$dbpath/${table}.${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 ${table}.${tag}${suffix}:" >&2
+                       else
+                               message_echo "WARNING: The following loop was found for ${table}.${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 if possible, and then restart by executing' >&2
+                               message_echo "        ${APPNAME} reset keepopts" >&2
+                               message_echo "        ${APPNAME}" >&2
+                               message_echo 'Otherwise, you may attempt a forcible continuation by executing' >&2
+                               message_echo "        ${APPNAME} -f" >&2
+                               exit 1
+                       else
+                               message_echo 'Exploring a node port to terminate the loop by evaluating only build-and-run-time dependencies as essential.' >&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/${table}.run.direct${suffix}" 2> /dev/null || \
+                                               ! grep -Eq "^$origin_ref_esc$" "$dbpath_target/${table}.build.direct${suffix}" 2> /dev/null
+                                       then
+                                               fileedit_add_a_line_if_new "$origin_ref" "$dbpath_target/ignored_dependencies_to_break_loops"
+                                               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
+                                       fileedit_add_a_line_if_new "$origin_ref" "$dbpath_target/ignored_dependencies_to_break_loops"
+                                       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
+                               str_escape_regexp_filter < $dbpath_target/ignored_dependencies_to_break_loops | sed 's/^/^/;s/$/$/' > $dbpath_target/ignored_dependencies_to_break_loops.regexp
+                       fi
+               fi
+               echo "$origin" >> $tmppath.parents
+               tmpdstpath=${TMPDIR}/requires/$origin
+               dstfile_tmp=$tmpdstpath/${table}.${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 "$table" "$tag" "$origin_requirement" "$suffix" > $tmppath.recursive_dependency
+                       origin_requirement_esc=`str_escape_regexp "$origin_requirement"`
+                       grep -Eq "^$origin_requirement_esc$" "$dbpath/ignored_dependencies_to_break_loops" 2> /dev/null && continue
                        echo "$origin_requirement"
-                       database_build_get_complete_recursive_dependency "$table" "$origin_requirement"
-               done < $dbpath/$table.direct | 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"
 }
@@ -647,21 +742,18 @@ database_build_inspect_necessity_for_only_new_upgrade ()
        origin=$1
        level=$2
        dbpath=${DBDIR}/requires/$origin
-       [ -e "$dbpath/necessary_port.${level}" ] && return
+       [ ! -d "$dbpath" -o -e "$dbpath/necessary_port.${level}" ] && return
        tmpfile=${TMPDIR}/database_build_inspect_necessity_for_only_new_upgrade:`echo "$origin" | tr / :`
        if database_query_does_a_port_need_update "$origin"
        then
                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}"
 }
@@ -679,14 +771,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
@@ -741,63 +836,6 @@ eof
                done
        done
        touch "$dbdir/COMPLETE_ATTRS"
-#      local origin dbdir reqdir _is_all _is_target _is_requires_requirements _is_initial_requirements _is_requires_dependents _is_initial_dependents _is_requires_requirements_complement _is_relevant tag level database table
-#      _is_all=y
-#      _is_target=
-#      _is_requires_requirements=
-#      _is_initial_requirements=
-#      _is_requires_dependents=
-#      _is_initial_dependents=
-#      _is_relevant=y
-#      origin_esc=`str_escape_regexp "$origin"`
-#      target_${database}_${table}.${tag}.${level}
-#      if [ `cat "${DBDIR}/stage.loop_list/target_requirements.specified" 2> /dev/null | wc -l` -gt 0 ]
-#      then
-#              if [ -e "$nodedir_req/installed_version" ]
-#              then
-#                      deptag=`options_get_dependency_type`
-#              else
-#                      deptag=all
-#              fi
-#              _is_all=
-#              if grep -m 1 -E "^$origin_esc$" \
-#                      "${DBDIR}/stage.loop_list/target_requirements.specified" > /dev/null 2>&1
-#              then
-#                      _is_target=y
-#              elif [ -e "$nodedir_req/dependents.$deptag.pattern" ] && \
-#                      grep -m 1 -E -f "$nodedir_req/dependents.$deptag.pattern" \
-#                              "${DBDIR}/stage.loop_list/target_requirements.specified" > /dev/null 2>&1
-#              then
-#                      _is_requires_requirements=y
-#              elif [ -e "$nodedir_ini/dependents.$deptag.pattern" ] && \
-#                      grep -m 1 -E -f "$nodedir_ini/dependents.$deptag.pattern" \
-#                              "${DBDIR}/stage.loop_list/target_requirements.specified" > /dev/null 2>&1
-#              then
-#                      _is_initial_requirements=y
-#              fi
-#      fi
-#      if [ `cat "${DBDIR}/stage.loop_list/target_dependents.specified" 2> /dev/null | wc -l` -gt 0 ]
-#      then
-#              deptag=`options_get_dependency_type`
-#              _is_all=
-#              if [ -n "${_is_target}" ] \
-#                      || grep -m 1 -E "^$origin_esc$" "${DBDIR}/stage.loop_list/target_dependents.specified" \
-#                              > /dev/null 2>&1
-#              then
-#                      _is_target=y
-#              elif [ -e "$nodedir_req/requirements.$deptag.pattern" ] && \
-#                      grep -m 1 -E -f "$nodedir_req/requirements.$deptag.pattern" \
-#                              "${DBDIR}/stage.loop_list/target_dependents.specified" > /dev/null 2>&1
-#              then
-#                      _is_requires_dependents=y
-#              elif [ -e "$nodedir_ini/requirements.$deptag.pattern" ] && \
-#                      grep -m 1 -E -f "$nodedir_ini/requirements.$deptag.pattern" \
-#                              "${DBDIR}/stage.loop_list/target_dependents.specified" > /dev/null 2>&1
-#              then
-#                      _is_initial_dependents=y
-#              fi
-#      fi
-# eof
 }
 
 # ============= Order the ports considering dependencies =============
@@ -848,7 +886,6 @@ END {
                        if (srcsize[it] > 0) continue;
                        is_operated = 1;
                        target = srcikey[it];
-#                      print "[" icycle "]-- " target;
                        delete srcikey[it];
                        order[norder++] = target;
                        order_str = order_str lf_order_str;
@@ -918,8 +955,10 @@ _database_build_reset_a_port_confdb ()
                        for tabel in requirements dependents
                        do
                                cat "${DBDIR}/$dbtag/$origin/$tabel.all.full" 2> /dev/null || :
+                               cat "${DBDIR}/$dbtag/$origin/$tabel.all.full.orig" 2> /dev/null || :
                                rm -f "${DBDIR}/$dbtag/$origin/$tabel.run.full" \
-                                       "${DBDIR}/$dbtag/$origin/$tabel.build.full" 2> /dev/null
+                                       "${DBDIR}/$dbtag/$origin/$tabel.build.full" \
+                                       "${DBDIR}/$dbtag/$origin/is_customized" 2> /dev/null
                        done
                done
        } | sort -u >> ${DBDIR}/inspected_ports.update
@@ -930,119 +969,47 @@ _database_build_reset_a_port_confdb ()
        fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports"
        fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.list"
        cat "${DBDIR}/replace/$origin/origin" 2> /dev/null || :
-#      if [ ! -d "${PORTSDIR}/$origin" ] || \
-#              echo "$origin" | grep -m 1 -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern" > /dev/null
-#      then
-#              rm -rf "${DBDIR}/requires/$origin"
-#      else
-#              rm -f "${DBDIR}/requires/$origin/complete_as_node"
-#      fi
+}
+
+# ============= Clear database directories for an origin =============
+database_build_clear_db_dirs ()
+{
+       local origin db
+       origin=$1
+       for db in requires replace targets obsolete
+       do
+               rm -rf "${DBDIR}/$db/$origin"
+       done
 }
 
 # ============= Remove configurations for a port permanently =============
 database_build_forget ()
 {
-       local origin origin_replace db
+       local origin origin_replace
        origin=$1
        origin_replace=`_database_build_reset_a_port_confdb "$origin"`
-#      [ -d "${DBDIR}/initial/$origin" -o -d "${DBDIR}/replace/$origin" \
-#              -o -d "${DBDIR}/requires/$origin" -o -d "${DBDIR}/targets/$origin" ] || return 0
-#      touch "${DBDIR}/inspected_ports_only_partially"
-#      {
-#              echo "$origin"
-#              cat "${DBDIR}/replace/$origin/origin" || :
-#              for dbtag in initial requires
-#              do
-#                      for tabel in requirements dependents
-#                      do
-#                              cat "${DBDIR}/$dbtag/$origin/$tabel.all.full" || :
-#                              rm -f "${DBDIR}/$dbtag/$origin/$tabel.run.full" \
-#                                      "${DBDIR}/$dbtag/$origin/$tabel.build.full"
-#                      done
-#              done
-#      } 2> /dev/null | sort -u >> ${DBDIR}/inspected_ports.update
-#      for level in full direct node
-#      do
-#              fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.${level}.list"
-#      done
-#      fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports"
-#      fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.list"
-#      fileedit_add_a_line_if_new "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
-#      fileedit_add_a_line_if_new "$origin" "${DBDIR}/to_be_reconf"
-#      origin_replace=`cat "${DBDIR}/replace/$origin/origin" 2> /dev/null` || :
-#      if [ ! -d "${PORTSDIR}/$origin" ] || \
-#              echo "$origin" | grep -m 1 -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern" > /dev/null
-#      then
-#              rm -rf "${DBDIR}/requires/$origin"
-#      else
-#              rm -f "${DBDIR}/requires/$origin/complete_as_node"
-#      fi
-#      for db in replace targets obsolete
-#      do
-#              rm -rf "${DBDIR}/$db/$origin"
-#      done
        fileedit_rm_a_line "$origin" "${DBDIR}/targets_specified_so_far"
        [ -z "$origin_replace" ] || database_build_forget "$origin_replace"
-       for db in requires replace targets obsolete
-       do
-               rm -rf "${DBDIR}/$db/$origin"
-       done
+       database_build_clear_db_dirs "$origin"
 }
 
 # ============= Patch to the temporary database so as to re-inspect and reinstall ports whose configurations were changed =============
 database_build_patch_reconf ()
 {
        local origin origin_replace
-#      local origin origin_replace db
        origin=$1
        origin_replace=`_database_build_reset_a_port_confdb "$origin"`
-#      [ -d "${DBDIR}/initial/$origin" -o -d "${DBDIR}/replace/$origin" \
-#              -o -d "${DBDIR}/requires/$origin" -o -d "${DBDIR}/targets/$origin" ] || return 0
-#      touch "${DBDIR}/inspected_ports_only_partially"
-#      {
-#              echo "$origin"
-#              cat "${DBDIR}/replace/$origin/origin" || :
-#              for dbtag in initial requires
-#              do
-#                      for tabel in requirements dependents
-#                      do
-#                              cat "${DBDIR}/$dbtag/$origin/$tabel.all.full" || :
-#                              rm -f "${DBDIR}/$dbtag/$origin/$tabel.run.full" \
-#                                      "${DBDIR}/$dbtag/$origin/$tabel.build.full"
-#                      done
-#              done
-#      } 2> /dev/null >> ${DBDIR}/inspected_ports.update
-#      for level in full direct node
-#      do
-#              fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.${level}.list"
-#      done
-#      fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports"
-#      fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.list"
        [ -d "${DBDIR}/initial/$origin" -o -d "${DBDIR}/requires/$origin" ] && \
                fileedit_add_a_line_if_new "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect"
        fileedit_add_a_line_if_new "$origin" "${DBDIR}/to_be_reconf"
-#      origin_replace=`cat "${DBDIR}/replace/$origin/origin" 2> /dev/null` || :
-#      if [ ! -d "${PORTSDIR}/$origin" ] || \
-#              echo "$origin" | grep -m 1 -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern" > /dev/null
-#      then
-#              rm -rf "${DBDIR}/requires/$origin"
-#      else
-#              rm -f "${DBDIR}/requires/$origin/complete_as_node"
-#      fi
-#      for db in replace targets obsolete
-#      do
-#              rm -rf "${DBDIR}/$db/$origin"
-#      done
        [ -z "$origin_replace" ] || database_build_patch_reconf "$origin_replace"
-       for db in requires replace targets obsolete
-       do
-               rm -rf "${DBDIR}/$db/$origin"
-       done
+       database_build_clear_db_dirs "$origin"
 }
 
-# ============= Post`processes after finishing to inspect dependencies =============
+# ============= Post-processes after finishing to inspect dependencies =============
 database_build_post_inspect_dependencies ()
 {
+       local table
        touch "${DBDIR}/obsolete_ports" "${DBDIR}/inspected_ports.update"
        find "${DBDIR}/requires" -depth 2 -type d \
                | sed -E 's|.*/([^/]+/[^/]+)$|\1|' > ${DBDIR}/inspected_ports
@@ -1070,6 +1037,7 @@ database_build_post_inspect_dependencies ()
                origin_regexp=`str_escape_regexp "$origin"`
                origin_esc=`str_escape_replaceval "$origin"`
                echo "s/^$origin_orig_regexp$/$origin_esc/" >> ${DBDIR}/REPLACE.complete_sed_pattern.tmp
+               [ -z "$origin_regexp" ] && continue
                echo "s/^$origin_regexp$/$origin_orig_esc/" >> ${DBDIR}/REVERSE_REPLACE.complete_sed_pattern.tmp
        done
        mv "${DBDIR}/REPLACE.complete_sed_pattern.tmp" "${DBDIR}/REPLACE.complete_sed_pattern"
@@ -1091,43 +1059,24 @@ database_build_post_inspect_dependencies ()
                else
                        cat "${DBDIR}/inspected_ports.update" "${DBDIR}/stage.loop_list/convert_dependency_lists" \
                                2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/convert_dependency_lists.tmp
-                       mv "${DBDIR}/stage.loop_list/convert_dependency_lists.tmp" "${DBDIR}/stage.loop_list/convert_dependency_lists"
+                       mv "${DBDIR}/stage.loop_list/convert_dependency_lists.tmp" \
+                               "${DBDIR}/stage.loop_list/convert_dependency_lists"
                        rm -f "${DBDIR}/inspected_ports.update"
                fi
        else
-               program_chk_stage_loop_complete CONVERT_REQUIREMENTS_LIST && rm -f "${DBDIR}/stage.loop_list/convert_dependency_lists"
+               program_chk_stage_loop_complete CONVERT_REQUIREMENTS_LIST \
+                       && rm -f "${DBDIR}/stage.loop_list/convert_dependency_lists"
        fi
+       {
+               sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "${DBDIR}/need.list" || :
+               cat "${DBDIR}/need.list" || :
+       } 2> /dev/null | sort -u > ${DBDIR}/need.with_replaced.list
+       for table in requirements dependents itself
+       do
+               [ -e "${DBDIR}/stage.loop_list/target_$table.specified" ] || continue
+               sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" \
+                       "${DBDIR}/stage.loop_list/target_$table.specified" \
+                       > ${DBDIR}/stage.loop_list/target_$table.replaced.specified
+       done    
        cp /dev/null "${DBDIR}/update_dependencies"
 }
-
-# # ============= Remove configurations for a port with its requirements permanently unless initially installed =============
-# database_build_rm_new_port_conf ()
-# {
-#      local origin src_scope dst_dependents dst_requirements origin_orig
-#      origin=$1
-#      src_scope=$2
-#      dst_dependents=$3
-#      dst_requirements=$4
-#      if [ -e "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern" ]
-#      then
-#              origin_orig=`echo "$origin" | sed -E -f "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern"`
-#      else
-#              origin_orig=$origin
-#      fi
-#      if [ -n "$dst_requirements" ]
-#      then
-#              cat "${DBDIR}/requires/$origin/requirements.all.full" 2> /dev/null >> $dst_requirements || :
-#      fi
-#      if [ -n "$dst_dependents" ]
-#      then
-#              cat "${DBDIR}/requires/$origin/dependents.all.full" 2> /dev/null >> $dst_dependents || :
-#      fi
-#      if [ -e "${DBDIR}/initial/$origin/installed_version" -o -e "${DBDIR}/initial/$origin_orig/installed_version" ]
-#      then
-#              message_echo "$origin (reset)"
-#              database_build_patch_reconf "$origin"
-#      else
-#              message_echo "$origin (removed)"
-#              database_build_forget "$origin"
-#      fi
-# }