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}
710 program_exec_and_record_completion INSPECT_NECESSITY
713 # ============= Inspection of necessary upgrades =============
714 command_do_inspection_of_necessary_upgrades ()
716 local PROGRAM_DEPENDS _NECESSARY_UPDATES_level
717 for _NECESSARY_UPDATES_level in direct full
719 PROGRAM_DEPENDS='INSPECT_NECESSITY INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE'
720 _program_exec_restartable_loop_operation__routine ()
722 local markerpath level dbpath origin tag
724 level=${_NECESSARY_UPDATES_level}
725 dbpath=`dirname "$markerpath"`
726 origin=`str_dirpath_to_origin "$dbpath"`
727 database_query_does_a_port_need_update "$origin" || return 0
728 for tag in all run build none
730 touch "$dbpath/necessary_upgrade.$tag.${level}"
731 [ -e "$dbpath/dependents.$tag.${level}" -o "$dbpath/ignored_dependents.$tag" ] || continue
732 cat "$dbpath/dependents.$tag.${level}" "$dbpath/ignored_dependents.$tag" 2> /dev/null | \
733 while read origin_dependent
735 touch "${DBDIR}/requires/$origin_dependent/necessary_upgrade.$tag.${level}"
739 _program_exec_and_record_completion__operation ()
742 level=${_NECESSARY_UPDATES_level}
743 message_section_title "Inspection of necessary upgrades at the $level level"
744 program_exec_restartable_loop_operation necessary_ports.${level}
747 program_exec_and_record_completion NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
751 # ============= Preparation for inspection of new leaf ports =============
752 command_do_preparation_for_inspection_of_new_leaf_ports ()
754 local PROGRAM_DEPENDS
755 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
757 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PARSE_CONF'
758 _program_exec_and_record_completion__operation ()
760 message_section_title "Preparation for inspection of new leaf ports"
761 find "${DBDIR}/requires" -depth 3 -type f -name dependents.all.full -or -name ignored_dependents.all \
762 | sed -E 's|.*/([^/]+/[^/]+)/[^/]+$|\1|' \
763 | sort -u > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports
764 sort -u "${DBDIR}/inspected_ports" > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports
765 fileedit_manipulate_new_lines \
766 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports" \
767 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports" \
768 | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null \
769 > ${DBDIR}/stage.loop_list/leaf_ports_primary_candidates || :
770 cp /dev/null "${DBDIR}/leaf_ports.filter"
771 cp /dev/null "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
774 program_exec_and_record_completion PREPARE_INSPECT_LEAF_PORTS
778 # ============= Inspection of new primary leaf ports =============
779 command_do_inspection_of_new_primary_leaf_ports ()
781 local PROGRAM_DEPENDS
782 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
784 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PREPARE_INSPECT_LEAF_PORTS PARSE_CONF'
785 _program_exec_restartable_loop_operation__routine ()
787 local origin origin_ini dbpath origin_req
789 pkgsys_is_pkgtool "$origin" && return
790 dbpath=${DBDIR}/requires/$origin
791 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
792 if ! grep -q -Fx "$origin" "${DBDIR}/noneed.list" 2> /dev/null
794 if [ -e "$dbpath/initial_orig" ]
796 origin_ini=`cat "$dbpath/initial_orig"`
797 [ -e "${DBDIR}/initial/$origin_ini/installed_version" \
798 -a `cat "${DBDIR}/initial/$origin_ini/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
801 [ -e "${DBDIR}/initial/$origin/installed_version" \
802 -a `cat "${DBDIR}/initial/$origin/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
805 if [ -e "$dbpath/requirements.all.full" -o -e "$dbpath/ignored_requirements.all" ]
807 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null | \
808 grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null| \
809 fileedit_add_lines_if_new "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
811 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
813 _program_exec_and_record_completion__operation ()
815 local num_leaves num_leaves_prev
816 message_section_title "Inspection of new primary leaf ports"
817 program_exec_restartable_loop_operation leaf_ports_primary_candidates
818 wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' ' > ${DBDIR}/num_leaves
819 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
820 message_echo " `cat "${DBDIR}/num_leaves"` primary leaf port(s) is/are found."
823 program_exec_and_record_completion INSPECT_PRIMARY_LEAF_PORTS
827 # ============= Inspection of requirements of new leaf ports =============
828 command_do_inspection_of_requirements_of_new_leaf_ports ()
830 local PROGRAM_DEPENDS
831 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
833 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE INSPECT_PRIMARY_LEAF_PORTS PARSE_CONF'
834 _program_exec_and_record_completion__operation ()
836 local num_leaves num_leaves_prev num_inspect num_leaves_new
837 message_section_title "Inspection of requirements of new leaf ports"
838 message_echo "INFO: The inspection proceeds by iterative method."
841 _program_exec_restartable_loop_operation__routine ()
845 pkgsys_is_pkgtool "$origin" && return
846 dbpath=${DBDIR}/requires/$origin
847 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
848 cat "$dbpath/dependents.all.full" "$dbpath/ignored_dependents.all" 2> /dev/null \
849 | grep -Fxq -v -f "${DBDIR}/leaf_ports.filter" 2> /dev/null && return
850 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null \
851 >> ${DBDIR}/leaf_ports_secondary_candidates.new_requirements || :
852 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
854 program_exec_restartable_loop_operation leaf_ports_secondary_candidates
855 num_leaves_prev=`cat "${DBDIR}/num_leaves"`
856 num_leaves=`wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' '`
857 num_leaves_new=`echo $(($num_leaves-$num_leaves_prev)) | tr -d ' '`
858 if [ $num_leaves_new -eq 0 ]
860 message_echo " No more leaf port is found."
861 message_echo " $num_leaves leaf port(s) is/are found in total."
865 grep -Fx -v -f "${DBDIR}/leaf_ports.filter" \
866 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
867 cat "${DBDIR}/leaf_ports_secondary_candidates.new_requirements" || :
868 } 2> /dev/null | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null | sort -u \
869 > ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp || :
870 program_reset_loop_for_stage INSPECT_REQUIREMENTS_OF_LEAF_PORTS
871 mv "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp" \
872 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
873 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
874 echo "$num_leaves" > ${DBDIR}/num_leaves
875 num_inspect=`wc -l < ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates | tr -d ' '`
876 message_echo " $num_leaves_new leaf port(s) is/are newly found; continue for $num_inspect candidate(s)."
878 grep -Fx -f "${DBDIR}/leaf_ports.filter" "${DBDIR}/inspected_ports" 2> /dev/null | sort -u > ${DBDIR}/leaf_ports || :
881 program_exec_and_record_completion INSPECT_REQUIREMENTS_OF_LEAF_PORTS
885 # ============= Order the ports considering dependencies =============
886 command_do_order_the_ports_considering_dependencies ()
888 local PROGRAM_DEPENDS
889 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
890 _program_exec_and_record_completion__operation ()
892 message_section_title "Ordering dependencies"
893 if ! database_build_order_ports_considering_dependencies
895 message_echo "ERROR: Unsatisfied dependencies are remained:" >&2
896 message_cat "${DBDIR}/unsatisfied.list"
897 message_echo "*** Aborted by ${APPNAME}"
898 message_echo "The ports tree seems broken. You might have caught an incomplete version."
899 message_echo "You are encouraged to update the ports tree by portsnap(8)."
900 message_echo "Then execute"
901 message_echo " ${APPNAME} clean"
902 message_echo "before restart."
903 temp_terminate_process () { :; }
908 program_exec_and_record_completion ORDER_ALL_DEPENDENCIES
911 # ============= Selection of removing leaf ports =============
912 command_do_selection_of_removing_leaf_ports ()
914 local PROGRAM_DEPENDS
915 PROGRAM_DEPENDS='INSPECT_REQUIREMENTS_OF_LEAF_PORTS'
916 _program_exec_and_record_completion__operation ()
918 message_section_title "Selection of removing leaf ports"
919 deinstall_select_leaf_ports_to_delete
922 program_exec_and_record_completion SELECT_LEAF_PORTS
925 # ============= Selection of removing obsolete ports =============
926 command_do_selection_of_removing_obsolete_ports ()
928 local PROGRAM_DEPENDS
929 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES PARSE_CONF'
930 _program_exec_and_record_completion__operation ()
932 message_section_title "Selection of removing obsolete ports"
933 deinstall_select_obsolete_ports_to_delete
936 program_exec_and_record_completion SELECT_OBSOLETE_PORTS
939 # ============= Collection of leaf ports to delete =============
940 command_do_collection_of_leaf_ports_to_delete ()
942 local PROGRAM_DEPENDS
943 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
945 PROGRAM_DEPENDS='SELECT_LEAF_PORTS'
946 _program_exec_and_record_completion__operation ()
948 local src src_unselected reqptn_file src_with_initial_origins
949 message_section_title "Collecting leaf ports to delete"
950 src=${DBDIR}/leaf_ports
951 src_unselected=${DBDIR}/leaf_ports_to_delete.unselected
952 src_with_initial_origins=${DBDIR}/leaf_ports.with_ini
953 reqptn_file=${DBDIR}/leaf_ports.requirements_of_unselected
954 cat "$src_unselected" 2> /dev/null | while read origin
956 cat "${DBDIR}/requires/$origin/requirements.all.full" "${DBDIR}/requires/$origin/ignored_requirements.all" || :
957 done 2> /dev/null | sort -u > $reqptn_file
958 database_query_add_initial_origins < $src > $src_with_initial_origins
961 program_exec_and_record_completion COLLECT_LEAF_PORTS_TO_DELETE
965 # ============= Collection of obsolete ports to delete =============
966 command_do_collection_of_obsolete_ports_to_delete ()
968 local PROGRAM_DEPENDS
969 PROGRAM_DEPENDS='SELECT_OBSOLETE_PORTS'
970 _program_exec_and_record_completion__operation ()
972 local src src_selected src_unselected dst_selected reqptn_file
973 message_section_title "Collecting obsolete ports to delete"
974 src=${DBDIR}/obsolete_ports.can_be_deleted
975 src_selected=${DBDIR}/obsolete_ports_to_delete.selected
976 src_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
977 dst_selected=${DBDIR}/obsolete_ports_to_delete
978 reqptn_file=${DBDIR}/obsolete_ports.requirements_of_unselected
979 cat "$src_unselected" 2> /dev/null | while read origin
981 cat "${DBDIR}/initial/$origin/requirements.run.full" || :
982 cat "${DBDIR}/obsolete/$origin/requirements.run.full" || :
983 done | sort -u > $reqptn_file
984 grep -v -Fx -f "$reqptn_file" "$src_selected" > $dst_selected 2> /dev/null || :
987 program_exec_and_record_completion COLLECT_OBSOLETE_PORTS_TO_DELETE
990 # ============= Set up the list of ports to reinstall =============
991 command_do_set_up_the_list_of_ports_to_reinstall ()
993 local PROGRAM_DEPENDS
994 PROGRAM_DEPENDS='ORDER_ALL_DEPENDENCIES'
995 _program_exec_and_record_completion__operation ()
997 message_section_title "Setting up the list of ports to reinstall"
998 cp -p "${DBDIR}/reinst_order.list" "${DBDIR}/stage.loop_list/reinst_todo"
1001 program_exec_and_record_completion SETUP_REINST_TODO
1004 # ============= Composition of a list for deinstallation of obsolete and leaf packages =============
1005 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages ()
1007 local PROGRAM_DEPENDS
1008 PROGRAM_DEPENDS='COLLECT_LEAF_PORTS_TO_DELETE COLLECT_OBSOLETE_PORTS_TO_DELETE'
1009 _program_exec_and_record_completion__operation ()
1011 local reqptn_leaf reqptn_obs leaf_selected leaf_selected_src obs_selected obs_selected_src grepptn preserved
1012 message_section_title "Composing a list for deinstallation of obsolete and leaf packages"
1013 reqptn_leaf=${DBDIR}/leaf_ports.requirements_of_unselected
1014 reqptn_obs=${DBDIR}/obsolete_ports.requirements_of_unselected
1015 leaf_selected_src=${DBDIR}/leaf_ports_to_delete.selected
1016 leaf_selected=${DBDIR}/leaf_ports_to_delete
1017 obs_selected_src=${DBDIR}/obsolete_ports_to_delete.selected
1018 obs_selected=${DBDIR}/obsolete_ports_to_delete
1019 grepptn=${DBDIR}/ports_to_delete.grep_pattern
1020 grepptn_col1=${DBDIR}/ports_to_delete.grep_pattern_col1
1021 preserved=${TMPDIR}/LIST_DEINST_PKGS::preserved
1022 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1024 cat "$reqptn_leaf" "$reqptn_obs" 2> /dev/null | sort -u > $grepptn
1025 grep -v -Fx -f "$grepptn" "$leaf_selected_src" 2> /dev/null \
1026 | database_query_add_initial_origins > $leaf_selected || :
1027 cat "$obs_selected" "$leaf_selected" 2> /dev/null || :
1029 rm -f "$leaf_selected"
1030 cat "$obs_selected" 2> /dev/null
1031 fi | sort -u > ${DBDIR}/stage.loop_list/ports_to_delete
1032 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1033 | sed 's/^/^/;s/$/[[:space:]]/' > $grepptn_col1
1034 cat "${DBDIR}/leaf_ports.with_ini" "${DBDIR}/obsolete_ports" 2> /dev/null \
1035 | grep -Fx -v -f "${DBDIR}/stage.loop_list/ports_to_delete" > ${DBDIR}/stage.loop_list/ports_to_restore 2> /dev/null || :
1036 if [ $opt_batch_mode = no ]
1038 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ] && \
1039 grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$leaf_selected_src" > $preserved 2> /dev/null
1041 message_echo "INFO: Following leaf ports are preserved because required by other preserved leaf/obsolete ports."
1042 message_echo "----------------"
1045 pkgtag=`cat "${DBDIR}/moved_from/$origin/pkgtag" 2> /dev/null` || :
1048 echo "$origin" "($pkgtag)"
1053 message_echo "----------------"
1055 if grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$obs_selected_src" > $preserved 2> /dev/null
1057 message_echo "INFO: Following obsolete ports are preserved because required by other obsolete ports."
1058 message_echo "----------------"
1061 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version" 2> /dev/null` || :
1064 echo "$origin" "($pkgtag)"
1069 message_echo "----------------"
1074 program_exec_and_record_completion LIST_DEINST_PKGS
1077 # ============= Collect entire distfiles list =============
1078 command_do_collect_entire_distfiles_list ()
1080 local PROGRAM_DEPENDS
1081 if [ $opt_inspect_entire_distinfo = yes ]
1084 _program_exec_and_record_completion__operation ()
1086 message_section_title "Collecting entire distfiles list"
1087 find "${PORTSDIR}" -depth 3 -name distinfo -exec cat {} \; \
1088 | grep '^SHA256 ' | sed -E 's/^SHA256 \(([^)]*)\).*/\1/' \
1089 | sort -u > ${DBDIR}/distfiles.entire.tmp
1090 mv "${DBDIR}/distfiles.entire.tmp" "${DBDIR}/distfiles.entire"
1093 program_exec_and_record_completion COLLECT_ALL_DISTFILES_LIST
1097 # ============= Inspection of all required distfiles =============
1098 command_do_inspection_of_all_required_distfiles ()
1100 local PROGRAM_DEPENDS
1101 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES COLLECT_ALL_DISTFILES_LIST'
1102 _program_exec_and_record_completion__operation ()
1104 message_section_title "Summarizing distfiles list"
1106 cat "${DBDIR}/distfiles.entire" || :
1107 cat "${DBDIR}/distfiles.inspected" || :
1108 } 2> /dev/null | sort -u | str_escape_regexp_filter \
1109 | sed 's|^|^\\.\\/|; s|$|$|' > ${DBDIR}/distfiles.grep.pattern || :
1112 program_exec_and_record_completion DISTFILES_LIST
1115 # ============= Clean up of reinstallation status for preparation =============
1116 command_do_clean_up_of_reinstallation_status_for_preparation ()
1118 local PROGRAM_DEPENDS
1119 PROGRAM_DEPENDS='REDO_INIT INSPECT_ALL_DEPENDENCIES'
1120 _program_exec_and_record_completion__operation ()
1122 message_section_title "Cleaning up of reinstallation status for preparation"
1123 rm -rf "${DBDIR}/status.ports"
1126 program_exec_and_record_completion CLEANUP_REINST_STATUS
1129 # ============= Completion of building the temporary database =============
1130 command_do_completion_of_building_the_temporary_database ()
1132 local PROGRAM_DEPENDS
1133 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'
1134 _program_exec_and_record_completion__operation ()
1136 message_section_title "The temporary database is completely built up"
1139 program_exec_and_record_completion PREPARATION
1142 # ============= End of do/redo prepare =============
1143 command_do_end_at_prepare_complete ()
1146 tmp_msg=${TMPDIR}/command_do_end_at_prepare_complete:msg
1147 cat > "$tmp_msg" << eof
1148 Done (skipped reinstallation) at `message_timestamp`
1150 You can restart this process from the aborted/terminated point by executing without options or arguments as:
1153 message_cat "$tmp_msg"
1154 temp_terminate_process () { :; }
1157 # ============= Reinstallation of remained ports =============
1158 command_do_reinstallation_of_remained_ports ()
1160 local PROGRAM_DEPENDS
1161 PROGRAM_DEPENDS='PREPARATION'
1162 _program_exec_restartable_loop_operation__routine ()
1165 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1167 _program_exec_and_record_completion__operation ()
1169 local _MSG_CURRENT_STAGE_general
1170 _MSG_CURRENT_STAGE_general="reinstallation"
1171 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1172 message_section_title "Reinstallation"
1173 program_exec_restartable_loop_operation reinst_todo
1174 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1175 reinstall_restore_conflicts
1176 temp_set_msg_current_stage
1179 program_exec_and_record_completion REINSTALLATION
1182 # ============= Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again =============
1183 command_do_restore_needed_obsolete_and_leaf_packages ()
1185 local PROGRAM_DEPENDS
1186 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1187 _program_exec_restartable_loop_operation__routine ()
1189 deinstall_restore "$@"
1191 _program_exec_and_record_completion__operation ()
1193 local _MSG_CURRENT_STAGE_general
1194 _MSG_CURRENT_STAGE_general="restoration of unselected obsolete/leaf packages"
1195 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1196 message_section_title "Restoration of unselected obsolete/leaf packages"
1197 program_exec_restartable_loop_operation ports_to_restore
1198 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1199 temp_set_msg_current_stage
1202 program_exec_and_record_completion RESTORE_ONCE_DEINST_PKGS
1205 # ============= Deinstallation of unused obsolete and leaf packages =============
1206 command_do_deinstallation_of_unused_obsolete_and_leaf_packages ()
1208 local PROGRAM_DEPENDS
1209 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1210 _program_exec_restartable_loop_operation__routine ()
1214 _program_exec_and_record_completion__operation ()
1216 local _MSG_CURRENT_STAGE_general
1217 _MSG_CURRENT_STAGE_general="deinstallation of obsolete/leaf packages"
1218 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1219 message_section_title "Deinstallation of unused obsolete/leaf packages"
1220 program_exec_restartable_loop_operation ports_to_delete
1221 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1222 temp_set_msg_current_stage
1225 program_exec_and_record_completion DEINST_UNUSED_PKGS
1228 # ============= Clean up obsolete or unused distfiles =============
1229 command_do_clean_up_obsolete_or_unused_distfiles ()
1231 local PROGRAM_DEPENDS
1232 if [ $opt_only_target_scope = no -a $opt_keep_distfiles = no ]
1234 PROGRAM_DEPENDS='REINSTALLATION DISTFILES_LIST'
1235 _program_exec_and_record_completion__operation ()
1237 local tmp_distfiles_exists
1238 message_section_title "Cleaning up obsolete or unused distfiles"
1239 tmp_distfiles_exists=${TMPDIR}/CLEANUP_OBSLETE_DISTFILES::distfiles_exists
1240 [ $opt_dry_run = yes ] && message_echo "INFO: The operations are not actually carried out."
1241 ( set -e; cd "${DISTDIR}" && find . -type f ) \
1242 | sed 's|^\./||' | sort -u > $tmp_distfiles_exists
1243 fileedit_manipulate_old_lines "$tmp_distfiles_exists" "${DBDIR}/distfiles.entire" \
1244 | while read distfile
1246 if [ $opt_batch_mode = no ]
1250 [ $opt_dry_run = yes ] && continue
1251 rm -f "${DISTDIR}/$distfile"
1255 program_exec_and_record_completion CLEANUP_OBSLETE_DISTFILES
1259 # ============= Rebuild of package database =============
1260 command_do_rebuild_of_package_database ()
1262 local PROGRAM_DEPENDS
1263 PROGRAM_DEPENDS='REINSTALLATION RESTORE_ONCE_DEINST_PKGS DEINST_UNUSED_PKGS'
1264 _program_exec_and_record_completion__operation ()
1266 which -s pkgdb || return 0
1267 message_section_title "Rebuilding package database for portupgrade"
1268 if grep -q @ "${DBDIR}/stage.loop_list/reinst_todo"
1270 message_echo "INFO: Skipped because of lacking flavor support."
1276 program_exec_and_record_completion REBUILD_PKGDB
1279 # =============Operation of redo command irrespective of option settings =============
1280 command_do_redo__command_all_exec_irrespective_of_saved_options ()
1282 [ $opt_reload_conf = yes ] || return 0
1283 program_deregister_stage_complete SAVE_PREV_CONF
1284 program_deregister_stage_complete ALL_COMPLETE
1285 rm -f "${DBDIR}"/complete
1288 # ============= Preparation of the temporary database =============
1289 command_do_prepare ()
1291 # Meta process for redo
1292 command_do_meta_process_for_redo
1294 # Determine specified targets
1295 command_do_determine_specified_targets
1297 # Show specified targets
1298 command_do_show_specified_targets
1300 # Determine all target ports
1301 command_do_determine_all_target_ports
1303 # Inspection of all initial dependencies
1304 command_do_inspection_of_all_initial_dependencies
1306 # Loop considering cases that port options are changed after inspection
1309 # Prepare for inspecting all dependencies
1310 command_do_prepare_for_inspect_all_dependencies
1312 # Inspection of all dependencies
1313 command_do_inspection_of_all_dependencies
1315 # Convert dependency-lists to actual ones
1316 command_do_convert_dependency_lists_to_actual_ones
1318 # Completion of recursive requirement lists
1319 command_do_completion_of_recursive_requirement_lists
1321 # Trim dependency lists by removing uninspected ports
1322 command_do_trim_dependency_lists_by_removing_uninspected_ports
1324 # Inspection of dependents
1325 command_do_inspection_of_dependents
1327 # End the loop when no change is made on port options after the inspection
1328 command_do_reset_changed_portdb && break
1331 # Restore escaped obsolete packages for inspection
1332 command_do_restore_escaped_obsoletes
1334 # Remove duplicated lines in dependents lists
1335 command_do_remove_duplicated_lines_in_dependents_lists
1337 # Remove duplicated lines in ignored dependents lists
1338 command_do_remove_duplicated_lines_in_ignored_dependents_lists
1340 # Preparation of target attribute information
1341 command_do_preparation_of_target_attribute_information
1343 # Post-process after the preparation of target attribute information
1344 command_do_post_process_after_the_preparation_of_target_attribute_information
1346 # Build of data on complement to new dependents for target attribute information
1347 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information
1349 # Parse target attribute information
1350 command_do_parse_target_attribute_information
1352 # Inspection of necessity
1353 command_do_inspection_of_necessity
1355 # Inspection of necessary upgrades
1356 command_do_inspection_of_necessary_upgrades
1358 # Preparation for inspection of new leaf ports
1359 command_do_preparation_for_inspection_of_new_leaf_ports
1361 # Inspection of new primary leaf ports
1362 command_do_inspection_of_new_primary_leaf_ports
1364 # Inspection of requirements of new leaf ports
1365 command_do_inspection_of_requirements_of_new_leaf_ports
1367 # Order the ports considering dependencies
1368 command_do_order_the_ports_considering_dependencies
1370 # Selection of removing leaf ports
1371 command_do_selection_of_removing_leaf_ports
1373 # Selection of removing obsolete ports
1374 command_do_selection_of_removing_obsolete_ports
1376 # Collection of leaf ports to delete
1377 command_do_collection_of_leaf_ports_to_delete
1379 # Collection of obsolete ports to delete
1380 command_do_collection_of_obsolete_ports_to_delete
1382 # Set up the list of ports to reinstall
1383 command_do_set_up_the_list_of_ports_to_reinstall
1385 # Composition of a list for deinstallation of obsolete and leaf packages
1386 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages
1388 # Collect entire distfiles list
1389 command_do_collect_entire_distfiles_list
1391 # Inspection of all required distfiles
1392 command_do_inspection_of_all_required_distfiles
1394 # Clean up of reinstallation status for preparation
1395 command_do_clean_up_of_reinstallation_status_for_preparation
1397 # Completion of building the temporary database
1398 command_do_completion_of_building_the_temporary_database
1401 # ============= Reset the progress of reinstallation for retrial =============
1402 command_do_reset_for_reinst_retrial ()
1404 program_deregister_stage_complete REINSTALLATION
1405 program_deregister_stage_complete RESTORE_ONCE_DEINST_PKGS
1406 program_deregister_stage_complete DEINST_UNUSED_PKGS
1407 rm -rf "${DBDIR}/status.ports" "${DBDIR}/new_success_in_current_run"
1410 # ============= Main operation of do/redo =============
1414 # Reset termination messages
1415 temp_reset_termination_messages_common
1420 if [ $ntrial -gt 0 ]
1422 message_echo "########## RETRIAL ($ntrial) OF (RE)INSTALLATION ##########"
1426 if [ $opt_fetch_only = yes ]
1428 # Reinstallation of remained ports
1429 command_do_reinstallation_of_remained_ports
1431 message_echo "Completed the fetch only mode."
1433 elif [ $opt_delete_then_reinstall = no ]
1435 # Reinstallation of remained ports
1436 command_do_reinstallation_of_remained_ports
1438 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1439 command_do_restore_needed_obsolete_and_leaf_packages
1441 # Deinstallation of unused obsolete and leaf packages
1442 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1444 # Deinstallation of unused obsolete and leaf packages
1445 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1447 # Reinstallation of remained ports
1448 command_do_reinstallation_of_remained_ports
1449 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1451 command_do_restore_needed_obsolete_and_leaf_packages
1454 # Clean up obsolete or unused distfiles
1455 command_do_clean_up_obsolete_or_unused_distfiles
1457 # Rebuild of package database
1458 command_do_rebuild_of_package_database
1460 # Retry if incomplete
1461 command_do_is_everything_resolved && break
1462 database_query_is_any_progress || break
1463 command_do_reset_for_reinst_retrial
1464 ntrial=$(($ntrial+1))
1469 # ============= Check whether everything is resolved =============
1470 command_do_is_everything_resolved ()
1473 for subject in failure redo conflict
1475 database_query_show_single_list_exec "$subject" \
1476 `options_get_dependency_type` `options_get_dependency_level` > /dev/null 2> /dev/null && return 1
1481 # ============= Notice of failures =============
1482 command_do_failure_notice ()
1484 local exists_unresolved_ports
1485 exists_unresolved_ports=
1486 message_summary_dependents_of_failed_reinstallation failure || exists_unresolved_ports=y
1487 message_summary_dependents_of_failed_reinstallation redo || exists_unresolved_ports=y
1488 message_summary_dependents_of_failed_reinstallation conflict || exists_unresolved_ports=y
1489 [ "x$exists_unresolved_ports" = xy ] || return 0
1490 message_summary_advice_on_manual_solution
1494 # ============= Ending process =============
1495 command_do_ending_process ()
1497 local PROGRAM_DEPENDS
1498 temp_terminate_process () { :; }
1499 if command_do_failure_notice
1501 if [ $opt_no_opening_message = yes ]
1503 message_echo "Done as ${APPNAME}"
1505 message_section_title "COMPLETELY DONE"
1507 if [ $opt_fetch_only = no -a $opt_dry_run = no ]
1509 PROGRAM_DEPENDS='REBUILD_PKGDB CLEANUP_OBSLETE_DISTFILES '
1510 _program_exec_and_record_completion__operation ()
1513 program_exec_and_record_completion ALL_COMPLETE
1514 [ $opt_no_opening_message = yes ] || message_echo "- E N D -"
1516 message_echo "INFO: Redo for the real (re)installation."
1519 message_warn_no_achieved_progress
1520 message_section_title "Done with some unresolved problems"
1521 message_echo "- To be continued -"