X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=lib%2Flibdatabase_build.sh;h=bef02a7a5647fa1d41a2fc2070c4e89d7ea832ae;hb=eef49b58a1d722e712e56987cda9de0875549c1a;hp=1b2a5b889609106ce83baae1341eb0cf33e00952;hpb=1c6f716862cb5b466490cd921d91bb1fb075ded9;p=portsreinstall%2Fcurrent.git diff --git a/lib/libdatabase_build.sh b/lib/libdatabase_build.sh index 1b2a5b8..bef02a7 100644 --- a/lib/libdatabase_build.sh +++ b/lib/libdatabase_build.sh @@ -2,94 +2,19 @@ # ============================================================================== # portsreinstall library script # - Operations for building the temporary database - -# Copyright (C) 2013-2016 Mamoru Sakaue, MwGhennndo, All Rights Reserved. +# Copyright (C) 2013-2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved. # This software is distributed under the 2-Clause BSD License. # ============================================================================== -# ============= Variables ============= -DATABASE_VERSION= -DATABASE_IS_OBSOLETE=no - -# ============= Creation ============= -database_build_create () -{ - [ `id -u` -eq 0 -a ! -d "${DBDIR}" ] && mkdir -p "${DBDIR}" - misc_lock_duplicated_executions "${DBDIR}/.lock" - if [ -e "${DBDIR}/MYVERSION" ] - then - 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 - message_echo " in order to enable the current version." >&2 - exit 1 - fi - elif misc_is_superuser_privilege - then - echo "$MYVERSION" > ${DBDIR}/MYVERSION - fi - DATABASE_VERSION=`cat "${DBDIR}"/MYVERSION 2> /dev/null || :` - misc_is_superuser_privilege || return 0 - for subdir in initial requires replace targets obsolete backup_packages \ - stage.loop_list stage.complete stage.reinit_loop stage.depends - do - [ -d "${DBDIR}/$subdir" ] || mkdir -p "${DBDIR}/$subdir" - done -} - -# ============= Refresh the temporary database ============= -database_build_refresh () -{ - misc_is_superuser_privilege || return - [ $opt_suppress_obsolete_db_clean = no ] || return - message_echo "INFO: The temporary database is cleaned up." - message_echo - [ -d "${DBDIR}" -a ! -d "${DBDIR}.tmp" ] && mv "${DBDIR}" "${DBDIR}.tmp" - database_build_create - mv "${DBDIR}.tmp/saved_options.sh" "${DBDIR}" 2> /dev/null || : - mv "${DBDIR}.tmp/backup_packages" "${DBDIR}" 2> /dev/null || : - mv "${DBDIR}.tmp/backup_pkgarcs.lst" "${DBDIR}" 2> /dev/null || : - rm -rf "${DBDIR}.tmp" -} - -# ============= Clean up the temporary database for upgrade of this utility ============= -database_build_clean_for_self_upgrade () -{ - misc_is_superuser_privilege || return - [ $opt_suppress_obsolete_db_clean = no ] || return - rm -rf "${DBDIR}" - database_build_create - [ -e "${DBDIR}/MYVERSION" ] && mv "${DBDIR}/MYVERSION" "${DBDIR}/MYVERSION.prev" - : -} - -# ============= Check whether the temporary database is newer than the ports tree and refresh if so ============= -database_build_refresh_if_obsolete () -{ - if [ "${PORTS_INDEX_DB}" -nt "${DBDIR}"/MYVERSION ] && misc_is_superuser_privilege - then - if [ $opt_suppress_obsolete_db_clean = no -a "z${command}" = zclean ] - then - DATABASE_IS_OBSOLETE=no - message_echo "WARNING: The temporary database is older than the ports tree." >&2 - database_build_refresh || DATABASE_IS_OBSOLETE=yes - else - DATABASE_IS_OBSOLETE=yes - fi - else - DATABASE_IS_OBSOLETE=no - fi -} - -# ============= Register an obsolete origin ============= +# ============= Register an obsolete flavored origin ============= database_build_register_obsolete_port () { local origin dbpath pkgtag origin=$1 dbpath=${DBDIR}/obsolete/$origin [ -e "$dbpath/complete_as_node" ] && return - [ -d "${DBDIR}/obsolete/$origin" ] || mkdir -p "${DBDIR}/obsolete/$origin" - pkgtag=`pkgsys_pkg_info_qO_init "$origin"` + mkdir -p "${DBDIR}/obsolete/$origin" + pkgtag=`pkgsys_get_init_pkg_from_orig "$origin"` [ -n "$pkgtag" ] || pkgtag='[not installed]' echo "$pkgtag" > ${DBDIR}/obsolete/$origin/pkgtag for table in dependents requirements @@ -106,7 +31,7 @@ database_build_register_obsolete_port () touch "$dbpath/complete_as_node" } -# ============= Convert and register if an origin is obsolete ============= +# ============= Convert and register if a flavored origin is obsolete ============= database_build_convert_and_register_origin_if_obsolete () { local origin recursedb_in recursedb output_origin iline_db origin_new date_moved why_moved @@ -114,12 +39,13 @@ database_build_convert_and_register_origin_if_obsolete () recursedb_in=$2 recursedb=${recursedb_in:-${PORTS_MOVED_DB}} echo "$origin" > ${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origin - [ -d "${PORTSDIR}/$origin" ] && return + pkgsys_exists_port "$origin" && return database_build_register_obsolete_port "$origin" grep -n -m 1 -E "^`str_escape_regexp \"$origin\"`\|" "$recursedb" 2> /dev/null > ${TMPDIR}/moved.info || : if [ `wc -l < ${TMPDIR}/moved.info` -eq 0 ] then fileedit_add_a_line_if_new "$origin" "${DBDIR}/obsolete_ports" + fileedit_rm_a_line "$origin" "${DBDIR}/moved_ports" if [ -n "$recursedb_in" ] then message_echo "${DEPTH_INDEX} ===> Disappeared port (MOVED broken?)" @@ -136,20 +62,37 @@ database_build_convert_and_register_origin_if_obsolete () if [ -n "$origin_new" ] then message_echo "${DEPTH_INDEX} ===> Moved to $origin_new at $date_moved because \"$why_moved\"" + fileedit_add_a_line_if_new "$origin" "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origins_old" + fileedit_add_a_line_if_new "$origin" "${DBDIR}/moved_ports" + fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports" database_build_convert_and_register_origin_if_obsolete "$origin_new" "${TMPDIR}/MOVED.DB" || return 1 else message_echo "${DEPTH_INDEX} ===> Deleted at $date_moved because \"$why_moved\"" fileedit_add_a_line_if_new "$origin" "${DBDIR}/obsolete_ports" + fileedit_rm_a_line "$origin" "${DBDIR}/moved_ports" return 1 fi fi } -# ============= [Sub-function] Get the output value of converted origin ============= -_database_build_convert_and_register_origin_if_obsolete__get_origin () + +# ============= [Sub-function] Get the true latest flavored origin ============= +database_build_convert_and_register_origin_if_obsolete__get_origin () { cat "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origin" } +# ============= [Sub-function] Reset the all old origins of the tested flavored origin ============= +database_build_convert_and_register_origin_if_obsolete__reset_origins_old () +{ + rm -rf "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origins_old" +} + +# ============= [Sub-function] Save the all old origins of the tested flavored origin ============= +database_build_convert_and_register_origin_if_obsolete__save_origins_old () +{ + cat "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origins_old" 2> /dev/null +} + # ============= Get the make arguments for building the temporary database ============= database_build_setup_make_args () { @@ -173,6 +116,8 @@ database_build_setup_make_args () dbdir=${DBDIR}/requires/$origin [ -d "$dbdir" ] || dbdir=${DBDIR}/conf/each_port/$origin cat "$dbdir/MARG.conf" 2> /dev/null || : + flavor=`pkgsys_get_flavor_from_origin "$origin"` + [ -z "$flavor" ] || echo "FLAVOR=$flavor" } | tr '\n' ' ' } @@ -183,18 +128,20 @@ database_build_setup_make_envs () origin=$1 dbdir=${DBDIR}/requires/$origin [ -d "$dbdir" ] || dbdir=${DBDIR}/conf/each_port/$origin - cat "$dbdir/MENV.conf" 2> /dev/null || : + cat "$dbdir/MENV.conf" 2> /dev/null | tr '\n' ' ' } # ============= Execute make command for building the temporary database ============= database_build_make () { - local origin MAKE_ARGS MAKE_ENVS + local origin MAKE_ARGS MAKE_ENVS port_path flavor origin=$1 shift MAKE_ARGS=`database_build_setup_make_args "$origin"` MAKE_ENVS=`database_build_setup_make_envs "$origin"` - env $MAKE_ENVS make -C "${PORTSDIR}/$origin" "$@" $MAKE_ARGS + port_path=`pkgsys_get_portpath_from_origin "$origin"` + fs_fix_unionfs_image_if_hidden "$port_path" + env $MAKE_ENVS make -C "$port_path" "$@" $MAKE_ARGS } # ============= Set up a temporary database node for the initial state of a port ============= @@ -206,7 +153,7 @@ database_build_setup_initial_node () [ -e "$dbpath/complete_as_node" ] && return rm -rf "$dbpath" mkdir -p "$dbpath" - pkg=`pkg_info_qO "$origin"` + pkg=`pkgsys_get_installed_pkg_from_origin "$origin"` if [ -n "$pkg" ] then echo "$pkg" > $dbpath/installed_version @@ -248,69 +195,93 @@ database_build_setup_initial_node () # ============= Set up a temporary database node for the replaced/moved information of a port ============= database_build_setup_replace_node () { - local origin_orig origin dbpath + local origin_orig portoption_before portoption_after origin_trial origin dbpath tmp_msg origin_orig=$1 + portoption_before=$2 + portoption_after=$3 dbpath=${DBDIR}/replace/$origin_orig + tmp_msg=${TMPDIR}/database_build_setup_replace_node:meg if [ ! -e "$dbpath/complete_as_node" ] then rm -rf "$dbpath" mkdir -p "$dbpath" - origin=$origin_orig - if echo "$origin_orig" | grep -q -E -f "${DBDIR}/conf/REPLACE.grep_from_pattern" + origin_trial=$origin_orig + if echo "$origin_orig" | grep -q -Fx -f "${DBDIR}/conf/REPLACE.filter" 2> /dev/null then - origin=`echo "$origin_orig" | sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern"` - if [ "x$origin_orig" != "x$origin" ] + origin_trial=`echo "$origin_orig" | sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern"` + if [ "x$origin_orig" != "x$origin_trial" ] then - if [ -n "$origin" ] + if [ -n "$origin_trial" ] then - message_echo "${DEPTH_INDEX} ===> Replaced with $origin by user configuration" + message_echo "${DEPTH_INDEX} ===> Replaced with $origin_trial by user configuration" else database_build_register_obsolete_port "$origin_orig" message_echo "${DEPTH_INDEX} ===> Deleted by user configuration" fi > $dbpath/message fi fi - if [ -n "$origin" ] + if [ -n "$origin_trial" ] then - if database_build_convert_and_register_origin_if_obsolete "$origin" >> $dbpath/message + if database_build_convert_and_register_origin_if_obsolete "$origin_trial" >> $dbpath/message then - origin=`_database_build_convert_and_register_origin_if_obsolete__get_origin` + origin_trial=`database_build_convert_and_register_origin_if_obsolete__get_origin` else - if [ "x$origin" != "x$origin_orig" ] + if [ "x$origin_trial" != "x$origin_orig" ] then message_echo "${DEPTH_INDEX} ===> Going back to the original port $origin_orig" if database_build_convert_and_register_origin_if_obsolete "$origin_orig" then - origin=`_database_build_convert_and_register_origin_if_obsolete__get_origin` + origin_trial=`database_build_convert_and_register_origin_if_obsolete__get_origin` else - origin= + origin_trial= fi else - origin= + origin_trial= fi >> $dbpath/message fi fi + cat "$dbpath/message" 2> /dev/null || : + if [ -n "$origin_trial" ] + then + database_build_make "$origin_trial" showconfig > $portoption_before 2> /dev/null || : + database_build_determine_port_option "$origin_trial" + database_build_make "$origin_trial" showconfig > $portoption_after 2> /dev/null || : + origin=`database_build_determine_flavored_origin "$origin_trial"` + if [ "x$origin_trial" != "x$origin" ] + then + if [ -n "$origin" ] + then + message_echo "${DEPTH_INDEX} ===> Transferred to $origin" + else + fileedit_add_a_line_if_new "$origin" "${DBDIR}/obsolete_ports" + message_echo "${DEPTH_INDEX} ===> Lost (Something is wrong!)" + fi + fi > $tmp_msg + cat "$tmp_msg" >> $dbpath/message + else + origin= + fi [ "x$origin_orig" = "x$origin" ] || echo "$origin" > $dbpath/origin + cat "$tmp_msg" 2> /dev/null || : touch "$dbpath/complete_as_node" + else + cat "$dbpath/message" 2> /dev/null || : fi - cat "$dbpath/message" 2> /dev/null || : } # ============= Get the inspected level for a port with the current option settings ============= database_build_get_inspected_level () { - local origin origin_dependent origin_esc origin_dependent_esc + local origin origin_dependent origin=$1 origin_dependent=$2 - origin_esc='^'`str_escape_regexp "$origin"`'$' - origin_dependent_esc='^'`str_escape_regexp "$origin_dependent"`'$' if [ $opt_only_target_scope = no ] then echo full - elif ! pkgsys_pkg_info_eO "$origin" \ - || grep -E "$origin_esc" "${DBDIR}/stage.loop_list/ports_to_inspect" > /dev/null \ - || [ ! -e "${DBDIR}/requires/$origin_dependent/installed_version" ] \ - || grep -E "$origin_dependent_esc" "${DBDIR}/stage.loop_list/ports_to_inspect" > /dev/null + elif ! pkgsys_exists_or_existed_from_orig "$origin" \ + || grep -qFx "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect" 2> /dev/null \ + || [ ! -e "${DBDIR}/moved_from/$origin_dependent/installed_version" ] \ + || grep -qFx "$origin_dependent" "${DBDIR}/stage.loop_list/ports_to_inspect" 2> /dev/null then echo direct else @@ -321,46 +292,42 @@ database_build_get_inspected_level () # ============= Check whether a port has been inspected in a required level ============= database_build_is_port_already_inspected_in_required_level () { - local origin origin_dependent origin_actual origin_esc inspected_level + local origin origin_dependent origin_actual inspected_level origin=$1 origin_dependent=$2 origin_actual=`echo "$origin" | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" 2> /dev/null || :` [ -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 -q -E "^$origin_esc$" "${DBDIR}/ports.inspected.${inspected_level}.list" \ - "${DBDIR}/obsolete_ports" 2> /dev/null || return + { + cat "${DBDIR}/ports.inspected.${inspected_level}.list" || : + cat "${DBDIR}/moved_ports" || : + cat "${DBDIR}/obsolete_ports" || : + } 2> /dev/null | grep -q -Fx "$origin_actual" || 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" - : + echo "$origin_actual" } # ============= Update the current package name of a port ============= database_build_update_pkgname () { - local origin pkg savefile origin_orig + local origin dbdir pkg savefile origin=$1 - savefile=${DBDIR}/requires/$origin/current_version - if [ -e "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern" ] + dbdir=${DBDIR}/moved_from/$origin + mkdir -p "$dbdir" + savefile=$dbdir/current_version + pkg=`pkgsys_get_installed_pkg_from_origin "$origin"` + if [ -z "$pkg" -a -e "$dbdir/initial_orig" ] 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" || :` - 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 + while read orig_init + do + pkgsys_get_installed_pkg_from_origin "$orig_init" + done < $dbdir/initial_orig + elif [ -n "$pkg" ] + then + echo "$pkg" + fi | sort -u > $savefile cat "$savefile" } @@ -369,7 +336,7 @@ database_build_get_pkgname () { local origin savefile origin=$1 - savefile=${DBDIR}/requires/$origin/current_version + savefile=${DBDIR}/moved_from/$origin/current_version if [ -e "$savefile" ] then cat "$savefile" @@ -381,7 +348,7 @@ database_build_get_pkgname () # ============= Get the new package name of a port ============= database_build_get_new_pkgname () { - local origin savefile pkg + local origin savefile origin=$1 savefile=${DBDIR}/requires/$origin/new_version if [ ! -e "$savefile" ] @@ -392,12 +359,33 @@ database_build_get_new_pkgname () cat "$savefile" } +# ============= Get the package list of full-run-time requirements ============= +database_build_get_full_run_requirement_pkgs () +{ + local origin srcfile savefile + origin=$1 + srcfile=${DBDIR}/requires/$origin/requirements.run.full + savefile=${DBDIR}/requires/$origin/pkg_requirements.run.full + if [ ! -e "$srcfile" ] + then + rm -f "$savefile" + elif [ ! -e "$savefile" -o "$savefile" -ot "$srcfile" ] + then + while read origin + do + database_build_get_new_pkgname "$origin" + done < $srcfile | grep -v '^[[:space:]]*$' | sort -u > $savefile + fi + cat "$savefile" 2> /dev/null || : +} + # ============= Build the original message tag showing the version upgrade ============= database_build_create_pkgtag () { local origin dbdir pkg_init pkg_new pkgtag origin=$1 - dbdir=${DBDIR}/requires/$origin + dbdir=${DBDIR}/moved_from/$origin + mkdir -p "$dbdir" pkg_init=`database_build_get_pkgname "$origin"` [ -n "$pkg_init" -a ! -e "$dbdir/installed_version" ] && \ echo -n "$pkg_init" > $dbdir/installed_version @@ -424,10 +412,12 @@ database_build_create_pkgtag () # ============= Update the message tag showing the version upgrade ============= database_build_update_pkgtag () { - local origin pkg_init pkg_bak pkg_cur detail pkgtag + local origin dbdir pkg_init pkg_bak pkg_cur detail pkgtag origin=$1 - 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/ *$//'` + dbdir=${DBDIR}/moved_from/$origin + mkdir -p "$dbdir" + pkg_init=`cat "$dbdir/installed_version" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'` + pkg_bak=`cat "$dbdir/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" ] @@ -442,8 +432,8 @@ database_build_update_pkgtag () detail=" [currently deinstalled]" fi fi - pkgtag=`cat "${DBDIR}/requires/$origin/pkgtag.orig"` - echo "$pkgtag$detail" > ${DBDIR}/requires/$origin/pkgtag + pkgtag=`cat "$dbdir/pkgtag.orig"` + echo "$pkgtag$detail" > $dbdir/pkgtag } # ============= Check whether the currently installed package version is the latest ============= @@ -455,172 +445,407 @@ database_build_is_currentpkg_latest () pkg_new=`database_build_get_new_pkgname "$origin"` [ "x$pkg_cur" = "x$pkg_new" ] } +# ============= Configure the port option to determine the true flavor ============= +database_build_determine_port_option () +{ + local origin + origin=$1 + if [ $opt_apply_default_config = yes ] + then + if ! pkgsys_is_dialog4ports_used + then + printf '\t\n' | database_build_make "$origin" config-conditional > /dev/null + fi + else + database_build_make "$origin" config-conditional + fi +} + +# ============= Get the true flavor to determine the flavored port origin ============= +database_build_determine_flavored_origin () +{ + local origin origin_unflavored flavor_trial origin_trial flavors_ptn flavor + origin=$1 + origin_unflavored=`pkgsys_get_unflavored_origin "$origin"` + flavor_trial=`pkgsys_get_flavor_from_origin "$origin"` + if [ -n "$flavor_trial" ] + then + flavors_ptn="^("`database_build_make "$origin" -V FLAVORS 2> /dev/null | sed -E 's/[[:space:]]+/|/g'`")$" + echo "$flavor_trial" | grep -qE "$flavors_ptn" || flavor_trial= + fi + origin_trial=`pkgsys_compose_flavored_origin "$origin_unflavored" "$flavor_trial"` + flavor=`database_build_make "$origin_trial" -V FLAVOR 2> /dev/null || :` + pkgsys_compose_flavored_origin "$origin_unflavored" "$flavor" +} + +# ============= Escape of inspection conflict ============= +database_build_escape_inspect_conflict () +{ + local origin dbpath + origin=$1 + dbpath=${DBDIR}/requires/$origin + if [ -e "$dbpath/CONFLICT.conf" ] + then + message_echo "${DEPTH_INDEX} ===> Escaping inspection conflict..." + pkgsys_eval_ports_glob `cat "$dbpath/CONFLICT.conf"` | database_build_escape "$dbpath/CONFLICT_pkgarc.lst" + fi +} + +# ============= Escape of conflicts ============= +# A list of conflict package origins are given by stdin. +database_build_escape () +{ + local backup_list origin_conflict pkg_conflict pkgarc + backup_list=$1 + while read origin_conflict + do + pkg_conflict=`pkgsys_get_installed_pkg_from_origin "$origin_conflict"` + [ -n "$pkg_conflict" ] || continue + message_echo "${DEPTH_INDEX} ===> Escaping $pkg_conflict..." + pkgarc=`pkgsys_create_backup_pkg "$pkg_conflict" "${DBDIR}/backup_packages" 2> /dev/null` || \ + message_echo "${DEPTH_INDEX} ===> (WARNING: Failed to back up)" + pkg_delete_f "$pkg_conflict" > /dev/null 2>&1 || \ + message_echo "${DEPTH_INDEX} ===> (WARNING: Failed to delete)" + [ -n "$pkgarc" ] && printf '%s\t%s\n' "$pkg_conflict" "$pkgarc" >> $backup_list + done +} + +# ============= Restoration of escaped inspection conflict ============= +database_build_restore_inspect_conflict () +{ + local origin dbpath + origin=$1 + dbpath=${DBDIR}/requires/$origin + if [ -e "$dbpath/CONFLICT.conf" ] + then + message_echo "${DEPTH_INDEX} ===> Restoring inspection conflict..." + cat "$dbpath/CONFLICT_pkgarc.lst" 2> /dev/null | database_build_restore + rm -f "$dbpath/CONFLICT_pkgarc.lst" + fi +} + +# ============= Restoration of escaped conflicts ============= +# The backup list is given by stdin. +database_build_restore () +{ + local pkg_conflict pkgarc + while read pkg_conflict pkgarc + do + pkg_info_e "$pkg_conflict" && continue + message_echo "${DEPTH_INDEX} ===> Restoring $pkg_conflict..." + pkg_add_f "$pkgarc" > /dev/null 2>&1 || \ + message_echo "${DEPTH_INDEX} ===> (WARNING: Failed to restore $pkg_conflict)" + done +} # ============= 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_replace origin tag stage level dbpath dbpath_prev origin_id tmp_config 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 same_as_prevset dbfile installed_version frompath variable pkg_new origin_orig=$1 origin_dependent=$2 [ -z "$origin_orig" ] && return - database_build_is_port_already_inspected_in_required_level "$origin_orig" "$origin_dependent" && return - origin_orig_regexp=`str_escape_regexp "$origin_orig"` - DEPTH_INDEX_orig=${DEPTH_INDEX} - DEPTH_INDEX="${DEPTH_INDEX}--" - message_echo "${DEPTH_INDEX} $origin_orig" - origin_id=`echo "$origin_orig" | tr / :` - database_build_setup_initial_node "$origin_orig" - database_build_setup_replace_node "$origin_orig" - if [ -e "${DBDIR}/replace/$origin_orig/origin" ] + if ! origin=`database_build_is_port_already_inspected_in_required_level "$origin_orig" "$origin_dependent"` then - origin=`cat "${DBDIR}/replace/$origin_orig/origin"` - else - origin=$origin_orig - fi - origin_regexp=`str_escape_regexp "$origin"` - inspected_level= - inspected_levels_compatible= - if [ -n "$origin" ] - then - fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports" - dbpath=${DBDIR}/requires/$origin - if [ ! -e "$dbpath/complete_as_node" ] + DEPTH_INDEX_orig=${DEPTH_INDEX} + DEPTH_INDEX="${DEPTH_INDEX}--" + message_echo "${DEPTH_INDEX} $origin_orig" + database_build_convert_and_register_origin_if_obsolete__reset_origins_old + origin_id=`echo "$origin_orig" | tr / :` + # Replacement specified by the configuration file, knobs and port options + tmp_config=${TMPDIR}/database_build_inspect_dependencies:config + database_build_setup_replace_node "$origin_orig" "$tmp_config.before" "$tmp_config.after" + if [ -e "${DBDIR}/replace/$origin_orig/origin" ] then - conf_updated= - 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 - fi - rm -rf "$dbpath" - mkdir -p "$dbpath" - [ -n "$conf_updated" ] && touch "$dbpath/conf_updated" - [ "x$origin_orig" = "x$origin" ] || echo "$origin_orig" > $dbpath/initial_orig - [ -e "${DBDIR}/initial/$origin_orig/SUPPRESSED_SELF" ] && touch "$dbpath/SUPPRESSED_SELF" - [ -e "${DBDIR}/initial/$origin_orig/SUPPRESSED_PKGNG" ] && touch "$dbpath/SUPPRESSED_PKGNG" - if [ -d "${DBDIR}/conf/each_port/$origin" ] - then - cp -R "${DBDIR}/conf/each_port/$origin/"* "$dbpath/" > /dev/null 2>&1 || : - fi - tmp_portsdb_work=${TMPDIR}/database_build_inspect_dependencies:portsdb_work - [ -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 - ) - if [ `wc -c < $dbpath/ports_options.default` -gt 0 ] + origin=`cat "${DBDIR}/replace/$origin_orig/origin"` + else + origin=$origin_orig + fi + # Build the database for this port + inspected_level= + inspected_levels_compatible= + if [ -n "$origin" ] + then + frompath=${DBDIR}/moved_from/$origin + mkdir -p "$frompath" + database_build_convert_and_register_origin_if_obsolete__save_origins_old | \ + fileedit_add_lines_if_new "$frompath/old_origs" + # Check the package name initially installed + installed_version=`cat "${DBDIR}/initial/$origin_orig/installed_version" 2> /dev/null || :` + [ -n "$installed_version" ] && fileedit_add_a_line_if_new "$installed_version" "$frompath/installed_version" + [ "x$origin_orig" = "x$origin" ] || fileedit_add_a_line_if_new "$origin_orig" "$frompath/initial_orig" + [ -e "${DBDIR}/initial/$origin_orig/SUPPRESSED_SELF" ] && touch "$frompath/SUPPRESSED_SELF" + [ -e "${DBDIR}/initial/$origin_orig/SUPPRESSED_PKGNG" ] && touch "$frompath/SUPPRESSED_PKGNG" + if ! grep -qFx "$origin" "${DBDIR}/done_required_ports_to_inspect" 2> /dev/null then - if [ $opt_apply_default_config = yes ] + fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports" + fileedit_rm_a_line "$origin" "${DBDIR}/moved_ports" + dbpath=${DBDIR}/requires/$origin + dbpath_prev=${DBDIR}/prevset/requires/$origin + if [ ! -e "$dbpath/complete_as_node" ] || \ + ! diff "$tmp_config.before" "$tmp_config.after" > /dev/null 2> /dev/null then - if ! pkgsys_is_dialog4ports_used + # Notify reconfiguration of the port option + conf_updated= + if [ -e "$dbpath/complete_as_node" ] || \ + grep -q -Fx -e "$origin_orig" -e "$origin" "${DBDIR}/to_be_reconf" 2> /dev/null + then + message_echo "${DEPTH_INDEX} ===> Reconfigured" + conf_updated=y + fi + # Reset the database + rm -rf "$dbpath" + mkdir -p "$dbpath" + [ -n "$conf_updated" ] && touch "$dbpath/conf_updated" + if [ -d "${DBDIR}/conf/each_port/$origin" ] + then + cp -R "${DBDIR}/conf/each_port/$origin/"* "$dbpath/" > /dev/null 2>&1 || : + fi + # Escape of inspection conflict + database_build_escape_inspect_conflict "$origin" + # Check the change of the port option from the default + 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 + 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 - printf '\t\n' | database_build_make "$origin" config-conditional > /dev/null + 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 + pkgsys_save_port_oprion_timestamp "$origin" + # Get the lists of requirements in the flavored form + database_build_create_pkgtag "$origin" + for variable in PKG_DEPENDS EXTRACT_DEPENDS PATCH_DEPENDS FETCH_DEPENDS BUILD_DEPENDS LIB_DEPENDS + do + database_build_make "$origin" -V $variable + done > ${TMPDIR}/database_build_inspect_dependencies:build_depends_list + for variable in LIB_DEPENDS RUN_DEPENDS + do + database_build_make "$origin" -V $variable + done > ${TMPDIR}/database_build_inspect_dependencies:run_depends_list + for tag in run build + do + tr ' ' '\n' < ${TMPDIR}/database_build_inspect_dependencies:${tag}_depends_list | \ + sed -E 's#.*:([^:/]+/[^:/]+|[^:/]+/[^:/]+:[^:/]*)$#\1#' | cut -d : -f 1 | sort -u | \ + grep -Ev "`pkgsys_pkgtools_ports_filter_regexp`" \ + | while read origin_flavor_incomplete + do + ( set -e + opt_apply_default_config=yes + database_build_determine_port_option "$origin_flavor_incomplete" + ) + database_build_determine_flavored_origin "$origin_flavor_incomplete" + done | grep -v '^$' | sort -u > $dbpath/requirements.$tag.orig || : + sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern" "$dbpath/requirements.$tag.orig" \ + | grep -v '^$' | sort -u > $dbpath/requirements.$tag.src || : + done + for stage in orig src + do + sort -u "$dbpath/requirements.run.${stage}" "$dbpath/requirements.build.${stage}" \ + > $dbpath/requirements.all.direct.${stage} + mv "$dbpath/requirements.build.${stage}" "$dbpath/requirements.build.direct.${stage}" + mv "$dbpath/requirements.run.${stage}" "$dbpath/requirements.run.direct.${stage}" + done + # Record the completion + touch "$dbpath/complete_as_node" + fileedit_rm_a_line "$origin_orig" "${DBDIR}/to_be_reconf" + fileedit_rm_a_line "$origin" "${DBDIR}/to_be_reconf" + # Restoration of escaped inspection conflict + database_build_restore_inspect_conflict "$origin" else - database_build_make "$origin" config-conditional + # Restoration of escaped inspection conflict + database_build_restore_inspect_conflict "$origin" + # Reset the complied lists of requirements + for level in direct full + do + for tag in run build + do + rm -f "$dbpath/requirements.${tag}.${level}" + done + done + for origin_tmp in "$origin" "$origin_orig" + do + for inspected_level_tmp in full direct node + do + fileedit_rm_a_line "$origin_tmp" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" + done + done fi - database_build_make "$origin" showconfig > $dbpath/ports_options.current - else - cp /dev/null "$dbpath/ports_options.current" - fi - if [ ! -e "${DBDIR}/initial/$origin_orig/installed_version" ] - then - cp "${DBDIR}/initial/$origin_orig/installed_version" "$dbpath" 2> /dev/null || : - fi - database_build_create_pkgtag "$origin" - 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 || : - done - for stage in orig src - do - sort -u "$dbpath/requirements.run.${stage}" "$dbpath/requirements.build.${stage}" \ - > $dbpath/requirements.all.direct.${stage} - mv "$dbpath/requirements.build.${stage}" "$dbpath/requirements.build.direct.${stage}" - mv "$dbpath/requirements.run.${stage}" "$dbpath/requirements.run.direct.${stage}" - done - touch "$dbpath/complete_as_node" - fileedit_rm_a_line "$origin_orig" "${DBDIR}/to_be_reconf" - fileedit_rm_a_line "$origin" "${DBDIR}/to_be_reconf" - else - for level in direct full - do - for tag in run build + # Inspect the requirements + inspected_level=`database_build_get_inspected_level "$origin" "$origin_dependent"` + case $inspected_level in + full ) + grep -v -Fx -f "${DBDIR}/installed_ports" \ + "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || : + inspected_levels_compatible='full direct node' + ;; + direct ) + grep -v -Fx -f "${DBDIR}/installed_ports" \ + "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || : + inspected_levels_compatible='direct node' + ;; + node ) + cp /dev/null "${TMPDIR}/missing.$origin_id" + inspected_levels_compatible='node' + ;; + esac + rm -rf "$dbpath/rename_requirements.sed.pattern" + nlines=`wc -l < ${TMPDIR}/missing.$origin_id` + iline=1 + while [ $iline -le $nlines ] do - rm -f "$dbpath/requirements.${tag}.${level}" + origin_dependency=`sed -n ${iline}p "${TMPDIR}/missing.$origin_id"` + iline=$(($iline+1)) + grep -q -Fx "$origin_dependency" "${DBDIR}/ports.inspected.list" 2> /dev/null && \ + continue + database_build_inspect_dependencies "$origin_dependency" "$origin" done - done - for origin_tmp in "$origin" "$origin_orig" - do + if [ -e "$dbpath/rename_requirements.sed.pattern" ] + then + for tag in run build all + do + sed -E -i .unrenamed -f "$dbpath/rename_requirements.sed.pattern" "$dbpath/requirements.${tag}.direct.src" + done + fi + rm -f "${TMPDIR}/missing.$origin_id" + # Inspect the distfiles + dist_subdir_rpl=`database_query_get_makevar_val "$origin" DIST_SUBDIR | str_escape_replaceval_filter` || : + [ -n "$dist_subdir_rpl" ] && dist_subdir_rpl="$dist_subdir_rpl\/" + database_build_make "$origin" fetch-urlall-list \ + | sed -E "s/.*\/([^\/]+)$/$dist_subdir_rpl\1/" \ + | sort -u | fileedit_add_lines_if_new "${DBDIR}/distfiles.inspected" + # Transfer data from the previous database if existent, successful and no change + pkg_new=`cat "$dbpath/new_version"` + if [ ! -e "$dbpath/conf_updated" -a -d "$dbpath_prev" ] && pkg_info_e "$pkg_new" 2> /dev/null && \ + ! grep -qFx "$origin" "$dbpath_prev/to_be_reconf" 2> /dev/null + then + same_as_prevset=yes + for dbfile in new_version CONFLICT.conf BUILDCONFLICT.conf MARG.conf MENV.conf \ + ports_options.default ports_options.current \ + rename_requirements.sed.pattern \ + requirements.run.direct.orig requirements.run.direct.src \ + requirements.build.direct.orig requirements.build.direct.src + do + [ ! -e "$dbpath/$dbfile" -a ! -e "$dbpath_prev/$dbfile" ] && continue + if ! diff "$dbpath/$dbfile" "$dbpath_prev/$dbfile" 2> /dev/null > /dev/null + then + same_as_prevset=no + break + fi + done + if [ $same_as_prevset = yes ] + then + nlines=`wc -l < $dbpath/requirements.all.direct.src` + iline=1 + while [ $iline -le $nlines ] + do + origin_dependency=`sed -n ${iline}p "$dbpath/requirements.all.direct.src"` + iline=$(($iline+1)) + if [ ! -e "${DBDIR}/requires/$origin_dependency/same_as_prevset" ] + then + same_as_prevset=no + break + fi + done + fi + if [ $same_as_prevset = yes ] + then + for dbfile in failed.list damaged_package manually_done.list + do + if grep -qFx "$origin" "${DBDIR}/prevset/$dbfile" 2> /dev/null + then + same_as_prevset=no + break + fi + done + fi + if [ $same_as_prevset = yes ] + then + rm -rf "$dbpath" + cp -Rp "$dbpath_prev" "$dbpath" + if [ -d "${DBDIR}/prevset/notes/$origin" ] + then + rm -rf "${DBDIR}/notes/$origin" + mkdir -p "${DBDIR}/notes" + cp -Rp "${DBDIR}/prevset/notes/$origin" "${DBDIR}/notes/$origin" + fi + { + for tag in all run build none + do + for level in full direct + do + echo "success.$tag.$level.list" + done + done + } | while read dbfile + do + if grep -Fxq "$origin" "${DBDIR}/prevset/$dbfile" 2> /dev/null + then + fileedit_add_a_line_if_new "$origin" "${DBDIR}/$dbfile" + fi + done + touch "$dbpath/same_as_prevset" + message_echo "${DEPTH_INDEX} ===> No update from the previous reinstallation. Progress status inherited." + fi + fi + # Record the completion + if [ "x$origin_orig" != "x$origin" ] + then + for inspected_level_tmp in $inspected_levels_compatible + do + fileedit_add_a_line_if_new "$origin" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" + done + fileedit_add_a_line_if_new "$origin" "${DBDIR}/ports.inspected.list" + fileedit_add_a_line_if_new "$origin" "${DBDIR}/inspected_ports.update" + fileedit_rm_a_line "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect.remain" + fi + fileedit_add_a_line_if_new "$origin" "${DBDIR}/done_required_ports_to_inspect" + else + message_echo "${DEPTH_INDEX} ===> Already inspected merged port" + fileedit_rm_a_line "$origin_orig" "${DBDIR}/to_be_reconf" for inspected_level_tmp in full direct node do - fileedit_rm_a_line "$origin_tmp" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" + fileedit_rm_a_line "$origin_orig" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" done - done + fi fi - 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.direct.src" > ${TMPDIR}/missing.$origin_id || : - inspected_levels_compatible='full direct node' - ;; - direct) - grep -v -E -f "${DBDIR}/installed_ports.grep_pattern" \ - "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || : - inspected_levels_compatible='direct node' - ;; - node) - cp /dev/null "${TMPDIR}/missing.$origin_id" - inspected_levels_compatible='node' - ;; - esac - nlines=`wc -l < ${TMPDIR}/missing.$origin_id` - iline=1 - while [ $iline -le $nlines ] + # Record the completion + for inspected_level_tmp in $inspected_levels_compatible do - origin_dependency=`sed -n ${iline}p "${TMPDIR}/missing.$origin_id"` - iline=$(($iline+1)) - grep -q -E '^'`str_escape_regexp "$origin_dependency"`'$' \ - "${DBDIR}/ports.inspected.list" 2> /dev/null && \ - continue - database_build_inspect_dependencies "$origin_dependency" "$origin" + fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" done - rm -f "${TMPDIR}/missing.$origin_id" - dist_subdir_rpl=`database_query_get_makevar_val "$origin" DIST_SUBDIR | str_escape_replaceval_filter` || : - [ -n "$dist_subdir_rpl" ] && dist_subdir_rpl="$dist_subdir_rpl\/" - database_build_make "$origin" fetch-urlall-list \ - | sed -E "s/.*\/([^\/]+)$/$dist_subdir_rpl\1/" \ - | sort -u >> ${DBDIR}/distfiles.inspected + fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/ports.inspected.list" + fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/inspected_ports.update" + fileedit_rm_a_line "$origin_orig" "${DBDIR}/stage.loop_list/ports_to_inspect.remain" + message_echo "${DEPTH_INDEX} ===> ok" + DEPTH_INDEX=${DEPTH_INDEX_orig} fi - if [ "x$origin_orig" != "x$origin" ] + if [ -n "$origin_dependent" -a "x$origin_orig" != "x$origin" ] then - if [ -n "$origin" ] - then - for inspected_level_tmp in $inspected_levels_compatible - do - fileedit_add_a_line_if_new "$origin" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" - done - fileedit_add_a_line_if_new "$origin" "${DBDIR}/ports.inspected.list" - fileedit_add_a_line_if_new "$origin" "${DBDIR}/inspected_ports.update" - fileedit_rm_a_line "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect.remain" - fi + origin_orig_regexp=`str_escape_regexp "$origin_orig"` + origin_replace=`str_escape_replaceval "$origin"` + fileedit_add_a_line_if_new "s/^$origin_orig_regexp$/$origin_replace/" "${DBDIR}/requires/$origin_dependent/rename_requirements.sed.pattern" fi - for inspected_level_tmp in $inspected_levels_compatible - do - fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" - done - fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/ports.inspected.list" - fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/inspected_ports.update" - fileedit_rm_a_line "$origin_orig" "${DBDIR}/stage.loop_list/ports_to_inspect.remain" - message_echo "${DEPTH_INDEX} ===> ok" - - DEPTH_INDEX=${DEPTH_INDEX_orig} } # ============= Filter ignored dependencies from a list given by the standard input ============= @@ -628,10 +853,10 @@ database_build_filter_ignored_requirements () { local origin pattern origin=$1 - pattern=${DBDIR}/requires/$origin/ignored_requirements.regexp + pattern=${DBDIR}/requires/$origin/ignored_requirements.filter if [ -e "$pattern" ] then - grep -Evq -f "$pattern" + grep -Fxvq -f "$pattern" else cat fi 2> /dev/null || : @@ -640,7 +865,7 @@ database_build_filter_ignored_requirements () # ============= Build and get a list of the complete recursive dependencies of a port ============= database_build_get_complete_recursive_dependency () { - 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 + local tag origin suffix tmppath dbpath srcfile dstfile num_parents loophead dstfile_tmp tmpdstpath index_loop loop_len origin_target origin_ref dbpath_target tag=$1 origin=$2 suffix=$3 @@ -655,12 +880,11 @@ database_build_get_complete_recursive_dependency () fi if [ ! -e "$dstfile" ] then - origin_esc=`str_escape_regexp "$origin"` touch "$tmppath.parents" num_parents=`wc -l < $tmppath.parents` - if grep -Eq "^$origin_esc$" "$tmppath.parents" + if grep -Fxq "$origin" "$tmppath.parents" then - loophead=`grep -En "^$origin_esc$" "$tmppath.parents" | tail -n 1 | cut -d : -f 1` + loophead=`grep -Fxn "$origin" "$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 @@ -668,21 +892,19 @@ database_build_get_complete_recursive_dependency () 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 + ports_in_loop=`sed -n $(($loophead+1)),\$p "$tmppath.parents"` + echo "$ports_in_loop" | sed 's/^/ -->/' | 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 'Resolve the problem manually and then retry 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 + 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 "$ports_in_loop" >> $tmppath.ports_in_loop echo "$origin" >> $tmppath.ports_in_loop index_loop=1 loop_len=`wc -l < $tmppath.ports_in_loop` @@ -691,9 +913,8 @@ database_build_get_complete_recursive_dependency () 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 + if ! grep -Fxq "$origin_ref" "$dbpath_target/requirements.run.direct${suffix}" 2> /dev/null || \ + ! grep -Fxq "$origin_ref" "$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 @@ -708,30 +929,35 @@ database_build_get_complete_recursive_dependency () do for tag_tmp in run build do - grep -Eq "^$origin_ref_esc$" "$dbpath_target/requirements.${tag_tmp}.direct${suffix_tmp}" 2> /dev/null && \ + grep -Fxq "$origin_ref" "$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 + cat "$dbpath_target/ignored_requirements.all"* 2> /dev/null | sort -u > $dbpath_target/ignored_requirements.filter fi fi echo "$origin" >> $tmppath.parents tmpdstpath=${TMPDIR}/requires/$origin dstfile_tmp=$tmpdstpath/requirements.${tag}.full${suffix} - [ -d "$tmpdstpath" ] || mkdir -p "$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 + # The least requirements of build are the direct build-time requirements and the full run-time requirements of the direct build-time requirements. + tag_dep=$tag + [ "x$tag" = xbuild ] && tag_dep=run + recursive_dependency=`database_build_get_complete_recursive_dependency "$tag_dep" "$origin_requirement" "$suffix"` + [ -e "$dbpath/ignored_requirements.filter" ] && \ + echo "$origin_requirement" | grep -Fxq -f "$dbpath/ignored_requirements.filter" 2> /dev/null && \ + continue echo "$origin_requirement" - cat "$tmppath.recursive_dependency" + echo "$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 + sort -u "$dstfile_tmp" | grep -v '^$' > $dstfile || : rm "$dstfile_tmp" fi fi @@ -847,100 +1073,9 @@ eof database_build_order_ports_considering_dependencies () { touch "${DBDIR}/reinst_order.list.tmp" - cat > ${TMPDIR}/order_dependencies.awk << eof -BEGIN { - it = 0; - i = 0; -} -{ - if (NF == 0) - { - i = 0; - } - else - { - if (i == 0) - { - target = \$0; - sub (/\/requirements.all\.full$/, "", target); - sub (/^\.\//, "", target); - srcikey[it] = target; - srckeyi[target] = it; - it++; - } - else - { - src[it-1,i-1] = \$0; - srcimax[it-1] = srcsize[it-1] = i; - } - i++; - } -} -END { - ntargets = it; - norder = 0; - order_str = ""; - icycle = 0; - lf_order_str = ""; - while (1) - { - is_operated = 0; - for (it = 0; it < ntargets; it++) - { - if (!(it in srcikey)) continue; - if (srcsize[it] > 0) continue; - is_operated = 1; - target = srcikey[it]; - delete srcikey[it]; - order[norder++] = target; - order_str = order_str lf_order_str; - order_str = sprintf ("%s%s", order_str, target); - lf_order_str = "\n"; - for (jt = 0; jt < ntargets; jt++) - { - for (j = 0; j < srcimax[jt]; j++) - { - if ((jt,j) in src && src[jt,j] == target) - { - delete src[jt,j]; - srcsize[jt]--; - break; - } - } - } - } - if (is_operated == 0) break; - icycle++; - } - reinst_order_list = sprintf ("%s%s", ENVIRON["DBDIR"], "/reinst_order.list.tmp"); - print order_str > reinst_order_list; - unsatisfied = ""; - for (it = 0; it < ntargets; it++) - { - if (srcsize[it] == 0) continue; - reqs = ""; - sp_reqs = ""; - for (i = 0; i < srcimax[it]; i++) - { - if ((it,i) in src) - { - reqs = reqs sp_reqs src[it,i]; - sp_reqs = ", "; - } - } - unsatisfied = sprintf ("%s%s [%d] (%s)\n", unsatisfied, srcikey[it], srcsize[it], reqs); - } - if (unsatisfied != "") - { - unsatisfied_list = sprintf ("%s%s", ENVIRON["DBDIR"], "/unsatisfied.list"); - print unsatisfied > unsatisfied_list; - exit 1; - } -} -eof (cd "${DBDIR}/requires" && \ find . -depth 3 -name requirements.all.full -exec echo {} \; -exec cat {} \; -exec echo \;) | \ - env "DBDIR=${DBDIR}" awk -f "${TMPDIR}"/order_dependencies.awk || return + env "DBDIR=${DBDIR}" awk -f "${LIBEXECDIR}"/order_dependencies.awk || return grep -v '^$' "${DBDIR}/reinst_order.list.tmp" > "${DBDIR}/reinst_order.list" || : } @@ -961,10 +1096,10 @@ _database_build_reset_a_port_confdb () 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" \ - "${DBDIR}/$dbtag/$origin/is_customized" 2> /dev/null + rm -rf "${DBDIR}/$dbtag/$origin/$tabel.run.full" \ + "${DBDIR}/$dbtag/$origin/$tabel.build.full" done + rm -rf "${DBDIR}/$dbtag/$origin/is_customized" done } | sort -u >> ${DBDIR}/inspected_ports.update for level in full direct node @@ -972,11 +1107,12 @@ _database_build_reset_a_port_confdb () 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}/moved_ports" fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.list" cat "${DBDIR}/replace/$origin/origin" 2> /dev/null || : } -# ============= Clear database directories for an origin ============= +# ============= Clear database directories for a flavored origin ============= database_build_clear_db_dirs () { local origin db @@ -998,7 +1134,7 @@ database_build_forget () database_build_clear_db_dirs "$origin" } -# ============= Patch to the temporary database so as to re-inspect and reinstall ports whose configurations were changed ============= +# ============= Overlay onto the temporary database so as to re-inspect and reinstall ports whose configurations were changed ============= database_build_patch_reconf () { local origin origin_replace @@ -1007,50 +1143,46 @@ database_build_patch_reconf () [ -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" + fileedit_rm_a_line "$origin" "${DBDIR}/done_required_ports_to_inspect" [ -z "$origin_replace" ] || database_build_patch_reconf "$origin_replace" database_build_clear_db_dirs "$origin" } +# ============= Post-processes after finishing to inspect initial dependencies ============= +database_build_post_inspect_initial_dependencies () +{ + find "${DBDIR}/initial" -depth 2 -type d \ + | sed -E 's|.*/([^/]+/[^/]+)$|\1|' > ${DBDIR}/inspected_ports.initial +} + # ============= Post-processes after finishing to inspect dependencies ============= database_build_post_inspect_dependencies () { - local table + local table tmpfile + tmpfile=${TMPDIR}/database_build_post_inspect_dependencies touch "${DBDIR}/obsolete_ports" "${DBDIR}/inspected_ports.update" find "${DBDIR}/requires" -depth 2 -type d \ | sed -E 's|.*/([^/]+/[^/]+)$|\1|' > ${DBDIR}/inspected_ports - find "${DBDIR}/initial" -depth 2 -type d \ - | sed -E 's|.*/([^/]+/[^/]+)$|\1|' > ${DBDIR}/inspected_ports.initial sort -u "${DBDIR}/inspected_ports" "${DBDIR}/inspected_ports.initial" > ${DBDIR}/inspected_ports.all - str_escape_regexp_filter < ${DBDIR}/inspected_ports \ - | sed 's/^/^/; s/$/$/' > ${DBDIR}/inspected_ports.grep_pattern - str_escape_regexp_filter < ${DBDIR}/inspected_ports.initial \ - | sed 's/^/^/; s/$/$/' > ${DBDIR}/inspected_ports.initial.grep_pattern - str_escape_regexp_filter < ${DBDIR}/inspected_ports.all \ - | sed 's/^/^/; s/$/$/' > ${DBDIR}/inspected_ports.all.grep_pattern - cat "${DBDIR}/conf/HOLD_PORTS.grep_pattern" "${DBDIR}/need.grep_pattern" \ - 2> /dev/null > ${TMPDIR}/INSPECT_ALL_DEPENDENCIES:obsolete_ports.exclude.grep_pattern || : - grep -v -E -f "${TMPDIR}/INSPECT_ALL_DEPENDENCIES:obsolete_ports.exclude.grep_pattern" \ - "${DBDIR}/obsolete_ports" > ${DBDIR}/obsolete_ports.can_be_deleted || : + { + cat "${DBDIR}/conf/HOLD:PORTS.parsed" || : + cat "${DBDIR}/need.list" || : + } 2> /dev/null | sort -u > $tmpfile.obsolete_ports.exclude + grep -v -Fx -f "$tmpfile.obsolete_ports.exclude" "${DBDIR}/obsolete_ports" > ${DBDIR}/obsolete_ports.can_be_deleted || : cp /dev/null "${DBDIR}/REPLACE.complete_sed_pattern.tmp" - cp /dev/null "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern.tmp" find "${DBDIR}/replace" -depth 3 -type f -name origin | while read nodepath do origin_orig=`expr "$nodepath" : '.*/\([^/][^/]*/[^/][^/]*\)/origin$'` origin=`cat "$nodepath"` origin_orig_regexp=`str_escape_regexp "$origin_orig"` - origin_orig_esc=`str_escape_replaceval "$origin_orig"` - 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" - mv "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern.tmp" "${DBDIR}/REVERSE_REPLACE.complete_sed_pattern" if [ `cat "${DBDIR}/inspected_ports.update" 2> /dev/null | wc -l` -gt 0 ] then - grep -E -f "${DBDIR}/inspected_ports.all.grep_pattern" "${DBDIR}/inspected_ports.update" \ - > ${DBDIR}/inspected_ports.update.tmp || : + grep -Fx -f "${DBDIR}/inspected_ports.all" "${DBDIR}/inspected_ports.update" \ + > ${DBDIR}/inspected_ports.update.tmp 2> /dev/null || : mv "${DBDIR}/inspected_ports.update.tmp" "${DBDIR}/inspected_ports.update" if [ $opt_only_target_scope = yes ] then @@ -1082,6 +1214,6 @@ database_build_post_inspect_dependencies () sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" \ "${DBDIR}/stage.loop_list/target_$table.specified" \ > ${DBDIR}/stage.loop_list/target_$table.replaced.specified - done + done cp /dev/null "${DBDIR}/update_dependencies" }