2 # ==============================================================================
3 # portsreinstall library script
4 # - "do"/"redo" command operation -
5 # Copyright (C) 2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
6 # This software is distributed under the 2-Clause BSD License.
7 # ==============================================================================
9 # ============= Operation of redo command before the database reconstruction =============
10 command_do_do__command_all_exec_command_specific_preconfiguration ()
12 program_deregister_stage_complete FORGET::PREPARATION_INSPECT_MASTER
13 program_deregister_stage_complete ALL_COMPLETE
16 # ============= Operation of redo command before the database reconstruction =============
17 command_do_redo__command_all_exec_command_specific_preconfiguration ()
19 program_deregister_stage_complete REDO_INIT
20 if [ $opt_reset_targets = yes ]
22 program_deregister_stage_complete DETERMINE_SPECIFIED_TARGETS
23 program_deregister_stage_complete PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
24 rm -rf "${DBDIR}/targets"
26 command_do_do__command_all_exec_command_specific_preconfiguration
29 # ============= Meta process for redo =============
30 command_do_meta_process_for_redo ()
34 _program_exec_and_record_completion__operation ()
36 rm -f "${DBDIR}/new_success_in_current_run"
37 [ "x$COMMAND_MODE" = xredo ] || return 0
38 message_echo "[REDO mode]"
41 program_exec_and_record_completion REDO_INIT
44 # ============= Determine specified targets =============
45 command_do_determine_specified_targets ()
49 _program_exec_and_record_completion__operation ()
51 local tag level dbsuffix
52 message_section_title "Determining specified targets"
53 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
54 "${DBDIR}/stage.loop_list/target_dependents.specified" \
55 "${DBDIR}/stage.loop_list/target_requirements.specified" \
56 "${DBDIR}/need.list" \
57 "${DBDIR}/targets_specified_so_far" 2> /dev/null \
58 | sort -u > ${DBDIR}/targets_specified_so_far.tmp
59 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
60 rm -f "${DBDIR}/stage.loop_list/target_itself.specified" \
61 "${DBDIR}/stage.loop_list/target_dependents.specified" \
62 "${DBDIR}/stage.loop_list/target_requirements.specified"
63 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
65 options_select_new_ports_if_duplicated O \
66 "${DBDIR}/stage.loop_list/target_itself.specified" "$opt_target_itself"
67 options_select_new_ports_if_duplicated t \
68 "${DBDIR}/stage.loop_list/target_dependents.specified" "$opt_target_dependents"
69 options_select_new_ports_if_duplicated T \
70 "${DBDIR}/stage.loop_list/target_requirements.specified" "$opt_target_requirements"
71 if [ `cat "${DBDIR}/stage.loop_list/target_itself.specified" \
72 "${DBDIR}/stage.loop_list/target_dependents.specified" \
73 "${DBDIR}/stage.loop_list/target_requirements.specified" | wc -l` -eq 0 ]
75 message_echo "ERROR: No matching port for target globs." >&2
79 cat "${DBDIR}/stage.loop_list/target_itself.specified" \
80 "${DBDIR}/stage.loop_list/target_dependents.specified" \
81 "${DBDIR}/stage.loop_list/target_requirements.specified" \
82 | sort -u > ${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset
83 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset" "${DBDIR}/need.list" 2> /dev/null \
84 | sort -u > ${DBDIR}/need.list.tmp
85 mv "${DBDIR}/need.list.tmp" "${DBDIR}/need.list"
86 sort -u "${DBDIR}/need.list" "${DBDIR}/targets_specified_so_far" \
87 > ${DBDIR}/targets_specified_so_far.tmp
88 mv "${DBDIR}/targets_specified_so_far.tmp" "${DBDIR}/targets_specified_so_far"
89 for tag in all run build none
91 for level in direct full
95 cat "${TMPDIR}/DETERMINE_SPECIFIED_TARGETS.reset"
96 cat "${DBDIR}/stage.loop_list/target_dependents.specified" | while read origin
98 nodedir=${DBDIR}/requires/$origin
99 cat "$nodedir/dependents.$dbsuffix" 2> /dev/null
101 cat "${DBDIR}/stage.loop_list/target_requirements.specified" | while read origin
103 nodedir=${DBDIR}/requires/$origin
104 cat "$nodedir/requirements.$dbsuffix" 2> /dev/null
106 } | sort -u | while read origin
108 fileedit_rm_a_line "$origin" "${DBDIR}/success.$dbsuffix.list"
109 fileedit_rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.$dbsuffix.list"
110 rm -f "${DBDIR}/requires/$origin/succeeded_once"
117 program_exec_and_record_completion DETERMINE_SPECIFIED_TARGETS
120 # ============= Show specified targets =============
121 command_do_show_specified_targets ()
123 if [ -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" -a $opt_batch_mode = no ]
125 message_echo "INFO: (Re/de-)installation will be carried out only for the targets:"
127 if [ `wc -l < ${DBDIR}/stage.loop_list/target_itself.specified` -gt 0 ]
129 message_echo "[Targets only]"
130 echo "----------------------------------------"
131 cat "${DBDIR}/stage.loop_list/target_itself.specified"
132 echo "----------------------------------------"
135 if [ `wc -l < ${DBDIR}/stage.loop_list/target_dependents.specified` -gt 0 ]
137 message_echo "[Targets with their `options_get_dependency_msgterm` dependents]"
138 echo "----------------------------------------"
139 cat "${DBDIR}/stage.loop_list/target_dependents.specified"
140 echo "----------------------------------------"
143 if [ `wc -l < ${DBDIR}/stage.loop_list/target_requirements.specified` -gt 0 ]
145 message_echo "[Targets with their `options_get_dependency_msgterm` requirements]"
146 echo "----------------------------------------"
147 cat "${DBDIR}/stage.loop_list/target_requirements.specified"
148 echo "----------------------------------------"
154 # ============= Determine all target ports =============
155 command_do_determine_all_target_ports ()
157 local PROGRAM_DEPENDS
158 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS COLLECT_ALL_INSTALLED_PACKAGES'
159 _program_exec_and_record_completion__operation ()
161 message_section_title "Determining all target ports"
163 if [ $opt_only_target_scope = no ]
165 cat "${DBDIR}/installed_ports" 2> /dev/null || :
167 cat "${DBDIR}/stage.loop_list/target_itself.specified" || :
168 cat "${DBDIR}/stage.loop_list/target_dependents.specified" || :
169 cat "${DBDIR}/stage.loop_list/target_requirements.specified" || :
170 cat "${DBDIR}/targets_specified_so_far" || :
171 } 2> /dev/null | sort -u > "${DBDIR}/stage.loop_list/ports_to_inspect"
172 cp "${DBDIR}/stage.loop_list/ports_to_inspect" "${DBDIR}/stage.loop_list/ports_to_inspect_initial"
175 [ -d "${PORTSDIR}/$origin" ] || echo "$origin"
176 done < ${DBDIR}/stage.loop_list/ports_to_inspect > ${DBDIR}/obsoletes_to_escape_for_inspection
179 program_exec_and_record_completion DETERMINE_ALL_TARGET_PORTS
182 # ============= Inspection of all initial dependencies =============
183 command_do_inspection_of_all_initial_dependencies ()
185 local PROGRAM_DEPENDS
186 PROGRAM_DEPENDS='DETERMINE_ALL_TARGET_PORTS'
187 _program_exec_restartable_loop_operation__routine ()
191 database_build_setup_initial_node "$origin"
193 _program_exec_and_record_completion__operation ()
196 message_section_title "Inspecting initial dependencies of the all installed packages"
197 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
198 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
199 program_exec_restartable_loop_operation ports_to_inspect_initial
200 database_build_post_inspect_initial_dependencies
203 program_exec_and_record_completion INSPECT_ALL_INITIAL_DEPENDENCIES
206 # ============= Prepare for inspecting all dependencies =============
207 command_do_prepare_for_inspect_all_dependencies ()
209 local PROGRAM_DEPENDS
210 PROGRAM_DEPENDS='PARSE_CONF INSPECT_ALL_INITIAL_DEPENDENCIES'
211 _program_exec_and_record_completion__operation ()
213 message_section_title "Preparing for inspection of all dependencies"
214 database_build_escape "${DBDIR}/escaped_obsoletes" < ${DBDIR}/obsoletes_to_escape_for_inspection
215 cp /dev/null "${DBDIR}/done_required_ports_to_inspect"
218 program_exec_and_record_completion PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
221 # ============= Check ports of which the port options are changed and reset their databases =============
222 # Return status 0 for no need to update of inspected ports and 1 for needed to do it
223 command_do_reset_changed_portdb ()
226 program_chk_stage_complete INSPECT_DEPENDENTS || return
227 pkgsys_exists_saved_port_oprions_timestamps || return
228 message_section_title "Inspecting changes of port options"
229 tmp_ls=${TMPDIR}/command_do_reset_changed_portdb
230 rm -f "$tmp_ls.updated"
231 if [ ! -d "${PORT_DBDIR}" ]
233 message_echo "WARNING: ${PORT_DBDIR} is missing. All port options are recognized as default."
235 pkgsys_get_saved_port_oprions_timestamps_all > $tmp_ls.db
236 pkgsys_get_current_port_oprions_timestamp > $tmp_ls.log
237 pkgsys_get_changed_port_oprions "$tmp_ls.db" "$tmp_ls.log" > $tmp_ls.diff
238 if ! [ `wc -l < $tmp_ls.diff` -gt 0 ]
243 message_echo "INFO: There are some changes. Inspecting the detail..."
244 cp /dev/null "$tmp_ls.uninspected.dbfile"
245 cp /dev/null "$tmp_ls.uninspected.origin"
246 cp /dev/null "$tmp_ls.nonexistent.db"
247 pkgsys_conv_portoptiondbs_to_globs < $tmp_ls.diff > $tmp_ls.glob
248 str_escape_replaceval_filter < $tmp_ls.diff > $tmp_ls.diff.rpl
249 paste "$tmp_ls.diff" "$tmp_ls.diff.rpl" "$tmp_ls.glob" | while read -r dbfile dbfile_rpl glob
251 pkgsys_eval_ports_glob "$glob" > $tmp_ls.origins
252 if [ `wc -l < $tmp_ls.origins` -gt 0 ]
254 sed -E "s/^/$dbfile_rpl /" < $tmp_ls.origins
256 echo $dbfile >> $tmp_ls.nonexistent.db
258 done | while read dbfile origin
260 if [ -d "${DBDIR}/requires/$origin" ]
262 message_echo "Change detected on $origin: Resetting"
263 database_build_patch_reconf "$origin"
264 program_deregister_stage_complete PREPARE_FOR_INSPECT_ALL_DEPENDENCIES
265 program_deregister_stage_complete ALL_COMPLETE
266 touch "$tmp_ls.updated"
268 echo "$dbfile" >> $tmp_ls.uninspected.dbfile
269 echo "$origin" >> $tmp_ls.uninspected.origin
272 message_echo "INFO: Recording for not inspected ports..."
273 pkgsys_conv_portorigin_to_port_oprion_timestamp_logname < $tmp_ls.uninspected.origin > $tmp_ls.uninspected.logname
274 str_escape_regexp_filter < $tmp_ls.uninspected.dbfile | sed 's/^/^/;s/$/[[:space:]]/' > $tmp_ls.uninspected.dbfile_ptn
275 paste "$tmp_ls.uninspected.dbfile_ptn" "$tmp_ls.uninspected.logname" | while read -r dbfile_ptn logname
277 grep -E "$dbfile_ptn" < $tmp_ls.log > ${DBDIR}/ls_dbdir/$logname.log 2> /dev/null || :
279 str_escape_regexp_filter < $tmp_ls.nonexistent.db | sed 's/^/^/;s/$/[[:space:]]/' > $tmp_ls.nonexistent.db_ptn
280 grep -E -f "$tmp_ls.nonexistent.db_ptn" < $tmp_ls.log | pkgsys_register_list_nonexistent_portopriondb
282 [ ! -e "$tmp_ls.updated" ]
285 # ============= Inspection of all dependencies =============
286 command_do_inspection_of_all_dependencies ()
288 local PROGRAM_DEPENDS
289 PROGRAM_DEPENDS='PREPARE_FOR_INSPECT_ALL_DEPENDENCIES'
290 _program_exec_restartable_loop_operation__routine ()
294 database_build_inspect_dependencies "$origin"
296 _program_exec_and_record_completion__operation ()
299 message_section_title "Inspecting dependencies of the all installed packages"
300 [ $opt_only_target_scope = no -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ] && \
301 message_echo "INFO: Ports which seem irrelevant to the targets are also inspected in order to get complete information."
303 program_exec_restartable_loop_operation ports_to_inspect
304 database_build_post_inspect_dependencies
305 database_maintain_clear_prevset
308 program_exec_and_record_completion INSPECT_ALL_DEPENDENCIES
311 # ============= Convert dependency-lists to actual ones =============
312 command_do_convert_dependency_lists_to_actual_ones ()
314 local PROGRAM_DEPENDS
315 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES'
316 _program_exec_restartable_loop_operation__routine ()
318 local origin table dbtag level tag target
320 for table in dependents requirements
322 for dbtag in requires obsolete
324 for level in direct full
326 for tag in all run build
328 target=${DBDIR}/$dbtag/$origin/${table}.${tag}.${level}
329 if [ -e "$target.src" ]
331 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "$target.src" \
332 | grep -v '^$' | sort -u > $target.tmp
333 [ -e "$target" ] && ! diff -q "$target.tmp" "$target" > /dev/null \
334 && echo "$origin" >> ${DBDIR}/update_dependencies
335 mv "$target.tmp" "$target"
337 [ -e "$target" ] && echo "$origin" >> ${DBDIR}/update_dependencies
345 _program_exec_and_record_completion__operation ()
347 message_section_title "Conversion of dependency-lists to actual ones"
348 program_exec_restartable_loop_operation convert_dependency_lists
349 sort -u "${DBDIR}/update_dependencies" > ${DBDIR}/update_dependencies.tmp
350 mv "${DBDIR}/update_dependencies.tmp" "${DBDIR}/update_dependencies"
351 for tag in all run build
353 ( cd "${DBDIR}/requires" && \
354 find . -depth 3 -type f -name requirements.${tag}.full -or -name requirements.${tag}.full.orig ) \
356 | sed 's|^./||;s|/[^/]*$||' \
357 | grep -v -Fx -f "${DBDIR}/update_dependencies" \
358 > ${TMPDIR}/convert_requirements_list:full_complete.grep_pattern || :
359 ( cd "${DBDIR}/requires" && \
360 find . -depth 3 -type f -name requirements.${tag}.direct -or -name requirements.${tag}.direct.orig ) \
362 | sed 's|^./||;s|/[^/]*$||' \
363 | grep -v -Fx -f "${TMPDIR}/convert_requirements_list:full_complete.grep_pattern" \
364 > ${DBDIR}/stage.loop_list/complete_recursive_${tag}time_reqlists || :
366 for inspected_level_tmp in direct node
368 cat "${DBDIR}/ports.inspected.${inspected_level_tmp}.list" || :
369 done 2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/trim_dependency_lists_rm_uninspected_ports
370 find "${DBDIR}/requires" -depth 2 -type d > ${DBDIR}/stage.loop_list/inspect_dependent
371 [ -e "${DBDIR}/dependents_files" ] && \
372 mv "${DBDIR}/dependents_files" "${DBDIR}/dependents_files.prev"
373 rm -f "${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp" "${DBDIR}/dependents_files.tmp"
376 program_exec_and_record_completion CONVERT_REQUIREMENTS_LIST
379 # ============= Completion of recursive requirement lists =============
380 command_do_completion_of_recursive_requirement_lists ()
382 local PROGRAM_DEPENDS _REQUIREMENT_LISTS_tag
383 for _REQUIREMENT_LISTS_tag in all run build
385 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
386 _program_exec_restartable_loop_operation__routine ()
388 local tag dbpath origin suffix
389 tag=${_REQUIREMENT_LISTS_tag}
391 origin=`str_dirpath_to_origin "$dbpath"`
392 for suffix in '' .orig
394 database_build_get_complete_recursive_dependency "$tag" "$origin" "$suffix" > /dev/null
397 _program_exec_and_record_completion__operation ()
400 tag=${_REQUIREMENT_LISTS_tag}
401 message_section_title "Completion of ${tag}-time requirement lists"
402 program_exec_restartable_loop_operation complete_recursive_${tag}time_reqlists
405 program_exec_and_record_completion RECURSIVE_REQUIREMENT_LISTS:${_REQUIREMENT_LISTS_tag}
409 # ============= Trim dependency lists by removing uninspected ports =============
410 command_do_trim_dependency_lists_by_removing_uninspected_ports ()
412 local PROGRAM_DEPENDS
413 if [ $opt_only_target_scope = yes ]
415 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST'
416 _program_exec_restartable_loop_operation__routine ()
418 local dbpath tag level srcdb
420 for tag in all run build
422 for level in direct full
424 srcdb=requirements.${tag}.${level}
425 [ -e "$dbpath/$srcdb" ] || continue
426 grep -Fx -f "${DBDIR}/inspected_ports" "$dbpath/$srcdb" > $dbpath/$srcdb.tmp || :
427 mv "$dbpath/$srcdb.tmp" "$dbpath/$srcdb"
431 _program_exec_and_record_completion__operation ()
433 message_section_title "Trimming dependency lists by removing uninspected ports"
434 program_exec_restartable_loop_operation trim_dependency_lists_rm_uninspected_ports
437 program_exec_and_record_completion TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS
441 # ============= Inspection of dependents =============
442 command_do_inspection_of_dependents ()
444 local PROGRAM_DEPENDS
445 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES CONVERT_REQUIREMENTS_LIST TRIM_DEPENDENCY_LISTS_RM_UNINSPECTED_PORTS'
446 _program_exec_restartable_loop_operation__routine ()
448 local dbpath origin tag level suffix srcdb dstdb
450 origin=`str_dirpath_to_origin "$dbpath"`
451 for tag in all run build
453 for suffix in '' .orig
455 for level in direct full
457 srcdb=requirements.${tag}.${level}${suffix}
458 [ -e "$dbpath/$srcdb" ] || continue
459 dstdb=dependents.${tag}.${level}${suffix}
460 while read origin_requirement
462 dstpath=${DBDIR}/requires/$origin_requirement
463 echo "$dstpath/$dstdb" >> ${DBDIR}/dependents_files.tmp
464 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
466 echo "$origin" >> $dstpath/$dstdb.raw
467 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_dependents_lists_unique.tmp
468 done < $dbpath/$srcdb
470 srcdb=ignored_requirements.${tag}${suffix}
471 [ -e "$dbpath/$srcdb" ] || continue
472 dstdb=ignored_dependents.${tag}${suffix}
473 while read origin_requirement
475 dstpath=${DBDIR}/requires/$origin_requirement
476 echo "$dstpath/$dstdb" >> ${DBDIR}/ignored_dependents_files.tmp
477 [ "$dstpath/$dstdb" -nt "$dbpath/$srcdb" ] && continue
479 echo "$origin" >> $dstpath/$dstdb.raw
480 echo "$dstpath/$dstdb" >> ${DBDIR}/stage.loop_list/make_ignored_dependents_lists_unique.tmp
481 done < $dbpath/$srcdb
485 _program_exec_and_record_completion__operation ()
487 local dbrequires_valesc
488 message_section_title "Inspection of dependents"
489 dbrequires_valesc=`str_escape_replaceval "${DBDIR}/requires/"`
490 program_exec_restartable_loop_operation inspect_dependent
491 for dbtype in dependents ignored_dependents
493 sort -u "${DBDIR}/stage.loop_list/make_${dbtype}_lists_unique.tmp" 2> /dev/null \
494 > ${DBDIR}/stage.loop_list/make_${dbtype}_lists_unique || :
495 sort -u "${DBDIR}/${dbtype}_files.tmp" 2> /dev/null > ${DBDIR}/${dbtype}_files || :
496 [ -e "${DBDIR}/make_${dbtype}_lists_unique.prev" ] && \
497 fileedit_manipulate_old_lines "${DBDIR}/${dbtype}_files.prev" "${DBDIR}/${dbtype}_files" \
502 program_exec_and_record_completion INSPECT_DEPENDENTS
505 # ============= Restore escaped obsolete packages for inspection =============
506 command_do_restore_escaped_obsoletes ()
508 local PROGRAM_DEPENDS
509 PROGRAM_DEPENDS='INSPECT_DEPENDENTS'
510 _program_exec_and_record_completion__operation ()
512 message_section_title "Restoring escaped obsolete packages for inspection"
513 cat "${DBDIR}/escaped_obsoletes" 2> /dev/null | database_build_restore
514 rm -f "${DBDIR}/escaped_obsoletes"
517 program_exec_and_record_completion RESTORE_ESCAPED_OBSOLETE_PACKAGES_FOR_INSPECTION
520 # ============= Remove duplicated lines in dependents lists =============
521 command_do_remove_duplicated_lines_in_dependents_lists ()
523 local PROGRAM_DEPENDS
524 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
525 _program_exec_restartable_loop_operation__routine ()
527 local dbpath tag level dstdb
529 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
530 mv "$dstdb.tmp" "$dstdb"
533 _program_exec_and_record_completion__operation ()
535 local dbrequires_valesc
536 message_section_title "Removing duplicated items in dependents lists"
537 program_exec_restartable_loop_operation make_dependents_lists_unique
540 program_exec_and_record_completion MAKE_DEPENDENTS_LISTS_UNIQUE
543 # ============= Remove duplicated lines in ignored dependents lists =============
544 command_do_remove_duplicated_lines_in_ignored_dependents_lists ()
546 local PROGRAM_DEPENDS
547 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST INSPECT_DEPENDENTS'
548 _program_exec_restartable_loop_operation__routine ()
550 local dbpath tag level dstdb
552 cat "$dstdb" "$dstdb.raw" 2> /dev/null | sort -u > $dstdb.tmp
553 mv "$dstdb.tmp" "$dstdb"
556 _program_exec_and_record_completion__operation ()
558 local dbrequires_valesc
559 message_section_title "Removing duplicated items in ignored dependents lists"
560 program_exec_restartable_loop_operation make_ignored_dependents_lists_unique
563 program_exec_and_record_completion MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE
566 # ============= Preparation of target attribute information =============
567 command_do_preparation_of_target_attribute_information ()
569 local PROGRAM_DEPENDS _TARGET_ATTR_INFO_table
570 for _TARGET_ATTR_INFO_table in requirements dependents itself
572 [ `cat "${DBDIR}/stage.loop_list/target_${_TARGET_ATTR_INFO_table}.replaced.specified" 2> /dev/null \
573 | wc -l` -gt 0 ] || continue
574 PROGRAM_DEPENDS='DETERMINE_SPECIFIED_TARGETS CONVERT_REQUIREMENTS_LIST'
575 _program_exec_restartable_loop_operation__routine ()
577 local origin dbtargets_valesc table
579 dbtargets_valesc=`str_escape_replaceval "${DBDIR}/targets/"`
580 table=${_TARGET_ATTR_INFO_table}
581 for database in requires initial
583 dbpath=${DBDIR}/$database/$origin
584 dstpath=${DBDIR}/targets/$origin
586 touch "$dstpath/target_itself"
587 echo "$origin" >> ${DBDIR}/all_targets.lst
588 [ $table = itself ] && continue
589 for tag in all run build
591 for level in direct full
593 srcdb=${table}.${tag}.${level}
594 dstdb=target_${database}_${table}.${tag}.${level}
595 [ -e "$dbpath/$srcdb" ] || continue
596 cat "$dbpath/$srcdb" >> ${DBDIR}/all_targets.lst
597 sed -E "s/^/$dbtargets_valesc/; s|$|/$dstdb|" "$dbpath/$srcdb" \
598 | fileedit_add_a_line_to_files_if_new "$origin"
603 _program_exec_and_record_completion__operation ()
606 table=${_TARGET_ATTR_INFO_table}
607 message_section_title "Preparation of target attribute information for dependency [$table]"
608 program_exec_restartable_loop_operation target_$table.replaced.specified
611 program_exec_and_record_completion TARGET_ATTR_INFO:${_TARGET_ATTR_INFO_table}
615 # ============= Post-process after the preparation of target attribute information =============
616 command_do_post_process_after_the_preparation_of_target_attribute_information ()
618 local PROGRAM_DEPENDS
619 PROGRAM_DEPENDS='MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents'
620 _program_exec_and_record_completion__operation ()
622 message_section_title "Post-process after the preparation of target attribute information"
623 sort -u "${DBDIR}/all_targets.lst" 2> /dev/null \
624 | grep -Fx -f "${DBDIR}/inspected_ports" \
625 | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" 2> /dev/null \
626 > ${DBDIR}/all_targets.lst.tmp || :
627 mv "${DBDIR}/all_targets.lst.tmp" "${DBDIR}/all_targets.lst"
628 find "${DBDIR}/targets" -depth 2 -type d > ${DBDIR}/stage.loop_list/build_complement_to_new_dependents_for_targets 2> /dev/null || :
630 cat "${DBDIR}/all_targets.lst" "${DBDIR}/need.with_replaced.list" 2> /dev/null || :
631 find "${DBDIR}/moved_from" -depth 3 -type f -name installed_version \
632 | sed -E 's|.*/([^/]+/[^/]+)/[^/]*$|\1|'
633 } | sort -u > ${DBDIR}/stage.loop_list/inspect_necessity
634 cp /dev/null "${DBDIR}/stage.loop_list/parse_target_attr_info"
635 find -E "${DBDIR}/requires" -depth 3 -type f -regex '.*/necessary_port\.(direct|full)$' -delete
638 program_exec_and_record_completion TARGET_ATTR_INFO_POSTPROCESS
641 # ============= Build of data on complement to new dependents for target attribute information =============
642 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information ()
644 local PROGRAM_DEPENDS
645 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS TARGET_ATTR_INFO:requirements TARGET_ATTR_INFO:dependents CONVERT_REQUIREMENTS_LIST'
646 _program_exec_restartable_loop_operation__routine ()
650 origin=`str_dirpath_to_origin "$dbpath"`
651 database_build_complement_to_new_dependents_for_targets "$origin"
653 _program_exec_and_record_completion__operation ()
655 message_section_title "Build of data on complement to new dependents for target attribute information"
656 program_exec_restartable_loop_operation build_complement_to_new_dependents_for_targets
657 sort -u "${DBDIR}/stage.loop_list/parse_target_attr_info" > ${DBDIR}/stage.loop_list/parse_target_attr_info.tmp
658 mv "${DBDIR}/stage.loop_list/parse_target_attr_info.tmp" "${DBDIR}/stage.loop_list/parse_target_attr_info"
661 program_exec_and_record_completion COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO
664 # ============= Parse target attribute information =============
665 command_do_parse_target_attribute_information ()
667 local PROGRAM_DEPENDS
668 PROGRAM_DEPENDS='COMPLEMENT_TO_NEW_DEPENDENTS_FOR_TARGET_ATTR_INFO'
669 _program_exec_restartable_loop_operation__routine ()
673 origin=`str_dirpath_to_origin "$dbpath"`
674 database_build_target_attributes "$origin"
676 _program_exec_and_record_completion__operation ()
678 message_section_title "Parsing target attribute information"
679 program_exec_restartable_loop_operation parse_target_attr_info
682 program_exec_and_record_completion PARSE_TARGET_ATTR_INFO
685 # ============= Inspection of necessity =============
686 command_do_inspection_of_necessity ()
688 local PROGRAM_DEPENDS
689 PROGRAM_DEPENDS='TARGET_ATTR_INFO_POSTPROCESS RECURSIVE_REQUIREMENT_LISTS:run RECURSIVE_REQUIREMENT_LISTS:build INSPECT_ALL_DEPENDENCIES'
690 _program_exec_restartable_loop_operation__routine ()
694 for level in direct full
696 database_build_inspect_necessity_for_only_new_upgrade "$origin" "$level"
699 _program_exec_and_record_completion__operation ()
701 message_section_title "Inspection of necessity"
702 program_exec_restartable_loop_operation inspect_necessity
703 for level in direct full
705 find "${DBDIR}/requires" -depth 3 -type f -name "necessary_port.${level}" \
706 > ${DBDIR}/stage.loop_list/necessary_ports.${level}
707 cp "${DBDIR}/stage.loop_list/necessary_ports.${level}" "${DBDIR}/stage.loop_list/complete_necessary_ports.${level}"
711 program_exec_and_record_completion INSPECT_NECESSITY
714 # ============= Inspection of necessary upgrades =============
715 command_do_inspection_of_necessary_upgrades ()
717 local PROGRAM_DEPENDS _NECESSARY_UPDATES_level
718 for _NECESSARY_UPDATES_level in direct full
720 PROGRAM_DEPENDS='INSPECT_NECESSITY INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE'
721 _program_exec_restartable_loop_operation__routine ()
723 local markerpath level dbpath origin tag
725 level=${_NECESSARY_UPDATES_level}
726 dbpath=`dirname "$markerpath"`
727 origin=`str_dirpath_to_origin "$dbpath"`
728 database_query_does_a_port_need_update "$origin" || return 0
729 for tag in all run build none
731 touch "$dbpath/necessary_upgrade.${tag}.${level}"
732 [ -e "$dbpath/dependents.${tag}.${level}" -o "$dbpath/ignored_dependents.${tag}" ] || continue
733 cat "$dbpath/dependents.${tag}.${level}" "$dbpath/ignored_dependents.${tag}" 2> /dev/null | \
734 while read origin_dependent
736 touch "${DBDIR}/requires/$origin_dependent/necessary_upgrade.${tag}.${level}"
740 _program_exec_and_record_completion__operation ()
743 level=${_NECESSARY_UPDATES_level}
744 message_section_title "Inspection of necessary upgrades at the $level level"
745 program_exec_restartable_loop_operation necessary_ports.${level}
748 program_exec_and_record_completion NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
752 # ============= Completion of necessary upgrades for build =============
753 command_do_complete_necessary_upgrades_for_build ()
755 local PROGRAM_DEPENDS _NECESSARY_UPDATES_level
756 for _NECESSARY_UPDATES_level in direct full
758 PROGRAM_DEPENDS="INSPECT_NECESSITY NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}"
759 _program_exec_restartable_loop_operation__routine ()
761 local markerpath level dbpath origin_requirement dbpath_requirement
763 level=${_NECESSARY_UPDATES_level}
764 dbpath=`dirname "$markerpath"`
765 [ -e "$dbpath/requirements.build.${level}" -a -e "$dbpath/necessary_upgrade.run.${level}" ] || return 0
766 while read origin_requirement
768 dbpath_requirement=${DBDIR}/requires/$origin_requirement
769 [ -e "$dbpath_requirement/necessary_upgrade.build.${level}" ] || continue
770 [ `cat "${DBDIR}/moved_from/$origin_requirement/current_version" 2> /dev/null | wc -l` -eq 0 ] || return 0
771 touch "$dbpath_requirement/necessary_upgrade.run.${level}"
772 done < $dbpath/requirements.build.${level}
775 _program_exec_and_record_completion__operation ()
778 level=${_NECESSARY_UPDATES_level}
779 message_section_title "Completion of necessary upgrades for build at the $level level"
780 program_exec_restartable_loop_operation complete_necessary_ports.${level}
783 program_exec_and_record_completion COMPLETE_NECESSARY_UPDATES:${_NECESSARY_UPDATES_level}
787 # ============= Preparation for inspection of new leaf ports =============
788 command_do_preparation_for_inspection_of_new_leaf_ports ()
790 local PROGRAM_DEPENDS
791 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
793 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PARSE_CONF'
794 _program_exec_and_record_completion__operation ()
796 message_section_title "Preparation for inspection of new leaf ports"
797 find "${DBDIR}/requires" -depth 3 -type f -name dependents.all.full -or -name ignored_dependents.all \
798 | sed -E 's|.*/([^/]+/[^/]+)/[^/]+$|\1|' \
799 | sort -u > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports
800 sort -u "${DBDIR}/inspected_ports" > ${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports
801 fileedit_manipulate_new_lines \
802 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:nonleaf_ports" \
803 "${TMPDIR}/PREPARE_INSPECT_LEAF_PORTS:inspected_ports" \
804 | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null \
805 > ${DBDIR}/stage.loop_list/leaf_ports_primary_candidates || :
806 cp /dev/null "${DBDIR}/leaf_ports.filter"
807 cp /dev/null "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
810 program_exec_and_record_completion PREPARE_INSPECT_LEAF_PORTS
814 # ============= Inspection of new primary leaf ports =============
815 command_do_inspection_of_new_primary_leaf_ports ()
817 local PROGRAM_DEPENDS
818 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
820 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE PREPARE_INSPECT_LEAF_PORTS PARSE_CONF'
821 _program_exec_restartable_loop_operation__routine ()
823 local origin origin_ini dbpath origin_req
825 pkgsys_is_pkgtool "$origin" && return
826 dbpath=${DBDIR}/requires/$origin
827 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
828 if ! grep -q -Fx "$origin" "${DBDIR}/noneed.list" 2> /dev/null
830 if [ -e "$dbpath/initial_orig" ]
832 origin_ini=`cat "$dbpath/initial_orig"`
833 [ -e "${DBDIR}/initial/$origin_ini/installed_version" \
834 -a `cat "${DBDIR}/initial/$origin_ini/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
837 [ -e "${DBDIR}/initial/$origin/installed_version" \
838 -a `cat "${DBDIR}/initial/$origin/dependents.all.full" 2> /dev/null | wc -l` -eq 0 ] \
841 if [ -e "$dbpath/requirements.all.full" -o -e "$dbpath/ignored_requirements.all" ]
843 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null | \
844 grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null| \
845 fileedit_add_lines_if_new "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
847 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
849 _program_exec_and_record_completion__operation ()
851 local num_leaves num_leaves_prev
852 message_section_title "Inspection of new primary leaf ports"
853 program_exec_restartable_loop_operation leaf_ports_primary_candidates
854 wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' ' > ${DBDIR}/num_leaves
855 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
856 message_echo " `cat "${DBDIR}/num_leaves"` primary leaf port(s) is/are found."
859 program_exec_and_record_completion INSPECT_PRIMARY_LEAF_PORTS
863 # ============= Inspection of requirements of new leaf ports =============
864 command_do_inspection_of_requirements_of_new_leaf_ports ()
866 local PROGRAM_DEPENDS
867 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
869 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES MAKE_DEPENDENTS_LISTS_UNIQUE MAKE_IGNORED_DEPENDENTS_LISTS_UNIQUE INSPECT_PRIMARY_LEAF_PORTS PARSE_CONF'
870 _program_exec_and_record_completion__operation ()
872 local num_leaves num_leaves_prev num_inspect num_leaves_new
873 message_section_title "Inspection of requirements of new leaf ports"
874 message_echo "INFO: The inspection proceeds by iterative method."
877 _program_exec_restartable_loop_operation__routine ()
881 pkgsys_is_pkgtool "$origin" && return
882 dbpath=${DBDIR}/requires/$origin
883 grep -q -Fx "$origin" "${DBDIR}/need.with_replaced.list" 2> /dev/null && return
884 cat "$dbpath/dependents.all.full" "$dbpath/ignored_dependents.all" 2> /dev/null \
885 | grep -Fxq -v -f "${DBDIR}/leaf_ports.filter" 2> /dev/null && return
886 cat "$dbpath/requirements.all.full" "$dbpath/ignored_requirements.all" 2> /dev/null \
887 >> ${DBDIR}/leaf_ports_secondary_candidates.new_requirements || :
888 fileedit_add_a_line_if_new "$origin" "${DBDIR}/leaf_ports.filter"
890 program_exec_restartable_loop_operation leaf_ports_secondary_candidates
891 num_leaves_prev=`cat "${DBDIR}/num_leaves"`
892 num_leaves=`wc -l < ${DBDIR}/leaf_ports.filter | tr -d ' '`
893 num_leaves_new=`echo $(($num_leaves-$num_leaves_prev)) | tr -d ' '`
894 if [ $num_leaves_new -eq 0 ]
896 message_echo " No more leaf port is found."
897 message_echo " $num_leaves leaf port(s) is/are found in total."
901 grep -Fx -v -f "${DBDIR}/leaf_ports.filter" \
902 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates" || :
903 cat "${DBDIR}/leaf_ports_secondary_candidates.new_requirements" || :
904 } 2> /dev/null | grep -v -Fx -f "${DBDIR}/conf/HOLD:PORTS.parsed" 2> /dev/null | sort -u \
905 > ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp || :
906 program_reset_loop_for_stage INSPECT_REQUIREMENTS_OF_LEAF_PORTS
907 mv "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates.tmp" \
908 "${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates"
909 cp /dev/null "${DBDIR}/leaf_ports_secondary_candidates.new_requirements"
910 echo "$num_leaves" > ${DBDIR}/num_leaves
911 num_inspect=`wc -l < ${DBDIR}/stage.loop_list/leaf_ports_secondary_candidates | tr -d ' '`
912 message_echo " $num_leaves_new leaf port(s) is/are newly found; continue for $num_inspect candidate(s)."
914 grep -Fx -f "${DBDIR}/leaf_ports.filter" "${DBDIR}/inspected_ports" 2> /dev/null | sort -u > ${DBDIR}/leaf_ports || :
917 program_exec_and_record_completion INSPECT_REQUIREMENTS_OF_LEAF_PORTS
921 # ============= Order the ports considering dependencies =============
922 command_do_order_the_ports_considering_dependencies ()
924 local PROGRAM_DEPENDS
925 PROGRAM_DEPENDS='CONVERT_REQUIREMENTS_LIST'
926 _program_exec_and_record_completion__operation ()
928 message_section_title "Ordering dependencies"
929 if ! database_build_order_ports_considering_dependencies
931 message_echo "ERROR: Unsatisfied dependencies are remained:" >&2
932 message_cat "${DBDIR}/unsatisfied.list"
933 message_echo "*** Aborted by ${APPNAME}"
934 message_echo "The ports tree seems broken. You might have caught an incomplete version."
935 message_echo "You are encouraged to update the ports tree by portsnap(8)."
936 message_echo "Then execute"
937 message_echo " ${APPNAME} clean"
938 message_echo "before restart."
939 temp_terminate_process () { :; }
944 program_exec_and_record_completion ORDER_ALL_DEPENDENCIES
947 # ============= Selection of removing leaf ports =============
948 command_do_selection_of_removing_leaf_ports ()
950 local PROGRAM_DEPENDS
951 PROGRAM_DEPENDS='INSPECT_REQUIREMENTS_OF_LEAF_PORTS'
952 _program_exec_and_record_completion__operation ()
954 message_section_title "Selection of removing leaf ports"
955 deinstall_select_leaf_ports_to_delete
958 program_exec_and_record_completion SELECT_LEAF_PORTS
961 # ============= Selection of removing obsolete ports =============
962 command_do_selection_of_removing_obsolete_ports ()
964 local PROGRAM_DEPENDS
965 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES PARSE_CONF'
966 _program_exec_and_record_completion__operation ()
968 message_section_title "Selection of removing obsolete ports"
969 deinstall_select_obsolete_ports_to_delete
972 program_exec_and_record_completion SELECT_OBSOLETE_PORTS
975 # ============= Collection of leaf ports to delete =============
976 command_do_collection_of_leaf_ports_to_delete ()
978 local PROGRAM_DEPENDS
979 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
981 PROGRAM_DEPENDS='SELECT_LEAF_PORTS'
982 _program_exec_and_record_completion__operation ()
984 local src src_unselected reqptn_file src_with_initial_origins
985 message_section_title "Collecting leaf ports to delete"
986 src=${DBDIR}/leaf_ports
987 src_unselected=${DBDIR}/leaf_ports_to_delete.unselected
988 src_with_initial_origins=${DBDIR}/leaf_ports.with_ini
989 reqptn_file=${DBDIR}/leaf_ports.requirements_of_unselected
990 cat "$src_unselected" 2> /dev/null | while read origin
992 cat "${DBDIR}/requires/$origin/requirements.all.full" "${DBDIR}/requires/$origin/ignored_requirements.all" || :
993 done 2> /dev/null | sort -u > $reqptn_file
994 database_query_add_initial_origins < $src > $src_with_initial_origins
997 program_exec_and_record_completion COLLECT_LEAF_PORTS_TO_DELETE
1001 # ============= Collection of obsolete ports to delete =============
1002 command_do_collection_of_obsolete_ports_to_delete ()
1004 local PROGRAM_DEPENDS
1005 PROGRAM_DEPENDS='SELECT_OBSOLETE_PORTS'
1006 _program_exec_and_record_completion__operation ()
1008 local src src_selected src_unselected dst_selected reqptn_file
1009 message_section_title "Collecting obsolete ports to delete"
1010 src=${DBDIR}/obsolete_ports.can_be_deleted
1011 src_selected=${DBDIR}/obsolete_ports_to_delete.selected
1012 src_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
1013 dst_selected=${DBDIR}/obsolete_ports_to_delete
1014 reqptn_file=${DBDIR}/obsolete_ports.requirements_of_unselected
1015 cat "$src_unselected" 2> /dev/null | while read origin
1017 cat "${DBDIR}/initial/$origin/requirements.run.full" || :
1018 cat "${DBDIR}/obsolete/$origin/requirements.run.full" || :
1019 done | sort -u > $reqptn_file
1020 grep -v -Fx -f "$reqptn_file" "$src_selected" > $dst_selected 2> /dev/null || :
1023 program_exec_and_record_completion COLLECT_OBSOLETE_PORTS_TO_DELETE
1026 # ============= Set up the list of ports to reinstall =============
1027 command_do_set_up_the_list_of_ports_to_reinstall ()
1029 local PROGRAM_DEPENDS
1030 PROGRAM_DEPENDS='ORDER_ALL_DEPENDENCIES'
1031 _program_exec_and_record_completion__operation ()
1033 message_section_title "Setting up the list of ports to reinstall"
1034 cp -p "${DBDIR}/reinst_order.list" "${DBDIR}/stage.loop_list/reinst_todo"
1037 program_exec_and_record_completion SETUP_REINST_TODO
1040 # ============= Composition of a list for deinstallation of obsolete and leaf packages =============
1041 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages ()
1043 local PROGRAM_DEPENDS
1044 PROGRAM_DEPENDS='COLLECT_LEAF_PORTS_TO_DELETE COLLECT_OBSOLETE_PORTS_TO_DELETE'
1045 _program_exec_and_record_completion__operation ()
1047 local reqptn_leaf reqptn_obs leaf_selected leaf_selected_src obs_selected obs_selected_src grepptn preserved
1048 message_section_title "Composing a list for deinstallation of obsolete and leaf packages"
1049 reqptn_leaf=${DBDIR}/leaf_ports.requirements_of_unselected
1050 reqptn_obs=${DBDIR}/obsolete_ports.requirements_of_unselected
1051 leaf_selected_src=${DBDIR}/leaf_ports_to_delete.selected
1052 leaf_selected=${DBDIR}/leaf_ports_to_delete
1053 obs_selected_src=${DBDIR}/obsolete_ports_to_delete.selected
1054 obs_selected=${DBDIR}/obsolete_ports_to_delete
1055 grepptn=${DBDIR}/ports_to_delete.grep_pattern
1056 grepptn_col1=${DBDIR}/ports_to_delete.grep_pattern_col1
1057 preserved=${TMPDIR}/LIST_DEINST_PKGS::preserved
1058 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
1060 cat "$reqptn_leaf" "$reqptn_obs" 2> /dev/null | sort -u > $grepptn
1061 grep -v -Fx -f "$grepptn" "$leaf_selected_src" 2> /dev/null \
1062 | database_query_add_initial_origins > $leaf_selected || :
1063 cat "$obs_selected" "$leaf_selected" 2> /dev/null || :
1065 rm -f "$leaf_selected"
1066 cat "$obs_selected" 2> /dev/null
1067 fi | sort -u > ${DBDIR}/stage.loop_list/ports_to_delete
1068 str_escape_regexp_filter < ${DBDIR}/stage.loop_list/ports_to_delete \
1069 | sed 's/^/^/;s/$/[[:space:]]/' > $grepptn_col1
1070 cat "${DBDIR}/leaf_ports.with_ini" "${DBDIR}/obsolete_ports" 2> /dev/null \
1071 | grep -Fx -v -f "${DBDIR}/stage.loop_list/ports_to_delete" > ${DBDIR}/stage.loop_list/ports_to_restore 2> /dev/null || :
1072 if [ $opt_batch_mode = no ]
1074 if [ ! -e "${DBDIR}/inspected_ports_only_partially" ] && \
1075 grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$leaf_selected_src" > $preserved 2> /dev/null
1077 message_echo "INFO: Following leaf ports are preserved because required by other preserved leaf/obsolete ports."
1078 message_echo "----------------"
1081 pkgtag=`cat "${DBDIR}/moved_from/$origin/pkgtag" 2> /dev/null` || :
1084 echo "$origin" "($pkgtag)"
1089 message_echo "----------------"
1091 if grep -v -Fx -f "${DBDIR}/stage.loop_list/ports_to_delete" "$obs_selected_src" > $preserved 2> /dev/null
1093 message_echo "INFO: Following obsolete ports are preserved because required by other obsolete ports."
1094 message_echo "----------------"
1097 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version" 2> /dev/null` || :
1100 echo "$origin" "($pkgtag)"
1105 message_echo "----------------"
1110 program_exec_and_record_completion LIST_DEINST_PKGS
1113 # ============= Collect entire distfiles list =============
1114 command_do_collect_entire_distfiles_list ()
1116 local PROGRAM_DEPENDS
1117 if [ $opt_inspect_entire_distinfo = yes ]
1120 _program_exec_and_record_completion__operation ()
1122 message_section_title "Collecting entire distfiles list"
1123 find "${PORTSDIR}" -depth 3 -name distinfo -exec cat {} \; \
1124 | grep '^SHA256 ' | sed -E 's/^SHA256 \(([^)]*)\).*/\1/' \
1125 | sort -u > ${DBDIR}/distfiles.entire.tmp
1126 mv "${DBDIR}/distfiles.entire.tmp" "${DBDIR}/distfiles.entire"
1129 program_exec_and_record_completion COLLECT_ALL_DISTFILES_LIST
1133 # ============= Inspection of all required distfiles =============
1134 command_do_inspection_of_all_required_distfiles ()
1136 local PROGRAM_DEPENDS
1137 PROGRAM_DEPENDS='INSPECT_ALL_DEPENDENCIES COLLECT_ALL_DISTFILES_LIST'
1138 _program_exec_and_record_completion__operation ()
1140 message_section_title "Summarizing distfiles list"
1142 cat "${DBDIR}/distfiles.entire" || :
1143 cat "${DBDIR}/distfiles.inspected" || :
1144 } 2> /dev/null | sort -u | str_escape_regexp_filter \
1145 | sed 's|^|^\\.\\/|; s|$|$|' > ${DBDIR}/distfiles.grep.pattern || :
1148 program_exec_and_record_completion DISTFILES_LIST
1151 # ============= Clean up of reinstallation status for preparation =============
1152 command_do_clean_up_of_reinstallation_status_for_preparation ()
1154 local PROGRAM_DEPENDS
1155 PROGRAM_DEPENDS='REDO_INIT INSPECT_ALL_DEPENDENCIES'
1156 _program_exec_and_record_completion__operation ()
1158 message_section_title "Cleaning up of reinstallation status for preparation"
1159 rm -rf "${DBDIR}/status.ports"
1162 program_exec_and_record_completion CLEANUP_REINST_STATUS
1165 # ============= Completion of building the temporary database =============
1166 command_do_completion_of_building_the_temporary_database ()
1168 local PROGRAM_DEPENDS
1169 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'
1170 _program_exec_and_record_completion__operation ()
1172 message_section_title "The temporary database is completely built up"
1175 program_exec_and_record_completion PREPARATION
1178 # ============= End of do/redo prepare =============
1179 command_do_end_at_prepare_complete ()
1182 tmp_msg=${TMPDIR}/command_do_end_at_prepare_complete:msg
1183 cat > "$tmp_msg" << eof
1184 Done (skipped reinstallation) at `message_timestamp`
1186 You can restart this process from the aborted/terminated point by executing without options or arguments as:
1189 message_cat "$tmp_msg"
1190 temp_terminate_process () { :; }
1193 # ============= Reinstallation of remained ports =============
1194 command_do_reinstallation_of_remained_ports ()
1196 local PROGRAM_DEPENDS
1197 PROGRAM_DEPENDS='PREPARATION'
1198 _program_exec_restartable_loop_operation__routine ()
1201 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1203 _program_exec_and_record_completion__operation ()
1205 local _MSG_CURRENT_STAGE_general
1206 _MSG_CURRENT_STAGE_general="reinstallation"
1207 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1208 message_section_title "Reinstallation"
1209 program_exec_restartable_loop_operation reinst_todo
1210 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1211 reinstall_restore_conflicts
1212 temp_set_msg_current_stage
1215 program_exec_and_record_completion REINSTALLATION
1218 # ============= Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again =============
1219 command_do_restore_needed_obsolete_and_leaf_packages ()
1221 local PROGRAM_DEPENDS
1222 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1223 _program_exec_restartable_loop_operation__routine ()
1225 deinstall_restore "$@"
1227 _program_exec_and_record_completion__operation ()
1229 local _MSG_CURRENT_STAGE_general
1230 _MSG_CURRENT_STAGE_general="restoration of unselected obsolete/leaf packages"
1231 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1232 message_section_title "Restoration of unselected obsolete/leaf packages"
1233 program_exec_restartable_loop_operation ports_to_restore
1234 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1235 temp_set_msg_current_stage
1238 program_exec_and_record_completion RESTORE_ONCE_DEINST_PKGS
1241 # ============= Deinstallation of unused obsolete and leaf packages =============
1242 command_do_deinstallation_of_unused_obsolete_and_leaf_packages ()
1244 local PROGRAM_DEPENDS
1245 PROGRAM_DEPENDS='REDO_INIT LIST_DEINST_PKGS'
1246 _program_exec_restartable_loop_operation__routine ()
1250 _program_exec_and_record_completion__operation ()
1252 local _MSG_CURRENT_STAGE_general
1253 _MSG_CURRENT_STAGE_general="deinstallation of obsolete/leaf packages"
1254 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
1255 message_section_title "Deinstallation of unused obsolete/leaf packages"
1256 program_exec_restartable_loop_operation ports_to_delete
1257 [ "x$PROGRAM_STEP_COUNTER_LAST_SKIPPED" = xyes ] && message_stage_title "$PROGRAM_STEP_COUNTER"
1258 temp_set_msg_current_stage
1261 program_exec_and_record_completion DEINST_UNUSED_PKGS
1264 # ============= Clean up obsolete or unused distfiles =============
1265 command_do_clean_up_obsolete_or_unused_distfiles ()
1267 local PROGRAM_DEPENDS
1268 if [ $opt_only_target_scope = no -a $opt_keep_distfiles = no ]
1270 PROGRAM_DEPENDS='REINSTALLATION DISTFILES_LIST'
1271 _program_exec_and_record_completion__operation ()
1273 local tmp_distfiles_exists
1274 message_section_title "Cleaning up obsolete or unused distfiles"
1275 tmp_distfiles_exists=${TMPDIR}/CLEANUP_OBSLETE_DISTFILES::distfiles_exists
1276 [ $opt_dry_run = yes ] && message_echo "INFO: The operations are not actually carried out."
1277 ( set -e; cd "${DISTDIR}" && find . -type f ) \
1278 | sed 's|^\./||' | sort -u > $tmp_distfiles_exists
1279 fileedit_manipulate_old_lines "$tmp_distfiles_exists" "${DBDIR}/distfiles.entire" \
1280 | while read distfile
1282 if [ $opt_batch_mode = no ]
1286 [ $opt_dry_run = yes ] && continue
1287 rm -f "${DISTDIR}/$distfile"
1291 program_exec_and_record_completion CLEANUP_OBSLETE_DISTFILES
1295 # ============= Rebuild of package database =============
1296 command_do_rebuild_of_package_database ()
1298 local PROGRAM_DEPENDS
1299 PROGRAM_DEPENDS='REINSTALLATION RESTORE_ONCE_DEINST_PKGS DEINST_UNUSED_PKGS'
1300 _program_exec_and_record_completion__operation ()
1302 which -s pkgdb || return 0
1303 message_section_title "Rebuilding package database for portupgrade"
1304 if grep -q @ "${DBDIR}/stage.loop_list/reinst_todo"
1306 message_echo "INFO: Skipped because of lacking flavor support."
1312 program_exec_and_record_completion REBUILD_PKGDB
1315 # =============Operation of redo command irrespective of option settings =============
1316 command_do_redo__command_all_exec_irrespective_of_saved_options ()
1318 [ $opt_reload_conf = yes ] || return 0
1319 program_deregister_stage_complete SAVE_PREV_CONF
1320 program_deregister_stage_complete ALL_COMPLETE
1321 rm -f "${DBDIR}"/complete
1324 # ============= Preparation of the temporary database =============
1325 command_do_prepare ()
1327 # Meta process for redo
1328 command_do_meta_process_for_redo
1330 # Determine specified targets
1331 command_do_determine_specified_targets
1333 # Show specified targets
1334 command_do_show_specified_targets
1336 # Determine all target ports
1337 command_do_determine_all_target_ports
1339 # Inspection of all initial dependencies
1340 command_do_inspection_of_all_initial_dependencies
1342 # Loop considering cases that port options are changed after inspection
1345 # Prepare for inspecting all dependencies
1346 command_do_prepare_for_inspect_all_dependencies
1348 # Inspection of all dependencies
1349 command_do_inspection_of_all_dependencies
1351 # Convert dependency-lists to actual ones
1352 command_do_convert_dependency_lists_to_actual_ones
1354 # Completion of recursive requirement lists
1355 command_do_completion_of_recursive_requirement_lists
1357 # Trim dependency lists by removing uninspected ports
1358 command_do_trim_dependency_lists_by_removing_uninspected_ports
1360 # Inspection of dependents
1361 command_do_inspection_of_dependents
1363 # End the loop when no change is made on port options after the inspection
1364 command_do_reset_changed_portdb && break
1367 # Restore escaped obsolete packages for inspection
1368 command_do_restore_escaped_obsoletes
1370 # Remove duplicated lines in dependents lists
1371 command_do_remove_duplicated_lines_in_dependents_lists
1373 # Remove duplicated lines in ignored dependents lists
1374 command_do_remove_duplicated_lines_in_ignored_dependents_lists
1376 # Preparation of target attribute information
1377 command_do_preparation_of_target_attribute_information
1379 # Post-process after the preparation of target attribute information
1380 command_do_post_process_after_the_preparation_of_target_attribute_information
1382 # Build of data on complement to new dependents for target attribute information
1383 command_do_build_of_data_on_complement_to_new_dependents_for_target_attribute_information
1385 # Parse target attribute information
1386 command_do_parse_target_attribute_information
1388 # Inspection of necessity
1389 command_do_inspection_of_necessity
1391 # Inspection of necessary upgrades
1392 command_do_inspection_of_necessary_upgrades
1394 # Completion of necessary upgrades for build
1395 command_do_complete_necessary_upgrades_for_build
1397 # Preparation for inspection of new leaf ports
1398 command_do_preparation_for_inspection_of_new_leaf_ports
1400 # Inspection of new primary leaf ports
1401 command_do_inspection_of_new_primary_leaf_ports
1403 # Inspection of requirements of new leaf ports
1404 command_do_inspection_of_requirements_of_new_leaf_ports
1406 # Order the ports considering dependencies
1407 command_do_order_the_ports_considering_dependencies
1409 # Selection of removing leaf ports
1410 command_do_selection_of_removing_leaf_ports
1412 # Selection of removing obsolete ports
1413 command_do_selection_of_removing_obsolete_ports
1415 # Collection of leaf ports to delete
1416 command_do_collection_of_leaf_ports_to_delete
1418 # Collection of obsolete ports to delete
1419 command_do_collection_of_obsolete_ports_to_delete
1421 # Set up the list of ports to reinstall
1422 command_do_set_up_the_list_of_ports_to_reinstall
1424 # Composition of a list for deinstallation of obsolete and leaf packages
1425 command_do_composition_of_a_list_for_deinstallation_of_obsolete_and_leaf_packages
1427 # Collect entire distfiles list
1428 command_do_collect_entire_distfiles_list
1430 # Inspection of all required distfiles
1431 command_do_inspection_of_all_required_distfiles
1433 # Clean up of reinstallation status for preparation
1434 command_do_clean_up_of_reinstallation_status_for_preparation
1436 # Completion of building the temporary database
1437 command_do_completion_of_building_the_temporary_database
1440 # ============= Reset the progress of reinstallation for retrial =============
1441 command_do_reset_for_reinst_retrial ()
1443 program_deregister_stage_complete REINSTALLATION
1444 program_deregister_stage_complete RESTORE_ONCE_DEINST_PKGS
1445 program_deregister_stage_complete DEINST_UNUSED_PKGS
1446 rm -rf "${DBDIR}/status.ports" "${DBDIR}/new_success_in_current_run"
1449 # ============= Main operation of do/redo =============
1453 # Reset termination messages
1454 temp_reset_termination_messages_common
1459 if [ $ntrial -gt 0 ]
1461 message_echo "########## RETRIAL ($ntrial) OF (RE)INSTALLATION ##########"
1465 if [ $opt_fetch_only = yes ]
1467 # Reinstallation of remained ports
1468 command_do_reinstallation_of_remained_ports
1470 message_echo "Completed the fetch only mode."
1472 elif [ $opt_delete_then_reinstall = no ]
1474 # Reinstallation of remained ports
1475 command_do_reinstallation_of_remained_ports
1477 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1478 command_do_restore_needed_obsolete_and_leaf_packages
1480 # Deinstallation of unused obsolete and leaf packages
1481 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1483 # Deinstallation of unused obsolete and leaf packages
1484 command_do_deinstallation_of_unused_obsolete_and_leaf_packages
1486 # Reinstallation of remained ports
1487 command_do_reinstallation_of_remained_ports
1488 # Restoration of obsolete and leaf packages which have been deinstalled but unselected from the deletion list again
1490 command_do_restore_needed_obsolete_and_leaf_packages
1493 # Clean up obsolete or unused distfiles
1494 command_do_clean_up_obsolete_or_unused_distfiles
1496 # Rebuild of package database
1497 command_do_rebuild_of_package_database
1499 # Retry if incomplete
1500 command_do_is_everything_resolved && break
1501 database_query_is_any_progress || break
1502 command_do_reset_for_reinst_retrial
1503 ntrial=$(($ntrial+1))
1508 # ============= Check whether everything is resolved =============
1509 command_do_is_everything_resolved ()
1512 for subject in failure redo conflict
1514 database_query_show_single_list_exec "$subject" \
1515 `options_get_dependency_type` `options_get_dependency_level` > /dev/null 2> /dev/null && return 1
1520 # ============= Notice of failures =============
1521 command_do_failure_notice ()
1523 local exists_unresolved_ports
1524 exists_unresolved_ports=
1525 message_summary_dependents_of_failed_reinstallation failure || exists_unresolved_ports=y
1526 message_summary_dependents_of_failed_reinstallation redo || exists_unresolved_ports=y
1527 message_summary_dependents_of_failed_reinstallation conflict || exists_unresolved_ports=y
1528 [ "x$exists_unresolved_ports" = xy ] || return 0
1529 message_summary_advice_on_manual_solution
1533 # ============= Ending process =============
1534 command_do_ending_process ()
1536 local PROGRAM_DEPENDS
1537 temp_terminate_process () { :; }
1538 if command_do_failure_notice
1540 if [ $opt_no_opening_message = yes ]
1542 message_echo "Done as ${APPNAME}"
1544 message_section_title "COMPLETELY DONE"
1546 if [ $opt_fetch_only = no -a $opt_dry_run = no ]
1548 PROGRAM_DEPENDS='REBUILD_PKGDB CLEANUP_OBSLETE_DISTFILES '
1549 _program_exec_and_record_completion__operation ()
1552 program_exec_and_record_completion ALL_COMPLETE
1553 [ $opt_no_opening_message = yes ] || message_echo "- E N D -"
1555 message_echo "INFO: Redo for the real (re)installation."
1558 message_warn_no_achieved_progress
1559 message_section_title "Done with some unresolved problems"
1560 message_echo "- To be continued -"