2 # ==============================================================================
3 # portsreinstall library script
4 # - Operations for queries to the temporary database -
5 # Copyright (C) 2013-2022 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
6 # This software is distributed under the 2-Clause BSD License.
7 # ==============================================================================
9 # ============= Show a list of failed ports with their reasons =============
10 database_query_show_list_failure ()
13 tmp_valid=${TMPDIR}/database_query_show_list_failure:valid
14 if [ `cat "${DBDIR}/failed.list" 2> /dev/null | wc -l` -eq 0 ]
16 message_echo "INFO: No item is registered in this list."
19 env LANG=C grep -v -E -f "${DBDIR}/ports_to_delete.grep_pattern" "${DBDIR}/failed.list" 2> /dev/null \
22 env LANG=C grep -q -Fx "$origin" "${DBDIR}/stage.loop_list/ports_to_delete" 2> /dev/null \
25 if [ `cat "$tmp_valid" 2> /dev/null | wc -l` -eq 0 ]
27 message_echo "INFO: No valid item is registered in this list."
32 note=`cat "${DBDIR}/notes/$origin/note_failtre" 2> /dev/null || :`
34 env LANG=C grep -q -Fx "$origin" "${DBDIR}/manually_done.list" 2> /dev/null && resolved=yes
35 pkgtag=`cat "${DBDIR}/moved_from/$origin/pkgtag" 2> /dev/null || :`
36 if [ $opt_batch_mode = no ]
40 yes ) resolved=', resolved';;
44 detail="while [$note]"
46 detail="by unrecorded reasons"
50 echo "$origin ($pkgtag) (error $detail$resolved)"
52 echo "$origin (error $detail$resolved)"
55 printf "%s\t%s\t%s\t%s\n" "$origin" "$pkgtag" "$note" "$resolved"
61 # ============= Get a list of failed restoration of required conflict =============
62 database_query_get_required_deleted_conflicts ()
65 tmp_filter=${TMPDIR}/database_query_get_required_deleted_conflicts:filter
66 str_escape_regexp_filter < ${DBDIR}/moved_ports | sed 's/^/^/;s/$/[[:space:]].*/' > $tmp_filter
67 env LANG=C grep -v -f "$tmp_filter" "${DBDIR}/deleted_conflicts" 2> /dev/null
70 # ============= Show a list of failed restoration of conflict =============
71 database_query_show_list_failed_conflicts_restoration ()
73 local tmp_deleted_conflicts
74 tmp_deleted_conflicts=${TMPDIR}/database_query_show_list_failed_conflicts_restoration:deleted_conflicts
76 if ! database_query_get_required_deleted_conflicts > $tmp_deleted_conflicts
78 message_echo "INFO: No item is registered in this list."
81 env LANG=C grep -v -E -f "${DBDIR}/ports_to_delete.grep_pattern_col1" "$tmp_deleted_conflicts" \
82 | while read origin pkg
84 pkg_regexp=`str_escape_regexp "$pkg"`
85 against=`env LANG=C grep -E "^$pkg_regexp:" "${DBDIR}/forbidden_conflicts" 2> /dev/null | cut -d : -f 2,3 | sort -u`
86 if [ $opt_batch_mode = no ]
90 echo -n "$origin ($pkg)"
97 against=`echo "$against" | sed 's/:/(/;s/$/)/' | tr '\n' ' '`
98 str_linearize_list_and "$against"
103 against=`echo "$against" | tr '\n' '|' | sed 's/,$//'`
104 printf '%s\t%s\t%s\n' "$origin" "$pkg" "$against"
110 # ============= Show installed ports which have been neither upgraded or reinstalled from the initial state =============
111 database_query_show_list_fossil ()
113 local srclist origin pkg
114 srclist=`ls "${DBDIR}"/fossil_pkgs/fossil_since_* | head -n 1`
115 [ -e "$srclist" ] || return 0
118 pkg=`pkgsys_get_init_pkg_from_orig "$origin"`
119 pkg_info_e "$pkg" || continue
120 printf '%s\t%s\n' "$origin" "$pkg"
124 # ============= Insert initial flavored origins to a list of flavored origins =============
125 database_query_add_initial_origins ()
131 [ -e "${DBDIR}/moved_from/$origin/initial_orig" ] || continue
132 cat "${DBDIR}/moved_from/$origin/initial_orig"
137 # ============= Get target attributes =============
138 database_query_get_target_attributes ()
140 local prefix origin _is_all _is_target _is_requires_requirements _is_initial_requirements _is_requires_dependents _is_initial_dependents _is_requires_requirements_complement _is_relevant infofile tag level
145 _is_requires_requirements=
146 _is_initial_requirements=
147 _is_requires_dependents=
148 _is_initial_dependents=
149 _is_requires_requirements_complement=
151 if [ ! -e "${DBDIR}/target_all" -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
154 tag=`options_get_dependency_type`
156 [ $opt_only_target_scope = yes ] && level=direct
157 infofile=${DBDIR}/targets/$origin/attrs.${tag}.${level}
158 if [ -e "$infofile" ]
165 eval ${prefix}_is_all=\$\{_is_all\}
166 eval ${prefix}_is_target=\$\{_is_target\}
167 eval ${prefix}_is_requires_requirements=\$\{_is_requires_requirements\}
168 eval ${prefix}_is_initial_requirements=\$\{_is_initial_requirements\}
169 eval ${prefix}_is_requires_dependents=\$\{_is_requires_dependents\}
170 eval ${prefix}_is_initial_dependents=\$\{_is_initial_dependents\}
171 eval ${prefix}_is_requires_requirements_complement=\$\{_is_requires_requirements_complement\}
172 eval ${prefix}_is_relevant=\$\{_is_relevant\}
175 # ============= Check whether (re/de)installation of a port is suppressed =============
176 database_query_is_a_port_suppressed ()
178 local origin flags flag
181 [ $opt_suppress_self_upadte = yes ] && flags=SUPPRESSED_SELF
182 [ $opt_suppress_pkgtools_upadte = yes ] && flags="$flags SUPPRESSED_PKGNG"
185 for db in initial moved_from
187 [ -e "${DBDIR}/$db/$origin/$flag" ] && return
193 # ============= Check whether a port needs to be updated or upgraded =============
194 database_query_does_a_port_need_update ()
196 local origin dbpath frompath new_version current_version
198 dbpath=${DBDIR}/requires/$origin
199 frompath=${DBDIR}/moved_from/$origin
200 [ -e "$dbpath/conf_updated" ] && return
201 [ -e "$dbpath/new_version" ] || return
202 new_version=`cat "$dbpath/new_version"`
203 current_version=`cat "$frompath/current_version"`
204 [ "x$current_version" != "x$new_version" ]
207 # ============= Check before operations of a command which need the temporary database completely prepared =============
208 database_query_chk_preparation_completion ()
210 program_chk_stage_complete PREPARATION && return
211 message_echo "ERROR: Database has to be built completely before executing this command." >&2
215 # ============= Get a make variable value of a port =============
216 database_query_get_makevar_val ()
218 local origin variable dbdir cache value
221 dbdir=${DBDIR}/requires/$origin
222 cache=$dbdir/makevar/$variable
227 value=`database_build_make "$origin" -V "$variable"`
228 if [ -d "$dbdir" ] && misc_is_superuser_privilege
230 [ -d "$dbdir/makevar" ] || mkdir "$dbdir/makevar"
231 echo "$value" > $cache.tmp
232 mv "$cache.tmp" "$cache"
238 # ============= Get a configured value of a port =============
239 database_query_get_config_val ()
241 local origin variable dbdir cache value
244 dbfile=${DBDIR}/conf/each_port/$origin/$variable.conf
245 cat "$dbfile" 2> /dev/null || :
248 # ============= Check whether configurations for a port is default =============
249 database_query_is_default_conf ()
251 local origin mode dbpath tmp_msg is_customized is_requiremnt_replaced files tmp_old tmp_new origin_requirement tmp_msg_customized
254 dbpath=${DBDIR}/requires/$origin
255 if [ ! -e "$dbpath/is_customized" ]
257 tmp_msg=${TMPDIR}/database_query_is_default_conf:msg
258 cp /dev/null "$tmp_msg"
260 if [ `ls "${DBDIR}/conf/each_port/$origin" 2> /dev/null | wc -l` -gt 0 ]
262 files=`ls "${DBDIR}/conf/each_port/$origin" | sed -E 's/^([^.]+).*/\1/' | str_concat_items_for_sentence`
263 echo "Knobs and miscellaneous customization by $files," >> $tmp_msg
266 if ! diff -q "$dbpath/ports_options.default" "$dbpath/ports_options.current" > /dev/null 2>&1
268 echo "Non-default port options," >> $tmp_msg
271 if env LANG=C grep -q -Fx "$origin" "${DBDIR}/conf/NOPKG:PORTS.parsed" 2> /dev/null
273 echo "Explicit specification as non-default in ${APPNAME}.conf," >> $tmp_msg
276 tmp_old=${TMPDIR}/database_query_is_default_conf:old
277 tmp_new=${TMPDIR}/database_query_is_default_conf:new
278 is_requiremnt_replaced=no
279 if fileedit_manipulate_old_new_lines "$dbpath/requirements.all.direct.orig" "$dbpath/requirements.all.direct" \
280 "$tmp_old" "$tmp_new"
282 echo "Replacement in requirements:" >> $tmp_msg
283 echo "-------- FROM --------" >> $tmp_msg
284 sed 's/^/ /' "$tmp_old" >> $tmp_msg
285 echo "-------- TO --------" >> $tmp_msg
286 sed 's/^/ /' "$tmp_new" >> $tmp_msg
287 echo "----------------------" >> $tmp_msg
290 for origin_requirement in `cat "$dbpath/requirements.all.direct" 2> /dev/null`
292 database_query_is_default_conf "$origin_requirement" quiet && continue
293 echo "Non-default requirement $origin_requirement," >> $tmp_msg
296 { [ $is_customized = yes ] && cat "$tmp_msg"; } > $dbpath/is_customized.tmp
297 mv "$dbpath/is_customized.tmp" "$dbpath/is_customized"
299 [ `wc -c < $dbpath/is_customized` -eq 0 ] && return
300 if [ "x$mode" != xquiet ]
302 tmp_msg_customized=${TMPDIR}/database_query_is_default_conf:msg_customized
303 message_echo "INFO: This port is configured to be non-default because of"
304 sed 's/^/ /' "$dbpath/is_customized" > $tmp_msg_customized
305 message_cat "$tmp_msg_customized"
306 message_echo " so the prebuilt package is not used."
311 # ============= Output of lists in which each matching port is registered =============
312 database_query_show_list_inclusion_of_matching_port ()
314 local grandtitle lists pkgnamedb deptag level isfirst origin_target pkg_target table_target
321 message_echo "[$grandtitle]"
322 message_dependency_scope "$deptag" "$level"
325 for origin_target in `pkgsys_eval_ports_glob "$@"`
328 for table_target in $pkgnamedb
330 pkg_target=`cat "${DBDIR}/$table_target/$origin_target/pkgtag" 2> /dev/null` || :
331 [ -n "$pkg_target" ] && break
333 [ -n "$pkg_target" ] || continue
336 for subject in `echo "$lists" | tr \| ' '`
338 database_query_exists_in_list "$origin_target" "$subject" "$deptag" "$level" \
339 && match="$match $subject"
341 if [ $opt_batch_mode = no ]
343 echo -n "$origin_target ($pkg_target): "
344 echo "$match" | sed 's/^ *//;s/ /, /g'
346 printf '%s\t%s\t' "$origin_target" "$pkg_target"
347 echo "$match" | sed 's/^ *//;s/ /,/g'
350 if [ "$isfirst" = y ]
352 message_echo "ERROR: No inspected port matches the glob(s)." >&2
358 # ============= Output of "show" command for port lists =============
359 database_query_show_port_lists ()
361 local grandtitle title list listdb pkgnamedb deptag level isfirst origin_target pkg_target table_target list_target
370 message_echo "[$grandtitle]"
371 message_dependency_scope "$deptag" "$level"
374 for origin_target in `pkgsys_eval_ports_glob "$@"`
377 for table_target in $pkgnamedb
379 pkg_target=`cat "${DBDIR}/$table_target/$origin_target/pkgtag" 2> /dev/null` || :
380 [ -n "$pkg_target" ] && break
382 [ -n "$pkg_target" ] || continue
383 [ "$isfirst" = y ] || message_echo
385 [ $opt_batch_mode = no ] && printf "$title\n" "$origin_target ($pkg_target)"
387 for table_target in $listdb
389 list_target=${DBDIR}/$table_target/$origin_target/$list
390 [ -e "$list_target" ] && break
392 [ -e "$list_target" ] || continue
393 if [ $opt_batch_mode = no ]
398 for table in $pkgnamedb
400 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
401 [ -n "$pkg" ] && break
403 [ -n "$pkg" ] || continue
404 echo "$origin ($pkg)"
410 for table in $pkgnamedb
412 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
413 [ -n "$pkg" ] && break
415 [ -n "$pkg" ] || continue
416 printf '%s\t%s\t%s\t%s\n' "$origin_target" "$pkg_target" "$origin" "$pkg"
420 if [ "$isfirst" = y ]
422 message_echo "ERROR: No inspected port matches the glob(s)." >&2
428 # ============= Output of "show" command for log files =============
429 database_query_show_log ()
431 local grandtitle title list listdb pkgnamedb isfirst origin_target pkg_target table_target list_target
438 message_echo "[$grandtitle]"
441 for origin_target in `pkgsys_eval_ports_glob "$@"`
444 for table_target in $pkgnamedb
446 pkg_target=`cat "${DBDIR}/$table_target/$origin_target/pkgtag" 2> /dev/null` || :
447 [ -n "$pkg_target" ] && break
449 [ -n "$pkg_target" ] || continue
450 [ "$isfirst" = y ] || message_echo
452 [ $opt_batch_mode = no ] && printf "$title\n" "$origin_target ($pkg_target)"
454 for table_target in $listdb
456 list_target=${DBDIR}/$table_target/$origin_target/$list
457 [ -e "$list_target" ] && break
459 [ -e "$list_target" ] || continue
463 if [ "$isfirst" = y ]
465 message_echo "ERROR: No inspected port matches the glob(s)." >&2
471 # ============= Output of "show" command for two column lists =============
472 database_query_show_two_column_lists ()
474 local grandtitle title list listdb pkgnamedb isfirst origin_target pkg_target table_target list_target
481 message_echo "[$grandtitle]"
484 for origin_target in `pkgsys_eval_ports_glob "$@"`
487 for table_target in $pkgnamedb
489 pkg_target=`cat "${DBDIR}/$table_target/$origin_target/pkgtag" 2> /dev/null` || :
490 [ -n "$pkg_target" ] && break
492 [ -n "$pkg_target" ] || continue
493 [ "$isfirst" = y ] || message_echo
495 [ $opt_batch_mode = no ] && printf "$title\n" "$origin_target ($pkg_target)"
497 for table_target in $listdb
499 list_target=${DBDIR}/$table_target/$origin_target/$list
500 [ -e "$list_target" ] && break
502 [ -e "$list_target" ] || continue
503 if [ $opt_batch_mode = no ]
505 sed 's/[[:space:]]/: /' < $list_target
510 if [ "$isfirst" = y ]
512 message_echo "ERROR: No inspected port matches the glob(s)." >&2
518 # ============= Output of "show" command for a single list =============
519 database_query_show_single_list ()
521 local list pkgnamedb flag_filter_skip_unchanged flag_filter_only_target flag_negative_listdb tmpflag_exists put_blankline origin matches_negative matches_positive flag pkg table
522 local currentorigin_is_alll currentorigin_is_target currentorigin_is_requires_requirements
523 local currentorigin_is_initial_requirements currentorigin_is_requires_dependents
524 local currentorigin_is_initial_dependents currentorigin_is_requires_requirements_complement currentorigin_is_relevant
527 flag_filter_skip_unchanged=$3
528 flag_filter_only_target=$4
529 flag_negative_listdb=$5
530 tmpflag_exists=${TMPDIR}/database_query_show_single_list::exists_item
531 if [ `cat "${DBDIR}/$list" 2> /dev/null | wc -l` -eq 0 ]
533 message_echo "INFO: No item is registered in this list."
536 if ! program_chk_stage_complete PREPARATION
538 message_echo "WARNING: The temporary database is incomplete. The raw list is shown." >&2
542 rm -f "$tmpflag_exists"
544 if [ -n "$flag_filter_only_target" \
545 -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
547 message_echo "WARNING: Ports outside of the target scope are excluded." >&2
550 if [ -n "$flag_filter_skip_unchanged" -a $opt_skip_unchanged = yes ]
552 message_echo "WARNING: Ports which have been the newest with their all requirements from the first are excluded." >&2
555 [ -n "$put_blankline" ] && message_echo
559 for negative_listdb in $flag_negative_listdb
561 if env LANG=C grep -qFx "$origin" "${DBDIR}/$negative_listdb" 2> /dev/null
567 [ $matches_negative = yes ] && continue
568 if [ -n "$flag_filter_skip_unchanged" -a $opt_skip_unchanged = yes ]
571 for flag in $flag_filter_skip_unchanged
573 if [ -e "${DBDIR}/requires/$origin/$flag" ]
579 [ $matches_positive = no ] && continue
581 if [ -n "$flag_filter_only_target" ]
583 database_query_get_target_attributes currentorigin "$origin"
584 [ -n "${currentorigin_is_relevant}" ] || continue
585 database_query_is_a_port_suppressed "$origin" && continue
588 for table in $pkgnamedb
590 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
591 [ -n "$pkg" ] && break
593 [ -n "$pkg" ] || continue
594 touch "$tmpflag_exists"
595 if [ $opt_batch_mode = no ]
597 echo "$origin ($pkg)"
599 printf '%s\t%s\n' "$origin" "$pkg"
601 done < ${DBDIR}/$list
602 [ -e "$tmpflag_exists" ] && return
603 message_echo "INFO: No item is registered in this list."
607 # ============= Check whether the upgrade is necessary for a port =============
608 database_query_is_necessary_upgrade ()
610 local origin nodedir dbsuffix tmpfile_new tmpfile_old tmpfile_diff
612 nodedir=${DBDIR}/requires/$origin
613 [ -e "$nodedir/installed_by_pkg" ] && return 1
614 dbsuffix=`options_get_dependency_type`.`options_get_dependency_level`
615 tmpfile_new=${TMPDIR}/database_query_is_necessary_upgrade:failed_requirements.new
616 tmpfile_old=${TMPDIR}/database_query_is_necessary_upgrade:failed_requirements.old
617 tmpfile_diff=${TMPDIR}/database_query_is_necessary_upgrade:failed_requirements.diff
618 [ -e "$nodedir/failed_requirements.${dbsuffix}.previous" ] || return
619 sort -u "$nodedir/failed_requirements.${dbsuffix}" > $tmpfile_new 2> /dev/null || :
620 sort -u "$nodedir/failed_requirements.${dbsuffix}.previous" > $tmpfile_old 2> /dev/null || :
621 fileedit_exists_old_lines "$tmpfile_old" "$tmpfile_new"
624 # ============= Show moved or replaced ports to alternatives =============
625 database_query_show_list_moved ()
627 cat "${DBDIR}/moved_ports" 2> /dev/null | while read origin
630 while [ -n "$lastorigin" -a -e "${DBDIR}/replace/$lastorigin/origin" ]
632 lastorigin=`cat "${DBDIR}/replace/$lastorigin/origin"`
634 [ -n "$lastorigin" ] || continue
636 for table in $pkgnamedb
638 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
639 [ -n "$pkg" ] && break
641 [ -n "$pkg" ] || pkg='not installed'
643 for table in moved_from obsolete initial
645 lastpkg=`cat "${DBDIR}/$table/$lastorigin/pkgtag" 2> /dev/null` || :
646 [ -n "$lastpkg" ] && break
648 [ -n "$lastpkg" ] || lastpkg='not installed'
649 if [ $opt_batch_mode = no ]
651 echo "$origin ($pkg) => $lastorigin ($lastpkg)"
653 printf '%s\t%s\t%s\t%s\n' "$origin" "$pkg" "$lastorigin" "$lastpkg"
658 # ============= Actual operations of "show" command for a single list =============
659 database_query_show_single_list_exec ()
661 local subject deptag level dbsuffix flag_filter_skip_unchanged flag_filter_only_target flag_negative_listdb pkgnamedb
665 dbsuffix=$deptag.$level
666 flag_filter_skip_unchanged=
667 flag_filter_only_target=
668 flag_negative_listdb=
669 pkgnamedb='moved_from obsolete initial'
672 message_echo "The following ports remain in the (re)installation queue for the current do/redo process:"
673 message_echo "It is noted that ports to be skipped can be included here."
674 message_dependency_scope "$deptag" "$level"
676 list=stage.loop_list/reinst_todo.remain
677 [ ${DBDIR}/reinst_order.list -nt ${DBDIR}/$list ] && list=reinst_order.list
678 flag_filter_skip_unchanged=necessary_upgrade.$dbsuffix
679 flag_filter_only_target=y
682 message_echo "The following ports have been successfully (re)installed or newly installed:"
683 message_dependency_scope "$deptag" "$level"
685 list=success.$dbsuffix.list
686 flag_filter_skip_unchanged=necessary_upgrade_completed.$dbsuffix
687 flag_filter_only_target=y
690 message_echo "The following ports need (re)installation after success of the all requirements:"
691 message_dependency_scope "$deptag" "$level"
693 list=todo_after_requirements_succeed.$dbsuffix.list
694 flag_filter_skip_unchanged="necessary_upgrade.$dbsuffix necessary_upgrade_completed.$dbsuffix"
695 flag_filter_only_target=y
696 flag_negative_listdb=leaf_ports_to_delete.selected
699 message_echo "The following ports had problems which have been manually resolved:"
701 list=manually_done.list
704 message_echo "The following ports are configured default and installed by prebuilt packages"
706 list=installation_complete_by_pkg.list
709 message_echo "The following ports are configured default and installed by ports"
711 list=inst_by_port_with_default_conf.list
714 message_echo "The following ports are configured non-default and installed by ports"
716 list=inst_by_port_with_custom_conf.list
719 message_echo "The following ports experienced failures and kept to be old or uninstalled:"
721 database_query_show_list_failure
725 message_echo "The following ports are neither upgraded or reinstalled from the initial state:"
727 database_query_show_list_fossil
731 message_echo "The following ports are temporarily deleted due to conflict:"
733 database_query_show_list_failed_conflicts_restoration
737 message_echo "The following ports are moved/replaced to new alternatives:"
739 database_query_show_list_moved
743 message_echo "The following ports are registered as taboo:"
748 message_echo "The following ports are registered to freeze:"
753 message_echo "The following ports are registered as necessary:"
758 message_echo "The following ports are registered as unnecessary:"
763 message_echo "The following leaf, obsolete or unneeded ports had been once deleted but are to be or have been restored:"
765 list=stage.loop_list/ports_to_restore
766 pkgnamedb='moved_from obsolete initial'
767 flag_filter_only_target=y
770 message_echo "The following leaf, obsolete or unneeded ports are to be or have been deleted:"
772 list=stage.loop_list/ports_to_delete
773 pkgnamedb='moved_from obsolete initial'
774 flag_filter_only_target=y
779 message_echo "The following ports are all detected leaf ports:"
782 message_echo "The following ports are all $deptag leaf ports:"
783 list=leaf_ports_to_delete.$deptag
786 pkgnamedb='moved_from obsolete initial'
787 flag_filter_only_target=y
792 message_echo "The following ports are all detected obsolete ports:"
793 list=obsolete_ports.can_be_deleted
795 message_echo "The following ports are all $deptag obsolete ports:"
796 list=obsolete_ports_to_delete.$deptag
799 pkgnamedb='moved_from obsolete initial'
800 flag_filter_only_target=y
803 database_query_show_single_list "$list" "$pkgnamedb" \
804 "$flag_filter_skip_unchanged" "$flag_filter_only_target" "$flag_negative_listdb"
807 # ============= Check whether a port is registered in a list =============
808 database_query_exists_in_list ()
810 local origin subject deptag level tmp_list dbsuffix origin_esc
815 tmp_list=${TMPDIR}/database_query_exists_in_list:list
816 dbsuffix=$deptag.$level
817 origin_esc=`str_escape_regexp "$origin"`
820 list=stage.loop_list/reinst_todo.remain
821 [ ${DBDIR}/reinst_order.list -nt ${DBDIR}/$list ] && list=reinst_order.list
824 list=success.$dbsuffix.list
827 list=todo_after_requirements_succeed.$dbsuffix.list
830 list=manually_done.list
833 list=installation_complete_by_pkg.list
836 list=inst_by_port_with_default_conf.list
839 list=inst_by_port_with_custom_conf.list
845 list=`ls "${DBDIR}"/fossil_pkgs/fossil_since_* | head -n 1`
848 database_query_get_required_deleted_conflicts | env LANG=C grep -v -E -f "${DBDIR}/ports_to_delete.grep_pattern_col1" 2> /dev/null \
849 | env LANG=C grep -q -E "^${origin_esc}[[:space:]]" || :
865 list=stage.loop_list/ports_to_restore
868 list=stage.loop_list/ports_to_delete
871 env LANG=C grep -q -Fx "$origin" "${DBDIR}/$list" 2> /dev/null
874 # ============= Check whether the requirements of installed packages match the port configuration =============
875 database_query_dependency_matching ()
877 local origin pkg tmp_inst tmp_db
879 [ -d "${DBDIR}/requires/$origin" ] || return
880 tmp_inst=${TMPDIR}/database_query_dependency_matching.installed
881 tmp_db=${TMPDIR}/database_query_dependency_matching.configured
882 pkg=`database_build_get_new_pkgname "$origin"`
883 [ -n "$pkg" ] || return
884 pkg_info_e "$pkg" || return
885 pkg_info_qr "$pkg" | env LANG=C grep -v '^[[:space:]]*$' | sort -u > $tmp_inst
886 database_build_get_full_run_requirement_pkgs "$origin" > $tmp_db
887 diff "$tmp_inst" "$tmp_db" > /dev/null 2>/dev/null
890 # ============= Check whether any of the requirements are locked because being missing ports to freeze =============
891 database_query_are_requirements_not_locked ()
895 cat "${DBDIR}/requires/$origin/requirements.all.direct" 2> /dev/null | while read origin_requirement
897 pkg_requirement=`pkgsys_get_installed_pkg_from_origin "$origin_requirement"` || :
898 if env LANG=C grep -q -Fx "$origin_requirement" "${DBDIR}/freeze.all.list" 2> /dev/null
900 [ -n "$pkg_requirement" ] || return
901 elif [ -z "$pkg_requirement" ]
903 database_query_are_requirements_not_locked "$origin_requirement" || return
909 # ============= Check whether any of progress is made in the current run =============
910 database_query_is_any_progress ()
912 [ `cat "${DBDIR}/new_success_in_current_run" 2> /dev/null | wc -l` -gt 0 ]
915 # ============= Get the all initial origins, separated by line feed =============
916 database_query_initial_orgins ()
918 local origin origin_init
920 if [ -e "${DBDIR}/moved_from/$origin/old_origs" ]
922 for origin_init in `cat "${DBDIR}/moved_from/$origin/old_origs"`
924 [ -e "${DBDIR}/initial/$origin_init/installed_version" ] && echo "$origin_init"
927 [ -e "${DBDIR}/initial/$origin/installed_version" ] && echo "$origin"
932 # ============= Get an unflavored or flavored equivalence of an origin with the same package name, which is deemed the same version =============
933 # If the input is unflavored and a flavored equivalence is inspected as a required port, the flavored origin is returned.
934 # If the input is flavored and an unflavored equivalence is inspected as a required port, the unflavored origin is returned.
935 # Otherwise, a blank value is returned.
936 database_query_get_equivalent_orgin ()
938 local origin origin_esc pkg_origin pkg_origin_esc flavor origin_unflavored_esc origin_search
940 origin_esc=`str_escape_regexp "$origin"`
941 pkg_origin=`env LANG=C grep -E "[[:space:]]$origin_esc$" "${DBDIR}/installed_ports:pkg_vs_origin.tbl" | cut -f 2 || :`
942 [ -n "$pkg_origin" ] || return 0
943 pkg_origin_esc=`str_escape_regexp "$pkg_origin"`
944 flavor=`pkgsys_get_flavor_from_origin "$origin"`
945 origin_search=$origin_unflavored_esc$
946 [ -n "$flavor" ] || origin_search=$origin_esc@
947 env LANG=C grep -E "^$pkg_origin_esc[[:space:]]$origin_search" "${DBDIR}/installed_ports:pkg_vs_origin.tbl" | cut -f 2 | head -n 1 || :