2 # ==============================================================================
3 # portsreinstall library script
4 # - "do"/"redo" command operation -
5 # Copyright (C) 2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
6 # This software is distributed under the 2-Clause BSD License.
7 # ==============================================================================
9 # ============= Operation of redo command before the database reconstruction =============
10 command_do_do__command_all_exec_command_specific_preconfiguration ()
12 program_deregister_stage_complete FORGET::PREPARATION_INSPECT_MASTER
13 program_deregister_stage_complete ALL_COMPLETE
16 # ============= Operation of redo command before the database reconstruction =============
17 command_do_redo__command_all_exec_command_specific_preconfiguration ()
19 program_deregister_stage_complete REDO_INIT
20 if [ $opt_reset_targets = yes ]
22 program_deregister_stage_complete DETERMINE_SPECIFIED_TARGETS
23 program_deregister_stage_complete PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
24 rm -rf "${DBDIR}/targets"
26 command_do_do__command_all_exec_command_specific_preconfiguration
29 # ============= Meta process for redo =============
30 command_do_meta_process_for_redo ()
34 _program_exec_and_record_completion__operation ()
36 rm -f "${DBDIR}/new_success_in_current_run"
37 [ "x$COMMAND_MODE" = xredo ] || return 0
38 message_echo "[REDO mode]"
41 program_exec_and_record_completion REDO_INIT
44 # ============= Determine specified targets =============
45 command_do_determine_specified_targets ()
49 _program_exec_and_record_completion__operation ()
51 local tag level dbsuffix
52 message_section_title "Determining specified targets"
53 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
54 "${DBDIR}/stage.loop_list/target_dependents.specified" \
55 "${DBDIR}/stage.loop_list/target_requirements.specified" \
56 "${DBDIR}/need.list" \
57 "${DBDIR}/targets_specified_so_far" 2> /dev/null \
58 | sort -u > ${DBDIR}/targets_specified_so_far.tmp
59 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
60 rm -f "${DBDIR}/stage.loop_list/target_itself.specified" \
61 "${DBDIR}/stage.loop_list/target_dependents.specified" \
62 "${DBDIR}/stage.loop_list/target_requirements.specified"
63 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
65 options_select_new_ports_if_duplicated O \
66 "${DBDIR}/stage.loop_list/target_itself.specified" "$opt_target_itself"
67 options_select_new_ports_if_duplicated t \
68 "${DBDIR}/stage.loop_list/target_dependents.specified" "$opt_target_dependents"
69 options_select_new_ports_if_duplicated T \
70 "${DBDIR}/stage.loop_list/target_requirements.specified" "$opt_target_requirements"
71 if [ `cat "${DBDIR}/stage.loop_list/target_itself.specified" \
72 "${DBDIR}/stage.loop_list/target_dependents.specified" \
73 "${DBDIR}/stage.loop_list/target_requirements.specified" | wc -l` -eq 0 ]
75 message_echo "ERROR: No matching port for target globs." >&2
79 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
80 "${DBDIR}/stage.loop_list/target_dependents.specified" \
81 "${DBDIR}/stage.loop_list/target_requirements.specified" \
82 | sort -u > ${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset
83 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset" "${DBDIR}/need.list" 2> /dev/null \
84 | sort -u > ${DBDIR}/need.list.tmp
85 mv "${DBDIR}/need.list.tmp" "${DBDIR}/need.list"
86 sort -u "${DBDIR}/need.list" "${DBDIR}/targets_specified_so_far" \
87 > ${DBDIR}/targets_specified_so_far.tmp
88 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
89 for tag in all run build none
91 for level in direct full
95 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset"
96 cat "${DBDIR}/stage.loop_list/target_dependents.specified" | while read origin
98 nodedir=${DBDIR}/requires/$origin
99 cat "$nodedir/dependents.$dbsuffix" 2> /dev/null
101 cat "${DBDIR}/stage.loop_list/target_requirements.specified" | while read origin
103 nodedir=${DBDIR}/requires/$origin
104 cat "$nodedir/requirements.$dbsuffix" 2> /dev/null
106 } | sort -u | while read origin
108 fileedit_rm_a_line "$origin" "${DBDIR}/success.$dbsuffix.list"
109 fileedit_rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.$dbsuffix.list"
110 rm -f "${DBDIR}/requires/$origin/succeeded_once"
117 program_exec_and_record_completion DETERMINE_SPECIFIED_TARGETS
120 # ============= Show specified targets =============
121 command_do_show_specified_targets ()
123 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" -a $opt_batch_mode = no ]
125 message_echo "INFO: (Re/de-)installation will be carried out only for the targets:"
127 if [ `wc -l < ${DBDIR}/stage.loop_list/target_itself.specified` -gt 0 ]
129 message_echo "[Targets only]"
130 echo "----------------------------------------"
131 cat "${DBDIR}/stage.loop_list/target_itself.specified"
132 echo "----------------------------------------"
135 if [ `wc -l < ${DBDIR}/stage.loop_list/target_dependents.specified` -gt 0 ]
137 message_echo "[Targets with their `options_get_dependency_msgterm` dependents]"
138 echo "----------------------------------------"
139 cat "${DBDIR}/stage.loop_list/target_dependents.specified"
140 echo "----------------------------------------"
143 if [ `wc -l < ${DBDIR}/stage.loop_list/target_requirements.specified` -gt 0 ]
145 message_echo "[Targets with their `options_get_dependency_msgterm` requirements]"
146 echo "----------------------------------------"
147 cat "${DBDIR}/stage.loop_list/target_requirements.specified"
148 echo "----------------------------------------"
154 # ============= Determine all target ports =============
155 command_do_determine_all_target_ports ()
157 local PROGRAM_DEPENDS
158 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS COLLECT_ALL_INSTALLED_PACKAGES'
159 _program_exec_and_record_completion__operation ()
161 message_section_title "Determining all target ports"
163 if [ $opt_only_target_scope = no ]
165 cat "${DBDIR}/installed_ports" 2> /dev/null || :
167 cat "${DBDIR}/stage.loop_list/target_itself.specified" || :
168 cat "${DBDIR}/stage.loop_list/target_dependents.specified" || :
169 cat "${DBDIR}/stage.loop_list/target_requirements.specified" || :
170 cat "${DBDIR}/targets_specified_so_far" || :
171 } 2> /dev/null | sort -u > "${DBDIR}/stage.loop_list/ports_to_inspect"
172 cp "${DBDIR}/stage.loop_list/ports_to_inspect" "${DBDIR}/stage.loop_list/ports_to_inspect_initial"
175 [ -d "${PORTSDIR}/$origin" ] || echo "$origin"
176 done < ${DBDIR}/stage.loop_list/ports_to_inspect > ${DBDIR}/obsoletes_to_escape_for_inspection
179 program_exec_and_record_completion DETERMINE_ALL_TARGET_PORTS
182 # ============= Inspection of all initial dependencies =============
183 command_do_inspection_of_all_initial_dependencies ()
185 local PROGRAM_DEPENDS
186 PROGRAM_DEPENDS='DETERMINE_ALL_TARGET_PORTS'
187 _program_exec_restartable_loop_operation__routine ()
191 database_build_setup_initial_node "$origin"
193 _program_exec_and_record_completion__operation ()
196 message_section_title "Inspecting initial dependencies of the all installed packages"
197 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
198 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
199 program_exec_restartable_loop_operation ports_to_inspect_initial
200 database_build_post_inspect_initial_dependencies
203 program_exec_and_record_completion INSPECT_ALL_INITIAL_DEPENDENCIES
206 # ============= Prepare for inspecting all dependencies =============
207 command_do_prepare_for_inspect_all_dependencies ()
209 local PROGRAM_DEPENDS
210 PROGRAM_DEPENDS='PARSE_CONF INSPECT_ALL_INITIAL_DEPENDENCIES'
211 _program_exec_and_record_completion__operation ()
213 message_section_title "Preparing for inspection of all dependencies"
214 database_build_escape "${DBDIR}/escaped_obsoletes" < ${DBDIR}/obsoletes_to_escape_for_inspection
215 cp /dev/null "${DBDIR}/done_required_ports_to_inspect"
218 program_exec_and_record_completion PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
221 # ============= Check ports of which the port options are changed and reset their databases =============
222 # Return status 0 for no need to update of inspected ports and 1 for needed to do it
223 command_do_reset_changed_portdb ()
226 program_chk_stage_complete INSPECT_DEPENDENTS || return
227 pkgsys_exists_saved_port_oprions_timestamps || return
228 message_section_title "Inspecting changes of port options"
229 tmp_ls=${TMPDIR}/command_do_reset_changed_portdb
230 rm -f "$tmp_ls.updated"
231 if [ ! -d "${PORT_DBDIR}" ]
233 message_echo "WARNING: ${PORT_DBDIR} is missing. All port options are recognized as default."
235 pkgsys_get_saved_port_oprions_timestamps_all > $tmp_ls.db
236 pkgsys_get_current_port_oprions_timestamp > $tmp_ls.log
237 pkgsys_get_changed_port_oprions "$tmp_ls.db" "$tmp_ls.log" > $tmp_ls.diff
238 if ! [ `wc -l < $tmp_ls.diff` -gt 0 ]
243 message_echo "INFO: There are some changes. Inspecting the detail..."
244 cp /dev/null "$tmp_ls.uninspected.dbfile"
245 cp /dev/null "$tmp_ls.uninspected.origin"
246 cp /dev/null "$tmp_ls.nonexistent.db"
247 pkgsys_conv_portoptiondbs_to_globs < $tmp_ls.diff > $tmp_ls.glob
248 str_escape_replaceval_filter < $tmp_ls.diff > $tmp_ls.diff.rpl
249 paste "$tmp_ls.diff" "$tmp_ls.diff.rpl" "$tmp_ls.glob" | while read -r dbfile dbfile_rpl glob
251 pkgsys_eval_ports_glob "$glob" > $tmp_ls.origins
252 if [ `wc -l < $tmp_ls.origins` -gt 0 ]
254 sed -E "s/^/$dbfile_rpl /" < $tmp_ls.origins
256 echo $dbfile >> $tmp_ls.nonexistent.db
258 done | while read dbfile origin
260 if [ -d "${DBDIR}/requires/$origin" ]
262 message_echo "Change detected on $origin: Resetting"
263 database_build_patch_reconf "$origin"
264 program_deregister_stage_complete PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
265 program_deregister_stage_complete ALL_COMPLETE
266 touch "$tmp_ls.updated"
268 echo "$dbfile" >> $tmp_ls.uninspected.dbfile
269 echo "$origin" >> $tmp_ls.uninspected.origin
272 message_echo "INFO: Recording for not inspected ports..."
273 pkgsys_conv_portorigin_to_port_oprion_timestamp_logname < $tmp_ls.uninspected.origin > $tmp_ls.uninspected.logname
274 str_escape_regexp_filter < $tmp_ls.uninspected.dbfile | sed 's/^/^/;s/$/[[:space:]]/' > $tmp_ls.uninspected.dbfile_ptn
275 paste "$tmp_ls.uninspected.dbfile_ptn" "$tmp_ls.uninspected.logname" | while read -r dbfile_ptn logname
277 grep -E "$dbfile_ptn" < $tmp_ls.log > ${DBDIR}/ls_dbdir/$logname.log 2> /dev/null || :
279 str_escape_regexp_filter < $tmp_ls.nonexistent.db | sed 's/^/^/;s/$/[[:space:]]/' > $tmp_ls.nonexistent.db_ptn
280 grep -E -f "$tmp_ls.nonexistent.db_ptn" < $tmp_ls.log | pkgsys_register_list_nonexistent_portopriondb
282 [ ! -e "$tmp_ls.updated" ]
285 # ============= Inspection of all dependencies =============
286 command_do_inspection_of_all_dependencies ()
288 local PROGRAM_DEPENDS
289 PROGRAM_DEPENDS='PREPARE_FOR_INSPECT_ALL_DEPENDENCIES'
290 _program_exec_restartable_loop_operation__routine ()
294 database_build_inspect_dependencies "$origin"
296 _program_exec_and_record_completion__operation ()
299 message_section_title "Inspecting dependencies of the all installed packages"
300 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
301 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
303 program_exec_restartable_loop_operation ports_to_inspect
304 database_build_post_inspect_dependencies
305 database_maintain_clear_prevset
308 program_exec_and_record_completion INSPECT_ALL_DEPENDENCIES
311 # ============= Convert dependency-lists to actual ones =============
312 command_do_convert_dependency_lists_to_actual_ones ()
314 local PROGRAM_DEPENDS
315 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES'
316 _program_exec_restartable_loop_operation__routine ()
318 local origin table dbtag level tag target
320 for table in dependents requirements
322 for dbtag in requires obsolete
324 for level in direct full
326 for tag in all run build
328 target=${DBDIR}/$dbtag/$origin/${table}.${tag}.${level}
329 if [ -e "$target.src" ]
331 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "$target.src" \
332 | grep -v '^$' | sort -u > $target.tmp
333 [ -e "$target" ] && ! diff -q "$target.tmp" "$target" > /dev/null \
334 && echo "$origin" >> ${DBDIR}/update_dependencies
335 mv "$target.tmp" "$target"
337 [ -e "$target" ] && echo "$origin" >> ${DBDIR}/update_dependencies
345 _program_exec_and_record_completion__operation ()
347 message_section_title "Conversion of dependency-lists to actual ones"
348 program_exec_restartable_loop_operation convert_dependency_lists
349 sort -u "${DBDIR}/update_dependencies" > ${DBDIR}/update_dependencies.tmp
350 mv "${DBDIR}/update_dependencies.tmp" "${DBDIR}/update_dependencies"
351 for tag in all run build
353 ( cd "${DBDIR}/requires" && \
354 find . -depth 3 -type f -name requirements.${tag}.full -or -name requirements.${tag}.full.orig ) \
356 | sed 's|^./||;s|/[^/]*$||' \
357 | grep -v -Fx -f "${DBDIR}/update_dependencies" \
358 > ${TMPDIR}/convert_requirements_list:full_complete.grep_pattern || :
359 ( cd "${DBDIR}/requires" && \
360 find . -depth 3 -type f -name requirements.${tag}.direct -or -name requirements.${tag}.direct.orig ) \
362 | sed 's|^./||;s|/[^/]*$||' \
363 | grep -v -Fx -f "${TMPDIR}/convert_requirements_list:full_complete.grep_pattern" \
364 > ${DBDIR}/stage.loop_list/complete_recursive_${tag}time_reqlists || :
366 for inspected_level_tmp in direct node
368 cat "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" || :
369 done 2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/trim_dependency_lists_rm_uninspected_ports
370 find "${DBDIR}/requires" -depth 2 -type d > ${DBDIR}/stage.loop_list/inspect_dependent
371 [ -e "${DBDIR}/dependents_files" ] && \
372 mv "${DBDIR}/dependents_files" "${DBDIR}/dependents_files.prev"
373 rm -f "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" "${DBDIR}/dependents_files.tmp"
376 program_exec_and_record_completion CONVERT_REQUIREMENTS_LIST
379 # ============= Completion of recursive requirement lists =============
380 command_do_completion_of_recursive_requirement_lists ()
382 local PROGRAM_DEPENDS _REQUIREMENT_LISTS_tag
383 for _REQUIREMENT_LISTS_tag in all run build
385 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
386 _program_exec_restartable_loop_operation__routine ()
388 local tag dbpath origin suffix
389 tag=${_REQUIREMENT_LISTS_tag}
391 origin=`str_dirpath_to_origin "$dbpath"`
392 for suffix in '' .orig
394 database_build_get_complete_recursive_dependency "$tag" "$origin" "$suffix" > /dev/null
397 _program_exec_and_record_completion__operation ()
400 tag=${_REQUIREMENT_LISTS_tag}
401 message_section_title "Completion of ${tag}-time requirement lists"
402 program_exec_restartable_loop_operation complete_recursive_${tag}time_reqlists
405 program_exec_and_record_completion RECURSIVE_REQUIREMENT_LISTS:${_REQUIREMENT_LISTS_tag}
409 # ============= Trim dependency lists by removing uninspected ports =============
410 command_do_trim_dependency_lists_by_removing_uninspected_ports ()
412 local PROGRAM_DEPENDS
413 if [ $opt_only_target_scope = yes ]
415 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST'
416 _program_exec_restartable_loop_operation__routine ()
418 local dbpath tag level srcdb
420 for tag in all run build
422 for level in direct full
424 srcdb=requirements.${tag}.${level}
425 [ -e "$dbpath/$srcdb" ] || continue
426 grep -Fx -f "${DBDIR}/inspected_ports" "$dbpath/$srcdb" > $dbpath/$srcdb.tmp || :
427 mv "$dbpath/$srcdb.tmp" "$dbpath/$srcdb"
431 _program_exec_and_record_completion__operation ()
433 message_section_title "Trimming dependency lists by removing uninspected ports"
434 program_exec_restartable_loop_operation trim_dependency_lists_rm_uninspected_ports
437 program_exec_and_record_completion TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS
441 # ============= Inspection of dependents =============
442 command_do_inspection_of_dependents ()
444 local PROGRAM_DEPENDS
445 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS'
446 _program_exec_restartable_loop_operation__routine ()
448 local dbpath origin tag level suffix srcdb dstdb
450 origin=`str_dirpath_to_origin "$dbpath"`
451 for tag in all run build
453 for suffix in '' .orig
455 for level in direct full
457 srcdb=requirements.${tag}.${level}${suffix}
458 [ -e "$dbpath/$srcdb" ] || continue
459 dstdb=dependents.${tag}.${level}${suffix}
460 while read origin_requirement
462 dstpath=${DBDIR}/requires/$origin_requirement
463 echo "$dstpath/$dstdb" >> ${DBDIR}/dependents_files.tmp
464 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
466 echo "$origin" >> $dstpath/$dstdb.raw
467 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp
468 done < $dbpath/$srcdb
470 srcdb=ignored_requirements.${tag}${suffix}
471 [ -e "$dbpath/$srcdb" ] || continue
472 dstdb=ignored_dependents.${tag}${suffix}
473 while read origin_requirement
475 dstpath=${DBDIR}/requires/$origin_requirement
476 echo "$dstpath/$dstdb" >> ${DBDIR}/ignored_dependents_files.tmp
477 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
479 echo "$origin" >> $dstpath/$dstdb.raw
480 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_ignored_dependents_lists_unique.tmp
481 done < $dbpath/$srcdb
485 _program_exec_and_record_completion__operation ()
487 local dbrequires_valesc
488 message_section_title "Inspection of dependents"
489 dbrequires_valesc=`str_escape_replaceval "${DBDIR}/requires/"`
490 program_exec_restartable_loop_operation inspect_dependent
491 for dbtype in dependents ignored_dependents
493 sort -u "${DBDIR}/stage.loop_list/make_${dbtype}_lists_unique.tmp" 2> /dev/null \
494 > ${DBDIR}/stage.loop_list/make_${dbtype}_lists_unique || :
495 sort -u "${DBDIR}/${dbtype}_files.tmp" 2> /dev/null > ${DBDIR}/${dbtype}_files || :
496 [ -e "${DBDIR}/make_${dbtype}_lists_unique.prev" ] && \
497 fileedit_manipulate_old_lines "${DBDIR}/${dbtype}_files.prev" "${DBDIR}/${dbtype}_files" \
502 program_exec_and_record_completion INSPECT_DEPENDENTS
505 # ============= Restore escaped obsolete packages for inspection =============
506 command_do_restore_escaped_obsoletes ()
508 local PROGRAM_DEPENDS
509 PROGRAM_DEPENDS='INSPECT_DEPENDENTS'
510 _program_exec_and_record_completion__operation ()
512 message_section_title "Restoring escaped obsolete packages for inspection"
513 cat "${DBDIR}/escaped_obsoletes" 2> /dev/null | database_build_restore
514 rm -f "${DBDIR}/escaped_obsoletes"
517 program_exec_and_record_completion RESTORE_ESCAPED_OBSOLETE_PACKAGES_FOR_INSPECTION
520 # ============= Remove duplicated lines in dependents lists =============
521 command_do_remove_duplicated_lines_in_dependents_lists ()
523 local PROGRAM_DEPENDS
524 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
525 _program_exec_restartable_loop_operation__routine ()
527 local dbpath tag level dstdb
529 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
530 mv "$dstdb.tmp" "$dstdb"
533 _program_exec_and_record_completion__operation ()
535 local dbrequires_valesc
536 message_section_title "Removing duplicated items in dependents lists"
537 program_exec_restartable_loop_operation make_dependents_lists_unique
540 program_exec_and_record_completion MAKE_DEPENDENTS_LISTS_UNIQUE
543 # ============= Remove duplicated lines in ignored dependents lists =============
544 command_do_remove_duplicated_lines_in_ignored_dependents_lists ()
546 local PROGRAM_DEPENDS
547 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
548 _program_exec_restartable_loop_operation__routine ()
550 local dbpath tag level dstdb
552 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
553 mv "$dstdb.tmp" "$dstdb"
556 _program_exec_and_record_completion__operation ()
558 local dbrequires_valesc
559 message_section_title "Removing duplicated items in ignored dependents lists"
560 program_exec_restartable_loop_operation make_ignored_dependents_lists_unique
563 program_exec_and_record_completion MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE
566 # ============= Preparation of target attribute information =============
567 command_do_preparation_of_target_attribute_information ()
569 local PROGRAM_DEPENDS _TARGET_ATTR_INFO_table
570 for _TARGET_ATTR_INFO_table in requirements dependents itself
572 [ `cat "${DBDIR}/stage.loop_list/target_${_TARGET_ATTR_INFO_table}.replaced.specified" 2> /dev/null \
573 | wc -l` -gt 0 ] || continue
574 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS CONVERT_REQUIREMENTS_LIST'
575 _program_exec_restartable_loop_operation__routine ()
577 local origin dbtargets_valesc table
579 dbtargets_valesc=`str_escape_replaceval "${DBDIR}/targets/"`
580 table=${_TARGET_ATTR_INFO_table}
581 for database in requires initial
583 dbpath=${DBDIR}/$database/$origin
584 dstpath=${DBDIR}/targets/$origin
586 touch "$dstpath/target_itself"
587 echo "$origin" >> ${DBDIR}/all_targets.lst
588 [ $table = itself ] && continue
589 for tag in all run build
591 for level in direct full
593 srcdb=${table}.${tag}.${level}
594 dstdb=target_${database}_${table}.${tag}.${level}
595 [ -e "$dbpath/$srcdb" ] || continue
596 cat "$dbpath/$srcdb" >> ${DBDIR}/all_targets.lst
597 sed -E "s/^/$dbtargets_valesc/; s|$|/$dstdb|" "$dbpath/$srcdb" \
598 | fileedit_add_a_line_to_files_if_new "$origin"
603 _program_exec_and_record_completion__operation ()
606 table=${_TARGET_ATTR_INFO_table}
607 message_section_title "Preparation of target attribute information for dependency [$table]"
608 program_exec_restartable_loop_operation target_$table.replaced.specified
611 program_exec_and_record_completion TARGET_ATTR_INFO:${_TARGET_ATTR_INFO_table}
615 # ============= Post-process after the preparation of target attribute information =============
616 command_do_post_process_after_the_preparation_of_target_attribute_information ()
618 local PROGRAM_DEPENDS
619 PROGRAM_DEPENDS='MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents'
620 _program_exec_and_record_completion__operation ()
622 message_section_title "Post-process after the preparation of target attribute information"
623 sort -u "${DBDIR}/all_targets.lst" 2> /dev/null \
624 | grep -Fx -f "${DBDIR}/inspected_ports" \
625 | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" 2> /dev/null \
626 > ${DBDIR}/all_targets.lst.tmp || :
627 mv "${DBDIR}/all_targets.lst.tmp" "${DBDIR}/all_targets.lst"
628 find "${DBDIR}/targets" -depth 2 -type d > ${DBDIR}/stage.loop_list/build_complement_to_new_dependents_for_targets 2> /dev/null || :
630 cat "${DBDIR}/all_targets.lst" "${DBDIR}/need.with_replaced.list" 2> /dev/null || :
631 find "${DBDIR}/moved_from" -depth 3 -type f -name installed_version \
632 | sed -E 's|.*/([^/]+/[^/]+)/[^/]*$|\1|'
633 } | sort -u > ${DBDIR}/stage.loop_list/inspect_necessity
634 cp /dev/null "${DBDIR}/stage.loop_list/parse_target_attr_info"
635 find -E "${DBDIR}/requires" -depth 3 -type f -regex '.*/necessary_port\.(direct|full)$' -delete
638 program_exec_and_record_completion TARGET_ATTR_INFO_POSTPROCESS
641 # ============= Build of data on complement to new dependents for target attribute information =============
642 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information ()
644 local PROGRAM_DEPENDS
645 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents CONVERT_REQUIREMENTS_LIST'
646 _program_exec_restartable_loop_operation__routine ()
650 origin=`str_dirpath_to_origin "$dbpath"`
651 database_build_complement_to_new_dependents_for_targets "$origin"
653 _program_exec_and_record_completion__operation ()
655 message_section_title "Build of data on complement to new dependents for target attribute information"
656 program_exec_restartable_loop_operation build_complement_to_new_dependents_for_targets
657 sort -u "${DBDIR}/stage.loop_list/parse_target_attr_info" > ${DBDIR}/stage.loop_list/parse_target_attr_info.tmp
658 mv "${DBDIR}/stage.loop_list/parse_target_attr_info.tmp" "${DBDIR}/stage.loop_list/parse_target_attr_info"
661 program_exec_and_record_completion COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO
664 # ============= Parse target attribute information =============
665 command_do_parse_target_attribute_information ()
667 local PROGRAM_DEPENDS
668 PROGRAM_DEPENDS='COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO'
669 _program_exec_restartable_loop_operation__routine ()
673 origin=`str_dirpath_to_origin "$dbpath"`
674 database_build_target_attributes "$origin"
676 _program_exec_and_record_completion__operation ()
678 message_section_title "Parsing target attribute information"
679 program_exec_restartable_loop_operation parse_target_attr_info
682 program_exec_and_record_completion PARSE_TARGET_ATTR_INFO
685 # ============= Inspection of necessity =============
686 command_do_inspection_of_necessity ()
688 local PROGRAM_DEPENDS
689 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS RECURSIVE_REQUIREMENT_LISTS:run RECURSIVE_REQUIREMENT_LISTS:build INSPECT_ALL_DEPENDENCIES'
690 _program_exec_restartable_loop_operation__routine ()
694 for level in direct full
696 database_build_inspect_necessity_for_only_new_upgrade "$origin" "$level"
699 _program_exec_and_record_completion__operation ()
701 message_section_title "Inspection of necessity"
702 program_exec_restartable_loop_operation inspect_necessity
703 for level in direct full
705 find "${DBDIR}/requires" -depth 3 -type f -name "necessary_port.${level}" \
706 > ${DBDIR}/stage.loop_list/necessary_ports.${level}
707 cp "${DBDIR}/stage.loop_list/necessary_ports.${level}" "${DBDIR}/stage.loop_list/complete_necessary_ports.${level}"
711 program_exec_and_record_completion INSPECT_NECESSITY
714 # ============= Inspection of necessary upgrades =============
715 command_do_inspection_of_necessary_upgrades ()
717 local PROGRAM_DEPENDS _NECESSARY_UPDATES_level
718 for _NECESSARY_UPDATES_level in direct full
720 PROGRAM_DEPENDS='INSPECT_NECESSITY INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE'
721 _program_exec_restartable_loop_operation__routine ()
723 local markerpath level dbpath origin tag
725 level=${_NECESSARY_UPDATES_level}
726 dbpath=`dirname "$markerpath"`
727 origin=`str_dirpath_to_origin "$dbpath"`
728 database_query_does_a_port_need_update "$origin" || return 0
729 for tag in all run build none
731 touch "$dbpath/necessary_upgrade.${tag}.${level}"
732 [ -e "$dbpath/dependents.${tag}.${level}" -o "$dbpath/ignored_dependents.${tag}" ] || continue
733 cat "$dbpath/dependents.${tag}.${level}" "$dbpath/ignored_dependents.${tag}" 2> /dev/null | \
734 while read origin_dependent
736 touch "${DBDIR}/requires/$origin_dependent/necessary_upgrade.${tag}.${level}"
740 _program_exec_and_record_completion__operation ()
743 level=${_NECESSARY_UPDATES_level}
744 message_section_title "Inspection of necessary upgrades at the $level level"
745 program_exec_restartable_loop_operation necessary_ports.${level}
748 program_exec_and_record_completion NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
752 # ============= Completion of necessary upgrades for build =============
753 command_do_complete_necessary_upgrades_for_build ()
755 local PROGRAM_DEPENDS _NECESSARY_UPDATES_level
756 for _NECESSARY_UPDATES_level in direct full
758 PROGRAM_DEPENDS="INSPECT_NECESSITY NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}"
759 _program_exec_restartable_loop_operation__routine ()
761 local markerpath level dbpath origin_requirement dbpath_requirement
763 level=${_NECESSARY_UPDATES_level}
764 dbpath=`dirname "$markerpath"`
765 [ -e "$dbpath/requirements.build.${level}" -a -e "$dbpath/necessary_upgrade.run.${level}" ] || return 0
766 while read origin_requirement
768 dbpath_requirement=${DBDIR}/requires/$origin_requirement
769 [ -e "$dbpath_requirement/necessary_upgrade.build.${level}" ] || continue
770 touch "$dbpath_requirement/necessary_upgrade.run.${level}"
771 done < $dbpath/requirements.build.${level}
774 _program_exec_and_record_completion__operation ()
777 level=${_NECESSARY_UPDATES_level}
778 message_section_title "Completion of necessary upgrades for build at the $level level"
779 program_exec_restartable_loop_operation complete_necessary_ports.${level}
782 program_exec_and_record_completion COMPLETE_NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
786 # ============= Preparation for inspection of new leaf ports =============
787 command_do_preparation_for_inspection_of_new_leaf_ports ()
789 local PROGRAM_DEPENDS
790 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
792 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PARSE_CONF'
793 _program_exec_and_record_completion__operation ()
795 message_section_title "Preparation for inspection of new leaf ports"
796 find "${DBDIR}/requires" -depth 3 -type f -name dependents.all.full -or -name ignored_dependents.all \
797 | sed -E 's|.*/([^/]+/[^/]+)/[^/]+$|\1|' \
798 | sort -u > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports
799 sort -u "${DBDIR}/inspected_ports" > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports
800 fileedit_manipulate_new_lines \
801 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports" \
802 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports" \
803 | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null \
804 > ${DBDIR}/stage.loop_list/leaf_ports_primary_candidates || :
805 cp /dev/null "${DBDIR}/leaf_ports.filter"
806 cp /dev/null "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
809 program_exec_and_record_completion PREPARE_INSPECT_LEAF_PORTS
813 # ============= Inspection of new primary leaf ports =============
814 command_do_inspection_of_new_primary_leaf_ports ()
816 local PROGRAM_DEPENDS
817 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
819 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PREPARE_INSPECT_LEAF_PORTS PARSE_CONF'
820 _program_exec_restartable_loop_operation__routine ()
822 local origin origin_ini dbpath origin_req
824 pkgsys_is_pkgtool "$origin" && return
825 dbpath=${DBDIR}/requires/$origin
826 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
827 if ! grep -q -Fx "$origin" "${DBDIR}/noneed.list" 2> /dev/null
829 if [ -e "$dbpath/initial_orig" ]
831 origin_ini=`cat "$dbpath/initial_orig"`
832 [ -e "${DBDIR}/initial/$origin_ini/installed_version" \
833 -a `cat "${DBDIR}/initial/$origin_ini/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
836 [ -e "${DBDIR}/initial/$origin/installed_version" \
837 -a `cat "${DBDIR}/initial/$origin/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
840 if [ -e "$dbpath/requirements.all.full" -o -e "$dbpath/ignored_requirements.all" ]
842 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null | \
843 grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null| \
844 fileedit_add_lines_if_new "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
846 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
848 _program_exec_and_record_completion__operation ()
850 local num_leaves num_leaves_prev
851 message_section_title "Inspection of new primary leaf ports"
852 program_exec_restartable_loop_operation leaf_ports_primary_candidates
853 wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' ' > ${DBDIR}/num_leaves
854 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
855 message_echo " `cat "${DBDIR}/num_leaves"` primary leaf port(s) is/are found."
858 program_exec_and_record_completion INSPECT_PRIMARY_LEAF_PORTS
862 # ============= Inspection of requirements of new leaf ports =============
863 command_do_inspection_of_requirements_of_new_leaf_ports ()
865 local PROGRAM_DEPENDS
866 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
868 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE INSPECT_PRIMARY_LEAF_PORTS PARSE_CONF'
869 _program_exec_and_record_completion__operation ()
871 local num_leaves num_leaves_prev num_inspect num_leaves_new
872 message_section_title "Inspection of requirements of new leaf ports"
873 message_echo "INFO: The inspection proceeds by iterative method."
876 _program_exec_restartable_loop_operation__routine ()
880 pkgsys_is_pkgtool "$origin" && return
881 dbpath=${DBDIR}/requires/$origin
882 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
883 cat "$dbpath/dependents.all.full" "$dbpath/ignored_dependents.all" 2> /dev/null \
884 | grep -Fxq -v -f "${DBDIR}/leaf_ports.filter" 2> /dev/null && return
885 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null \
886 >> ${DBDIR}/leaf_ports_secondary_candidates.new_requirements || :
887 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
889 program_exec_restartable_loop_operation leaf_ports_secondary_candidates
890 num_leaves_prev=`cat "${DBDIR}/num_leaves"`
891 num_leaves=`wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' '`
892 num_leaves_new=`echo $(($num_leaves-$num_leaves_prev)) | tr -d ' '`
893 if [ $num_leaves_new -eq 0 ]
895 message_echo " No more leaf port is found."
896 message_echo " $num_leaves leaf port(s) is/are found in total."
900 grep -Fx -v -f "${DBDIR}/leaf_ports.filter" \
901 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
902 cat "${DBDIR}/leaf_ports_secondary_candidates.new_requirements" || :
903 } 2> /dev/null | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null | sort -u \
904 > ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp || :
905 program_reset_loop_for_stage INSPECT_REQUIREMENTS_OF_LEAF_PORTS
906 mv "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp" \
907 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
908 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
909 echo "$num_leaves" > ${DBDIR}/num_leaves
910 num_inspect=`wc -l < ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates | tr -d ' '`
911 message_echo " $num_leaves_new leaf port(s) is/are newly found; continue for $num_inspect candidate(s)."
913 grep -Fx -f "${DBDIR}/leaf_ports.filter" "${DBDIR}/inspected_ports" 2> /dev/null | sort -u > ${DBDIR}/leaf_ports || :
916 program_exec_and_record_completion INSPECT_REQUIREMENTS_OF_LEAF_PORTS
920 # ============= Order the ports considering dependencies =============
921 command_do_order_the_ports_considering_dependencies ()
923 local PROGRAM_DEPENDS
924 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
925 _program_exec_and_record_completion__operation ()
927 message_section_title "Ordering dependencies"
928 if ! database_build_order_ports_considering_dependencies
930 message_echo "ERROR: Unsatisfied dependencies are remained:" >&2
931 message_cat "${DBDIR}/unsatisfied.list"
932 message_echo "*** Aborted by ${APPNAME}"
933 message_echo "The ports tree seems broken. You might have caught an incomplete version."
934 message_echo "You are encouraged to update the ports tree by portsnap(8)."
935 message_echo "Then execute"
936 message_echo " ${APPNAME} clean"
937 message_echo "before restart."
938 temp_terminate_process () { :; }
943 program_exec_and_record_completion ORDER_ALL_DEPENDENCIES
946 # ============= Selection of removing leaf ports =============
947 command_do_selection_of_removing_leaf_ports ()
949 local PROGRAM_DEPENDS
950 PROGRAM_DEPENDS='INSPECT_REQUIREMENTS_OF_LEAF_PORTS'
951 _program_exec_and_record_completion__operation ()
953 message_section_title "Selection of removing leaf ports"
954 deinstall_select_leaf_ports_to_delete
957 program_exec_and_record_completion SELECT_LEAF_PORTS
960 # ============= Selection of removing obsolete ports =============
961 command_do_selection_of_removing_obsolete_ports ()
963 local PROGRAM_DEPENDS
964 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES PARSE_CONF'
965 _program_exec_and_record_completion__operation ()
967 message_section_title "Selection of removing obsolete ports"
968 deinstall_select_obsolete_ports_to_delete
971 program_exec_and_record_completion SELECT_OBSOLETE_PORTS
974 # ============= Collection of leaf ports to delete =============
975 command_do_collection_of_leaf_ports_to_delete ()
977 local PROGRAM_DEPENDS
978 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
980 PROGRAM_DEPENDS='SELECT_LEAF_PORTS'
981 _program_exec_and_record_completion__operation ()
983 local src src_unselected reqptn_file src_with_initial_origins
984 message_section_title "Collecting leaf ports to delete"
985 src=${DBDIR}/leaf_ports
986 src_unselected=${DBDIR}/leaf_ports_to_delete.unselected
987 src_with_initial_origins=${DBDIR}/leaf_ports.with_ini
988 reqptn_file=${DBDIR}/leaf_ports.requirements_of_unselected
989 cat "$src_unselected" 2> /dev/null | while read origin
991 cat "${DBDIR}/requires/$origin/requirements.all.full" "${DBDIR}/requires/$origin/ignored_requirements.all" || :
992 done 2> /dev/null | sort -u > $reqptn_file
993 database_query_add_initial_origins < $src > $src_with_initial_origins
996 program_exec_and_record_completion COLLECT_LEAF_PORTS_TO_DELETE
1000 # ============= Collection of obsolete ports to delete =============
1001 command_do_collection_of_obsolete_ports_to_delete ()
1003 local PROGRAM_DEPENDS
1004 PROGRAM_DEPENDS='SELECT_OBSOLETE_PORTS'
1005 _program_exec_and_record_completion__operation ()
1007 local src src_selected src_unselected dst_selected reqptn_file
1008 message_section_title "Collecting obsolete ports to delete"
1009 src=${DBDIR}/obsolete_ports.can_be_deleted
1010 src_selected=${DBDIR}/obsolete_ports_to_delete.selected
1011 src_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
1012 dst_selected=${DBDIR}/obsolete_ports_to_delete
1013 reqptn_file=${DBDIR}/obsolete_ports.requirements_of_unselected
1014 cat "$src_unselected" 2> /dev/null | while read origin
1016 cat "${DBDIR}/initial/$origin/requirements.run.full" || :
1017 cat "${DBDIR}/obsolete/$origin/requirements.run.full" || :
1018 done | sort -u > $reqptn_file
1019 grep -v -Fx -f "$reqptn_file" "$src_selected" > $dst_selected 2> /dev/null || :
1022 program_exec_and_record_completion COLLECT_OBSOLETE_PORTS_TO_DELETE
1025 # ============= Set up the list of ports to reinstall =============
1026 command_do_set_up_the_list_of_ports_to_reinstall ()
1028 local PROGRAM_DEPENDS
1029 PROGRAM_DEPENDS='ORDER_ALL_DEPENDENCIES'
1030 _program_exec_and_record_completion__operation ()
1032 message_section_title "Setting up the list of ports to reinstall"
1033 cp -p "${DBDIR}/reinst_order.list" "${DBDIR}/stage.loop_list/reinst_todo"
1036 program_exec_and_record_completion SETUP_REINST_TODO
1039 # ============= Composition of a list for deinstallation of obsolete and leaf packages =============
1040 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages ()
1042 local PROGRAM_DEPENDS
1043 PROGRAM_DEPENDS='COLLECT_LEAF_PORTS_TO_DELETE COLLECT_OBSOLETE_PORTS_TO_DELETE'
1044 _program_exec_and_record_completion__operation ()
1046 local reqptn_leaf reqptn_obs leaf_selected leaf_selected_src obs_selected obs_selected_src grepptn preserved
1047 message_section_title "Composing a list for deinstallation of obsolete and leaf packages"
1048 reqptn_leaf=${DBDIR}/leaf_ports.requirements_of_unselected
1049 reqptn_obs=${DBDIR}/obsolete_ports.requirements_of_unselected
1050 leaf_selected_src=${DBDIR}/leaf_ports_to_delete.selected
1051 leaf_selected=${DBDIR}/leaf_ports_to_delete
1052 obs_selected_src=${DBDIR}/obsolete_ports_to_delete.selected
1053 obs_selected=${DBDIR}/obsolete_ports_to_delete
1054 grepptn=${DBDIR}/ports_to_delete.grep_pattern
1055 grepptn_col1=${DBDIR}/ports_to_delete.grep_pattern_col1
1056 preserved=${TMPDIR}/LIST_DEINST_PKGS::preserved
1057 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1059 cat "$reqptn_leaf" "$reqptn_obs" 2> /dev/null | sort -u > $grepptn
1060 grep -v -Fx -f "$grepptn" "$leaf_selected_src" 2> /dev/null \
1061 | database_query_add_initial_origins > $leaf_selected || :
1062 cat "$obs_selected" "$leaf_selected" 2> /dev/null || :
1064 rm -f "$leaf_selected"
1065 cat "$obs_selected" 2> /dev/null
1066 fi | sort -u > ${DBDIR}/stage.loop_list/ports_to_delete
1067 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1068 | sed 's/^/^/;s/$/[[:space:]]/' > $grepptn_col1
1069 cat "${DBDIR}/leaf_ports.with_ini" "${DBDIR}/obsolete_ports" 2> /dev/null \
1070 | grep -Fx -v -f "${DBDIR}/stage.loop_list/ports_to_delete" > ${DBDIR}/stage.loop_list/ports_to_restore 2> /dev/null || :
1071 if [ $opt_batch_mode = no ]
1073 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ] && \
1074 grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$leaf_selected_src" > $preserved 2> /dev/null
1076 message_echo "INFO: Following leaf ports are preserved because required by other preserved leaf/obsolete ports."
1077 message_echo "----------------"
1080 pkgtag=`cat "${DBDIR}/moved_from/$origin/pkgtag" 2> /dev/null` || :
1083 echo "$origin" "($pkgtag)"
1088 message_echo "----------------"
1090 if grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$obs_selected_src" > $preserved 2> /dev/null
1092 message_echo "INFO: Following obsolete ports are preserved because required by other obsolete ports."
1093 message_echo "----------------"
1096 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version" 2> /dev/null` || :
1099 echo "$origin" "($pkgtag)"
1104 message_echo "----------------"
1109 program_exec_and_record_completion LIST_DEINST_PKGS
1112 # ============= Collect entire distfiles list =============
1113 command_do_collect_entire_distfiles_list ()
1115 local PROGRAM_DEPENDS
1116 if [ $opt_inspect_entire_distinfo = yes ]
1119 _program_exec_and_record_completion__operation ()
1121 message_section_title "Collecting entire distfiles list"
1122 find "${PORTSDIR}" -depth 3 -name distinfo -exec cat {} \; \
1123 | grep '^SHA256 ' | sed -E 's/^SHA256 \(([^)]*)\).*/\1/' \
1124 | sort -u > ${DBDIR}/distfiles.entire.tmp
1125 mv "${DBDIR}/distfiles.entire.tmp" "${DBDIR}/distfiles.entire"
1128 program_exec_and_record_completion COLLECT_ALL_DISTFILES_LIST
1132 # ============= Inspection of all required distfiles =============
1133 command_do_inspection_of_all_required_distfiles ()
1135 local PROGRAM_DEPENDS
1136 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES COLLECT_ALL_DISTFILES_LIST'
1137 _program_exec_and_record_completion__operation ()
1139 message_section_title "Summarizing distfiles list"
1141 cat "${DBDIR}/distfiles.entire" || :
1142 cat "${DBDIR}/distfiles.inspected" || :
1143 } 2> /dev/null | sort -u | str_escape_regexp_filter \
1144 | sed 's|^|^\\.\\/|; s|$|$|' > ${DBDIR}/distfiles.grep.pattern || :
1147 program_exec_and_record_completion DISTFILES_LIST
1150 # ============= Clean up of reinstallation status for preparation =============
1151 command_do_clean_up_of_reinstallation_status_for_preparation ()
1153 local PROGRAM_DEPENDS
1154 PROGRAM_DEPENDS='REDO_INIT INSPECT_ALL_DEPENDENCIES'
1155 _program_exec_and_record_completion__operation ()
1157 message_section_title "Cleaning up of reinstallation status for preparation"
1158 rm -rf "${DBDIR}/status.ports"
1161 program_exec_and_record_completion CLEANUP_REINST_STATUS
1164 # ============= Completion of building the temporary database =============
1165 command_do_completion_of_building_the_temporary_database ()
1167 local PROGRAM_DEPENDS
1168 PROGRAM_DEPENDS='REDO_INIT SETUP_REINST_TODO CLEANUP_REINST_STATUS PARSE_CONF INSPECT_ALL_DEPENDENCIES RESTORE_ESCAPED_OBSOLETE_PACKAGES_FOR_INSPECTION NECESSARY_UPDATES:direct NECESSARY_UPDATES:full PARSE_TARGET_ATTR_INFO MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE COLLECT_LEAF_PORTS_TO_DELETE'
1169 _program_exec_and_record_completion__operation ()
1171 message_section_title "The temporary database is completely built up"
1174 program_exec_and_record_completion PREPARATION
1177 # ============= End of do/redo prepare =============
1178 command_do_end_at_prepare_complete ()
1181 tmp_msg=${TMPDIR}/command_do_end_at_prepare_complete:msg
1182 cat > "$tmp_msg" << eof
1183 Done (skipped reinstallation) at `message_timestamp`
1185 You can restart this process from the aborted/terminated point by executing without options or arguments as:
1188 message_cat "$tmp_msg"
1189 temp_terminate_process () { :; }
1192 # ============= Reinstallation of remained ports =============
1193 command_do_reinstallation_of_remained_ports ()
1195 local PROGRAM_DEPENDS
1196 PROGRAM_DEPENDS='PREPARATION'
1197 _program_exec_restartable_loop_operation__routine ()
1200 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1202 _program_exec_and_record_completion__operation ()
1204 local _MSG_CURRENT_STAGE_general
1205 _MSG_CURRENT_STAGE_general="reinstallation"
1206 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1207 message_section_title "Reinstallation"
1208 program_exec_restartable_loop_operation reinst_todo
1209 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1210 reinstall_restore_conflicts
1211 temp_set_msg_current_stage
1214 program_exec_and_record_completion REINSTALLATION
1217 # ============= Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again =============
1218 command_do_restore_needed_obsolete_and_leaf_packages ()
1220 local PROGRAM_DEPENDS
1221 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1222 _program_exec_restartable_loop_operation__routine ()
1224 deinstall_restore "$@"
1226 _program_exec_and_record_completion__operation ()
1228 local _MSG_CURRENT_STAGE_general
1229 _MSG_CURRENT_STAGE_general="restoration of unselected obsolete/leaf packages"
1230 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1231 message_section_title "Restoration of unselected obsolete/leaf packages"
1232 program_exec_restartable_loop_operation ports_to_restore
1233 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1234 temp_set_msg_current_stage
1237 program_exec_and_record_completion RESTORE_ONCE_DEINST_PKGS
1240 # ============= Deinstallation of unused obsolete and leaf packages =============
1241 command_do_deinstallation_of_unused_obsolete_and_leaf_packages ()
1243 local PROGRAM_DEPENDS
1244 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1245 _program_exec_restartable_loop_operation__routine ()
1249 _program_exec_and_record_completion__operation ()
1251 local _MSG_CURRENT_STAGE_general
1252 _MSG_CURRENT_STAGE_general="deinstallation of obsolete/leaf packages"
1253 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1254 message_section_title "Deinstallation of unused obsolete/leaf packages"
1255 program_exec_restartable_loop_operation ports_to_delete
1256 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1257 temp_set_msg_current_stage
1260 program_exec_and_record_completion DEINST_UNUSED_PKGS
1263 # ============= Clean up obsolete or unused distfiles =============
1264 command_do_clean_up_obsolete_or_unused_distfiles ()
1266 local PROGRAM_DEPENDS
1267 if [ $opt_only_target_scope = no -a $opt_keep_distfiles = no ]
1269 PROGRAM_DEPENDS='REINSTALLATION DISTFILES_LIST'
1270 _program_exec_and_record_completion__operation ()
1272 local tmp_distfiles_exists
1273 message_section_title "Cleaning up obsolete or unused distfiles"
1274 tmp_distfiles_exists=${TMPDIR}/CLEANUP_OBSLETE_DISTFILES::distfiles_exists
1275 [ $opt_dry_run = yes ] && message_echo "INFO: The operations are not actually carried out."
1276 ( set -e; cd "${DISTDIR}" && find . -type f ) \
1277 | sed 's|^\./||' | sort -u > $tmp_distfiles_exists
1278 fileedit_manipulate_old_lines "$tmp_distfiles_exists" "${DBDIR}/distfiles.entire" \
1279 | while read distfile
1281 if [ $opt_batch_mode = no ]
1285 [ $opt_dry_run = yes ] && continue
1286 rm -f "${DISTDIR}/$distfile"
1290 program_exec_and_record_completion CLEANUP_OBSLETE_DISTFILES
1294 # ============= Rebuild of package database =============
1295 command_do_rebuild_of_package_database ()
1297 local PROGRAM_DEPENDS
1298 PROGRAM_DEPENDS='REINSTALLATION RESTORE_ONCE_DEINST_PKGS DEINST_UNUSED_PKGS'
1299 _program_exec_and_record_completion__operation ()
1301 which -s pkgdb || return 0
1302 message_section_title "Rebuilding package database for portupgrade"
1303 if grep -q @ "${DBDIR}/stage.loop_list/reinst_todo"
1305 message_echo "INFO: Skipped because of lacking flavor support."
1311 program_exec_and_record_completion REBUILD_PKGDB
1314 # =============Operation of redo command irrespective of option settings =============
1315 command_do_redo__command_all_exec_irrespective_of_saved_options ()
1317 [ $opt_reload_conf = yes ] || return 0
1318 program_deregister_stage_complete SAVE_PREV_CONF
1319 program_deregister_stage_complete ALL_COMPLETE
1320 rm -f "${DBDIR}"/complete
1323 # ============= Preparation of the temporary database =============
1324 command_do_prepare ()
1326 # Meta process for redo
1327 command_do_meta_process_for_redo
1329 # Determine specified targets
1330 command_do_determine_specified_targets
1332 # Show specified targets
1333 command_do_show_specified_targets
1335 # Determine all target ports
1336 command_do_determine_all_target_ports
1338 # Inspection of all initial dependencies
1339 command_do_inspection_of_all_initial_dependencies
1341 # Loop considering cases that port options are changed after inspection
1344 # Prepare for inspecting all dependencies
1345 command_do_prepare_for_inspect_all_dependencies
1347 # Inspection of all dependencies
1348 command_do_inspection_of_all_dependencies
1350 # Convert dependency-lists to actual ones
1351 command_do_convert_dependency_lists_to_actual_ones
1353 # Completion of recursive requirement lists
1354 command_do_completion_of_recursive_requirement_lists
1356 # Trim dependency lists by removing uninspected ports
1357 command_do_trim_dependency_lists_by_removing_uninspected_ports
1359 # Inspection of dependents
1360 command_do_inspection_of_dependents
1362 # End the loop when no change is made on port options after the inspection
1363 command_do_reset_changed_portdb && break
1366 # Restore escaped obsolete packages for inspection
1367 command_do_restore_escaped_obsoletes
1369 # Remove duplicated lines in dependents lists
1370 command_do_remove_duplicated_lines_in_dependents_lists
1372 # Remove duplicated lines in ignored dependents lists
1373 command_do_remove_duplicated_lines_in_ignored_dependents_lists
1375 # Preparation of target attribute information
1376 command_do_preparation_of_target_attribute_information
1378 # Post-process after the preparation of target attribute information
1379 command_do_post_process_after_the_preparation_of_target_attribute_information
1381 # Build of data on complement to new dependents for target attribute information
1382 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information
1384 # Parse target attribute information
1385 command_do_parse_target_attribute_information
1387 # Inspection of necessity
1388 command_do_inspection_of_necessity
1390 # Inspection of necessary upgrades
1391 command_do_inspection_of_necessary_upgrades
1393 # Completion of necessary upgrades for build
1394 command_do_complete_necessary_upgrades_for_build
1396 # Preparation for inspection of new leaf ports
1397 command_do_preparation_for_inspection_of_new_leaf_ports
1399 # Inspection of new primary leaf ports
1400 command_do_inspection_of_new_primary_leaf_ports
1402 # Inspection of requirements of new leaf ports
1403 command_do_inspection_of_requirements_of_new_leaf_ports
1405 # Order the ports considering dependencies
1406 command_do_order_the_ports_considering_dependencies
1408 # Selection of removing leaf ports
1409 command_do_selection_of_removing_leaf_ports
1411 # Selection of removing obsolete ports
1412 command_do_selection_of_removing_obsolete_ports
1414 # Collection of leaf ports to delete
1415 command_do_collection_of_leaf_ports_to_delete
1417 # Collection of obsolete ports to delete
1418 command_do_collection_of_obsolete_ports_to_delete
1420 # Set up the list of ports to reinstall
1421 command_do_set_up_the_list_of_ports_to_reinstall
1423 # Composition of a list for deinstallation of obsolete and leaf packages
1424 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages
1426 # Collect entire distfiles list
1427 command_do_collect_entire_distfiles_list
1429 # Inspection of all required distfiles
1430 command_do_inspection_of_all_required_distfiles
1432 # Clean up of reinstallation status for preparation
1433 command_do_clean_up_of_reinstallation_status_for_preparation
1435 # Completion of building the temporary database
1436 command_do_completion_of_building_the_temporary_database
1439 # ============= Reset the progress of reinstallation for retrial =============
1440 command_do_reset_for_reinst_retrial ()
1442 program_deregister_stage_complete REINSTALLATION
1443 program_deregister_stage_complete RESTORE_ONCE_DEINST_PKGS
1444 program_deregister_stage_complete DEINST_UNUSED_PKGS
1445 rm -rf "${DBDIR}/status.ports" "${DBDIR}/new_success_in_current_run"
1448 # ============= Main operation of do/redo =============
1452 # Reset termination messages
1453 temp_reset_termination_messages_common
1458 if [ $ntrial -gt 0 ]
1460 message_echo "########## RETRIAL ($ntrial) OF (RE)INSTALLATION ##########"
1464 if [ $opt_fetch_only = yes ]
1466 # Reinstallation of remained ports
1467 command_do_reinstallation_of_remained_ports
1469 message_echo "Completed the fetch only mode."
1471 elif [ $opt_delete_then_reinstall = no ]
1473 # Reinstallation of remained ports
1474 command_do_reinstallation_of_remained_ports
1476 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1477 command_do_restore_needed_obsolete_and_leaf_packages
1479 # Deinstallation of unused obsolete and leaf packages
1480 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1482 # Deinstallation of unused obsolete and leaf packages
1483 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1485 # Reinstallation of remained ports
1486 command_do_reinstallation_of_remained_ports
1487 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1489 command_do_restore_needed_obsolete_and_leaf_packages
1492 # Clean up obsolete or unused distfiles
1493 command_do_clean_up_obsolete_or_unused_distfiles
1495 # Rebuild of package database
1496 command_do_rebuild_of_package_database
1498 # Retry if incomplete
1499 command_do_is_everything_resolved && break
1500 database_query_is_any_progress || break
1501 command_do_reset_for_reinst_retrial
1502 ntrial=$(($ntrial+1))
1507 # ============= Check whether everything is resolved =============
1508 command_do_is_everything_resolved ()
1511 for subject in failure redo conflict
1513 database_query_show_single_list_exec "$subject" \
1514 `options_get_dependency_type` `options_get_dependency_level` > /dev/null 2> /dev/null && return 1
1519 # ============= Notice of failures =============
1520 command_do_failure_notice ()
1522 local exists_unresolved_ports
1523 exists_unresolved_ports=
1524 message_summary_dependents_of_failed_reinstallation failure || exists_unresolved_ports=y
1525 message_summary_dependents_of_failed_reinstallation redo || exists_unresolved_ports=y
1526 message_summary_dependents_of_failed_reinstallation conflict || exists_unresolved_ports=y
1527 [ "x$exists_unresolved_ports" = xy ] || return 0
1528 message_summary_advice_on_manual_solution
1532 # ============= Ending process =============
1533 command_do_ending_process ()
1535 local PROGRAM_DEPENDS
1536 temp_terminate_process () { :; }
1537 if command_do_failure_notice
1539 if [ $opt_no_opening_message = yes ]
1541 message_echo "Done as ${APPNAME}"
1543 message_section_title "COMPLETELY DONE"
1545 if [ $opt_fetch_only = no -a $opt_dry_run = no ]
1547 PROGRAM_DEPENDS='REBUILD_PKGDB CLEANUP_OBSLETE_DISTFILES '
1548 _program_exec_and_record_completion__operation ()
1551 program_exec_and_record_completion ALL_COMPLETE
1552 [ $opt_no_opening_message = yes ] || message_echo "- E N D -"
1554 message_echo "INFO: Redo for the real (re)installation."
1557 message_warn_no_achieved_progress
1558 message_section_title "Done with some unresolved problems"
1559 message_echo "- To be continued -"