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.0+toward_3.0.1_20130610124556
19 COMPATIBLE_VERSIONS='^(3\.0\.0\+toward_3\.0\.1_[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`" != 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"
350 program_exec_and_record_completion UPGRADE_PKGNG
353 # Upgrade of ports-mgmt/dialog4ports if new
354 # (No need depend on PARSE_CONF because REINSTALLATION will take the task.)
355 if [ \( "$COMMAND_MODE" = do -o "$COMMAND_MODE" = redo \) \
356 -a $opt_dry_run = no -a $opt_suppress_pkgtools_upadte = no ] \
357 && pkgsys_is_dialog4ports_used
359 PROGRAM_DEPENDS='PRELIMINARY_INSPECTION_OF_TOOLS'
360 _program_exec_and_record_completion__operation ()
362 local _MSG_CURRENT_STAGE_general
363 _MSG_CURRENT_STAGE_general="pkgng dialog4ports"
364 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
365 message_section_title "Upgrade of dialog4ports if new"
366 touch "${DBDIR}/target_all"
367 reinstall_exec ports-mgmt/dialog4ports
368 reinstall_restore_conflicts
369 rm -f "${DBDIR}/target_all"
372 program_exec_and_record_completion UPGRADE_DIALOG4PORTS
375 # Upgrade of this utility if new
376 # (No need depend on PARSE_CONF because REINSTALLATION will take the task.)
377 if [ \( "$COMMAND_MODE" = do -o "$COMMAND_MODE" = redo \) \
378 -a $opt_dry_run = no -a $opt_suppress_self_upadte = no \
379 -a -n "$MYPORTORIGIN" ]
381 PROGRAM_DEPENDS='PRELIMINARY_INSPECTION_OF_TOOLS'
382 _program_exec_and_record_completion__operation ()
384 local _MSG_CURRENT_STAGE_general
385 _MSG_CURRENT_STAGE_general="pkgng upgrade"
386 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
387 message_section_title "Upgrade of this utility if new"
388 touch "${DBDIR}/target_all"
389 reinstall_exec "$MYPORTORIGIN"
390 reinstall_restore_conflicts
391 rm -f "${DBDIR}/target_all"
394 program_exec_and_record_completion UPGRADE_SELF
397 if [ "x`${APPNAME} -aV 2> /dev/null`" != "x$MYVERSION" ]
399 message_echo "INFO: ${APPNAME} is upgraded and the temporary database needs refresh."
400 database_build_clean_for_self_upgrade || :
401 message_echo "INFO: Restarting with the new version."
403 temp_trap_for_invoking_new_version
404 . "${TMPDIR}"/restart_command.sh
409 # ==================================================
410 # ================== PREPARATION ===================
411 # ==================================================
413 # ============= Correspondence to configuration changes =============
415 # Patch to the temporary database by reflecting changes in configuration
416 PROGRAM_DEPENDS='PARSE_CONF'
417 _program_exec_and_record_completion__operation ()
419 local tmpfile_diff tmpfile_old tmpfile_new key
420 [ -d "${DBDIR}/conf.prev" ] || return 0
421 message_section_title "Patch to the temporary database by reflecting changes in configuration"
422 tmpfile_old=${TMPDIR}/PATCH_TO_TMPDB_REFLECT_CONF_CHANGES::old
423 tmpfile_new=${TMPDIR}/PATCH_TO_TMPDB_REFLECT_CONF_CHANGES::new
424 tmpfile_updated_ports=${TMPDIR}/PATCH_TO_TMPDB_REFLECT_CONF_CHANGES::updated_ports
425 if fileedit_manipulate_old_new_lines \
426 "${DBDIR}/conf.prev/setenv.sh" "${DBDIR}/conf/setenv.sh" "$tmpfile_old" "$tmpfile_new"
428 if grep -q -e ^LOCALBASE= -e ^LINUXBASE= -e ^PORTSDIR= "$tmpfile_old" "$tmpfile_new"
430 message_echo "ERROR: Migration of the temporary database is unavailable because LOCALBASE, LINUXBASE or PORTSDIR was changed." >&2
431 message_echo " ${APPNAME} clean" >&2
432 message_echo "must be executed in advance." >&2
436 cut -s -d '|' -f 1,2 "${DBDIR}/conf.prev/MOVED_ALT.parsed" | tr '|' '\t' > ${TMPDIR}/MOVED_ALT.old
437 cut -s -d '|' -f 1,2 "${DBDIR}/conf/MOVED_ALT.parsed" | tr '|' '\t' > ${TMPDIR}/MOVED_ALT.new
438 if fileedit_manipulate_old_new_lines \
439 "${TMPDIR}/MOVED_ALT.old" "${TMPDIR}/MOVED_ALT.new" "$tmpfile_old" "$tmpfile_new"
441 cat "$tmpfile_old" "$tmpfile_new" | while read from to
444 [ -n "$to" ] && echo "$to"
446 fi > $tmpfile_updated_ports
447 if fileedit_manipulate_old_new_lines \
448 "${DBDIR}/conf.prev/REPLACE.csv" "${DBDIR}/conf/REPLACE.csv" "$tmpfile_old" "$tmpfile_new"
450 cat "$tmpfile_old" "$tmpfile_new" | while read from to
453 [ -n "$to" ] && echo "$to"
455 fi >> $tmpfile_updated_ports
456 [ `wc -l < $tmpfile_updated_ports` -gt 0 ] && rm -f "${DBDIR}/REPLACE.complete_sed_pattern"
457 [ -d "${DBDIR}/conf/each_port" ] && find "${DBDIR}/conf/each_port" -depth 2 \
460 origin=`str_dirpath_to_origin "$dbpath"`
461 dbpath_prev=${DBDIR}/conf.prev/each_port/$origin
462 diff -r "$dbpath_prev" "$dbpath" > /dev/null 2>&1 && continue
464 done >> $tmpfile_updated_ports
465 [ -d "${DBDIR}/conf.prev/each_port" ] && find "${DBDIR}/conf.prev/each_port" -depth 2 \
466 | while read dbpath_prev
468 origin=`str_dirpath_to_origin "$dbpath_prev"`
469 dbpath=${DBDIR}/conf/each_port/$origin
470 [ -d "$dbpath" ] && continue
472 done >> $tmpfile_updated_ports
473 if [ `wc -l < $tmpfile_updated_ports` -gt 0 ]
475 sort -u "$tmpfile_updated_ports" | while read origin
477 database_build_patch_reconf "$origin"
479 program_deregister_stage_complete INSPECT_ALL_DEPENDENCIES
483 program_exec_and_record_completion PATCH_TO_TMPDB_REFLECT_CONF_CHANGES
485 # ============= Database construction =============
487 # Execute command operations which must be done before building the temporary database
488 command_exec_before_building_tempdb "$@"
490 # Meta process for redo
492 _program_exec_and_record_completion__operation ()
494 rm -f "${DBDIR}/new_success_in_current_run"
495 [ "x$COMMAND_MODE" = xredo ] || return 0
496 message_echo "[REDO mode]"
499 program_exec_and_record_completion REDO_INIT
501 # Determine specified targets
503 _program_exec_and_record_completion__operation ()
505 message_section_title "Determining specified targets"
506 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
507 "${DBDIR}/stage.loop_list/target_dependents.specified" \
508 "${DBDIR}/stage.loop_list/target_requirements.specified" \
509 "${DBDIR}/need.list" \
510 "${DBDIR}/targets_specified_so_far" 2> /dev/null \
511 | sort -u > ${DBDIR}/targets_specified_so_far.tmp
512 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
513 rm -f "${DBDIR}/stage.loop_list/target_itself.specified" \
514 "${DBDIR}/stage.loop_list/target_dependents.specified" \
515 "${DBDIR}/stage.loop_list/target_requirements.specified"
516 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
518 options_select_new_ports_if_duplicated O \
519 "${DBDIR}/stage.loop_list/target_itself.specified" "$opt_target_itself"
520 options_select_new_ports_if_duplicated t \
521 "${DBDIR}/stage.loop_list/target_dependents.specified" "$opt_target_dependents"
522 options_select_new_ports_if_duplicated T \
523 "${DBDIR}/stage.loop_list/target_requirements.specified" "$opt_target_requirements"
524 if [ `cat "${DBDIR}/stage.loop_list/target_itself.specified" \
525 "${DBDIR}/stage.loop_list/target_dependents.specified" \
526 "${DBDIR}/stage.loop_list/target_requirements.specified" | wc -l` -eq 0 ]
528 message_echo "ERROR: No matching port for target globs." >&2
532 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
533 "${DBDIR}/stage.loop_list/target_dependents.specified" \
534 "${DBDIR}/stage.loop_list/target_requirements.specified" \
535 | sort -u > ${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset
536 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset" "${DBDIR}/need.list" 2> /dev/null \
537 | sort -u > ${DBDIR}/need.list.tmp
538 mv "${DBDIR}/need.list.tmp" "${DBDIR}/need.list"
539 sort -u "${DBDIR}/need.list" "${DBDIR}/targets_specified_so_far" \
540 > ${DBDIR}/targets_specified_so_far.tmp
541 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
542 dbsuffix=`options_get_dependency_type`.`options_get_dependency_level`
544 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset"
545 cat "${DBDIR}/stage.loop_list/target_dependents.specified" | while read origin
547 nodedir=${DBDIR}/requires/$origin
548 cat "$nodedir/dependents.$dbsuffix" 2> /dev/null
550 cat "${DBDIR}/stage.loop_list/target_requirements.specified" | while read origin
552 nodedir=${DBDIR}/requires/$origin
553 cat "$nodedir/requirements.$dbsuffix" 2> /dev/null
555 } | sort -u | while read origin
557 fileedit_rm_a_line "$origin" "${DBDIR}/success.$dbsuffix.list"
558 fileedit_rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.$dbsuffix.list"
559 rm -f "${DBDIR}/requires/$origin/succeeded_once"
564 program_exec_and_record_completion DETERMINE_SPECIFIED_TARGETS
566 # Show specified targets
567 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" -a $opt_batch_mode = no ]
569 message_echo "INFO: (Re/de-)installation will be carried out only for the targets:"
571 if [ `wc -l < ${DBDIR}/stage.loop_list/target_itself.specified` -gt 0 ]
573 message_echo "[Targets only]"
574 echo "----------------------------------------"
575 cat "${DBDIR}/stage.loop_list/target_itself.specified"
576 echo "----------------------------------------"
579 if [ `wc -l < ${DBDIR}/stage.loop_list/target_dependents.specified` -gt 0 ]
581 message_echo "[Targets with their `options_get_dependency_msgterm` dependents]"
582 echo "----------------------------------------"
583 cat "${DBDIR}/stage.loop_list/target_dependents.specified"
584 echo "----------------------------------------"
587 if [ `wc -l < ${DBDIR}/stage.loop_list/target_requirements.specified` -gt 0 ]
589 message_echo "[Targets with their `options_get_dependency_msgterm` requirements]"
590 echo "----------------------------------------"
591 cat "${DBDIR}/stage.loop_list/target_requirements.specified"
592 echo "----------------------------------------"
597 # Determine all target ports
598 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS COLLECT_ALL_INSTALLED_PACKAGES'
599 _program_exec_and_record_completion__operation ()
601 message_section_title "Determining all target ports"
603 if [ $opt_only_target_scope = no ]
605 cat "${DBDIR}/installed_ports" 2> /dev/null || :
607 cat "${DBDIR}/stage.loop_list/target_itself.specified" || :
608 cat "${DBDIR}/stage.loop_list/target_dependents.specified" || :
609 cat "${DBDIR}/stage.loop_list/target_requirements.specified" || :
610 cat "${DBDIR}/targets_specified_so_far" || :
611 } 2> /dev/null | sort -u > "${DBDIR}/stage.loop_list/ports_to_inspect"
614 program_exec_and_record_completion DETERMINE_ALL_TARGET_PORTS
616 # Inspection of all dependencies
617 PROGRAM_DEPENDS='PARSE_CONF DETERMINE_ALL_TARGET_PORTS'
618 _program_exec_restartable_loop_operation__routine ()
622 database_build_inspect_dependencies "$origin"
624 _program_exec_and_record_completion__operation ()
627 message_section_title "Inspecting dependencies of the all installed packages"
628 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
629 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
631 program_exec_restartable_loop_operation ports_to_inspect
632 database_build_post_inspect_dependencies
635 program_exec_and_record_completion INSPECT_ALL_DEPENDENCIES
637 # Convert dependency-lists to actual ones
638 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES'
639 _program_exec_restartable_loop_operation__routine ()
641 local origin table dbtag level tag target
643 for table in dependents requirements
645 for dbtag in requires obsolete
647 for level in direct full
649 for tag in all run build
651 target=${DBDIR}/$dbtag/$origin/${table}.${tag}.${level}
652 [ -e "$target.src" ] || continue
653 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "$target.src" \
654 | grep -v '^$' | sort -u > $target.tmp
655 [ -e "$target" ] && ! diff "$target.tmp" "$target" > /dev/null \
656 && echo "$origin" >> ${DBDIR}/update_dependencies
657 mv "$target.tmp" "$target"
663 _program_exec_and_record_completion__operation ()
665 message_section_title "Conversion of dependency-lists to actual ones"
666 program_exec_restartable_loop_operation convert_dependency_lists
667 sort -u "${DBDIR}/update_dependencies" > ${DBDIR}/update_dependencies.tmp
668 mv "${DBDIR}/update_dependencies.tmp" "${DBDIR}/update_dependencies"
669 str_escape_regexp_filter < ${DBDIR}/update_dependencies \
670 | sed 's/^/^/; s/$/$/' > ${DBDIR}/update_dependencies.grep_pattern
671 for tag in all run build
673 ( cd "${DBDIR}/requires" && \
674 find . -depth 3 -type f -name requirements.${tag}.full | sed 's|^./||;s|/[^/]*$||' ) \
675 | grep -v -E -f "${DBDIR}/update_dependencies.grep_pattern" \
676 | str_escape_regexp_filter | sed 's/^/^/; s/$/$/' \
677 > ${TMPDIR}/convert_requirements_list:full_complete.grep_pattern || :
678 ( cd "${DBDIR}/requires" && \
679 find . -depth 3 -type f -name requirements.${tag}.direct | sed 's|^./||;s|/[^/]*$||' ) \
680 | grep -v -E -f "${TMPDIR}/convert_requirements_list:full_complete.grep_pattern" \
681 > ${DBDIR}/stage.loop_list/complete_${tag}time_reqlists || :
683 for inspected_level_tmp in direct node
685 cat "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" || :
686 done 2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/trim_dependency_lists_rm_uninspected_ports
687 find "${DBDIR}/requires" -depth 2 -type d > ${DBDIR}/stage.loop_list/inspect_dependent
688 [ -e "${DBDIR}/dependents_files" ] && \
689 mv "${DBDIR}/dependents_files" "${DBDIR}/dependents_files.prev"
690 rm -f "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" "${DBDIR}/dependents_files.tmp"
693 program_exec_and_record_completion CONVERT_REQUIREMENTS_LIST
695 # Completion of recursive requirement lists
696 for _REQUIREMENT_LISTS_tag in all run build
698 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
699 _program_exec_restartable_loop_operation__routine ()
701 local tag dbpath origin
702 tag=${_REQUIREMENT_LISTS_tag}
704 origin=`str_dirpath_to_origin "$dbpath"`
705 database_build_get_complete_recursive_dependency requirements.${tag} "$origin" > /dev/null
707 _program_exec_and_record_completion__operation ()
710 tag=${_REQUIREMENT_LISTS_tag}
711 message_section_title "Completion of ${tag}-time requirement lists"
712 program_exec_restartable_loop_operation complete_${tag}time_reqlists
715 program_exec_and_record_completion REQUIREMENT_LISTS:${_REQUIREMENT_LISTS_tag}
718 # Trim dependency lists by removing uninspected ports
719 if [ $opt_only_target_scope = yes ]
721 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST'
722 _program_exec_restartable_loop_operation__routine ()
724 local dbpath tag level srcdb
726 for tag in all run build
728 for level in direct full
730 srcdb=requirements.${tag}.${level}
731 [ -e "$dbpath/$srcdb" ] || continue
732 grep -E -f "${DBDIR}/inspected_ports.grep_pattern" "$dbpath/$srcdb" \
733 > $dbpath/$srcdb.tmp || :
734 mv "$dbpath/$srcdb.tmp" "$dbpath/$srcdb"
738 _program_exec_and_record_completion__operation ()
740 message_section_title "Trimming dependency lists by removing uninspected ports"
741 program_exec_restartable_loop_operation trim_dependency_lists_rm_uninspected_ports
744 program_exec_and_record_completion TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS
747 # Inspection of dependents
748 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS'
749 _program_exec_restartable_loop_operation__routine ()
751 local dbpath origin tag level srcdb dstdb
753 origin=`str_dirpath_to_origin "$dbpath"`
754 for tag in all run build
756 for level in direct full
758 srcdb=requirements.${tag}.${level}
759 dstdb=dependents.${tag}.${level}
760 [ -e "$dbpath/$srcdb" ] || continue
761 while read origin_requirement
763 dstpath=${DBDIR}/requires/$origin_requirement
764 echo "$dstpath/$dstdb" >> ${DBDIR}/dependents_files.tmp
765 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
766 [ -d "$dstpath" ] || mkdir -p "$dstpath"
767 echo "$origin" >> $dstpath/$dstdb.raw
768 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp
769 done < $dbpath/$srcdb
773 _program_exec_and_record_completion__operation ()
775 local dbrequires_valesc
776 message_section_title "Inspection of dependents"
777 dbrequires_valesc=`str_escape_replaceval "${DBDIR}/requires/"`
778 program_exec_restartable_loop_operation inspect_dependent
779 sort -u "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" 2> /dev/null \
780 > ${DBDIR}/stage.loop_list/make_dependents_lists_unique || :
781 sort -u "${DBDIR}/dependents_files.tmp" 2> /dev/null > ${DBDIR}/dependents_files || :
782 [ -e "${DBDIR}/make_dependents_lists_unique.prev" ] && \
783 fileedit_manipulate_old_lines "${DBDIR}/dependents_files.prev" "${DBDIR}/dependents_files" \
787 program_exec_and_record_completion INSPECT_DEPENDENTS
789 # Remove duplicated lines in dependents lists
790 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
791 _program_exec_restartable_loop_operation__routine ()
793 local dbpath tag level dstdb
795 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
796 mv "$dstdb.tmp" "$dstdb"
799 _program_exec_and_record_completion__operation ()
801 local dbrequires_valesc
802 message_section_title "Removing duplicated items in dependents lists"
803 program_exec_restartable_loop_operation make_dependents_lists_unique
806 program_exec_and_record_completion MAKE_DEPENDENTS_LISTS_UNIQUE
808 # Preparation of target attribute information
809 for _TARGET_ATTR_INFO_table in requirements dependents itself
811 [ `cat "${DBDIR}/stage.loop_list/target_${_TARGET_ATTR_INFO_table}.replaced.specified" 2> /dev/null \
812 | wc -l` -gt 0 ] || continue
813 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS CONVERT_REQUIREMENTS_LIST'
814 _program_exec_restartable_loop_operation__routine ()
816 local origin dbtargets_valesc table
818 dbtargets_valesc=`str_escape_replaceval "${DBDIR}/targets/"`
819 table=${_TARGET_ATTR_INFO_table}
820 for database in requires initial
822 dbpath=${DBDIR}/$database/$origin
823 dstpath=${DBDIR}/targets/$origin
824 [ -d "$dstpath" ] || mkdir -p "$dstpath"
825 touch "$dstpath/target_itself"
826 echo "$origin" >> ${DBDIR}/all_targets.lst
827 [ $table = itself ] && continue
828 for tag in all run build
830 for level in direct full
832 srcdb=${table}.${tag}.${level}
833 dstdb=target_${database}_${table}.${tag}.${level}
834 [ -e "$dbpath/$srcdb" ] || continue
835 cat "$dbpath/$srcdb" >> ${DBDIR}/all_targets.lst
836 sed -E "s/^/$dbtargets_valesc/; s|$|/$dstdb|" "$dbpath/$srcdb" \
837 | fileedit_add_a_line_to_files_if_new "$origin"
842 _program_exec_and_record_completion__operation ()
845 table=${_TARGET_ATTR_INFO_table}
846 message_section_title "Preparation of target attribute information for dependency [$table]"
847 program_exec_restartable_loop_operation target_$table.replaced.specified
850 program_exec_and_record_completion TARGET_ATTR_INFO:${_TARGET_ATTR_INFO_table}
853 # Post-process after the preparation of target attribute information
854 PROGRAM_DEPENDS='MAKE_DEPENDENTS_LISTS_UNIQUE TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents'
855 _program_exec_and_record_completion__operation ()
857 message_section_title "Post-process after the preparation of target attribute information"
858 sort -u "${DBDIR}/all_targets.lst" 2> /dev/null \
859 | grep -E -f "${DBDIR}/inspected_ports.grep_pattern" \
860 | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" \
861 > ${DBDIR}/all_targets.lst.tmp || :
862 mv "${DBDIR}/all_targets.lst.tmp" "${DBDIR}/all_targets.lst"
863 find "${DBDIR}/targets" -depth 2 -type d > ${DBDIR}/stage.loop_list/build_complement_to_new_dependents_for_targets 2> /dev/null || :
865 cat "${DBDIR}/all_targets.lst" "${DBDIR}/need.with_replaced.list" 2> /dev/null || :
866 find "${DBDIR}/requires" -depth 3 -type f -name installed_version \
867 | sed -E 's|.*/([^/]+/[^/]+)/[^/]*$|\1|'
868 } | sort -u > ${DBDIR}/stage.loop_list/inspect_necessity
869 cp /dev/null "${DBDIR}/stage.loop_list/parse_target_attr_info"
870 find -E "${DBDIR}/requires" -depth 3 -type f -regex '.*/necessary_port\.(direct|full)$' -delete
873 program_exec_and_record_completion TARGET_ATTR_INFO_POSTPROCESS
875 # Build of data on complement to new dependents for target attribute information
876 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents CONVERT_REQUIREMENTS_LIST'
877 _program_exec_restartable_loop_operation__routine ()
881 origin=`str_dirpath_to_origin "$dbpath"`
882 database_build_complement_to_new_dependents_for_targets "$origin"
884 _program_exec_and_record_completion__operation ()
886 message_section_title "Build of data on complement to new dependents for target attribute information"
887 program_exec_restartable_loop_operation build_complement_to_new_dependents_for_targets
888 sort -u "${DBDIR}/stage.loop_list/parse_target_attr_info" > ${DBDIR}/stage.loop_list/parse_target_attr_info.tmp
889 mv "${DBDIR}/stage.loop_list/parse_target_attr_info.tmp" "${DBDIR}/stage.loop_list/parse_target_attr_info"
892 program_exec_and_record_completion COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO
894 # Parse target attribute information
895 PROGRAM_DEPENDS='COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO'
896 _program_exec_restartable_loop_operation__routine ()
900 origin=`str_dirpath_to_origin "$dbpath"`
901 database_build_target_attributes "$origin"
903 _program_exec_and_record_completion__operation ()
905 message_section_title "Parsing target attribute information"
906 program_exec_restartable_loop_operation parse_target_attr_info
909 program_exec_and_record_completion PARSE_TARGET_ATTR_INFO
911 # Inspection of necessity
912 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS REQUIREMENT_LISTS:run-time REQUIREMENT_LISTS:build-time INSPECT_ALL_DEPENDENCIES'
913 _program_exec_restartable_loop_operation__routine ()
917 for level in direct full
919 database_build_inspect_necessity_for_only_new_upgrade "$origin" "$level"
922 _program_exec_and_record_completion__operation ()
924 message_section_title "Inspection of necessity"
925 program_exec_restartable_loop_operation inspect_necessity
926 for level in direct full
928 find "${DBDIR}/requires" -depth 3 -type f -name "necessary_port.${level}" \
929 > ${DBDIR}/stage.loop_list/necessary_ports.${level}
933 program_exec_and_record_completion INSPECT_NECESSITY
935 # Inspection of necessary upgrades
936 for _NECESSARY_UPDATES_level in direct full
938 PROGRAM_DEPENDS='INSPECT_NECESSITY INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE'
939 _program_exec_restartable_loop_operation__routine ()
941 local markerpath level dbpath origin tag
943 level=${_NECESSARY_UPDATES_level}
944 dbpath=`dirname "$markerpath"`
945 origin=`str_dirpath_to_origin "$dbpath"`
946 database_query_does_a_port_need_update "$origin" || return 0
947 for tag in all run build none
949 touch "$dbpath/necessary_upgrade.$tag.${level}"
950 [ -e "$dbpath/dependents.$tag.${level}" ] || continue
951 while read origin_dependent
953 touch "${DBDIR}/requires/$origin_dependent/necessary_upgrade.$tag.${level}"
954 done < $dbpath/dependents.$tag.${level}
957 _program_exec_and_record_completion__operation ()
960 level=${_NECESSARY_UPDATES_level}
961 message_section_title "Inspection of necessary upgrades at the $level level"
962 program_exec_restartable_loop_operation necessary_ports.${level}
965 program_exec_and_record_completion NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
968 # Preparation for inspection of new leaf ports
969 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
971 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE PARSE_CONF'
972 _program_exec_and_record_completion__operation ()
974 message_section_title "Preparation for inspection of new leaf ports"
975 find "${DBDIR}/requires" -depth 3 -type f -name dependents.all.full \
976 | sed -E 's|.*/([^/]+/[^/]+)/[^/]+$|\1|' \
977 | sort -u > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports
978 sort -u "${DBDIR}/inspected_ports" > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports
979 fileedit_manipulate_new_lines \
980 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports" \
981 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports" \
982 | grep -v -E -f "${DBDIR}/conf/HOLD_PORTS.grep_pattern" \
983 > ${DBDIR}/stage.loop_list/leaf_ports_primary_candidates || :
984 cp /dev/null "${DBDIR}/grep.leaf_ports.pattern"
985 cp /dev/null "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
988 program_exec_and_record_completion PREPARE_INSPECT_LEAF_PORTS
991 # Inspection of new primary leaf ports
992 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
994 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE PREPARE_INSPECT_LEAF_PORTS PARSE_CONF'
995 _program_exec_restartable_loop_operation__routine ()
997 local origin origin_ini origin_esc dbpath origin_req
999 pkgsys_is_pkgtool "$origin" && return
1000 dbpath=${DBDIR}/requires/$origin
1001 origin_esc=`str_escape_regexp "$origin"`
1002 grep -q -E "^$origin_esc$" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
1003 if ! grep -q -E "^$origin_esc$" "${DBDIR}/noneed.list" 2> /dev/null
1005 if [ -e "$dbpath/initial_orig" ]
1007 origin_ini=`cat "$dbpath/initial_orig"`
1008 [ -e "${DBDIR}/initial/$origin_ini/installed_version" \
1009 -a `cat "${DBDIR}/initial/$origin_ini/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
1012 [ -e "${DBDIR}/initial/$origin/installed_version" \
1013 -a `cat "${DBDIR}/initial/$origin/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
1016 if [ -e "$dbpath/requirements.all.full" ]
1018 grep -v -E -f "${DBDIR}/conf/HOLD_PORTS.grep_pattern" "$dbpath/requirements.all.full" | \
1019 fileedit_add_lines_if_new "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
1021 fileedit_add_a_line_if_new "^$origin_esc$" "${DBDIR}/grep.leaf_ports.pattern"
1023 _program_exec_and_record_completion__operation ()
1025 local num_leaves num_leaves_prev
1026 message_section_title "Inspection of new primary leaf ports"
1027 program_exec_restartable_loop_operation leaf_ports_primary_candidates
1028 wc -l < ${DBDIR}/grep.leaf_ports.pattern | tr -d ' ' > ${DBDIR}/num_leaves
1029 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
1030 message_echo " `cat "${DBDIR}/num_leaves"` primary leaf port(s) is/are found."
1033 program_exec_and_record_completion INSPECT_PRIMARY_LEAF_PORTS
1036 # Inspection of requirements of new leaf ports
1037 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1039 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE INSPECT_PRIMARY_LEAF_PORTS PARSE_CONF'
1040 _program_exec_and_record_completion__operation ()
1042 local num_leaves num_leaves_prev num_inspect num_leaves_new
1043 message_section_title "Inspection of requirements of new leaf ports"
1044 message_echo "INFO: The inspection proceeds by iterative method."
1047 _program_exec_restartable_loop_operation__routine ()
1049 local origin origin_esc dbpath
1051 pkgsys_is_pkgtool "$origin" && return
1052 dbpath=${DBDIR}/requires/$origin
1053 origin_esc=`str_escape_regexp "$origin"`
1054 grep -q -E "^$origin_esc$" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
1055 grep -E -v -f "${DBDIR}/grep.leaf_ports.pattern" \
1056 "$dbpath/dependents.all.full" > /dev/null 2>&1 && return
1057 cat "$dbpath/requirements.all.full" 2> /dev/null \
1058 >> ${DBDIR}/leaf_ports_secondary_candidates.new_requirements || :
1059 fileedit_add_a_line_if_new "^$origin_esc$" "${DBDIR}/grep.leaf_ports.pattern"
1061 program_exec_restartable_loop_operation leaf_ports_secondary_candidates
1062 num_leaves_prev=`cat "${DBDIR}/num_leaves"`
1063 num_leaves=`wc -l < ${DBDIR}/grep.leaf_ports.pattern | tr -d ' '`
1064 num_leaves_new=`echo $(($num_leaves-$num_leaves_prev)) | tr -d ' '`
1065 if [ $num_leaves_new -eq 0 ]
1067 message_echo " No more leaf port is found."
1068 message_echo " $num_leaves leaf port(s) is/are found in total."
1072 grep -E -v -f "${DBDIR}/grep.leaf_ports.pattern" \
1073 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
1074 cat "${DBDIR}/leaf_ports_secondary_candidates.new_requirements" || :
1075 } | grep -v -E -f "${DBDIR}/conf/HOLD_PORTS.grep_pattern" | sort -u \
1076 > ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp || :
1077 program_reset_loop_for_stage INSPECT_REQUIREMENTS_OF_LEAF_PORTS
1078 mv "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp" \
1079 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
1080 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
1081 echo "$num_leaves" > ${DBDIR}/num_leaves
1082 num_inspect=`wc -l < ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates | tr -d ' '`
1083 message_echo " $num_leaves_new leaf port(s) is/are newly found; continue for $num_inspect candidate(s)."
1085 grep -E -f "${DBDIR}/grep.leaf_ports.pattern" "${DBDIR}/inspected_ports" | sort -u > ${DBDIR}/leaf_ports || :
1088 program_exec_and_record_completion INSPECT_REQUIREMENTS_OF_LEAF_PORTS
1091 # Order the ports considering dependencies
1092 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
1093 _program_exec_and_record_completion__operation ()
1095 message_section_title "Ordering dependencies"
1096 if ! database_build_order_ports_considering_dependencies
1098 message_echo "ERROR: Unsatisfied dependencies are remained:" >&2
1099 message_cat "${DBDIR}/unsatisfied.list"
1100 message_echo "*** Aborted by ${APPNAME}"
1101 message_echo "The ports tree seems broken. You might have caught an incomplete version."
1102 message_echo "You are encouraged to update the ports tree by portsnap(8)."
1103 message_echo "Then execute"
1104 message_echo " ${APPNAME} clean"
1105 message_echo "before restart."
1106 temp_terminate_process () { :; }
1111 program_exec_and_record_completion ORDER_ALL_DEPENDENCIES
1113 # Selection of removing leaf ports
1114 PROGRAM_DEPENDS='INSPECT_REQUIREMENTS_OF_LEAF_PORTS'
1115 _program_exec_and_record_completion__operation ()
1117 message_section_title "Selection of removing leaf ports"
1118 deinstall_select_leaf_ports_to_delete
1121 program_exec_and_record_completion SELECT_LEAF_PORTS
1123 # Selection of removing obsolete ports
1124 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES PARSE_CONF'
1125 _program_exec_and_record_completion__operation ()
1127 message_section_title "Selection of removing obsolete ports"
1128 deinstall_select_obsolete_ports_to_delete
1131 program_exec_and_record_completion SELECT_OBSOLETE_PORTS
1133 # Collection of leaf ports to delete
1134 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1136 PROGRAM_DEPENDS='SELECT_LEAF_PORTS'
1137 _program_exec_and_record_completion__operation ()
1139 local src src_unselected reqptn_file src_with_initial_origins
1140 message_section_title "Collecting leaf ports to delete"
1141 src=${DBDIR}/leaf_ports
1142 src_unselected=${DBDIR}/leaf_ports_to_delete.unselected
1143 src_with_initial_origins=${DBDIR}/leaf_ports.with_ini
1144 reqptn_file=${DBDIR}/leaf_ports.requirements_of_unselected.grep_pattern
1145 cat "$src_unselected" 2> /dev/null | while read origin
1147 cat "${DBDIR}/requires/$origin/requirements.all.full" || :
1148 done | sort -u | str_escape_regexp_filter \
1149 | sed 's/^/^/;s/$/$/' > $reqptn_file
1150 database_query_add_initial_origins < $src > $src_with_initial_origins
1153 program_exec_and_record_completion COLLECT_LEAF_PORTS_TO_DELETE
1156 # Collection of obsolete ports to delete
1157 PROGRAM_DEPENDS='SELECT_OBSOLETE_PORTS'
1158 _program_exec_and_record_completion__operation ()
1160 local src src_selected src_unselected dst_selected reqptn_file
1161 message_section_title "Collecting obsolete ports to delete"
1162 src=${DBDIR}/obsolete_ports.can_be_deleted
1163 src_selected=${DBDIR}/obsolete_ports_to_delete.selected
1164 src_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
1165 dst_selected=${DBDIR}/obsolete_ports_to_delete
1166 reqptn_file=${DBDIR}/obsolete_ports.requirements_of_unselected.grep_pattern
1167 cat "$src_unselected" 2> /dev/null | while read origin
1169 cat "${DBDIR}/initial/$origin/requirements.run.full" || :
1170 cat "${DBDIR}/obsolete/$origin/requirements.run.full" || :
1171 done | sort -u | str_escape_regexp_filter \
1172 | sed 's/^/^/;s/$/$/' > $reqptn_file
1173 grep -v -E -f "$reqptn_file" "$src_selected" > $dst_selected 2> /dev/null || :
1176 program_exec_and_record_completion COLLECT_OBSOLETE_PORTS_TO_DELETE
1178 # Set up the list of ports to reinstall
1179 PROGRAM_DEPENDS='ORDER_ALL_DEPENDENCIES'
1180 _program_exec_and_record_completion__operation ()
1182 message_section_title "Setting up the list of ports to reinstall"
1183 cp -p "${DBDIR}/reinst_order.list" "${DBDIR}/stage.loop_list/reinst_todo"
1186 program_exec_and_record_completion SETUP_REINST_TODO
1188 # Composition of a list for deinstallation of obsolete and leaf packages
1189 PROGRAM_DEPENDS='COLLECT_LEAF_PORTS_TO_DELETE COLLECT_OBSOLETE_PORTS_TO_DELETE'
1190 _program_exec_and_record_completion__operation ()
1192 local reqptn_leaf reqptn_obs leaf_selected leaf_selected_src obs_selected obs_selected_src grepptn preserved
1193 message_section_title "Composing a list for deinstallation of obsolete and leaf packages"
1194 reqptn_leaf=${DBDIR}/leaf_ports.requirements_of_unselected.grep_pattern
1195 reqptn_obs=${DBDIR}/obsolete_ports.requirements_of_unselected.grep_pattern
1196 leaf_selected_src=${DBDIR}/leaf_ports_to_delete.selected
1197 leaf_selected=${DBDIR}/leaf_ports_to_delete
1198 obs_selected_src=${DBDIR}/obsolete_ports_to_delete.selected
1199 obs_selected=${DBDIR}/obsolete_ports_to_delete
1200 grepptn=${DBDIR}/ports_to_delete.grep_pattern
1201 grepptn_col1=${DBDIR}/ports_to_delete.grep_pattern_col1
1202 preserved=${TMPDIR}/LIST_DEINST_PKGS::preserved
1203 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1205 cat "$reqptn_leaf" "$reqptn_obs" 2> /dev/null | sort -u > $grepptn
1206 grep -v -E -f "$grepptn" "$leaf_selected_src" 2> /dev/null \
1207 | database_query_add_initial_origins > $leaf_selected || :
1208 cat "$obs_selected" "$leaf_selected" 2> /dev/null || :
1210 rm -f "$leaf_selected"
1211 cat "$obs_selected" 2> /dev/null
1212 fi | sort -u > ${DBDIR}/stage.loop_list/ports_to_delete
1213 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1214 | sed 's/^/^/;s/$/$/' > $grepptn
1215 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1216 | sed 's/^/^/;s/$/[[:space:]]/' > $grepptn_col1
1217 cat "${DBDIR}/leaf_ports.with_ini" "${DBDIR}/obsolete_ports" 2> /dev/null \
1218 | grep -E -v -f "$grepptn" > ${DBDIR}/stage.loop_list/ports_to_restore || :
1219 if [ $opt_batch_mode = no ]
1221 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ] && \
1222 grep -v -E -f "$grepptn" "$leaf_selected_src" > $preserved 2> /dev/null
1224 message_echo "INFO: Following leaf ports are preserved because required by other preserved leaf/obsolete ports."
1225 message_echo "----------------"
1228 pkgtag=`cat "${DBDIR}/required/$origin/pkgtag" 2> /dev/null` || :
1231 echo "$origin" "($pkgtag)"
1236 message_echo "----------------"
1238 if grep -v -E -f "$grepptn" "$obs_selected_src" > $preserved 2> /dev/null
1240 message_echo "INFO: Following obsolete ports are preserved because required by other obsolete ports."
1241 message_echo "----------------"
1244 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version" 2> /dev/null` || :
1247 echo "$origin" "($pkgtag)"
1252 message_echo "----------------"
1257 program_exec_and_record_completion LIST_DEINST_PKGS
1259 # Collect entire distfiles list
1260 if [ $opt_suppress_inspect_entire_distinfo = yes ]
1263 _program_exec_and_record_completion__operation ()
1265 message_section_title "Collecting entire distfiles list"
1266 find "${PORTSDIR}" -depth 3 -name distinfo -exec cat {} \; \
1267 | grep '^SHA256 ' | sed -E 's/^SHA256 \(([^)]*)\).*/\1/' \
1268 | sort -u > ${DBDIR}/distfiles.entire.tmp
1269 mv "${DBDIR}/distfiles.entire.tmp" "${DBDIR}/distfiles.entire"
1272 program_exec_and_record_completion COLLECT_ALL_DISTFILES_LIST
1275 # Inspection of all required distfiles
1276 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES COLLECT_ALL_DISTFILES_LIST'
1277 _program_exec_and_record_completion__operation ()
1279 message_section_title "Summarizing distfiles list"
1280 cat "${DBDIR}/distfiles.entire" "${DBDIR}/distfiles.inspected" 2> /dev/null \
1281 | sort -u | str_escape_regexp_filter \
1282 | sed 's|^|^\\.\\/|; s|$|$|' > ${DBDIR}/distfiles.grep.pattern || :
1285 program_exec_and_record_completion DISTFILES_LIST
1287 # Clean up of reinstallation status for preparation
1288 PROGRAM_DEPENDS='REDO_INIT INSPECT_ALL_DEPENDENCIES'
1289 _program_exec_and_record_completion__operation ()
1291 message_section_title "Cleaning up of reinstallation status for preparation"
1292 rm -rf "${DBDIR}/status.ports"
1295 program_exec_and_record_completion CLEANUP_REINST_STATUS
1297 # Completion of building the temporary database
1298 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'
1299 _program_exec_and_record_completion__operation ()
1301 message_section_title "The temporary database is completely built up"
1304 program_exec_and_record_completion PREPARATION
1307 # ==================================================
1308 # ====================== MAIN ======================
1309 # ==================================================
1311 # Execute command operations which must be done before actual (re/de)installation processes
1312 command_exec_before_actual_re_de_installation "$@"
1314 # Set termination messages
1315 temp_terminate_process ()
1317 temp_terminate_process_common
1320 # Reinstallation of remained ports
1321 PROGRAM_DEPENDS='PREPARATION'
1322 _program_exec_restartable_loop_operation__routine ()
1326 _program_exec_and_record_completion__operation ()
1328 local _MSG_CURRENT_STAGE_general
1329 _MSG_CURRENT_STAGE_general="reinstallation"
1330 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1331 message_section_title "Reinstallation"
1332 program_exec_restartable_loop_operation reinst_todo
1333 reinstall_restore_conflicts
1336 program_exec_and_record_completion REINSTALLATION
1338 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1339 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1340 _program_exec_restartable_loop_operation__routine ()
1342 deinstall_restore "$@"
1344 _program_exec_and_record_completion__operation ()
1346 local _MSG_CURRENT_STAGE_general
1347 _MSG_CURRENT_STAGE_general="restoration of unselected obsolete/leaf packages"
1348 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1349 message_section_title "Restoration of unselected obsolete/leaf packages"
1350 program_exec_restartable_loop_operation ports_to_restore
1351 temp_set_msg_current_stage
1354 program_exec_and_record_completion RESTORE_ONCE_DEINST_PKGS
1356 # Deinstallation of unused obsolete and leaf packages
1357 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1358 _program_exec_restartable_loop_operation__routine ()
1362 _program_exec_and_record_completion__operation ()
1364 local _MSG_CURRENT_STAGE_general
1365 _MSG_CURRENT_STAGE_general="deinstallation of obsolete/leaf packages"
1366 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1367 message_section_title "Deinstallation of unused obsolete/leaf packages"
1368 program_exec_restartable_loop_operation ports_to_delete
1369 temp_set_msg_current_stage
1372 program_exec_and_record_completion DEINST_UNUSED_PKGS
1374 # Clean up obsolete or unused distfiles
1375 if [ $opt_only_target_scope = no -a $opt_keep_distfiles = no ]
1377 PROGRAM_DEPENDS='REINSTALLATION DISTFILES_LIST'
1378 _program_exec_and_record_completion__operation ()
1380 local tmp_distfiles_exists
1381 message_section_title "Cleaning up obsolete or unused distfiles"
1382 tmp_distfiles_exists=${TMPDIR}/CLEANUP_OBSLETE_DISTFILES::distfiles_exists
1383 [ $opt_dry_run = yes ] && message_echo "INFO: The operations are not actually carried out."
1384 ( set -e; cd "${DISTDIR}" && find . -type f ) \
1385 | sed 's|^\./||' | sort -u > $tmp_distfiles_exists
1386 fileedit_manipulate_old_lines "$tmp_distfiles_exists" "${DBDIR}/distfiles.entire" \
1387 | while read distfile
1389 if [ $opt_batch_mode = no ]
1393 [ $opt_dry_run = yes ] && continue
1394 rm -f "${DISTDIR}/$distfile"
1398 program_exec_and_record_completion CLEANUP_OBSLETE_DISTFILES
1401 # Rebuild of package database
1402 PROGRAM_DEPENDS='REINSTALLATION RESTORE_ONCE_DEINST_PKGS DEINST_UNUSED_PKGS'
1403 _program_exec_and_record_completion__operation ()
1405 which -s pkgdb || return 0
1406 message_section_title "Rebuilding package database for portupgrade"
1410 program_exec_and_record_completion REBUILD_PKGDB
1413 # ==================================================
1414 # ================ ENDING MESSAGES =================
1415 # ==================================================
1417 # Notice of failures
1418 exists_unresolved_ports=
1419 message_summary_dependents_of_failed_reinstallation failure || exists_unresolved_ports=y
1420 message_summary_dependents_of_failed_reinstallation redo || exists_unresolved_ports=y
1421 message_summary_dependents_of_failed_reinstallation conflict || exists_unresolved_ports=y
1422 [ -n "$exists_unresolved_ports" ] && message_summary_advice_on_manual_solution
1425 temp_terminate_process () { :; }
1427 if [ -z "$exists_unresolved_ports" ]
1429 message_section_title "COMPLETELY DONE"
1430 message_echo "- E N D -"
1432 message_warn_no_achieved_progress || :
1433 message_section_title "Done with some unresolved problems"
1434 message_echo "- To be continued -"