2 # ==============================================================================
3 # portsreinstall library script
4 # - Operations for queries to the temporary database -
5 # Copyright (C) 2013 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 ()
12 if [ `cat "${DBDIR}/failed.list" 2> /dev/null | wc -l` -eq 0 ]
14 message_echo "INFO: No item is registered in this list."
17 grep -v -E -f "${DBDIR}/ports_to_delete.grep_pattern" "${DBDIR}/failed.list" \
20 origin_regexp=`str_escape_regexp "$origin"`
21 grep -m 1 -E "^$origin_regexp$" "${DBDIR}/stage.loop_list/ports_to_delete" \
22 2> /dev/null && continue
23 note=`cat "${DBDIR}/requires/$origin/note_failtre"`
25 grep -m 1 -E "^`str_escape_regexp \"$origin\"`$" \
26 "${DBDIR}/manually_done.list" > /dev/null 2>&1 \
28 pkgtag=`cat "${DBDIR}/requires/$origin/pkgtag" 2> /dev/null` || :
29 if [ $opt_batch_mode = no ]
33 yes) resolved=', resolved';;
37 echo "$origin ($pkgtag) (error while [$note]$resolved)"
39 echo "$origin (error while [$note]$resolved)"
42 printf "%s\t%s\t%s\t%s\n" "$origin" "$pkgtag" "$note" "$resolved"
48 # ============= Show a list of failed restoration of conflicts =============
49 database_query_show_list_failed_conflicts_restoration ()
51 if [ `cat "${DBDIR}/deleted_conflicts" 2> /dev/null | wc -l` -eq 0 ]
53 message_echo "INFO: No item is registered in this list."
56 grep -v -E -f "${DBDIR}/ports_to_delete.grep_pattern_col1" "${DBDIR}/deleted_conflicts" \
57 | if [ $opt_batch_mode = no ]
74 # ============= Insert initial origins to a list of origins =============
75 database_query_add_initial_origins ()
81 [ -e "${DBDIR}/requires/$origin/initial_orig" ] || continue
82 cat "${DBDIR}/requires/$origin/initial_orig"
87 # ============= Get target attributes =============
88 database_query_get_target_attributes ()
90 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
95 _is_requires_requirements=
96 _is_initial_requirements=
97 _is_requires_dependents=
98 _is_initial_dependents=
99 _is_requires_requirements_complement=
101 if [ ! -e "${DBDIR}/target_all" -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
104 tag=`options_get_dependency_type`
106 [ $opt_only_target_scope = yes ] && level=direct
107 infofile=${DBDIR}/targets/$origin/attrs.${tag}.${level}
108 if [ -e "$infofile" ]
115 eval ${prefix}_is_all=\$\{_is_all\}
116 eval ${prefix}_is_target=\$\{_is_target\}
117 eval ${prefix}_is_requires_requirements=\$\{_is_requires_requirements\}
118 eval ${prefix}_is_initial_requirements=\$\{_is_initial_requirements\}
119 eval ${prefix}_is_requires_dependents=\$\{_is_requires_dependents\}
120 eval ${prefix}_is_initial_dependents=\$\{_is_initial_dependents\}
121 eval ${prefix}_is_requires_requirements_complement=\$\{_is_requires_requirements_complement\}
122 eval ${prefix}_is_relevant=\$\{_is_relevant\}
125 # ============= Check whether (re/de)installation of a port is suppressed =============
126 database_query_is_a_port_suppressed ()
130 if [ $opt_suppress_self_upadte = yes ]
133 elif [ $opt_suppress_pkgtools_upadte = yes ]
135 flag=SUPPRESSED_PKGNG
139 for db in initial requires
141 [ -e "${DBDIR}/$db/$origin/$flag" ] && return
146 # ============= Check whether a port needs to be updated or upgraded =============
147 database_query_does_a_port_need_update ()
151 dbpath=${DBDIR}/requires/$origin
152 [ -e "$dbpath/conf_updated" ] && return
153 [ -e "$dbpath/new_version" ] || return
154 ! diff "$dbpath/new_version" "$dbpath/current_version" > /dev/null 2>&1
157 # ============= Check before operations of a command which need the temporary database completely prepared =============
158 database_query_chk_preparation_completion ()
160 program_chk_stage_complete PREPARATION && return
161 message_echo "ERROR: Database has to be built completely before executing this command." >&2
165 # ============= Get a make variable value of a port =============
166 database_query_get_makevar_val ()
168 local origin variable dbdir cache value
171 dbdir=${DBDIR}/requires/$origin
172 cache=$dbdir/makevar/$variable
177 value=`make -C "${PORTSDIR}/$origin" -V "$variable"`
178 if [ -d "$dbdir" ] && misc_is_superuser_privilege
180 [ -d "$dbdir/makevar" ] || mkdir "$dbdir/makevar"
181 echo "$value" > $cache.tmp
182 mv "$cache.tmp" "$cache"
188 # ============= Check whether configurations for a port is default =============
189 database_query_is_default_conf ()
191 local origin mode dbpath tmp_msg is_customized is_requiremnt_replaced files origin_regexp tmp_old tmp_new origin_requirement
194 dbpath=${DBDIR}/requires/$origin
195 if [ ! -e "$dbpath/is_customized" ]
197 tmp_msg=${TMPDIR}/database_query_is_default_conf:msg
198 cp /dev/null "$tmp_msg"
200 if [ `ls "${DBDIR}/conf/each_port/$origin" 2> /dev/null | wc -l` -gt 0 ]
202 files=`ls "${DBDIR}/conf/each_port/$origin" | str_cancat_items_for_sentence`
203 echo "Knobs and miscellaneous customization by $files," >> $tmp_msg
206 if ! diff "$dbpath/ports_options.default" "$dbpath/ports_options.current" > /dev/null 2>&1
208 echo "Non-default port options," >> $tmp_msg
211 origin_regexp=`str_escape_regexp "$origin"`
212 if grep -m 1 -E "^$origin_regexp$" "${DBDIR}/conf/NOPKG:PORTS.parsed" > /dev/null 2>&1
214 echo "Explicit specification as non-default in ${APPNAME}.conf," >> $tmp_msg
217 tmp_old=${TMPDIR}/database_query_is_default_conf:old
218 tmp_new=${TMPDIR}/database_query_is_default_conf:new
219 is_requiremnt_replaced=no
220 if fileedit_manipulate_old_new_lines "$dbpath/requirements.all.direct.orig" "$dbpath/requirements.all.direct" \
221 "$tmp_old" "$tmp_new"
223 echo "Replacement in requirements:" >> $tmp_msg
224 echo "-------- FROM --------" >> $tmp_msg
225 sed 's/^/ /' "$tmp_old" >> $tmp_msg
226 echo "-------- TO --------" >> $tmp_msg
227 sed 's/^/ /' "$tmp_new" >> $tmp_msg
228 echo "----------------------" >> $tmp_msg
231 # for tag in run build
233 # cat "$dbpath/requirements.${tag}.direct.orig" 2> /dev/null \
234 # | grep -v '^$' | sort -u > $tmp_orig
235 # cat "$dbpath/requirements.${tag}.direct" 2> /dev/null > $tmp_act || :
236 # diff "$tmp_orig" "$tmp_act" > /dev/null 2>&1 || { is_requiremnt_replaced=yes; break; }
238 # if [ $is_requiremnt_replaced = yes ]
240 # echo " Replacement in requirements," >> $tmp_msg
243 for origin_requirement in `cat "$dbpath/requirements.all.direct" 2> /dev/null`
245 database_query_is_default_conf "$origin_requirement" quiet && continue
246 echo "Non-default requirement $origin_requirement," >> $tmp_msg
249 { [ $is_customized = yes ] && cat "$tmp_msg"; } > $dbpath/is_customized.tmp
250 mv "$dbpath/is_customized.tmp" "$dbpath/is_customized"
252 [ `wc -c < $dbpath/is_customized` -eq 0 ] && return
253 if [ "x$mode" != xquiet ]
255 message_echo "INFO: This port is configured to be non-default because of"
257 `sed 's/^/ /' "$dbpath/is_customized"`
259 message_echo " so the prebuilt package is not used."
264 # ============= Output of "show" command for each matching port =============
265 database_query_for_each_matching_port ()
267 local grandtitle title list isfirst origin_target pkg_target table_target
275 message_echo "[$grandtitle]"
276 message_dependency_scope
279 for origin_target in `pkgsys_eval_ports_glob "$@"`
282 for table_target in $pkgnamedb
284 pkg_target=`cat "${DBDIR}/$table_target/$origin_target/pkgtag" 2> /dev/null` || :
285 [ -n "$pkg_target" ] && break
287 [ -n "$pkg_target" ] || continue
288 [ "$isfirst" = y ] || message_echo
290 [ $opt_batch_mode = no ] && printf "$title\n" "$origin_target ($pkg_target)"
292 for table_target in $pkgnamedb
294 list_target=${DBDIR}/$table_target/$origin_target/$list
295 [ -e "$list_target" ] && break
297 [ -e "$list_target" ] || continue
298 if [ $opt_batch_mode = no ]
303 for table in $pkgnamedb
305 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
306 [ -n "$pkg" ] && break
308 [ -n "$pkg" ] || continue
309 echo "$origin ($pkg)"
315 for table in $pkgnamedb
317 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
318 [ -n "$pkg" ] && break
320 [ -n "$pkg" ] || continue
321 printf '%s\t%s\t%s\t%s\n' "$origin_target" "$pkg_target" "$origin" "$pkg"
325 if [ "$isfirst" = y ]
327 message_echo "ERROR: No matching port for the glob(s) is in the temporary database." >&2
333 # ============= Output of "show" command for a single list =============
334 database_query_show_single_list ()
336 local list pkgnamedb flag_filter_skip_unchanged flag_filter_only_target tmpflag_exists put_blankline
339 flag_filter_skip_unchanged=$3
340 flag_filter_only_target=$4
341 tmpflag_exists=${TMPDIR}/database_query_show_single_list::exists_item
342 if [ `cat "${DBDIR}/$list" 2> /dev/null | wc -l` -eq 0 ]
344 message_echo "INFO: No item is registered in this list."
347 rm -f "$tmpflag_exists"
349 if [ -n "$flag_filter_only_target" \
350 -a -n "$opt_target_itself$opt_target_dependents$opt_target_requirements" ]
352 message_echo "INFO: Ports outside of the target scope are excluded."
355 if [ -n "$flag_filter_skip_unchanged" -a $opt_skip_unchanged = yes ]
357 message_echo "INFO: Ports which have been the newest with their all requirements from the first are excluded."
360 [ -n "$put_blankline" ] && message_echo
363 [ -n "$flag_filter_skip_unchanged" -a $opt_skip_unchanged = yes \
364 -a ! -e "${DBDIR}/requires/$origin/$flag_filter_skip_unchanged" ] \
366 if [ -n "$flag_filter_only_target" ]
368 database_query_get_target_attributes currentorigin "$origin"
369 [ -n "${currentorigin_is_relevant}" ] || continue
370 database_query_is_a_port_suppressed "$origin" && continue
373 for table in $pkgnamedb
375 pkg=`cat "${DBDIR}/$table/$origin/pkgtag" 2> /dev/null` || :
376 [ -n "$pkg" ] && break
378 [ -n "$pkg" ] || continue
379 touch "$tmpflag_exists"
380 if [ $opt_batch_mode = no ]
382 echo "$origin ($pkg)"
384 printf '%s\t%s\n' "$origin" "$pkg"
386 done < ${DBDIR}/$list
387 [ -e "$tmpflag_exists" ] && return
388 message_echo "INFO: No item is registered in this list."
392 # ============= Check whether the upgrade is necessary for a port =============
393 database_query_is_necessary_upgrade ()
395 local origin nodedir dbsuffix tmpfile_new tmpfile_old tmpfile_diff
397 nodedir=${DBDIR}/requires/$origin
398 [ -e "$nodedir/installed_by_pkg" ] && return 1
399 dbsuffix=`options_get_dependency_type`.`options_get_dependency_level`
400 tmpfile_new=${TMPDIR}/database_query_is_necessary_upgrade:failed_requirements.new
401 tmpfile_old=${TMPDIR}/database_query_is_necessary_upgrade:failed_requirements.old
402 tmpfile_diff=${TMPDIR}/database_query_is_necessary_upgrade:failed_requirements.diff
403 [ -e "$nodedir/failed_requirements.${dbsuffix}.previous" ] || return
404 sort -u "$nodedir/failed_requirements.${dbsuffix}" > $tmpfile_new 2> /dev/null || :
405 sort -u "$nodedir/failed_requirements.${dbsuffix}.previous" > $tmpfile_old 2> /dev/null || :
406 fileedit_exists_old_lines "$tmpfile_old" "$tmpfile_new"
409 # ============= Actual operations of "show" command for a single list =============
410 database_query_show_single_list_exec ()
412 local subject deptag level dbsuffix flag_filter_skip_unchanged flag_filter_only_target pkgnamedb
416 dbsuffix=$deptag.$level
417 flag_filter_skip_unchanged=
418 flag_filter_only_target=
419 pkgnamedb='requires obsolete initial'
422 message_echo "The following ports remain in the (re)installation queue for the current do/redo process:"
423 message_echo "It is noted that ports to be skipped can be included here."
424 message_dependency_scope
426 list=stage.loop_list/reinst_todo.remain
427 [ ${DBDIR}/reinst_order.list -nt ${DBDIR}/$list ] && list=reinst_order.list
428 flag_filter_skip_unchanged=necessary_upgrade.$dbsuffix
429 flag_filter_only_target=y
432 message_echo "The following ports have been successfully (re)installed or newly installed:"
433 message_dependency_scope
435 list=success.$dbsuffix.list
436 flag_filter_skip_unchanged=necessary_upgrade_completed.$dbsuffix
437 flag_filter_only_target=y
440 # message_echo "The following ports need reinstallation because of failed requirements which may succeed in following redo runs:"
442 # list=success_but_dependencies_failed.$dbsuffix.list
443 # flag_filter_skip_unchanged=necessary_upgrade.$dbsuffix
444 # flag_filter_only_target=y
447 message_echo "The following ports need (re)installation but are to be skipped until any of their failed requirements succeeds:"
448 message_dependency_scope
450 list=todo_after_requirements_succeed.$dbsuffix.list
451 flag_filter_skip_unchanged=necessary_upgrade.$dbsuffix
452 flag_filter_only_target=y
455 message_echo "The following ports had problems which have been manually resolved:"
457 list=manually_done.list
460 message_echo "The following ports experienced failures and kept to be old or uninstalled:"
462 database_query_show_list_failure
466 message_echo "The following ports are temporarily deleted due to conflicts:"
468 database_query_show_list_failed_conflicts_restoration
472 message_echo "The following ports are registered as taboo:"
477 message_echo "The following ports are registered as necessary:"
482 message_echo "The following ports are registered as unnecessary:"
487 message_echo "The following leaf, obsolete or unneeded ports had been once deleted but are to be or have been restored:"
489 list=stage.loop_list/ports_to_restore
490 pkgnamedb='obsolete initial'
491 flag_filter_only_target=y
494 message_echo "The following leaf, obsolete or unneeded ports are to be or have been deleted:"
496 list=stage.loop_list/ports_to_delete
497 pkgnamedb='obsolete initial'
498 flag_filter_only_target=y
501 database_query_show_single_list "$list" "$pkgnamedb" \
502 "$flag_filter_skip_unchanged" "$flag_filter_only_target"