2 # ==================================================================================
3 # portsreinstall main script
4 # Copyright (C) 2010-2013 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
5 # This software is distributed under the 2-Clause BSD License.
6 # ==================================================================================
8 # ==================================================
9 # ================== ENVIRONMENT ===================
10 # ==================================================
12 # ============ Set up of environment =============
13 APPNAME=`basename "$0"`
16 COMPATIBLE_VERSIONS='^(3\.0\.[0-9]+)$'
17 # Template for development versions
18 # MYVERSION=3.0.3+toward_3.0.4_20131115074959
19 # COMPATIBLE_VERSIONS='^(3\.0\.[0-9]+\+toward_3\.0\.[0-9]+_[0-9]+|3\.0\.[0-9]+)$'
20 MYPREFIX=`dirname "\`dirname \"$0\"\`" | sed 's|/bin$||'`
21 MYPREFIX=${MYPREFIX:-/usr/local}
22 LIBDIR=${MYPREFIX}/lib/${APPNAME}
24 . ${LIBDIR}/libtemp.sh
26 . ${LIBDIR}/liboptions.sh
27 . ${LIBDIR}/libusage.sh
28 . ${LIBDIR}/libmessage.sh
29 . ${LIBDIR}/libpkgsys.sh
30 . ${LIBDIR}/libmisc.sh
31 . ${LIBDIR}/libfileedit.sh
32 . ${LIBDIR}/libconf.sh
33 . ${LIBDIR}/libdatabase_build.sh
34 . ${LIBDIR}/libdatabase_query.sh
35 . ${LIBDIR}/libdatabase_record.sh
36 . ${LIBDIR}/libcommand.sh
37 . ${LIBDIR}/libprogram.sh
38 . ${LIBDIR}/libreinstall.sh
39 . ${LIBDIR}/libdeinstall.sh
44 DBDIR=/var/tmp/${APPNAME}.db
45 CONFFILE=${MYPREFIX}/etc/${APPNAME}.conf
46 PKGTOOLSCONF=${MYPREFIX}/etc/pkgtools.conf
49 # ==================================================
50 # ========= PARSING OPTIONS AND ARGUMENTS ==========
51 # ==================================================
53 # ============= Save arguments for upgraded restart =============
54 options_dump_args "$@" > ${TMPDIR}/restart_command.sh
56 # ============= Option check =============
59 options_getopts "$@" || :
60 if [ $OPTIONS_ERRNO -eq 2 ]
62 message_echo "INTERNAL ERROR: In parsing options" >&2
65 shift "${OPTIONS_SHIFT}"
67 # ============= Argument check for no-command options =============
68 if [ $opt_help_mode -ne 0 -o $opt_show_version = yes ]
76 # ============= Output usage if the case of a help mode or option/argument errors =============
77 if [ $OPTIONS_ERRNO -ne 0 ]
80 elif [ $opt_help_mode -eq 1 ]
84 elif [ $opt_help_mode -eq 2 ]
90 # ============= Output version number =============
91 if [ $opt_show_version = yes ]
97 # ============= Execute command operations before getting the temporary database ready =============
98 command_exec_before_db_creation "$@"
100 # ============= Creation of temporary database directory =============
101 database_build_create
103 # ============= Argument check for conventional runs =============
104 command_parse_args "$@"
105 shift "${COMMAND_SHIFT}"
108 # ==================================================
109 # ================== TOOLS SET UP ==================
110 # ==================================================
112 # ============= Opening title =============
115 [ $COMMAND_MODE = do -o $COMMAND_MODE = redo -o $COMMAND_MODE = forget ] && \
116 message_opening_notice
119 # ============= Execute command operations which do not need package tools =============
121 command_exec_without_pkgtools "$@"
122 misc_is_superuser_privilege && touch "${DBDIR}/in_use"
124 # ============= Definition of environment dependent functions =============
128 # ============= Option settings =============
130 # Execute command operations which are not affected by saved option settings
131 command_exec_irrespective_of_saved_options "$@"
133 # Load, renew and save option values
135 options_chk_invalid_optvals_renewal non_renewable || optcomb_err=$?
136 if [ \( $opt_reload_conf = yes -o $opt_reset_targets = yes \) -a "x$COMMAND_MODE" != xredo ]
138 message_echo "ERROR: Option -N is available only in the initial run of redo command." >&2
142 if [ $opt_batch_ports_only = yes -a $opt_interactive_ports_only = yes ]
144 message_echo "ERROR: Options -A and -I conflict with each other." >&2
148 if [ -e "${DBDIR}/saved_options.sh" ]
151 options_renewed_optvals M renewable_anytime || optcomb_err=$?
152 options_renewed_optvals N renewable_in_redo_on_target || optcomb_err=$?
153 options_renewed_optvals L renewable_in_redo_on_conf || optcomb_err=$?
154 } > ${TMPDIR}/renewed_optvals.sh
155 [ $optcomb_err -eq 0 ] || exit $optcomb_err
156 . "${DBDIR}/saved_options.sh"
157 . "${TMPDIR}/renewed_optvals.sh"
159 misc_is_superuser_privilege && misc_get_all_vardefs | options_filter saved > ${DBDIR}/saved_options.sh
162 if [ -e "${DBDIR}/saved_options.sh" -a $opt_batch_mode = no \
163 -a \( $COMMAND_MODE = do -o $COMMAND_MODE = redo \) ]
165 message_echo "INFO: List of option values:"
166 message_echo "-----------------------------------------"
167 message_cat "${DBDIR}/saved_options.sh"
168 message_echo "-----------------------------------------"
172 # ============= Termination messages during construction of the temporary database =============
174 # Set termination messages
175 temp_terminate_process_common ()
178 [ $opt_batch_mode = yes ] && return
179 msg_where=`temp_get_msg_current_stage`
180 [ -n "$msg_where" ] && msg_where=" during $msg_where"
182 if [ $errno -eq 130 ]
184 echo "INFO: Terminated at `message_timestamp`$msg_where."
186 echo " You can restart this process from the terminated point by"
188 echo "INFO: Aborted at `message_timestamp`$msg_where."
190 echo " You may restart this process from the aborted point by"
192 echo "executing without options or arguments as:"
193 if [ -n "$COMMAND_RESTART" ]
195 echo " ${APPNAME} $COMMAND_RESTART"
201 temp_terminate_process ()
203 [ $errno -eq 0 -o $opt_batch_mode = yes ] && return
204 temp_terminate_process_common
205 [ -n "$COMMAND_RESTART" ] || message_cat 3<< eof
206 Instead, if you only want to construct the temporary database so as to stop before the actual reinstallation, execute as:
211 # ============= Configurations =============
213 # Save the previous configuration if exists
215 _program_exec_and_record_completion__operation ()
217 rm -rf "${DBDIR}/conf.prev"
218 [ -d "${DBDIR}/conf" ] && \
219 cp -Rp "${DBDIR}/conf" "${DBDIR}/conf.prev"
222 program_exec_and_record_completion SAVE_PREV_CONF
224 # Get complete configuration variable definitions by importing pkgtools.conf(5) if available
225 PROGRAM_DEPENDS='SAVE_PREV_CONF'
226 _program_exec_and_record_completion__operation ()
230 rm -rf "${DBDIR}/conf"
231 mkdir -p "${DBDIR}/conf"
232 [ "x`options_get_effective_opt_load_pkgtoolsconf 2> /dev/null`" != xno -a $opt_batch_mode = no ] \
234 [ $need_msg = yes ] && \
235 message_section_title "Parsing pkgtools.conf (by using installed portupgrade)"
236 conf_get_complete_var_defs > ${DBDIR}/conf/complete_setup.sh
237 [ $need_msg = yes ] && { message_echo "===> ok"; message_echo; }
240 program_exec_and_record_completion GET_COMPLETE_CONF_VAR_DEF
242 # Parse the configuration
243 PROGRAM_DEPENDS='GET_COMPLETE_CONF_VAR_DEF'
244 _program_exec_and_record_completion__operation ()
246 message_section_title "Parsing the configuration"
247 conf_manipulate_available_var_defs
248 . "${DBDIR}/conf/manipulated_defs.sh"
250 conf_build_effective_MOVED
251 # Environmental variables
252 conf_setup_effective_env > ${DBDIR}/conf/setenv.sh
253 . "${DBDIR}/conf/setenv.sh"
255 conf_parse_vars_for_each_port_glob HOLD
256 str_escape_regexp_filter < ${DBDIR}/conf/HOLD:PORTS.parsed \
257 | sed 's/^/^/;s/$/$/' > ${DBDIR}/conf/HOLD_PORTS.grep_pattern
259 conf_parse_vars_for_each_port_glob TABOO
260 fileedit_combine_lists "${DBDIR}/conf/TABOO:PORTS.parsed" "${DBDIR}/taboo.list" \
261 > ${DBDIR}/taboo.all.list
263 conf_parse_vars_for_each_port_glob NOPKG
265 conf_build_replacement_patterns_from_REPLACE
267 conf_parse_vars_for_each_port_glob_with_bound_val MARG TARGET DEF
269 conf_parse_vars_for_each_port_glob_with_bound_val MENV TARGET DEF
271 conf_parse_vars_for_each_port_glob_with_bound_val BEFOREBUILD TARGET COMMAND
273 conf_parse_vars_for_each_port_glob_with_bound_val BEFOREDEINSTALL TARGET COMMAND
275 conf_parse_vars_for_each_port_glob_with_bound_val AFTERINSTALL TARGET COMMAND
278 program_exec_and_record_completion PARSE_CONF
280 . "${DBDIR}/conf/setenv.sh"
282 # ============= Upgrade of tools =============
284 # Execute command operations which should be done without upgrade of tools
285 command_exec_before_tools_upgrade "$@"
287 # Check whether the temporary database is newer than the ports tree and refresh if so
288 database_build_refresh_if_obsolete
290 # Get the port origin for this utility if installed by port
291 MYPORTORIGIN=`pkgsys_get_my_origin 2> /dev/null` || :
293 # Collect all installed packages
295 _program_exec_and_record_completion__operation ()
297 message_section_title "Collecting all installed packages"
298 pkg_info_qoa > ${DBDIR}/installed_ports
299 pkg_info_gen_pkg_origin_table
300 str_escape_regexp_filter < "${DBDIR}/installed_ports" \
301 | sed 's/^/^/; s/$/$/' > ${DBDIR}/installed_ports.grep_pattern
304 program_exec_and_record_completion COLLECT_ALL_INSTALLED_PACKAGES
306 # Preliminary inspection of tools which have to be up-to-date
307 # (No need depend on PARSE_CONF because INSPECT_ALL_DEPENDENCIES will take the task.)
309 _program_exec_restartable_loop_operation__routine ()
313 database_build_inspect_dependencies "$origin"
315 _program_exec_and_record_completion__operation ()
318 message_section_title "Preliminary inspection of tools which have to be up-to-date"
320 [ "$PKGSYS_USE_PKGNG" = yes ] && echo 'ports-mgmt/pkg'
321 pkgsys_is_dialog4ports_used && echo 'ports-mgmt/dialog4ports'
322 [ -n "$MYPORTORIGIN" ] && echo "$MYPORTORIGIN"
323 } 2> /dev/null > ${DBDIR}/stage.loop_list/tools_to_inspect
325 program_exec_restartable_loop_operation tools_to_inspect
326 database_build_post_inspect_dependencies
329 program_exec_and_record_completion PRELIMINARY_INSPECTION_OF_TOOLS
331 # Upgrade of ports-mgmt/pkg if new
332 # (No need depend on PARSE_CONF because REINSTALLATION will take the task.)
333 if [ \( "$COMMAND_MODE" = do -o "$COMMAND_MODE" = redo \) \
334 -a $opt_dry_run = no -a $opt_suppress_pkgtools_upadte = no \
335 -a "$PKGSYS_USE_PKGNG" = yes ]
337 PROGRAM_DEPENDS='PRELIMINARY_INSPECTION_OF_TOOLS'
338 _program_exec_and_record_completion__operation ()
340 local _MSG_CURRENT_STAGE_general
341 _MSG_CURRENT_STAGE_general="pkgng upgrade"
342 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
343 message_section_title "Upgrade of ports-mgmt/pkg if new"
344 touch "${DBDIR}/target_all"
345 reinstall_exec ports-mgmt/pkg
346 reinstall_restore_conflicts
347 rm -f "${DBDIR}/target_all"
348 temp_set_msg_current_stage
351 program_exec_and_record_completion UPGRADE_PKGNG
354 # Upgrade of ports-mgmt/dialog4ports if new
355 # (No need depend on PARSE_CONF because REINSTALLATION will take the task.)
356 if [ \( "$COMMAND_MODE" = do -o "$COMMAND_MODE" = redo \) \
357 -a $opt_dry_run = no -a $opt_suppress_pkgtools_upadte = no ] \
358 && pkgsys_is_dialog4ports_used
360 PROGRAM_DEPENDS='PRELIMINARY_INSPECTION_OF_TOOLS'
361 _program_exec_and_record_completion__operation ()
363 local _MSG_CURRENT_STAGE_general
364 _MSG_CURRENT_STAGE_general="pkgng dialog4ports"
365 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
366 message_section_title "Upgrade of dialog4ports if new"
367 touch "${DBDIR}/target_all"
368 reinstall_exec ports-mgmt/dialog4ports
369 reinstall_restore_conflicts
370 rm -f "${DBDIR}/target_all"
371 temp_set_msg_current_stage
374 program_exec_and_record_completion UPGRADE_DIALOG4PORTS
377 # Upgrade of this utility if new
378 # (No need depend on PARSE_CONF because REINSTALLATION will take the task.)
379 if [ \( "$COMMAND_MODE" = do -o "$COMMAND_MODE" = redo \) \
380 -a $opt_dry_run = no -a $opt_suppress_self_upadte = no \
381 -a -n "$MYPORTORIGIN" ]
383 PROGRAM_DEPENDS='PRELIMINARY_INSPECTION_OF_TOOLS'
384 _program_exec_and_record_completion__operation ()
386 local _MSG_CURRENT_STAGE_general
387 _MSG_CURRENT_STAGE_general="pkgng upgrade"
388 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
389 message_section_title "Upgrade of this utility if new"
390 touch "${DBDIR}/target_all"
391 reinstall_exec "$MYPORTORIGIN"
392 reinstall_restore_conflicts
393 rm -f "${DBDIR}/target_all"
394 temp_set_msg_current_stage
397 program_exec_and_record_completion UPGRADE_SELF
400 if [ "x`${APPNAME} -aV 2> /dev/null`" != "x$MYVERSION" ]
402 message_echo "INFO: ${APPNAME} is upgraded and the temporary database needs refresh."
403 database_build_clean_for_self_upgrade || :
404 message_echo "INFO: Restarting with the new version."
406 temp_trap_for_invoking_new_version
407 . "${TMPDIR}"/restart_command.sh
412 # ==================================================
413 # ================== PREPARATION ===================
414 # ==================================================
416 # ============= Correspondence to configuration changes =============
418 # Patch to the temporary database by reflecting changes in configuration
419 PROGRAM_DEPENDS='PARSE_CONF'
420 _program_exec_and_record_completion__operation ()
422 local tmpfile_diff tmpfile_old tmpfile_new key
423 [ -d "${DBDIR}/conf.prev" ] || return 0
424 message_section_title "Patch to the temporary database by reflecting changes in configuration"
425 tmpfile_old=${TMPDIR}/PATCH_TO_TMPDB_REFLECT_CONF_CHANGES::old
426 tmpfile_new=${TMPDIR}/PATCH_TO_TMPDB_REFLECT_CONF_CHANGES::new
427 tmpfile_updated_ports=${TMPDIR}/PATCH_TO_TMPDB_REFLECT_CONF_CHANGES::updated_ports
428 if fileedit_manipulate_old_new_lines \
429 "${DBDIR}/conf.prev/setenv.sh" "${DBDIR}/conf/setenv.sh" "$tmpfile_old" "$tmpfile_new"
431 if grep -q -e ^LOCALBASE= -e ^LINUXBASE= -e ^PORTSDIR= "$tmpfile_old" "$tmpfile_new"
433 message_echo "ERROR: Migration of the temporary database is unavailable because LOCALBASE, LINUXBASE or PORTSDIR was changed." >&2
434 message_echo " ${APPNAME} clean" >&2
435 message_echo "must be executed in advance." >&2
439 cut -s -d '|' -f 1,2 "${DBDIR}/conf.prev/MOVED_ALT.parsed" | tr '|' '\t' > ${TMPDIR}/MOVED_ALT.old
440 cut -s -d '|' -f 1,2 "${DBDIR}/conf/MOVED_ALT.parsed" | tr '|' '\t' > ${TMPDIR}/MOVED_ALT.new
441 if fileedit_manipulate_old_new_lines \
442 "${TMPDIR}/MOVED_ALT.old" "${TMPDIR}/MOVED_ALT.new" "$tmpfile_old" "$tmpfile_new"
444 cat "$tmpfile_old" "$tmpfile_new" | while read from to
447 [ -n "$to" ] && echo "$to"
449 fi > $tmpfile_updated_ports
450 if fileedit_manipulate_old_new_lines \
451 "${DBDIR}/conf.prev/REPLACE.csv" "${DBDIR}/conf/REPLACE.csv" "$tmpfile_old" "$tmpfile_new"
453 cat "$tmpfile_old" "$tmpfile_new" | while read from to
456 [ -n "$to" ] && echo "$to"
458 fi >> $tmpfile_updated_ports
459 [ `wc -l < $tmpfile_updated_ports` -gt 0 ] && rm -f "${DBDIR}/REPLACE.complete_sed_pattern"
460 [ -d "${DBDIR}/conf/each_port" ] && find "${DBDIR}/conf/each_port" -depth 2 \
463 origin=`str_dirpath_to_origin "$dbpath"`
464 dbpath_prev=${DBDIR}/conf.prev/each_port/$origin
465 diff -r "$dbpath_prev" "$dbpath" > /dev/null 2>&1 && continue
467 done >> $tmpfile_updated_ports
468 [ -d "${DBDIR}/conf.prev/each_port" ] && find "${DBDIR}/conf.prev/each_port" -depth 2 \
469 | while read dbpath_prev
471 origin=`str_dirpath_to_origin "$dbpath_prev"`
472 dbpath=${DBDIR}/conf/each_port/$origin
473 [ -d "$dbpath" ] && continue
475 done >> $tmpfile_updated_ports
476 if [ `wc -l < $tmpfile_updated_ports` -gt 0 ]
478 sort -u "$tmpfile_updated_ports" | while read origin
480 database_build_patch_reconf "$origin"
482 program_deregister_stage_complete INSPECT_ALL_DEPENDENCIES
486 program_exec_and_record_completion PATCH_TO_TMPDB_REFLECT_CONF_CHANGES
488 # ============= Database construction =============
490 # Execute command operations which must be done before building the temporary database
491 command_exec_before_building_tempdb "$@"
493 # Meta process for redo
495 _program_exec_and_record_completion__operation ()
497 rm -f "${DBDIR}/new_success_in_current_run"
498 [ "x$COMMAND_MODE" = xredo ] || return 0
499 message_echo "[REDO mode]"
502 program_exec_and_record_completion REDO_INIT
504 # Determine specified targets
506 _program_exec_and_record_completion__operation ()
508 local tag level dbsuffix
509 message_section_title "Determining specified targets"
510 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
511 "${DBDIR}/stage.loop_list/target_dependents.specified" \
512 "${DBDIR}/stage.loop_list/target_requirements.specified" \
513 "${DBDIR}/need.list" \
514 "${DBDIR}/targets_specified_so_far" 2> /dev/null \
515 | sort -u > ${DBDIR}/targets_specified_so_far.tmp
516 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
517 rm -f "${DBDIR}/stage.loop_list/target_itself.specified" \
518 "${DBDIR}/stage.loop_list/target_dependents.specified" \
519 "${DBDIR}/stage.loop_list/target_requirements.specified"
520 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
522 options_select_new_ports_if_duplicated O \
523 "${DBDIR}/stage.loop_list/target_itself.specified" "$opt_target_itself"
524 options_select_new_ports_if_duplicated t \
525 "${DBDIR}/stage.loop_list/target_dependents.specified" "$opt_target_dependents"
526 options_select_new_ports_if_duplicated T \
527 "${DBDIR}/stage.loop_list/target_requirements.specified" "$opt_target_requirements"
528 if [ `cat "${DBDIR}/stage.loop_list/target_itself.specified" \
529 "${DBDIR}/stage.loop_list/target_dependents.specified" \
530 "${DBDIR}/stage.loop_list/target_requirements.specified" | wc -l` -eq 0 ]
532 message_echo "ERROR: No matching port for target globs." >&2
536 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
537 "${DBDIR}/stage.loop_list/target_dependents.specified" \
538 "${DBDIR}/stage.loop_list/target_requirements.specified" \
539 | sort -u > ${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset
540 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset" "${DBDIR}/need.list" 2> /dev/null \
541 | sort -u > ${DBDIR}/need.list.tmp
542 mv "${DBDIR}/need.list.tmp" "${DBDIR}/need.list"
543 sort -u "${DBDIR}/need.list" "${DBDIR}/targets_specified_so_far" \
544 > ${DBDIR}/targets_specified_so_far.tmp
545 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
546 for tag in all run build none
548 for level in direct full
552 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset"
553 cat "${DBDIR}/stage.loop_list/target_dependents.specified" | while read origin
555 nodedir=${DBDIR}/requires/$origin
556 cat "$nodedir/dependents.$dbsuffix" 2> /dev/null
558 cat "${DBDIR}/stage.loop_list/target_requirements.specified" | while read origin
560 nodedir=${DBDIR}/requires/$origin
561 cat "$nodedir/requirements.$dbsuffix" 2> /dev/null
563 } | sort -u | while read origin
565 fileedit_rm_a_line "$origin" "${DBDIR}/success.$dbsuffix.list"
566 fileedit_rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.$dbsuffix.list"
567 rm -f "${DBDIR}/requires/$origin/succeeded_once"
574 program_exec_and_record_completion DETERMINE_SPECIFIED_TARGETS
576 # Show specified targets
577 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" -a $opt_batch_mode = no ]
579 message_echo "INFO: (Re/de-)installation will be carried out only for the targets:"
581 if [ `wc -l < ${DBDIR}/stage.loop_list/target_itself.specified` -gt 0 ]
583 message_echo "[Targets only]"
584 echo "----------------------------------------"
585 cat "${DBDIR}/stage.loop_list/target_itself.specified"
586 echo "----------------------------------------"
589 if [ `wc -l < ${DBDIR}/stage.loop_list/target_dependents.specified` -gt 0 ]
591 message_echo "[Targets with their `options_get_dependency_msgterm` dependents]"
592 echo "----------------------------------------"
593 cat "${DBDIR}/stage.loop_list/target_dependents.specified"
594 echo "----------------------------------------"
597 if [ `wc -l < ${DBDIR}/stage.loop_list/target_requirements.specified` -gt 0 ]
599 message_echo "[Targets with their `options_get_dependency_msgterm` requirements]"
600 echo "----------------------------------------"
601 cat "${DBDIR}/stage.loop_list/target_requirements.specified"
602 echo "----------------------------------------"
607 # Determine all target ports
608 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS COLLECT_ALL_INSTALLED_PACKAGES'
609 _program_exec_and_record_completion__operation ()
611 message_section_title "Determining all target ports"
613 if [ $opt_only_target_scope = no ]
615 cat "${DBDIR}/installed_ports" 2> /dev/null || :
617 cat "${DBDIR}/stage.loop_list/target_itself.specified" || :
618 cat "${DBDIR}/stage.loop_list/target_dependents.specified" || :
619 cat "${DBDIR}/stage.loop_list/target_requirements.specified" || :
620 cat "${DBDIR}/targets_specified_so_far" || :
621 } 2> /dev/null | sort -u > "${DBDIR}/stage.loop_list/ports_to_inspect"
624 program_exec_and_record_completion DETERMINE_ALL_TARGET_PORTS
626 # Inspection of all dependencies
627 PROGRAM_DEPENDS='PARSE_CONF DETERMINE_ALL_TARGET_PORTS'
628 _program_exec_restartable_loop_operation__routine ()
632 database_build_inspect_dependencies "$origin"
634 _program_exec_and_record_completion__operation ()
637 message_section_title "Inspecting dependencies of the all installed packages"
638 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
639 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
641 program_exec_restartable_loop_operation ports_to_inspect
642 database_build_post_inspect_dependencies
645 program_exec_and_record_completion INSPECT_ALL_DEPENDENCIES
647 # Convert dependency-lists to actual ones
648 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES'
649 _program_exec_restartable_loop_operation__routine ()
651 local origin table dbtag level tag target
653 for table in dependents requirements
655 for dbtag in requires obsolete
657 for level in direct full
659 for tag in all run build
661 target=${DBDIR}/$dbtag/$origin/${table}.${tag}.${level}
662 if [ -e "$target.src" ]
664 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "$target.src" \
665 | grep -v '^$' | sort -u > $target.tmp
666 [ -e "$target" ] && ! diff "$target.tmp" "$target" > /dev/null \
667 && echo "$origin" >> ${DBDIR}/update_dependencies
668 mv "$target.tmp" "$target"
670 [ -e "$target" ] && echo "$origin" >> ${DBDIR}/update_dependencies
678 _program_exec_and_record_completion__operation ()
680 message_section_title "Conversion of dependency-lists to actual ones"
681 program_exec_restartable_loop_operation convert_dependency_lists
682 sort -u "${DBDIR}/update_dependencies" > ${DBDIR}/update_dependencies.tmp
683 mv "${DBDIR}/update_dependencies.tmp" "${DBDIR}/update_dependencies"
684 str_escape_regexp_filter < ${DBDIR}/update_dependencies \
685 | sed 's/^/^/; s/$/$/' > ${DBDIR}/update_dependencies.grep_pattern
686 for tag in all run build
688 ( cd "${DBDIR}/requires" && \
689 find . -depth 3 -type f -name requirements.${tag}.full | sed 's|^./||;s|/[^/]*$||' ) \
690 | grep -v -E -f "${DBDIR}/update_dependencies.grep_pattern" \
691 | str_escape_regexp_filter | sed 's/^/^/; s/$/$/' \
692 > ${TMPDIR}/convert_requirements_list:full_complete.grep_pattern || :
693 ( cd "${DBDIR}/requires" && \
694 find . -depth 3 -type f -name requirements.${tag}.direct | sed 's|^./||;s|/[^/]*$||' ) \
695 | grep -v -E -f "${TMPDIR}/convert_requirements_list:full_complete.grep_pattern" \
696 > ${DBDIR}/stage.loop_list/complete_${tag}time_reqlists || :
698 for inspected_level_tmp in direct node
700 cat "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" || :
701 done 2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/trim_dependency_lists_rm_uninspected_ports
702 find "${DBDIR}/requires" -depth 2 -type d > ${DBDIR}/stage.loop_list/inspect_dependent
703 [ -e "${DBDIR}/dependents_files" ] && \
704 mv "${DBDIR}/dependents_files" "${DBDIR}/dependents_files.prev"
705 rm -f "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" "${DBDIR}/dependents_files.tmp"
708 program_exec_and_record_completion CONVERT_REQUIREMENTS_LIST
710 # Completion of recursive requirement lists
711 for _REQUIREMENT_LISTS_tag in all run build
713 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
714 _program_exec_restartable_loop_operation__routine ()
716 local tag dbpath origin
717 tag=${_REQUIREMENT_LISTS_tag}
719 origin=`str_dirpath_to_origin "$dbpath"`
720 database_build_get_complete_recursive_dependency requirements.${tag} "$origin" > /dev/null
722 _program_exec_and_record_completion__operation ()
725 tag=${_REQUIREMENT_LISTS_tag}
726 message_section_title "Completion of ${tag}-time requirement lists"
727 program_exec_restartable_loop_operation complete_${tag}time_reqlists
730 program_exec_and_record_completion REQUIREMENT_LISTS:${_REQUIREMENT_LISTS_tag}
733 # Trim dependency lists by removing uninspected ports
734 if [ $opt_only_target_scope = yes ]
736 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST'
737 _program_exec_restartable_loop_operation__routine ()
739 local dbpath tag level srcdb
741 for tag in all run build
743 for level in direct full
745 srcdb=requirements.${tag}.${level}
746 [ -e "$dbpath/$srcdb" ] || continue
747 grep -E -f "${DBDIR}/inspected_ports.grep_pattern" "$dbpath/$srcdb" \
748 > $dbpath/$srcdb.tmp || :
749 mv "$dbpath/$srcdb.tmp" "$dbpath/$srcdb"
753 _program_exec_and_record_completion__operation ()
755 message_section_title "Trimming dependency lists by removing uninspected ports"
756 program_exec_restartable_loop_operation trim_dependency_lists_rm_uninspected_ports
759 program_exec_and_record_completion TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS
762 # Inspection of dependents
763 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS'
764 _program_exec_restartable_loop_operation__routine ()
766 local dbpath origin tag level srcdb dstdb
768 origin=`str_dirpath_to_origin "$dbpath"`
769 for tag in all run build
771 for level in direct full
773 srcdb=requirements.${tag}.${level}
774 dstdb=dependents.${tag}.${level}
775 [ -e "$dbpath/$srcdb" ] || continue
776 while read origin_requirement
778 dstpath=${DBDIR}/requires/$origin_requirement
779 echo "$dstpath/$dstdb" >> ${DBDIR}/dependents_files.tmp
780 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
781 [ -d "$dstpath" ] || mkdir -p "$dstpath"
782 echo "$origin" >> $dstpath/$dstdb.raw
783 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp
784 done < $dbpath/$srcdb
788 _program_exec_and_record_completion__operation ()
790 local dbrequires_valesc
791 message_section_title "Inspection of dependents"
792 dbrequires_valesc=`str_escape_replaceval "${DBDIR}/requires/"`
793 program_exec_restartable_loop_operation inspect_dependent
794 sort -u "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" 2> /dev/null \
795 > ${DBDIR}/stage.loop_list/make_dependents_lists_unique || :
796 sort -u "${DBDIR}/dependents_files.tmp" 2> /dev/null > ${DBDIR}/dependents_files || :
797 [ -e "${DBDIR}/make_dependents_lists_unique.prev" ] && \
798 fileedit_manipulate_old_lines "${DBDIR}/dependents_files.prev" "${DBDIR}/dependents_files" \
802 program_exec_and_record_completion INSPECT_DEPENDENTS
804 # Remove duplicated lines in dependents lists
805 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
806 _program_exec_restartable_loop_operation__routine ()
808 local dbpath tag level dstdb
810 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
811 mv "$dstdb.tmp" "$dstdb"
814 _program_exec_and_record_completion__operation ()
816 local dbrequires_valesc
817 message_section_title "Removing duplicated items in dependents lists"
818 program_exec_restartable_loop_operation make_dependents_lists_unique
821 program_exec_and_record_completion MAKE_DEPENDENTS_LISTS_UNIQUE
823 # Preparation of target attribute information
824 for _TARGET_ATTR_INFO_table in requirements dependents itself
826 [ `cat "${DBDIR}/stage.loop_list/target_${_TARGET_ATTR_INFO_table}.replaced.specified" 2> /dev/null \
827 | wc -l` -gt 0 ] || continue
828 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS CONVERT_REQUIREMENTS_LIST'
829 _program_exec_restartable_loop_operation__routine ()
831 local origin dbtargets_valesc table
833 dbtargets_valesc=`str_escape_replaceval "${DBDIR}/targets/"`
834 table=${_TARGET_ATTR_INFO_table}
835 for database in requires initial
837 dbpath=${DBDIR}/$database/$origin
838 dstpath=${DBDIR}/targets/$origin
839 [ -d "$dstpath" ] || mkdir -p "$dstpath"
840 touch "$dstpath/target_itself"
841 echo "$origin" >> ${DBDIR}/all_targets.lst
842 [ $table = itself ] && continue
843 for tag in all run build
845 for level in direct full
847 srcdb=${table}.${tag}.${level}
848 dstdb=target_${database}_${table}.${tag}.${level}
849 [ -e "$dbpath/$srcdb" ] || continue
850 cat "$dbpath/$srcdb" >> ${DBDIR}/all_targets.lst
851 sed -E "s/^/$dbtargets_valesc/; s|$|/$dstdb|" "$dbpath/$srcdb" \
852 | fileedit_add_a_line_to_files_if_new "$origin"
857 _program_exec_and_record_completion__operation ()
860 table=${_TARGET_ATTR_INFO_table}
861 message_section_title "Preparation of target attribute information for dependency [$table]"
862 program_exec_restartable_loop_operation target_$table.replaced.specified
865 program_exec_and_record_completion TARGET_ATTR_INFO:${_TARGET_ATTR_INFO_table}
868 # Post-process after the preparation of target attribute information
869 PROGRAM_DEPENDS='MAKE_DEPENDENTS_LISTS_UNIQUE TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents'
870 _program_exec_and_record_completion__operation ()
872 message_section_title "Post-process after the preparation of target attribute information"
873 sort -u "${DBDIR}/all_targets.lst" 2> /dev/null \
874 | grep -E -f "${DBDIR}/inspected_ports.grep_pattern" \
875 | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" \
876 > ${DBDIR}/all_targets.lst.tmp || :
877 mv "${DBDIR}/all_targets.lst.tmp" "${DBDIR}/all_targets.lst"
878 find "${DBDIR}/targets" -depth 2 -type d > ${DBDIR}/stage.loop_list/build_complement_to_new_dependents_for_targets 2> /dev/null || :
880 cat "${DBDIR}/all_targets.lst" "${DBDIR}/need.with_replaced.list" 2> /dev/null || :
881 find "${DBDIR}/requires" -depth 3 -type f -name installed_version \
882 | sed -E 's|.*/([^/]+/[^/]+)/[^/]*$|\1|'
883 } | sort -u > ${DBDIR}/stage.loop_list/inspect_necessity
884 cp /dev/null "${DBDIR}/stage.loop_list/parse_target_attr_info"
885 find -E "${DBDIR}/requires" -depth 3 -type f -regex '.*/necessary_port\.(direct|full)$' -delete
888 program_exec_and_record_completion TARGET_ATTR_INFO_POSTPROCESS
890 # Build of data on complement to new dependents for target attribute information
891 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents CONVERT_REQUIREMENTS_LIST'
892 _program_exec_restartable_loop_operation__routine ()
896 origin=`str_dirpath_to_origin "$dbpath"`
897 database_build_complement_to_new_dependents_for_targets "$origin"
899 _program_exec_and_record_completion__operation ()
901 message_section_title "Build of data on complement to new dependents for target attribute information"
902 program_exec_restartable_loop_operation build_complement_to_new_dependents_for_targets
903 sort -u "${DBDIR}/stage.loop_list/parse_target_attr_info" > ${DBDIR}/stage.loop_list/parse_target_attr_info.tmp
904 mv "${DBDIR}/stage.loop_list/parse_target_attr_info.tmp" "${DBDIR}/stage.loop_list/parse_target_attr_info"
907 program_exec_and_record_completion COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO
909 # Parse target attribute information
910 PROGRAM_DEPENDS='COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO'
911 _program_exec_restartable_loop_operation__routine ()
915 origin=`str_dirpath_to_origin "$dbpath"`
916 database_build_target_attributes "$origin"
918 _program_exec_and_record_completion__operation ()
920 message_section_title "Parsing target attribute information"
921 program_exec_restartable_loop_operation parse_target_attr_info
924 program_exec_and_record_completion PARSE_TARGET_ATTR_INFO
926 # Inspection of necessity
927 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS REQUIREMENT_LISTS:run-time REQUIREMENT_LISTS:build-time INSPECT_ALL_DEPENDENCIES'
928 _program_exec_restartable_loop_operation__routine ()
932 for level in direct full
934 database_build_inspect_necessity_for_only_new_upgrade "$origin" "$level"
937 _program_exec_and_record_completion__operation ()
939 message_section_title "Inspection of necessity"
940 program_exec_restartable_loop_operation inspect_necessity
941 for level in direct full
943 find "${DBDIR}/requires" -depth 3 -type f -name "necessary_port.${level}" \
944 > ${DBDIR}/stage.loop_list/necessary_ports.${level}
948 program_exec_and_record_completion INSPECT_NECESSITY
950 # Inspection of necessary upgrades
951 for _NECESSARY_UPDATES_level in direct full
953 PROGRAM_DEPENDS='INSPECT_NECESSITY INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE'
954 _program_exec_restartable_loop_operation__routine ()
956 local markerpath level dbpath origin tag
958 level=${_NECESSARY_UPDATES_level}
959 dbpath=`dirname "$markerpath"`
960 origin=`str_dirpath_to_origin "$dbpath"`
961 database_query_does_a_port_need_update "$origin" || return 0
962 for tag in all run build none
964 touch "$dbpath/necessary_upgrade.$tag.${level}"
965 [ -e "$dbpath/dependents.$tag.${level}" ] || continue
966 while read origin_dependent
968 touch "${DBDIR}/requires/$origin_dependent/necessary_upgrade.$tag.${level}"
969 done < $dbpath/dependents.$tag.${level}
972 _program_exec_and_record_completion__operation ()
975 level=${_NECESSARY_UPDATES_level}
976 message_section_title "Inspection of necessary upgrades at the $level level"
977 program_exec_restartable_loop_operation necessary_ports.${level}
980 program_exec_and_record_completion NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
983 # Preparation for inspection of new leaf ports
984 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
986 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE PARSE_CONF'
987 _program_exec_and_record_completion__operation ()
989 message_section_title "Preparation for inspection of new leaf ports"
990 find "${DBDIR}/requires" -depth 3 -type f -name dependents.all.full \
991 | sed -E 's|.*/([^/]+/[^/]+)/[^/]+$|\1|' \
992 | sort -u > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports
993 sort -u "${DBDIR}/inspected_ports" > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports
994 fileedit_manipulate_new_lines \
995 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports" \
996 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports" \
997 | grep -v -E -f "${DBDIR}/conf/HOLD_PORTS.grep_pattern" \
998 > ${DBDIR}/stage.loop_list/leaf_ports_primary_candidates || :
999 cp /dev/null "${DBDIR}/grep.leaf_ports.pattern"
1000 cp /dev/null "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
1003 program_exec_and_record_completion PREPARE_INSPECT_LEAF_PORTS
1006 # Inspection of new primary leaf ports
1007 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1009 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE PREPARE_INSPECT_LEAF_PORTS PARSE_CONF'
1010 _program_exec_restartable_loop_operation__routine ()
1012 local origin origin_ini origin_esc dbpath origin_req
1014 pkgsys_is_pkgtool "$origin" && return
1015 dbpath=${DBDIR}/requires/$origin
1016 origin_esc=`str_escape_regexp "$origin"`
1017 grep -q -E "^$origin_esc$" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
1018 if ! grep -q -E "^$origin_esc$" "${DBDIR}/noneed.list" 2> /dev/null
1020 if [ -e "$dbpath/initial_orig" ]
1022 origin_ini=`cat "$dbpath/initial_orig"`
1023 [ -e "${DBDIR}/initial/$origin_ini/installed_version" \
1024 -a `cat "${DBDIR}/initial/$origin_ini/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
1027 [ -e "${DBDIR}/initial/$origin/installed_version" \
1028 -a `cat "${DBDIR}/initial/$origin/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
1031 if [ -e "$dbpath/requirements.all.full" ]
1033 grep -v -E -f "${DBDIR}/conf/HOLD_PORTS.grep_pattern" "$dbpath/requirements.all.full" | \
1034 fileedit_add_lines_if_new "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
1036 fileedit_add_a_line_if_new "^$origin_esc$" "${DBDIR}/grep.leaf_ports.pattern"
1038 _program_exec_and_record_completion__operation ()
1040 local num_leaves num_leaves_prev
1041 message_section_title "Inspection of new primary leaf ports"
1042 program_exec_restartable_loop_operation leaf_ports_primary_candidates
1043 wc -l < ${DBDIR}/grep.leaf_ports.pattern | tr -d ' ' > ${DBDIR}/num_leaves
1044 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
1045 message_echo " `cat "${DBDIR}/num_leaves"` primary leaf port(s) is/are found."
1048 program_exec_and_record_completion INSPECT_PRIMARY_LEAF_PORTS
1051 # Inspection of requirements of new leaf ports
1052 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1054 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE INSPECT_PRIMARY_LEAF_PORTS PARSE_CONF'
1055 _program_exec_and_record_completion__operation ()
1057 local num_leaves num_leaves_prev num_inspect num_leaves_new
1058 message_section_title "Inspection of requirements of new leaf ports"
1059 message_echo "INFO: The inspection proceeds by iterative method."
1062 _program_exec_restartable_loop_operation__routine ()
1064 local origin origin_esc dbpath
1066 pkgsys_is_pkgtool "$origin" && return
1067 dbpath=${DBDIR}/requires/$origin
1068 origin_esc=`str_escape_regexp "$origin"`
1069 grep -q -E "^$origin_esc$" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
1070 grep -E -v -f "${DBDIR}/grep.leaf_ports.pattern" \
1071 "$dbpath/dependents.all.full" > /dev/null 2>&1 && return
1072 cat "$dbpath/requirements.all.full" 2> /dev/null \
1073 >> ${DBDIR}/leaf_ports_secondary_candidates.new_requirements || :
1074 fileedit_add_a_line_if_new "^$origin_esc$" "${DBDIR}/grep.leaf_ports.pattern"
1076 program_exec_restartable_loop_operation leaf_ports_secondary_candidates
1077 num_leaves_prev=`cat "${DBDIR}/num_leaves"`
1078 num_leaves=`wc -l < ${DBDIR}/grep.leaf_ports.pattern | tr -d ' '`
1079 num_leaves_new=`echo $(($num_leaves-$num_leaves_prev)) | tr -d ' '`
1080 if [ $num_leaves_new -eq 0 ]
1082 message_echo " No more leaf port is found."
1083 message_echo " $num_leaves leaf port(s) is/are found in total."
1087 grep -E -v -f "${DBDIR}/grep.leaf_ports.pattern" \
1088 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
1089 cat "${DBDIR}/leaf_ports_secondary_candidates.new_requirements" || :
1090 } | grep -v -E -f "${DBDIR}/conf/HOLD_PORTS.grep_pattern" | sort -u \
1091 > ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp || :
1092 program_reset_loop_for_stage INSPECT_REQUIREMENTS_OF_LEAF_PORTS
1093 mv "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp" \
1094 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
1095 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
1096 echo "$num_leaves" > ${DBDIR}/num_leaves
1097 num_inspect=`wc -l < ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates | tr -d ' '`
1098 message_echo " $num_leaves_new leaf port(s) is/are newly found; continue for $num_inspect candidate(s)."
1100 grep -E -f "${DBDIR}/grep.leaf_ports.pattern" "${DBDIR}/inspected_ports" | sort -u > ${DBDIR}/leaf_ports || :
1103 program_exec_and_record_completion INSPECT_REQUIREMENTS_OF_LEAF_PORTS
1106 # Order the ports considering dependencies
1107 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
1108 _program_exec_and_record_completion__operation ()
1110 message_section_title "Ordering dependencies"
1111 if ! database_build_order_ports_considering_dependencies
1113 message_echo "ERROR: Unsatisfied dependencies are remained:" >&2
1114 message_cat "${DBDIR}/unsatisfied.list"
1115 message_echo "*** Aborted by ${APPNAME}"
1116 message_echo "The ports tree seems broken. You might have caught an incomplete version."
1117 message_echo "You are encouraged to update the ports tree by portsnap(8)."
1118 message_echo "Then execute"
1119 message_echo " ${APPNAME} clean"
1120 message_echo "before restart."
1121 temp_terminate_process () { :; }
1126 program_exec_and_record_completion ORDER_ALL_DEPENDENCIES
1128 # Selection of removing leaf ports
1129 PROGRAM_DEPENDS='INSPECT_REQUIREMENTS_OF_LEAF_PORTS'
1130 _program_exec_and_record_completion__operation ()
1132 message_section_title "Selection of removing leaf ports"
1133 deinstall_select_leaf_ports_to_delete
1136 program_exec_and_record_completion SELECT_LEAF_PORTS
1138 # Selection of removing obsolete ports
1139 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES PARSE_CONF'
1140 _program_exec_and_record_completion__operation ()
1142 message_section_title "Selection of removing obsolete ports"
1143 deinstall_select_obsolete_ports_to_delete
1146 program_exec_and_record_completion SELECT_OBSOLETE_PORTS
1148 # Collection of leaf ports to delete
1149 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1151 PROGRAM_DEPENDS='SELECT_LEAF_PORTS'
1152 _program_exec_and_record_completion__operation ()
1154 local src src_unselected reqptn_file src_with_initial_origins
1155 message_section_title "Collecting leaf ports to delete"
1156 src=${DBDIR}/leaf_ports
1157 src_unselected=${DBDIR}/leaf_ports_to_delete.unselected
1158 src_with_initial_origins=${DBDIR}/leaf_ports.with_ini
1159 reqptn_file=${DBDIR}/leaf_ports.requirements_of_unselected.grep_pattern
1160 cat "$src_unselected" 2> /dev/null | while read origin
1162 cat "${DBDIR}/requires/$origin/requirements.all.full" || :
1163 done | sort -u | str_escape_regexp_filter \
1164 | sed 's/^/^/;s/$/$/' > $reqptn_file
1165 database_query_add_initial_origins < $src > $src_with_initial_origins
1168 program_exec_and_record_completion COLLECT_LEAF_PORTS_TO_DELETE
1171 # Collection of obsolete ports to delete
1172 PROGRAM_DEPENDS='SELECT_OBSOLETE_PORTS'
1173 _program_exec_and_record_completion__operation ()
1175 local src src_selected src_unselected dst_selected reqptn_file
1176 message_section_title "Collecting obsolete ports to delete"
1177 src=${DBDIR}/obsolete_ports.can_be_deleted
1178 src_selected=${DBDIR}/obsolete_ports_to_delete.selected
1179 src_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
1180 dst_selected=${DBDIR}/obsolete_ports_to_delete
1181 reqptn_file=${DBDIR}/obsolete_ports.requirements_of_unselected.grep_pattern
1182 cat "$src_unselected" 2> /dev/null | while read origin
1184 cat "${DBDIR}/initial/$origin/requirements.run.full" || :
1185 cat "${DBDIR}/obsolete/$origin/requirements.run.full" || :
1186 done | sort -u | str_escape_regexp_filter \
1187 | sed 's/^/^/;s/$/$/' > $reqptn_file
1188 grep -v -E -f "$reqptn_file" "$src_selected" > $dst_selected 2> /dev/null || :
1191 program_exec_and_record_completion COLLECT_OBSOLETE_PORTS_TO_DELETE
1193 # Set up the list of ports to reinstall
1194 PROGRAM_DEPENDS='ORDER_ALL_DEPENDENCIES'
1195 _program_exec_and_record_completion__operation ()
1197 message_section_title "Setting up the list of ports to reinstall"
1198 cp -p "${DBDIR}/reinst_order.list" "${DBDIR}/stage.loop_list/reinst_todo"
1201 program_exec_and_record_completion SETUP_REINST_TODO
1203 # Composition of a list for deinstallation of obsolete and leaf packages
1204 PROGRAM_DEPENDS='COLLECT_LEAF_PORTS_TO_DELETE COLLECT_OBSOLETE_PORTS_TO_DELETE'
1205 _program_exec_and_record_completion__operation ()
1207 local reqptn_leaf reqptn_obs leaf_selected leaf_selected_src obs_selected obs_selected_src grepptn preserved
1208 message_section_title "Composing a list for deinstallation of obsolete and leaf packages"
1209 reqptn_leaf=${DBDIR}/leaf_ports.requirements_of_unselected.grep_pattern
1210 reqptn_obs=${DBDIR}/obsolete_ports.requirements_of_unselected.grep_pattern
1211 leaf_selected_src=${DBDIR}/leaf_ports_to_delete.selected
1212 leaf_selected=${DBDIR}/leaf_ports_to_delete
1213 obs_selected_src=${DBDIR}/obsolete_ports_to_delete.selected
1214 obs_selected=${DBDIR}/obsolete_ports_to_delete
1215 grepptn=${DBDIR}/ports_to_delete.grep_pattern
1216 grepptn_col1=${DBDIR}/ports_to_delete.grep_pattern_col1
1217 preserved=${TMPDIR}/LIST_DEINST_PKGS::preserved
1218 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1220 cat "$reqptn_leaf" "$reqptn_obs" 2> /dev/null | sort -u > $grepptn
1221 grep -v -E -f "$grepptn" "$leaf_selected_src" 2> /dev/null \
1222 | database_query_add_initial_origins > $leaf_selected || :
1223 cat "$obs_selected" "$leaf_selected" 2> /dev/null || :
1225 rm -f "$leaf_selected"
1226 cat "$obs_selected" 2> /dev/null
1227 fi | sort -u > ${DBDIR}/stage.loop_list/ports_to_delete
1228 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1229 | sed 's/^/^/;s/$/$/' > $grepptn
1230 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1231 | sed 's/^/^/;s/$/[[:space:]]/' > $grepptn_col1
1232 cat "${DBDIR}/leaf_ports.with_ini" "${DBDIR}/obsolete_ports" 2> /dev/null \
1233 | grep -E -v -f "$grepptn" > ${DBDIR}/stage.loop_list/ports_to_restore || :
1234 if [ $opt_batch_mode = no ]
1236 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ] && \
1237 grep -v -E -f "$grepptn" "$leaf_selected_src" > $preserved 2> /dev/null
1239 message_echo "INFO: Following leaf ports are preserved because required by other preserved leaf/obsolete ports."
1240 message_echo "----------------"
1243 pkgtag=`cat "${DBDIR}/required/$origin/pkgtag" 2> /dev/null` || :
1246 echo "$origin" "($pkgtag)"
1251 message_echo "----------------"
1253 if grep -v -E -f "$grepptn" "$obs_selected_src" > $preserved 2> /dev/null
1255 message_echo "INFO: Following obsolete ports are preserved because required by other obsolete ports."
1256 message_echo "----------------"
1259 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version" 2> /dev/null` || :
1262 echo "$origin" "($pkgtag)"
1267 message_echo "----------------"
1272 program_exec_and_record_completion LIST_DEINST_PKGS
1274 # Collect entire distfiles list
1275 if [ $opt_inspect_entire_distinfo = yes ]
1278 _program_exec_and_record_completion__operation ()
1280 message_section_title "Collecting entire distfiles list"
1281 find "${PORTSDIR}" -depth 3 -name distinfo -exec cat {} \; \
1282 | grep '^SHA256 ' | sed -E 's/^SHA256 \(([^)]*)\).*/\1/' \
1283 | sort -u > ${DBDIR}/distfiles.entire.tmp
1284 mv "${DBDIR}/distfiles.entire.tmp" "${DBDIR}/distfiles.entire"
1287 program_exec_and_record_completion COLLECT_ALL_DISTFILES_LIST
1290 # Inspection of all required distfiles
1291 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES COLLECT_ALL_DISTFILES_LIST'
1292 _program_exec_and_record_completion__operation ()
1294 message_section_title "Summarizing distfiles list"
1295 cat "${DBDIR}/distfiles.entire" "${DBDIR}/distfiles.inspected" 2> /dev/null \
1296 | sort -u | str_escape_regexp_filter \
1297 | sed 's|^|^\\.\\/|; s|$|$|' > ${DBDIR}/distfiles.grep.pattern || :
1300 program_exec_and_record_completion DISTFILES_LIST
1302 # Clean up of reinstallation status for preparation
1303 PROGRAM_DEPENDS='REDO_INIT INSPECT_ALL_DEPENDENCIES'
1304 _program_exec_and_record_completion__operation ()
1306 message_section_title "Cleaning up of reinstallation status for preparation"
1307 rm -rf "${DBDIR}/status.ports"
1310 program_exec_and_record_completion CLEANUP_REINST_STATUS
1312 # Completion of building the temporary database
1313 PROGRAM_DEPENDS='REDO_INIT SETUP_REINST_TODO CLEANUP_REINST_STATUS PARSE_CONF INSPECT_ALL_DEPENDENCIES NECESSARY_UPDATES:direct NECESSARY_UPDATES:full PARSE_TARGET_ATTR_INFO MAKE_DEPENDENTS_LISTS_UNIQUE COLLECT_LEAF_PORTS_TO_DELETE'
1314 _program_exec_and_record_completion__operation ()
1316 message_section_title "The temporary database is completely built up"
1319 program_exec_and_record_completion PREPARATION
1322 # ==================================================
1323 # ====================== MAIN ======================
1324 # ==================================================
1326 # Execute command operations which must be done before actual (re/de)installation processes
1327 command_exec_before_actual_re_de_installation "$@"
1329 # Set termination messages
1330 temp_terminate_process ()
1332 temp_terminate_process_common
1335 # Reinstallation of remained ports
1336 PROGRAM_DEPENDS='PREPARATION'
1337 _program_exec_restartable_loop_operation__routine ()
1341 _program_exec_and_record_completion__operation ()
1343 local _MSG_CURRENT_STAGE_general
1344 _MSG_CURRENT_STAGE_general="reinstallation"
1345 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1346 message_section_title "Reinstallation"
1347 program_exec_restartable_loop_operation reinst_todo
1348 reinstall_restore_conflicts
1349 temp_set_msg_current_stage
1352 program_exec_and_record_completion REINSTALLATION
1354 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1355 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1356 _program_exec_restartable_loop_operation__routine ()
1358 deinstall_restore "$@"
1360 _program_exec_and_record_completion__operation ()
1362 local _MSG_CURRENT_STAGE_general
1363 _MSG_CURRENT_STAGE_general="restoration of unselected obsolete/leaf packages"
1364 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1365 message_section_title "Restoration of unselected obsolete/leaf packages"
1366 program_exec_restartable_loop_operation ports_to_restore
1367 temp_set_msg_current_stage
1370 program_exec_and_record_completion RESTORE_ONCE_DEINST_PKGS
1372 # Deinstallation of unused obsolete and leaf packages
1373 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1374 _program_exec_restartable_loop_operation__routine ()
1378 _program_exec_and_record_completion__operation ()
1380 local _MSG_CURRENT_STAGE_general
1381 _MSG_CURRENT_STAGE_general="deinstallation of obsolete/leaf packages"
1382 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1383 message_section_title "Deinstallation of unused obsolete/leaf packages"
1384 program_exec_restartable_loop_operation ports_to_delete
1385 temp_set_msg_current_stage
1388 program_exec_and_record_completion DEINST_UNUSED_PKGS
1390 # Clean up obsolete or unused distfiles
1391 if [ $opt_only_target_scope = no -a $opt_keep_distfiles = no ]
1393 PROGRAM_DEPENDS='REINSTALLATION DISTFILES_LIST'
1394 _program_exec_and_record_completion__operation ()
1396 local tmp_distfiles_exists
1397 message_section_title "Cleaning up obsolete or unused distfiles"
1398 tmp_distfiles_exists=${TMPDIR}/CLEANUP_OBSLETE_DISTFILES::distfiles_exists
1399 [ $opt_dry_run = yes ] && message_echo "INFO: The operations are not actually carried out."
1400 ( set -e; cd "${DISTDIR}" && find . -type f ) \
1401 | sed 's|^\./||' | sort -u > $tmp_distfiles_exists
1402 fileedit_manipulate_old_lines "$tmp_distfiles_exists" "${DBDIR}/distfiles.entire" \
1403 | while read distfile
1405 if [ $opt_batch_mode = no ]
1409 [ $opt_dry_run = yes ] && continue
1410 rm -f "${DISTDIR}/$distfile"
1414 program_exec_and_record_completion CLEANUP_OBSLETE_DISTFILES
1417 # Rebuild of package database
1418 PROGRAM_DEPENDS='REINSTALLATION RESTORE_ONCE_DEINST_PKGS DEINST_UNUSED_PKGS'
1419 _program_exec_and_record_completion__operation ()
1421 which -s pkgdb || return 0
1422 message_section_title "Rebuilding package database for portupgrade"
1426 program_exec_and_record_completion REBUILD_PKGDB
1429 # ==================================================
1430 # ================ ENDING MESSAGES =================
1431 # ==================================================
1433 # Notice of failures
1434 exists_unresolved_ports=
1435 message_summary_dependents_of_failed_reinstallation failure || exists_unresolved_ports=y
1436 message_summary_dependents_of_failed_reinstallation redo || exists_unresolved_ports=y
1437 message_summary_dependents_of_failed_reinstallation conflict || exists_unresolved_ports=y
1438 [ -n "$exists_unresolved_ports" ] && message_summary_advice_on_manual_solution
1441 temp_terminate_process () { :; }
1443 if [ -z "$exists_unresolved_ports" ]
1445 message_section_title "COMPLETELY DONE"
1446 message_echo "- E N D -"
1448 message_warn_no_achieved_progress || :
1449 message_section_title "Done with some unresolved problems"
1450 message_echo "- To be continued -"