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"
174 [ -d "${PORTSDIR}/$origin" ] || echo "$origin"
175 done < ${DBDIR}/stage.loop_list/ports_to_inspect > ${DBDIR}/obsoletes_to_escape_for_inspection
178 program_exec_and_record_completion DETERMINE_ALL_TARGET_PORTS
181 # ============= Prepare for inspecting all dependencies =============
182 command_do_prepare_for_inspect_all_dependencies ()
184 local PROGRAM_DEPENDS
185 PROGRAM_DEPENDS='PARSE_CONF DETERMINE_ALL_TARGET_PORTS'
186 _program_exec_and_record_completion__operation ()
188 message_section_title "Preparing for inspection of all dependencies"
189 database_build_escape "${DBDIR}/escaped_obsoletes" < ${DBDIR}/obsoletes_to_escape_for_inspection
190 cp /dev/null "${DBDIR}/done_required_ports_to_inspect"
193 program_exec_and_record_completion PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
196 # ============= Check ports of which the port options are changed and reset their databases =============
197 # Return status 0 for no need to update of inspected ports and 1 for needed to do it
198 command_do_reset_changed_portdb ()
201 program_chk_stage_complete INSPECT_DEPENDENTS || return
202 pkgsys_exists_saved_port_oprions_timestamps || return
203 message_section_title "Inspecting changes of port options"
204 tmp_ls=${TMPDIR}/command_do_reset_changed_portdb
205 rm -f "$tmp_ls.updated"
206 if [ ! -d "${PORT_DBDIR}" ]
208 message_echo "WARNING: ${PORT_DBDIR} is missing. All port options are recognized as default."
210 pkgsys_get_saved_port_oprions_timestamps_all > $tmp_ls.db
211 pkgsys_get_current_port_oprions_timestamp > $tmp_ls.log
212 pkgsys_get_changed_port_oprions "$tmp_ls.db" "$tmp_ls.log" > $tmp_ls.diff
213 if ! [ `wc -l < $tmp_ls.diff` -gt 0 ]
218 message_echo "INFO: There are some changes. Inspecting the detail..."
219 cp /dev/null "$tmp_ls.uninspected.dbfile"
220 cp /dev/null "$tmp_ls.uninspected.origin"
221 cp /dev/null "$tmp_ls.nonexistent.db"
222 pkgsys_conv_portoptiondbs_to_globs < $tmp_ls.diff > $tmp_ls.glob
223 str_escape_replaceval_filter < $tmp_ls.diff > $tmp_ls.diff.rpl
224 paste "$tmp_ls.diff" "$tmp_ls.diff.rpl" "$tmp_ls.glob" | while read -r dbfile dbfile_rpl glob
226 pkgsys_eval_ports_glob "$glob" > $tmp_ls.origins
227 if [ `wc -l < $tmp_ls.origins` -gt 0 ]
229 sed -E "s/^/$dbfile_rpl /" < $tmp_ls.origins
231 echo $dbfile >> $tmp_ls.nonexistent.db
233 done | while read dbfile origin
235 if [ -d "${DBDIR}/requires/$origin" ]
237 message_echo "Change detected on $origin: Resetting"
238 database_build_patch_reconf "$origin"
239 program_deregister_stage_complete PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
240 program_deregister_stage_complete ALL_COMPLETE
241 touch "$tmp_ls.updated"
243 echo "$dbfile" >> $tmp_ls.uninspected.dbfile
244 echo "$origin" >> $tmp_ls.uninspected.origin
247 message_echo "INFO: Recording for not inspected ports..."
248 pkgsys_conv_portorigin_to_port_oprion_timestamp_logname < $tmp_ls.uninspected.origin > $tmp_ls.uninspected.logname
249 str_escape_regexp_filter < $tmp_ls.uninspected.dbfile | sed 's/^/^/;s/$/[[:space:]]/' > $tmp_ls.uninspected.dbfile_ptn
250 paste "$tmp_ls.uninspected.dbfile_ptn" "$tmp_ls.uninspected.logname" | while read -r dbfile_ptn logname
252 grep -E "$dbfile_ptn" < $tmp_ls.log > ${DBDIR}/ls_dbdir/$logname.log 2> /dev/null || :
254 str_escape_regexp_filter < $tmp_ls.nonexistent.db | sed 's/^/^/;s/$/[[:space:]]/' > $tmp_ls.nonexistent.db_ptn
255 grep -E -f "$tmp_ls.nonexistent.db_ptn" < $tmp_ls.log | pkgsys_register_list_nonexistent_portopriondb
257 [ ! -e "$tmp_ls.updated" ]
260 # ============= Inspection of all dependencies =============
261 command_do_inspection_of_all_dependencies ()
263 local PROGRAM_DEPENDS
264 PROGRAM_DEPENDS='PREPARE_FOR_INSPECT_ALL_DEPENDENCIES'
265 _program_exec_restartable_loop_operation__routine ()
269 database_build_inspect_dependencies "$origin"
271 _program_exec_and_record_completion__operation ()
274 message_section_title "Inspecting dependencies of the all installed packages"
275 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
276 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
278 program_exec_restartable_loop_operation ports_to_inspect
279 database_build_post_inspect_dependencies
280 database_maintain_clear_prevset
283 program_exec_and_record_completion INSPECT_ALL_DEPENDENCIES
286 # ============= Convert dependency-lists to actual ones =============
287 command_do_convert_dependency_lists_to_actual_ones ()
289 local PROGRAM_DEPENDS
290 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES'
291 _program_exec_restartable_loop_operation__routine ()
293 local origin table dbtag level tag target
295 for table in dependents requirements
297 for dbtag in requires obsolete
299 for level in direct full
301 for tag in all run build
303 target=${DBDIR}/$dbtag/$origin/${table}.${tag}.${level}
304 if [ -e "$target.src" ]
306 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "$target.src" \
307 | grep -v '^$' | sort -u > $target.tmp
308 [ -e "$target" ] && ! diff -q "$target.tmp" "$target" > /dev/null \
309 && echo "$origin" >> ${DBDIR}/update_dependencies
310 mv "$target.tmp" "$target"
312 [ -e "$target" ] && echo "$origin" >> ${DBDIR}/update_dependencies
320 _program_exec_and_record_completion__operation ()
322 message_section_title "Conversion of dependency-lists to actual ones"
323 program_exec_restartable_loop_operation convert_dependency_lists
324 sort -u "${DBDIR}/update_dependencies" > ${DBDIR}/update_dependencies.tmp
325 mv "${DBDIR}/update_dependencies.tmp" "${DBDIR}/update_dependencies"
326 for tag in all run build
328 ( cd "${DBDIR}/requires" && \
329 find . -depth 3 -type f -name requirements.${tag}.full -or -name requirements.${tag}.full.orig ) \
331 | sed 's|^./||;s|/[^/]*$||' \
332 | grep -v -Fx -f "${DBDIR}/update_dependencies" \
333 > ${TMPDIR}/convert_requirements_list:full_complete.grep_pattern || :
334 ( cd "${DBDIR}/requires" && \
335 find . -depth 3 -type f -name requirements.${tag}.direct -or -name requirements.${tag}.direct.orig ) \
337 | sed 's|^./||;s|/[^/]*$||' \
338 | grep -v -Fx -f "${TMPDIR}/convert_requirements_list:full_complete.grep_pattern" \
339 > ${DBDIR}/stage.loop_list/complete_recursive_${tag}time_reqlists || :
341 for inspected_level_tmp in direct node
343 cat "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" || :
344 done 2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/trim_dependency_lists_rm_uninspected_ports
345 find "${DBDIR}/requires" -depth 2 -type d > ${DBDIR}/stage.loop_list/inspect_dependent
346 [ -e "${DBDIR}/dependents_files" ] && \
347 mv "${DBDIR}/dependents_files" "${DBDIR}/dependents_files.prev"
348 rm -f "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" "${DBDIR}/dependents_files.tmp"
351 program_exec_and_record_completion CONVERT_REQUIREMENTS_LIST
354 # ============= Completion of recursive requirement lists =============
355 command_do_completion_of_recursive_requirement_lists ()
357 local PROGRAM_DEPENDS _REQUIREMENT_LISTS_tag
358 for _REQUIREMENT_LISTS_tag in all run build
360 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
361 _program_exec_restartable_loop_operation__routine ()
363 local tag dbpath origin suffix
364 tag=${_REQUIREMENT_LISTS_tag}
366 origin=`str_dirpath_to_origin "$dbpath"`
367 for suffix in '' .orig
369 database_build_get_complete_recursive_dependency "$tag" "$origin" "$suffix" > /dev/null
372 _program_exec_and_record_completion__operation ()
375 tag=${_REQUIREMENT_LISTS_tag}
376 message_section_title "Completion of ${tag}-time requirement lists"
377 program_exec_restartable_loop_operation complete_recursive_${tag}time_reqlists
380 program_exec_and_record_completion RECURSIVE_REQUIREMENT_LISTS:${_REQUIREMENT_LISTS_tag}
384 # ============= Trim dependency lists by removing uninspected ports =============
385 command_do_trim_dependency_lists_by_removing_uninspected_ports ()
387 local PROGRAM_DEPENDS
388 if [ $opt_only_target_scope = yes ]
390 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST'
391 _program_exec_restartable_loop_operation__routine ()
393 local dbpath tag level srcdb
395 for tag in all run build
397 for level in direct full
399 srcdb=requirements.${tag}.${level}
400 [ -e "$dbpath/$srcdb" ] || continue
401 grep -Fx -f "${DBDIR}/inspected_ports" "$dbpath/$srcdb" > $dbpath/$srcdb.tmp || :
402 mv "$dbpath/$srcdb.tmp" "$dbpath/$srcdb"
406 _program_exec_and_record_completion__operation ()
408 message_section_title "Trimming dependency lists by removing uninspected ports"
409 program_exec_restartable_loop_operation trim_dependency_lists_rm_uninspected_ports
412 program_exec_and_record_completion TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS
416 # ============= Inspection of dependents =============
417 command_do_inspection_of_dependents ()
419 local PROGRAM_DEPENDS
420 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS'
421 _program_exec_restartable_loop_operation__routine ()
423 local dbpath origin tag level suffix srcdb dstdb
425 origin=`str_dirpath_to_origin "$dbpath"`
426 for tag in all run build
428 for suffix in '' .orig
430 for level in direct full
432 srcdb=requirements.${tag}.${level}${suffix}
433 [ -e "$dbpath/$srcdb" ] || continue
434 dstdb=dependents.${tag}.${level}${suffix}
435 while read origin_requirement
437 dstpath=${DBDIR}/requires/$origin_requirement
438 echo "$dstpath/$dstdb" >> ${DBDIR}/dependents_files.tmp
439 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
441 echo "$origin" >> $dstpath/$dstdb.raw
442 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp
443 done < $dbpath/$srcdb
445 srcdb=ignored_requirements.${tag}${suffix}
446 [ -e "$dbpath/$srcdb" ] || continue
447 dstdb=ignored_dependents.${tag}${suffix}
448 while read origin_requirement
450 dstpath=${DBDIR}/requires/$origin_requirement
451 echo "$dstpath/$dstdb" >> ${DBDIR}/ignored_dependents_files.tmp
452 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
454 echo "$origin" >> $dstpath/$dstdb.raw
455 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_ignored_dependents_lists_unique.tmp
456 done < $dbpath/$srcdb
460 _program_exec_and_record_completion__operation ()
462 local dbrequires_valesc
463 message_section_title "Inspection of dependents"
464 dbrequires_valesc=`str_escape_replaceval "${DBDIR}/requires/"`
465 program_exec_restartable_loop_operation inspect_dependent
466 for dbtype in dependents ignored_dependents
468 sort -u "${DBDIR}/stage.loop_list/make_${dbtype}_lists_unique.tmp" 2> /dev/null \
469 > ${DBDIR}/stage.loop_list/make_${dbtype}_lists_unique || :
470 sort -u "${DBDIR}/${dbtype}_files.tmp" 2> /dev/null > ${DBDIR}/${dbtype}_files || :
471 [ -e "${DBDIR}/make_${dbtype}_lists_unique.prev" ] && \
472 fileedit_manipulate_old_lines "${DBDIR}/${dbtype}_files.prev" "${DBDIR}/${dbtype}_files" \
477 program_exec_and_record_completion INSPECT_DEPENDENTS
480 # ============= Restore escaped obsolete packages for inspection =============
481 command_do_restore_escaped_obsoletes ()
483 local PROGRAM_DEPENDS
484 PROGRAM_DEPENDS='INSPECT_DEPENDENTS'
485 _program_exec_and_record_completion__operation ()
487 message_section_title "Restoring escaped obsolete packages for inspection"
488 cat "${DBDIR}/escaped_obsoletes" 2> /dev/null | database_build_restore
489 rm -f "${DBDIR}/escaped_obsoletes"
492 program_exec_and_record_completion RESTORE_ESCAPED_OBSOLETE_PACKAGES_FOR_INSPECTION
495 # ============= Remove duplicated lines in dependents lists =============
496 command_do_remove_duplicated_lines_in_dependents_lists ()
498 local PROGRAM_DEPENDS
499 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
500 _program_exec_restartable_loop_operation__routine ()
502 local dbpath tag level dstdb
504 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
505 mv "$dstdb.tmp" "$dstdb"
508 _program_exec_and_record_completion__operation ()
510 local dbrequires_valesc
511 message_section_title "Removing duplicated items in dependents lists"
512 program_exec_restartable_loop_operation make_dependents_lists_unique
515 program_exec_and_record_completion MAKE_DEPENDENTS_LISTS_UNIQUE
518 # ============= Remove duplicated lines in ignored dependents lists =============
519 command_do_remove_duplicated_lines_in_ignored_dependents_lists ()
521 local PROGRAM_DEPENDS
522 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
523 _program_exec_restartable_loop_operation__routine ()
525 local dbpath tag level dstdb
527 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
528 mv "$dstdb.tmp" "$dstdb"
531 _program_exec_and_record_completion__operation ()
533 local dbrequires_valesc
534 message_section_title "Removing duplicated items in ignored dependents lists"
535 program_exec_restartable_loop_operation make_ignored_dependents_lists_unique
538 program_exec_and_record_completion MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE
541 # ============= Preparation of target attribute information =============
542 command_do_preparation_of_target_attribute_information ()
544 local PROGRAM_DEPENDS _TARGET_ATTR_INFO_table
545 for _TARGET_ATTR_INFO_table in requirements dependents itself
547 [ `cat "${DBDIR}/stage.loop_list/target_${_TARGET_ATTR_INFO_table}.replaced.specified" 2> /dev/null \
548 | wc -l` -gt 0 ] || continue
549 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS CONVERT_REQUIREMENTS_LIST'
550 _program_exec_restartable_loop_operation__routine ()
552 local origin dbtargets_valesc table
554 dbtargets_valesc=`str_escape_replaceval "${DBDIR}/targets/"`
555 table=${_TARGET_ATTR_INFO_table}
556 for database in requires initial
558 dbpath=${DBDIR}/$database/$origin
559 dstpath=${DBDIR}/targets/$origin
561 touch "$dstpath/target_itself"
562 echo "$origin" >> ${DBDIR}/all_targets.lst
563 [ $table = itself ] && continue
564 for tag in all run build
566 for level in direct full
568 srcdb=${table}.${tag}.${level}
569 dstdb=target_${database}_${table}.${tag}.${level}
570 [ -e "$dbpath/$srcdb" ] || continue
571 cat "$dbpath/$srcdb" >> ${DBDIR}/all_targets.lst
572 sed -E "s/^/$dbtargets_valesc/; s|$|/$dstdb|" "$dbpath/$srcdb" \
573 | fileedit_add_a_line_to_files_if_new "$origin"
578 _program_exec_and_record_completion__operation ()
581 table=${_TARGET_ATTR_INFO_table}
582 message_section_title "Preparation of target attribute information for dependency [$table]"
583 program_exec_restartable_loop_operation target_$table.replaced.specified
586 program_exec_and_record_completion TARGET_ATTR_INFO:${_TARGET_ATTR_INFO_table}
590 # ============= Post-process after the preparation of target attribute information =============
591 command_do_post_process_after_the_preparation_of_target_attribute_information ()
593 local PROGRAM_DEPENDS
594 PROGRAM_DEPENDS='MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents'
595 _program_exec_and_record_completion__operation ()
597 message_section_title "Post-process after the preparation of target attribute information"
598 sort -u "${DBDIR}/all_targets.lst" 2> /dev/null \
599 | grep -Fx -f "${DBDIR}/inspected_ports" \
600 | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" 2> /dev/null \
601 > ${DBDIR}/all_targets.lst.tmp || :
602 mv "${DBDIR}/all_targets.lst.tmp" "${DBDIR}/all_targets.lst"
603 find "${DBDIR}/targets" -depth 2 -type d > ${DBDIR}/stage.loop_list/build_complement_to_new_dependents_for_targets 2> /dev/null || :
605 cat "${DBDIR}/all_targets.lst" "${DBDIR}/need.with_replaced.list" 2> /dev/null || :
606 find "${DBDIR}/moved_from" -depth 3 -type f -name installed_version \
607 | sed -E 's|.*/([^/]+/[^/]+)/[^/]*$|\1|'
608 } | sort -u > ${DBDIR}/stage.loop_list/inspect_necessity
609 cp /dev/null "${DBDIR}/stage.loop_list/parse_target_attr_info"
610 find -E "${DBDIR}/requires" -depth 3 -type f -regex '.*/necessary_port\.(direct|full)$' -delete
613 program_exec_and_record_completion TARGET_ATTR_INFO_POSTPROCESS
616 # ============= Build of data on complement to new dependents for target attribute information =============
617 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information ()
619 local PROGRAM_DEPENDS
620 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents CONVERT_REQUIREMENTS_LIST'
621 _program_exec_restartable_loop_operation__routine ()
625 origin=`str_dirpath_to_origin "$dbpath"`
626 database_build_complement_to_new_dependents_for_targets "$origin"
628 _program_exec_and_record_completion__operation ()
630 message_section_title "Build of data on complement to new dependents for target attribute information"
631 program_exec_restartable_loop_operation build_complement_to_new_dependents_for_targets
632 sort -u "${DBDIR}/stage.loop_list/parse_target_attr_info" > ${DBDIR}/stage.loop_list/parse_target_attr_info.tmp
633 mv "${DBDIR}/stage.loop_list/parse_target_attr_info.tmp" "${DBDIR}/stage.loop_list/parse_target_attr_info"
636 program_exec_and_record_completion COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO
639 # ============= Parse target attribute information =============
640 command_do_parse_target_attribute_information ()
642 local PROGRAM_DEPENDS
643 PROGRAM_DEPENDS='COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO'
644 _program_exec_restartable_loop_operation__routine ()
648 origin=`str_dirpath_to_origin "$dbpath"`
649 database_build_target_attributes "$origin"
651 _program_exec_and_record_completion__operation ()
653 message_section_title "Parsing target attribute information"
654 program_exec_restartable_loop_operation parse_target_attr_info
657 program_exec_and_record_completion PARSE_TARGET_ATTR_INFO
660 # ============= Inspection of necessity =============
661 command_do_inspection_of_necessity ()
663 local PROGRAM_DEPENDS
664 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS RECURSIVE_REQUIREMENT_LISTS:run RECURSIVE_REQUIREMENT_LISTS:build INSPECT_ALL_DEPENDENCIES'
665 _program_exec_restartable_loop_operation__routine ()
669 for level in direct full
671 database_build_inspect_necessity_for_only_new_upgrade "$origin" "$level"
674 _program_exec_and_record_completion__operation ()
676 message_section_title "Inspection of necessity"
677 program_exec_restartable_loop_operation inspect_necessity
678 for level in direct full
680 find "${DBDIR}/requires" -depth 3 -type f -name "necessary_port.${level}" \
681 > ${DBDIR}/stage.loop_list/necessary_ports.${level}
685 program_exec_and_record_completion INSPECT_NECESSITY
688 # ============= Inspection of necessary upgrades =============
689 command_do_inspection_of_necessary_upgrades ()
691 local PROGRAM_DEPENDS _NECESSARY_UPDATES_level
692 for _NECESSARY_UPDATES_level in direct full
694 PROGRAM_DEPENDS='INSPECT_NECESSITY INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE'
695 _program_exec_restartable_loop_operation__routine ()
697 local markerpath level dbpath origin tag
699 level=${_NECESSARY_UPDATES_level}
700 dbpath=`dirname "$markerpath"`
701 origin=`str_dirpath_to_origin "$dbpath"`
702 database_query_does_a_port_need_update "$origin" || return 0
703 for tag in all run build none
705 touch "$dbpath/necessary_upgrade.$tag.${level}"
706 [ -e "$dbpath/dependents.$tag.${level}" -o "$dbpath/ignored_dependents.$tag" ] || continue
707 cat "$dbpath/dependents.$tag.${level}" "$dbpath/ignored_dependents.$tag" 2> /dev/null | \
708 while read origin_dependent
710 touch "${DBDIR}/requires/$origin_dependent/necessary_upgrade.$tag.${level}"
714 _program_exec_and_record_completion__operation ()
717 level=${_NECESSARY_UPDATES_level}
718 message_section_title "Inspection of necessary upgrades at the $level level"
719 program_exec_restartable_loop_operation necessary_ports.${level}
722 program_exec_and_record_completion NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
726 # ============= Preparation for inspection of new leaf ports =============
727 command_do_preparation_for_inspection_of_new_leaf_ports ()
729 local PROGRAM_DEPENDS
730 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
732 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PARSE_CONF'
733 _program_exec_and_record_completion__operation ()
735 message_section_title "Preparation for inspection of new leaf ports"
736 find "${DBDIR}/requires" -depth 3 -type f -name dependents.all.full -or -name ignored_dependents.all \
737 | sed -E 's|.*/([^/]+/[^/]+)/[^/]+$|\1|' \
738 | sort -u > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports
739 sort -u "${DBDIR}/inspected_ports" > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports
740 fileedit_manipulate_new_lines \
741 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports" \
742 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports" \
743 | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null \
744 > ${DBDIR}/stage.loop_list/leaf_ports_primary_candidates || :
745 cp /dev/null "${DBDIR}/leaf_ports.filter"
746 cp /dev/null "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
749 program_exec_and_record_completion PREPARE_INSPECT_LEAF_PORTS
753 # ============= Inspection of new primary leaf ports =============
754 command_do_inspection_of_new_primary_leaf_ports ()
756 local PROGRAM_DEPENDS
757 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
759 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PREPARE_INSPECT_LEAF_PORTS PARSE_CONF'
760 _program_exec_restartable_loop_operation__routine ()
762 local origin origin_ini dbpath origin_req
764 pkgsys_is_pkgtool "$origin" && return
765 dbpath=${DBDIR}/requires/$origin
766 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
767 if ! grep -q -Fx "$origin" "${DBDIR}/noneed.list" 2> /dev/null
769 if [ -e "$dbpath/initial_orig" ]
771 origin_ini=`cat "$dbpath/initial_orig"`
772 [ -e "${DBDIR}/initial/$origin_ini/installed_version" \
773 -a `cat "${DBDIR}/initial/$origin_ini/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
776 [ -e "${DBDIR}/initial/$origin/installed_version" \
777 -a `cat "${DBDIR}/initial/$origin/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
780 if [ -e "$dbpath/requirements.all.full" -o -e "$dbpath/ignored_requirements.all" ]
782 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null | \
783 grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null| \
784 fileedit_add_lines_if_new "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
786 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
788 _program_exec_and_record_completion__operation ()
790 local num_leaves num_leaves_prev
791 message_section_title "Inspection of new primary leaf ports"
792 program_exec_restartable_loop_operation leaf_ports_primary_candidates
793 wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' ' > ${DBDIR}/num_leaves
794 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
795 message_echo " `cat "${DBDIR}/num_leaves"` primary leaf port(s) is/are found."
798 program_exec_and_record_completion INSPECT_PRIMARY_LEAF_PORTS
802 # ============= Inspection of requirements of new leaf ports =============
803 command_do_inspection_of_requirements_of_new_leaf_ports ()
805 local PROGRAM_DEPENDS
806 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
808 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE INSPECT_PRIMARY_LEAF_PORTS PARSE_CONF'
809 _program_exec_and_record_completion__operation ()
811 local num_leaves num_leaves_prev num_inspect num_leaves_new
812 message_section_title "Inspection of requirements of new leaf ports"
813 message_echo "INFO: The inspection proceeds by iterative method."
816 _program_exec_restartable_loop_operation__routine ()
820 pkgsys_is_pkgtool "$origin" && return
821 dbpath=${DBDIR}/requires/$origin
822 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
823 cat "$dbpath/dependents.all.full" "$dbpath/ignored_dependents.all" 2> /dev/null \
824 | grep -Fxq -v -f "${DBDIR}/leaf_ports.filter" 2> /dev/null && return
825 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null \
826 >> ${DBDIR}/leaf_ports_secondary_candidates.new_requirements || :
827 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
829 program_exec_restartable_loop_operation leaf_ports_secondary_candidates
830 num_leaves_prev=`cat "${DBDIR}/num_leaves"`
831 num_leaves=`wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' '`
832 num_leaves_new=`echo $(($num_leaves-$num_leaves_prev)) | tr -d ' '`
833 if [ $num_leaves_new -eq 0 ]
835 message_echo " No more leaf port is found."
836 message_echo " $num_leaves leaf port(s) is/are found in total."
840 grep -Fx -v -f "${DBDIR}/leaf_ports.filter" \
841 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
842 cat "${DBDIR}/leaf_ports_secondary_candidates.new_requirements" || :
843 } 2> /dev/null | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null | sort -u \
844 > ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp || :
845 program_reset_loop_for_stage INSPECT_REQUIREMENTS_OF_LEAF_PORTS
846 mv "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp" \
847 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
848 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
849 echo "$num_leaves" > ${DBDIR}/num_leaves
850 num_inspect=`wc -l < ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates | tr -d ' '`
851 message_echo " $num_leaves_new leaf port(s) is/are newly found; continue for $num_inspect candidate(s)."
853 grep -Fx -f "${DBDIR}/leaf_ports.filter" "${DBDIR}/inspected_ports" 2> /dev/null | sort -u > ${DBDIR}/leaf_ports || :
856 program_exec_and_record_completion INSPECT_REQUIREMENTS_OF_LEAF_PORTS
860 # ============= Order the ports considering dependencies =============
861 command_do_order_the_ports_considering_dependencies ()
863 local PROGRAM_DEPENDS
864 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
865 _program_exec_and_record_completion__operation ()
867 message_section_title "Ordering dependencies"
868 if ! database_build_order_ports_considering_dependencies
870 message_echo "ERROR: Unsatisfied dependencies are remained:" >&2
871 message_cat "${DBDIR}/unsatisfied.list"
872 message_echo "*** Aborted by ${APPNAME}"
873 message_echo "The ports tree seems broken. You might have caught an incomplete version."
874 message_echo "You are encouraged to update the ports tree by portsnap(8)."
875 message_echo "Then execute"
876 message_echo " ${APPNAME} clean"
877 message_echo "before restart."
878 temp_terminate_process () { :; }
883 program_exec_and_record_completion ORDER_ALL_DEPENDENCIES
886 # ============= Selection of removing leaf ports =============
887 command_do_selection_of_removing_leaf_ports ()
889 local PROGRAM_DEPENDS
890 PROGRAM_DEPENDS='INSPECT_REQUIREMENTS_OF_LEAF_PORTS'
891 _program_exec_and_record_completion__operation ()
893 message_section_title "Selection of removing leaf ports"
894 deinstall_select_leaf_ports_to_delete
897 program_exec_and_record_completion SELECT_LEAF_PORTS
900 # ============= Selection of removing obsolete ports =============
901 command_do_selection_of_removing_obsolete_ports ()
903 local PROGRAM_DEPENDS
904 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES PARSE_CONF'
905 _program_exec_and_record_completion__operation ()
907 message_section_title "Selection of removing obsolete ports"
908 deinstall_select_obsolete_ports_to_delete
911 program_exec_and_record_completion SELECT_OBSOLETE_PORTS
914 # ============= Collection of leaf ports to delete =============
915 command_do_collection_of_leaf_ports_to_delete ()
917 local PROGRAM_DEPENDS
918 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
920 PROGRAM_DEPENDS='SELECT_LEAF_PORTS'
921 _program_exec_and_record_completion__operation ()
923 local src src_unselected reqptn_file src_with_initial_origins
924 message_section_title "Collecting leaf ports to delete"
925 src=${DBDIR}/leaf_ports
926 src_unselected=${DBDIR}/leaf_ports_to_delete.unselected
927 src_with_initial_origins=${DBDIR}/leaf_ports.with_ini
928 reqptn_file=${DBDIR}/leaf_ports.requirements_of_unselected
929 cat "$src_unselected" 2> /dev/null | while read origin
931 cat "${DBDIR}/requires/$origin/requirements.all.full" "${DBDIR}/requires/$origin/ignored_requirements.all" || :
932 done 2> /dev/null | sort -u > $reqptn_file
933 database_query_add_initial_origins < $src > $src_with_initial_origins
936 program_exec_and_record_completion COLLECT_LEAF_PORTS_TO_DELETE
940 # ============= Collection of obsolete ports to delete =============
941 command_do_collection_of_obsolete_ports_to_delete ()
943 local PROGRAM_DEPENDS
944 PROGRAM_DEPENDS='SELECT_OBSOLETE_PORTS'
945 _program_exec_and_record_completion__operation ()
947 local src src_selected src_unselected dst_selected reqptn_file
948 message_section_title "Collecting obsolete ports to delete"
949 src=${DBDIR}/obsolete_ports.can_be_deleted
950 src_selected=${DBDIR}/obsolete_ports_to_delete.selected
951 src_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
952 dst_selected=${DBDIR}/obsolete_ports_to_delete
953 reqptn_file=${DBDIR}/obsolete_ports.requirements_of_unselected
954 cat "$src_unselected" 2> /dev/null | while read origin
956 cat "${DBDIR}/initial/$origin/requirements.run.full" || :
957 cat "${DBDIR}/obsolete/$origin/requirements.run.full" || :
958 done | sort -u > $reqptn_file
959 grep -v -Fx -f "$reqptn_file" "$src_selected" > $dst_selected 2> /dev/null || :
962 program_exec_and_record_completion COLLECT_OBSOLETE_PORTS_TO_DELETE
965 # ============= Set up the list of ports to reinstall =============
966 command_do_set_up_the_list_of_ports_to_reinstall ()
968 local PROGRAM_DEPENDS
969 PROGRAM_DEPENDS='ORDER_ALL_DEPENDENCIES'
970 _program_exec_and_record_completion__operation ()
972 message_section_title "Setting up the list of ports to reinstall"
973 cp -p "${DBDIR}/reinst_order.list" "${DBDIR}/stage.loop_list/reinst_todo"
976 program_exec_and_record_completion SETUP_REINST_TODO
979 # ============= Composition of a list for deinstallation of obsolete and leaf packages =============
980 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages ()
982 local PROGRAM_DEPENDS
983 PROGRAM_DEPENDS='COLLECT_LEAF_PORTS_TO_DELETE COLLECT_OBSOLETE_PORTS_TO_DELETE'
984 _program_exec_and_record_completion__operation ()
986 local reqptn_leaf reqptn_obs leaf_selected leaf_selected_src obs_selected obs_selected_src grepptn preserved
987 message_section_title "Composing a list for deinstallation of obsolete and leaf packages"
988 reqptn_leaf=${DBDIR}/leaf_ports.requirements_of_unselected
989 reqptn_obs=${DBDIR}/obsolete_ports.requirements_of_unselected
990 leaf_selected_src=${DBDIR}/leaf_ports_to_delete.selected
991 leaf_selected=${DBDIR}/leaf_ports_to_delete
992 obs_selected_src=${DBDIR}/obsolete_ports_to_delete.selected
993 obs_selected=${DBDIR}/obsolete_ports_to_delete
994 grepptn=${DBDIR}/ports_to_delete.grep_pattern
995 grepptn_col1=${DBDIR}/ports_to_delete.grep_pattern_col1
996 preserved=${TMPDIR}/LIST_DEINST_PKGS::preserved
997 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
999 cat "$reqptn_leaf" "$reqptn_obs" 2> /dev/null | sort -u > $grepptn
1000 grep -v -Fx -f "$grepptn" "$leaf_selected_src" 2> /dev/null \
1001 | database_query_add_initial_origins > $leaf_selected || :
1002 cat "$obs_selected" "$leaf_selected" 2> /dev/null || :
1004 rm -f "$leaf_selected"
1005 cat "$obs_selected" 2> /dev/null
1006 fi | sort -u > ${DBDIR}/stage.loop_list/ports_to_delete
1007 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1008 | sed 's/^/^/;s/$/[[:space:]]/' > $grepptn_col1
1009 cat "${DBDIR}/leaf_ports.with_ini" "${DBDIR}/obsolete_ports" 2> /dev/null \
1010 | grep -Fx -v -f "${DBDIR}/stage.loop_list/ports_to_delete" > ${DBDIR}/stage.loop_list/ports_to_restore 2> /dev/null || :
1011 if [ $opt_batch_mode = no ]
1013 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ] && \
1014 grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$leaf_selected_src" > $preserved 2> /dev/null
1016 message_echo "INFO: Following leaf ports are preserved because required by other preserved leaf/obsolete ports."
1017 message_echo "----------------"
1020 pkgtag=`cat "${DBDIR}/moved_from/$origin/pkgtag" 2> /dev/null` || :
1023 echo "$origin" "($pkgtag)"
1028 message_echo "----------------"
1030 if grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$obs_selected_src" > $preserved 2> /dev/null
1032 message_echo "INFO: Following obsolete ports are preserved because required by other obsolete ports."
1033 message_echo "----------------"
1036 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version" 2> /dev/null` || :
1039 echo "$origin" "($pkgtag)"
1044 message_echo "----------------"
1049 program_exec_and_record_completion LIST_DEINST_PKGS
1052 # ============= Collect entire distfiles list =============
1053 command_do_collect_entire_distfiles_list ()
1055 local PROGRAM_DEPENDS
1056 if [ $opt_inspect_entire_distinfo = yes ]
1059 _program_exec_and_record_completion__operation ()
1061 message_section_title "Collecting entire distfiles list"
1062 find "${PORTSDIR}" -depth 3 -name distinfo -exec cat {} \; \
1063 | grep '^SHA256 ' | sed -E 's/^SHA256 \(([^)]*)\).*/\1/' \
1064 | sort -u > ${DBDIR}/distfiles.entire.tmp
1065 mv "${DBDIR}/distfiles.entire.tmp" "${DBDIR}/distfiles.entire"
1068 program_exec_and_record_completion COLLECT_ALL_DISTFILES_LIST
1072 # ============= Inspection of all required distfiles =============
1073 command_do_inspection_of_all_required_distfiles ()
1075 local PROGRAM_DEPENDS
1076 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES COLLECT_ALL_DISTFILES_LIST'
1077 _program_exec_and_record_completion__operation ()
1079 message_section_title "Summarizing distfiles list"
1081 cat "${DBDIR}/distfiles.entire" || :
1082 cat "${DBDIR}/distfiles.inspected" || :
1083 } 2> /dev/null | sort -u | str_escape_regexp_filter \
1084 | sed 's|^|^\\.\\/|; s|$|$|' > ${DBDIR}/distfiles.grep.pattern || :
1087 program_exec_and_record_completion DISTFILES_LIST
1090 # ============= Clean up of reinstallation status for preparation =============
1091 command_do_clean_up_of_reinstallation_status_for_preparation ()
1093 local PROGRAM_DEPENDS
1094 PROGRAM_DEPENDS='REDO_INIT INSPECT_ALL_DEPENDENCIES'
1095 _program_exec_and_record_completion__operation ()
1097 message_section_title "Cleaning up of reinstallation status for preparation"
1098 rm -rf "${DBDIR}/status.ports"
1101 program_exec_and_record_completion CLEANUP_REINST_STATUS
1104 # ============= Completion of building the temporary database =============
1105 command_do_completion_of_building_the_temporary_database ()
1107 local PROGRAM_DEPENDS
1108 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'
1109 _program_exec_and_record_completion__operation ()
1111 message_section_title "The temporary database is completely built up"
1114 program_exec_and_record_completion PREPARATION
1117 # ============= End of do/redo prepare =============
1118 command_do_end_at_prepare_complete ()
1121 tmp_msg=${TMPDIR}/command_do_end_at_prepare_complete:msg
1122 cat > "$tmp_msg" << eof
1123 Done (skipped reinstallation) at `message_timestamp`
1125 You can restart this process from the aborted/terminated point by executing without options or arguments as:
1128 message_cat "$tmp_msg"
1129 temp_terminate_process () { :; }
1132 # ============= Reinstallation of remained ports =============
1133 command_do_reinstallation_of_remained_ports ()
1135 local PROGRAM_DEPENDS
1136 PROGRAM_DEPENDS='PREPARATION'
1137 _program_exec_restartable_loop_operation__routine ()
1140 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1142 _program_exec_and_record_completion__operation ()
1144 local _MSG_CURRENT_STAGE_general
1145 _MSG_CURRENT_STAGE_general="reinstallation"
1146 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1147 message_section_title "Reinstallation"
1148 program_exec_restartable_loop_operation reinst_todo
1149 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1150 reinstall_restore_conflicts
1151 temp_set_msg_current_stage
1154 program_exec_and_record_completion REINSTALLATION
1157 # ============= Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again =============
1158 command_do_restore_needed_obsolete_and_leaf_packages ()
1160 local PROGRAM_DEPENDS
1161 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1162 _program_exec_restartable_loop_operation__routine ()
1164 deinstall_restore "$@"
1166 _program_exec_and_record_completion__operation ()
1168 local _MSG_CURRENT_STAGE_general
1169 _MSG_CURRENT_STAGE_general="restoration of unselected obsolete/leaf packages"
1170 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1171 message_section_title "Restoration of unselected obsolete/leaf packages"
1172 program_exec_restartable_loop_operation ports_to_restore
1173 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1174 temp_set_msg_current_stage
1177 program_exec_and_record_completion RESTORE_ONCE_DEINST_PKGS
1180 # ============= Deinstallation of unused obsolete and leaf packages =============
1181 command_do_deinstallation_of_unused_obsolete_and_leaf_packages ()
1183 local PROGRAM_DEPENDS
1184 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1185 _program_exec_restartable_loop_operation__routine ()
1189 _program_exec_and_record_completion__operation ()
1191 local _MSG_CURRENT_STAGE_general
1192 _MSG_CURRENT_STAGE_general="deinstallation of obsolete/leaf packages"
1193 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1194 message_section_title "Deinstallation of unused obsolete/leaf packages"
1195 program_exec_restartable_loop_operation ports_to_delete
1196 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1197 temp_set_msg_current_stage
1200 program_exec_and_record_completion DEINST_UNUSED_PKGS
1203 # ============= Clean up obsolete or unused distfiles =============
1204 command_do_clean_up_obsolete_or_unused_distfiles ()
1206 local PROGRAM_DEPENDS
1207 if [ $opt_only_target_scope = no -a $opt_keep_distfiles = no ]
1209 PROGRAM_DEPENDS='REINSTALLATION DISTFILES_LIST'
1210 _program_exec_and_record_completion__operation ()
1212 local tmp_distfiles_exists
1213 message_section_title "Cleaning up obsolete or unused distfiles"
1214 tmp_distfiles_exists=${TMPDIR}/CLEANUP_OBSLETE_DISTFILES::distfiles_exists
1215 [ $opt_dry_run = yes ] && message_echo "INFO: The operations are not actually carried out."
1216 ( set -e; cd "${DISTDIR}" && find . -type f ) \
1217 | sed 's|^\./||' | sort -u > $tmp_distfiles_exists
1218 fileedit_manipulate_old_lines "$tmp_distfiles_exists" "${DBDIR}/distfiles.entire" \
1219 | while read distfile
1221 if [ $opt_batch_mode = no ]
1225 [ $opt_dry_run = yes ] && continue
1226 rm -f "${DISTDIR}/$distfile"
1230 program_exec_and_record_completion CLEANUP_OBSLETE_DISTFILES
1234 # ============= Rebuild of package database =============
1235 command_do_rebuild_of_package_database ()
1237 local PROGRAM_DEPENDS
1238 PROGRAM_DEPENDS='REINSTALLATION RESTORE_ONCE_DEINST_PKGS DEINST_UNUSED_PKGS'
1239 _program_exec_and_record_completion__operation ()
1241 which -s pkgdb || return 0
1242 message_section_title "Rebuilding package database for portupgrade"
1243 if grep -q @ "${DBDIR}/stage.loop_list/reinst_todo"
1245 message_echo "INFO: Skipped because of lacking flavor support."
1251 program_exec_and_record_completion REBUILD_PKGDB
1254 # =============Operation of redo command irrespective of option settings =============
1255 command_do_redo__command_all_exec_irrespective_of_saved_options ()
1257 [ $opt_reload_conf = yes ] || return 0
1258 program_deregister_stage_complete SAVE_PREV_CONF
1259 program_deregister_stage_complete ALL_COMPLETE
1260 rm -f "${DBDIR}"/complete
1263 # ============= Preparation of the temporary database =============
1264 command_do_prepare ()
1266 # Meta process for redo
1267 command_do_meta_process_for_redo
1269 # Determine specified targets
1270 command_do_determine_specified_targets
1272 # Show specified targets
1273 command_do_show_specified_targets
1275 # Determine all target ports
1276 command_do_determine_all_target_ports
1278 # Loop considering cases that port options are changed after inspection
1281 # Prepare for inspecting all dependencies
1282 command_do_prepare_for_inspect_all_dependencies
1284 # Inspection of all dependencies
1285 command_do_inspection_of_all_dependencies
1287 # Convert dependency-lists to actual ones
1288 command_do_convert_dependency_lists_to_actual_ones
1290 # Completion of recursive requirement lists
1291 command_do_completion_of_recursive_requirement_lists
1293 # Trim dependency lists by removing uninspected ports
1294 command_do_trim_dependency_lists_by_removing_uninspected_ports
1296 # Inspection of dependents
1297 command_do_inspection_of_dependents
1299 # End the loop when no change is made on port options after the inspection
1300 command_do_reset_changed_portdb && break
1303 # Restore escaped obsolete packages for inspection
1304 command_do_restore_escaped_obsoletes
1306 # Remove duplicated lines in dependents lists
1307 command_do_remove_duplicated_lines_in_dependents_lists
1309 # Remove duplicated lines in ignored dependents lists
1310 command_do_remove_duplicated_lines_in_ignored_dependents_lists
1312 # Preparation of target attribute information
1313 command_do_preparation_of_target_attribute_information
1315 # Post-process after the preparation of target attribute information
1316 command_do_post_process_after_the_preparation_of_target_attribute_information
1318 # Build of data on complement to new dependents for target attribute information
1319 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information
1321 # Parse target attribute information
1322 command_do_parse_target_attribute_information
1324 # Inspection of necessity
1325 command_do_inspection_of_necessity
1327 # Inspection of necessary upgrades
1328 command_do_inspection_of_necessary_upgrades
1330 # Preparation for inspection of new leaf ports
1331 command_do_preparation_for_inspection_of_new_leaf_ports
1333 # Inspection of new primary leaf ports
1334 command_do_inspection_of_new_primary_leaf_ports
1336 # Inspection of requirements of new leaf ports
1337 command_do_inspection_of_requirements_of_new_leaf_ports
1339 # Order the ports considering dependencies
1340 command_do_order_the_ports_considering_dependencies
1342 # Selection of removing leaf ports
1343 command_do_selection_of_removing_leaf_ports
1345 # Selection of removing obsolete ports
1346 command_do_selection_of_removing_obsolete_ports
1348 # Collection of leaf ports to delete
1349 command_do_collection_of_leaf_ports_to_delete
1351 # Collection of obsolete ports to delete
1352 command_do_collection_of_obsolete_ports_to_delete
1354 # Set up the list of ports to reinstall
1355 command_do_set_up_the_list_of_ports_to_reinstall
1357 # Composition of a list for deinstallation of obsolete and leaf packages
1358 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages
1360 # Collect entire distfiles list
1361 command_do_collect_entire_distfiles_list
1363 # Inspection of all required distfiles
1364 command_do_inspection_of_all_required_distfiles
1366 # Clean up of reinstallation status for preparation
1367 command_do_clean_up_of_reinstallation_status_for_preparation
1369 # Completion of building the temporary database
1370 command_do_completion_of_building_the_temporary_database
1373 # ============= Reset the progress of reinstallation for retrial =============
1374 command_do_reset_for_reinst_retrial ()
1376 program_deregister_stage_complete REINSTALLATION
1377 program_deregister_stage_complete RESTORE_ONCE_DEINST_PKGS
1378 program_deregister_stage_complete DEINST_UNUSED_PKGS
1379 rm -rf "${DBDIR}/status.ports" "${DBDIR}/new_success_in_current_run"
1382 # ============= Main operation of do/redo =============
1386 # Reset termination messages
1387 temp_reset_termination_messages_common
1392 if [ $ntrial -gt 0 ]
1394 message_echo "########## RETRIAL ($ntrial) OF (RE)INSTALLATION ##########"
1398 if [ $opt_fetch_only = yes ]
1400 # Reinstallation of remained ports
1401 command_do_reinstallation_of_remained_ports
1403 message_echo "Completed the fetch only mode."
1405 elif [ $opt_delete_then_reinstall = no ]
1407 # Reinstallation of remained ports
1408 command_do_reinstallation_of_remained_ports
1410 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1411 command_do_restore_needed_obsolete_and_leaf_packages
1413 # Deinstallation of unused obsolete and leaf packages
1414 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1416 # Deinstallation of unused obsolete and leaf packages
1417 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1419 # Reinstallation of remained ports
1420 command_do_reinstallation_of_remained_ports
1421 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1423 command_do_restore_needed_obsolete_and_leaf_packages
1426 # Clean up obsolete or unused distfiles
1427 command_do_clean_up_obsolete_or_unused_distfiles
1429 # Rebuild of package database
1430 command_do_rebuild_of_package_database
1432 # Retry if incomplete
1433 command_do_is_everything_resolved && break
1434 database_query_is_any_progress || break
1435 command_do_reset_for_reinst_retrial
1436 ntrial=$(($ntrial+1))
1441 # ============= Check whether everything is resolved =============
1442 command_do_is_everything_resolved ()
1445 for subject in failure redo conflict
1447 database_query_show_single_list_exec "$subject" \
1448 `options_get_dependency_type` `options_get_dependency_level` > /dev/null 2> /dev/null && return 1
1453 # ============= Notice of failures =============
1454 command_do_failure_notice ()
1456 local exists_unresolved_ports
1457 exists_unresolved_ports=
1458 message_summary_dependents_of_failed_reinstallation failure || exists_unresolved_ports=y
1459 message_summary_dependents_of_failed_reinstallation redo || exists_unresolved_ports=y
1460 message_summary_dependents_of_failed_reinstallation conflict || exists_unresolved_ports=y
1461 [ "x$exists_unresolved_ports" = xy ] || return 0
1462 message_summary_advice_on_manual_solution
1466 # ============= Ending process =============
1467 command_do_ending_process ()
1469 local PROGRAM_DEPENDS
1470 temp_terminate_process () { :; }
1471 if command_do_failure_notice
1473 if [ $opt_no_opening_message = yes ]
1475 message_echo "Done as ${APPNAME}"
1477 message_section_title "COMPLETELY DONE"
1479 if [ $opt_fetch_only = no -a $opt_dry_run = no ]
1481 PROGRAM_DEPENDS='REBUILD_PKGDB CLEANUP_OBSLETE_DISTFILES '
1482 _program_exec_and_record_completion__operation ()
1485 program_exec_and_record_completion ALL_COMPLETE
1486 [ $opt_no_opening_message = yes ] || message_echo "- E N D -"
1488 message_echo "INFO: Redo for the real (re)installation."
1491 message_warn_no_achieved_progress
1492 message_section_title "Done with some unresolved problems"
1493 message_echo "- To be continued -"