OSDN Git Service

The message related to the looped dependency diagnosis is improved.
[portsreinstall/current.git] / lib / libdatabase_build.sh
index dbee841..fb639b4 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.
 # ==============================================================================
 
@@ -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,7 +160,6 @@ database_build_setup_make_args ()
                do
                        eval echo $key=\$$key
                done
-               echo 'FORCE_PKG_REGISTER=yes'
                echo 'DISABLE_VULNERABILITIES=yes'
                if [ $opt_apply_default_config = yes ]
                then
@@ -215,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
@@ -337,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"
 }
 
@@ -412,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
@@ -437,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" ]
 }
@@ -518,6 +532,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 || :
@@ -611,20 +626,58 @@ database_build_inspect_dependencies ()
 # ============= 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 origin suffix tmpdb_parents dbpath srcfile dstfile loophead origin_esc tmppath dstfile_tmp
        table=$1
        origin=$2
+       suffix=$3
+       tmpdb_parents=${TMPDIR}/database_build_get_complete_recursive_dependency.parents
        dbpath=${DBDIR}/requires/$origin
-       [ -e "$dbpath/$table.direct" ] || return 0
-       dstfile=$dbpath/$table.full
-       if [ ! -e "$dbpath/$table" -a ! -e "$dstfile" ]
+       srcfile=$dbpath/$table.direct$suffix
+       [ -e "$srcfile" ] || return 0
+       dstfile=$dbpath/$table.full$suffix
+       if [ ! -e "$dstfile" ]
        then
-               while read origin_requirement
-               do
-                       echo "$origin_requirement"
-                       database_build_get_complete_recursive_dependency "$table" "$origin_requirement"
-               done < $dbpath/$table.direct | sort -u > $dstfile.tmp
-               mv "$dstfile.tmp" "$dstfile"
+               origin_esc=`str_escape_regexp "$origin"`
+               touch "$tmpdb_parents"
+               num_parents=`wc -l < $tmpdb_parents`
+               if grep -Eq "^$origin_esc$" "$tmpdb_parents"
+               then
+                       loophead=`grep -En "^$origin_esc$" "$tmpdb_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:' >&2
+                       else
+                               message_echo 'WARNING: The following loop was found:' >&2
+                       fi
+                       message_echo "  $origin" >&2
+                       sed -n $(($loophead+1)),\$p "$tmpdb_parents" | sed 's/^/  -->/' | message_cat >&2
+                       message_echo "  -->$origin" >&2
+                       if [ "x$opt_force_continuation_for_looped_dependency" = xno ]
+                       then
+                               message_echo 'Resolve the problem manually if possible, and then restart by' >&2
+                               message_echo "        ${APPNAME} reset keepopts" >&2
+                               message_echo "        ${APPNAME}" >&2
+                               message_echo 'Otherwise, you may attempt to forcibly continue by' >&2
+                               message_echo "        ${APPNAME} -f" >&2
+                               exit 1
+                       else
+                               message_echo '(Forcibly continue)' >&2
+                       fi
+               else
+                       echo "$origin" >> $tmpdb_parents
+                       tmppath=${TMPDIR}/requires/$origin
+                       dstfile_tmp=$tmppath/$table.full$suffix
+                       [ -d "$tmppath" ] || mkdir -p "$tmppath"
+                       while read origin_requirement
+                       do
+                               echo "$origin_requirement"
+                               database_build_get_complete_recursive_dependency "$table" "$origin_requirement" "$suffix"
+                       done < $srcfile > $dstfile_tmp
+                       sort -u "$dstfile_tmp" > $dstfile
+                       rm "$dstfile_tmp"
+                       head -n ${num_parents}p "$tmpdb_parents" > $tmpdb_parents.tmp
+                       mv "$tmpdb_parents.tmp" "$tmpdb_parents"
+               fi
        fi
        cat "$dstfile"
 }
@@ -638,7 +691,7 @@ 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
@@ -851,8 +904,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
@@ -865,18 +920,26 @@ _database_build_reset_a_port_confdb ()
        cat "${DBDIR}/replace/$origin/origin" 2> /dev/null || :
 }
 
+# ============= 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"`
        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 =============
@@ -889,13 +952,10 @@ database_build_patch_reconf ()
                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"
        [ -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
@@ -926,6 +986,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"