OSDN Git Service

[BUG FIX] The message about the evaluated dependency level in show command was wrong.
[portsreinstall/current.git] / lib / libdatabase_build.sh
1 #!/bin/sh -e
2 # ==============================================================================
3 # portsreinstall library script
4 # - Operations for building the temporary database -
5 # Copyright (C) 2013-2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
6 # This software is distributed under the 2-Clause BSD License.
7 # ==============================================================================
8
9 # ============= Register an obsolete flavored origin =============
10 database_build_register_obsolete_port ()
11 {
12         local origin dbpath pkgtag
13         origin=$1
14         dbpath=${DBDIR}/obsolete/$origin
15         [ -e "$dbpath/complete_as_node" ] && return
16         mkdir -p "${DBDIR}/obsolete/$origin"
17         pkgtag=`pkgsys_get_init_pkg_from_orig "$origin"`
18         [ -n "$pkgtag" ] || pkgtag='[not installed]'
19         echo "$pkgtag" > ${DBDIR}/obsolete/$origin/pkgtag
20         for table in dependents requirements
21         do
22                 for level in direct full
23                 do
24                         for tag in all run build
25                         do
26                                 srcfile=${DBDIR}/initial/$origin/${table}.${tag}.${level}
27                                 [ -e "$srcfile" ] && ln -f "$srcfile" "$dbpath/${table}.${tag}.${level}.src"
28                         done
29                 done
30         done
31         touch "$dbpath/complete_as_node"
32 }
33
34 # ============= Convert and register if a flavored origin is obsolete =============
35 database_build_convert_and_register_origin_if_obsolete ()
36 {
37         local origin recursedb_in recursedb output_origin iline_db origin_new date_moved why_moved
38         origin=$1
39         recursedb_in=$2
40         recursedb=${recursedb_in:-${PORTS_MOVED_DB}}
41         echo "$origin" > ${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origin
42         pkgsys_exists_port "$origin" && return
43         database_build_register_obsolete_port "$origin"
44         grep -n -m 1 -E "^`str_escape_regexp \"$origin\"`\|" "$recursedb" 2> /dev/null > ${TMPDIR}/moved.info || :
45         if [ `wc -l < ${TMPDIR}/moved.info` -eq 0 ]
46         then
47                 fileedit_add_a_line_if_new "$origin" "${DBDIR}/obsolete_ports"
48                 if [ -n "$recursedb_in" ]
49                 then
50                         message_echo "${DEPTH_INDEX}  ===> Disappeared port (MOVED broken?)"
51                 else
52                         message_echo "${DEPTH_INDEX}  ===> Nonexistent port (your original?)"
53                 fi
54                 return 1
55         else
56                 iline_db=`cut -d : -f 1 "${TMPDIR}/moved.info"`
57                 sed 1,${iline_db}d "${PORTS_MOVED_DB}" > ${TMPDIR}/MOVED.DB
58                 origin_new=`sed -E 's/^[0-9]+://' "${TMPDIR}/moved.info" | cut -d '|' -f 2 || :`
59                 date_moved=`cut -d '|' -f 3 "${TMPDIR}/moved.info" || :`
60                 why_moved=`cut -d '|' -f 4 "${TMPDIR}/moved.info" || :`
61                 if [ -n "$origin_new" ]
62                 then
63                         message_echo "${DEPTH_INDEX}  ===> Moved to $origin_new at $date_moved because \"$why_moved\""
64                         fileedit_add_a_line_if_new "$origin" "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origins_old"
65                         database_build_convert_and_register_origin_if_obsolete "$origin_new" "${TMPDIR}/MOVED.DB" || return 1
66                 else
67                         message_echo "${DEPTH_INDEX}  ===> Deleted at $date_moved because \"$why_moved\""
68                         fileedit_add_a_line_if_new "$origin" "${DBDIR}/obsolete_ports"
69                         return 1
70                 fi
71         fi
72 }
73
74 # ============= [Sub-function] Get the true latest flavored origin =============
75 database_build_convert_and_register_origin_if_obsolete__get_origin ()
76 {
77         cat "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origin"
78 }
79
80 # ============= [Sub-function] Reset the all old origins of the tested flavored origin =============
81 database_build_convert_and_register_origin_if_obsolete__reset_origins_old ()
82 {
83         rm -rf "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origins_old"
84 }
85
86 # ============= [Sub-function] Save the all old origins of the tested flavored origin =============
87 database_build_convert_and_register_origin_if_obsolete__save_origins_old ()
88 {
89         cat "${TMPDIR}/database_build_convert_and_register_origin_if_obsolete:origins_old" 2> /dev/null
90 }
91
92 # ============= Get the make arguments for building the temporary database =============
93 database_build_setup_make_args ()
94 {
95         local origin
96         origin=$1
97         {
98                 for key in LOCALBASE LINUXBASE PORT_DBDIR PORTSDIR DISTDIR PACKAGES PKGREPOSITORY
99                 do
100                         eval echo $key=\$$key
101                 done
102                 echo 'DISABLE_VULNERABILITIES=yes'
103                 if [ $opt_apply_default_config = yes ]
104                 then
105                         if pkgsys_is_dialog4ports_used
106                         then
107                                 echo 'NO_DIALOG=yes'
108                         else
109                                 echo 'BATCH=yes'
110                         fi
111                 fi
112                 dbdir=${DBDIR}/requires/$origin
113                 [ -d "$dbdir" ] || dbdir=${DBDIR}/conf/each_port/$origin
114                 cat "$dbdir/MARG.conf" 2> /dev/null || :
115                 flavor=`pkgsys_get_flavor_from_origin "$origin"`
116                 [ -z "$flavor" ] || echo "FLAVOR=$flavor"
117         } | tr '\n' ' '
118 }
119
120 # ============= Get the make environment variables for building the temporary database =============
121 database_build_setup_make_envs ()
122 {
123         local origin dbdir
124         origin=$1
125         dbdir=${DBDIR}/requires/$origin
126         [ -d "$dbdir" ] || dbdir=${DBDIR}/conf/each_port/$origin
127         cat "$dbdir/MENV.conf" 2> /dev/null || :
128 }
129
130 # ============= Execute make command for building the temporary database =============
131 database_build_make ()
132 {
133         local origin MAKE_ARGS MAKE_ENVS port_path flavor
134         origin=$1
135         shift
136         MAKE_ARGS=`database_build_setup_make_args "$origin"`
137         MAKE_ENVS=`database_build_setup_make_envs "$origin"`
138         port_path=`pkgsys_get_portpath_from_origin "$origin"`
139         fs_fix_unionfs_image_if_hidden "$port_path"
140         env $MAKE_ENVS make -C "$port_path" "$@" $MAKE_ARGS
141 }
142
143 # ============= Set up a temporary database node for the initial state of a port =============
144 database_build_setup_initial_node ()
145 {
146         local origin pkg dbpath
147         origin=$1
148         dbpath=${DBDIR}/initial/$origin
149         [ -e "$dbpath/complete_as_node" ] && return
150         rm -rf "$dbpath"
151         mkdir -p "$dbpath"
152         pkg=`pkgsys_get_installed_pkg_from_origin "$origin"`
153         if [ -n "$pkg" ]
154         then
155                 echo "$pkg" > $dbpath/installed_version
156                 ln -f "$dbpath/installed_version" "$dbpath/pkgtag"
157                 pkg_info_qr "$pkg" | while read requirement
158                 do
159                         origin_requirement=`pkgsys_init_pkg_orig_by_ambiguous_matching "$requirement" || :`
160                         [ -n "$origin_requirement" ] && echo "$origin_requirement"
161                         :
162                 done > $dbpath/requirements.all.full
163                 pkg_info_qR "$pkg" | while read dependent
164                 do
165                         origin_dependent=`pkgsys_init_pkg_orig_by_ambiguous_matching "$dependent" || :`
166                         [ -n "$origin_dependent" ] && echo "$origin_dependent"
167                         :
168                 done > $dbpath/dependents.all.full
169                 for table in dependents requirements
170                 do
171                         for level in direct full
172                         do
173                                 for tag in all run build
174                                 do
175                                         [ "${tag}.${level}" = all.full ] && continue
176                                         ln -f "$dbpath/${table}.all.full" "$dbpath/${table}.${tag}.${level}"
177                                 done
178                         done
179                 done
180         fi
181         if [ `expr "$pkg" : "^${APPNAME}-[0-9].*"` -gt 0 ]
182         then
183                 [ -d "$dbpath" ] && touch "$dbpath/SUPPRESSED_SELF"
184         elif [ `expr "$pkg" : "^pkg-[0-9].*"` -gt 0 ]
185         then
186                 [ -d "$dbpath" ] && touch "$dbpath/SUPPRESSED_PKGNG"
187         fi
188         touch "$dbpath/complete_as_node"
189 }
190
191 # ============= Set up a temporary database node for the replaced/moved information of a port =============
192 database_build_setup_replace_node ()
193 {
194         local origin_orig portoption_before portoption_after origin_trial origin dbpath tmp_msg
195         origin_orig=$1
196         portoption_before=$2
197         portoption_after=$3
198         dbpath=${DBDIR}/replace/$origin_orig
199         tmp_msg=${TMPDIR}/database_build_setup_replace_node:meg
200         if [ ! -e "$dbpath/complete_as_node" ]
201         then
202                 rm -rf "$dbpath"
203                 mkdir -p "$dbpath"
204                 origin_trial=$origin_orig
205                 if echo "$origin_orig" | grep -q -Fx -f "${DBDIR}/conf/REPLACE.filter" 2> /dev/null
206                 then
207                         origin_trial=`echo "$origin_orig" | sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern"`
208                         if [ "x$origin_orig" != "x$origin_trial" ]
209                         then
210                                 if [ -n "$origin_trial" ]
211                                 then
212                                         message_echo "${DEPTH_INDEX}  ===> Replaced with $origin_trial by user configuration"
213                                 else
214                                         database_build_register_obsolete_port "$origin_orig"
215                                         message_echo "${DEPTH_INDEX}  ===> Deleted by user configuration"
216                                 fi > $dbpath/message
217                         fi
218                 fi
219                 if [ -n "$origin_trial" ]
220                 then
221                         if database_build_convert_and_register_origin_if_obsolete "$origin_trial" >> $dbpath/message
222                         then
223                                 origin_trial=`database_build_convert_and_register_origin_if_obsolete__get_origin`
224                         else
225                                 if [ "x$origin_trial" != "x$origin_orig" ]
226                                 then
227                                         message_echo "${DEPTH_INDEX}  ===> Going back to the original port $origin_orig"
228                                         if database_build_convert_and_register_origin_if_obsolete "$origin_orig"
229                                         then
230                                                 origin_trial=`database_build_convert_and_register_origin_if_obsolete__get_origin`
231                                         else
232                                                 origin_trial=
233                                         fi
234                                 else
235                                         origin_trial=
236                                 fi >> $dbpath/message
237                         fi
238                 fi
239                 cat "$dbpath/message" 2> /dev/null || :
240                 if [ -n "$origin_trial" ]
241                 then
242                         database_build_make "$origin_trial" showconfig > $portoption_before 2> /dev/null || :
243                         database_build_determine_port_option "$origin_trial"
244                         database_build_make "$origin_trial" showconfig > $portoption_after 2> /dev/null || :
245                         origin=`database_build_determine_flavored_origin "$origin_trial"`
246                         if [ "x$origin_trial" != "x$origin" ]
247                         then
248                                 if [ -n "$origin" ]
249                                 then
250                                         message_echo "${DEPTH_INDEX}  ===> Transferred to $origin"
251                                 else
252                                         fileedit_add_a_line_if_new "$origin" "${DBDIR}/obsolete_ports"
253                                         message_echo "${DEPTH_INDEX}  ===> Lost (Something is wrong!)"
254                                 fi
255                         fi > $tmp_msg
256                         cat "$tmp_msg" >> $dbpath/message
257                 else
258                         origin=
259                 fi
260                 [ "x$origin_orig" = "x$origin" ] || echo "$origin" > $dbpath/origin
261                 cat "$tmp_msg" 2> /dev/null || :
262                 touch "$dbpath/complete_as_node"
263         else
264                 cat "$dbpath/message" 2> /dev/null || :
265         fi
266 }
267
268 # ============= Get the inspected level for a port with the current option settings =============
269 database_build_get_inspected_level ()
270 {
271         local origin origin_dependent
272         origin=$1
273         origin_dependent=$2
274         if [ $opt_only_target_scope = no ]
275         then
276                 echo full
277         elif ! pkgsys_exists_or_existed_from_orig "$origin" \
278                 || grep -qFx "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect" 2> /dev/null \
279                 || [ ! -e "${DBDIR}/moved_from/$origin_dependent/installed_version" ] \
280                 || grep -qFx "$origin_dependent" "${DBDIR}/stage.loop_list/ports_to_inspect" 2> /dev/null
281         then
282                 echo direct
283         else
284                 echo node
285         fi
286 }
287
288 # ============= Check whether a port has been inspected in a required level =============
289 database_build_is_port_already_inspected_in_required_level ()
290 {
291         local origin origin_dependent origin_actual inspected_level
292         origin=$1
293         origin_dependent=$2
294         origin_actual=`echo "$origin" | sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" 2> /dev/null || :`
295         [ -n "$origin_actual" ] || origin_actual=$origin
296         inspected_level=`database_build_get_inspected_level "$origin_actual" "$origin_dependent"`
297         {
298                 cat "${DBDIR}/ports.inspected.${inspected_level}.list" || :
299                 cat "${DBDIR}/obsolete_ports" || :
300         }  2> /dev/null | grep -q -Fx "$origin_actual" || return
301         fileedit_rm_a_line "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
302         [ "x$origin" = "$origin_actual" ] || \
303                 fileedit_rm_a_line "$origin_actual" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
304         echo "$origin_actual"
305 }
306
307 # ============= Update the current package name of a port =============
308 database_build_update_pkgname ()
309 {
310         local origin dbdir pkg savefile
311         origin=$1
312         dbdir=${DBDIR}/moved_from/$origin
313         mkdir -p "$dbdir"
314         savefile=$dbdir/current_version
315         pkg=`pkgsys_get_installed_pkg_from_origin "$origin"`
316         if [ -z "$pkg" -a -e "$dbdir/initial_orig" ]
317         then
318                 while read orig_init
319                 do
320                         pkgsys_get_installed_pkg_from_origin "$orig_init"
321                 done < $dbdir/initial_orig
322         elif [ -n "$pkg" ]
323         then
324                 echo "$pkg"
325         fi | sort -u > $savefile
326         cat "$savefile"
327 }
328
329 # ============= Get the current package name of a port =============
330 database_build_get_pkgname ()
331 {
332         local origin savefile
333         origin=$1
334         savefile=${DBDIR}/moved_from/$origin/current_version
335         if [ -e "$savefile" ]
336         then
337                 cat "$savefile"
338         else
339                 database_build_update_pkgname "$origin"
340         fi
341 }
342
343 # ============= Get the new package name of a port =============
344 database_build_get_new_pkgname ()
345 {
346         local origin savefile
347         origin=$1
348         savefile=${DBDIR}/requires/$origin/new_version
349         if [ ! -e "$savefile" ]
350         then
351                 database_build_make "$origin" package-name \
352                         | tr -d '\n' > $savefile
353         fi
354         cat "$savefile"
355 }
356
357 # ============= Get the package list of full-run-time requirements =============
358 database_build_get_full_run_requirement_pkgs ()
359 {
360         local origin srcfile savefile
361         origin=$1
362         srcfile=${DBDIR}/requires/$origin/requirements.run.full
363         savefile=${DBDIR}/requires/$origin/pkg_requirements.run.full
364         if [ ! -e "$srcfile" ]
365         then
366                 rm -f "$savefile"
367         elif [ ! -e "$savefile" -o "$savefile" -ot "$srcfile" ]
368         then
369                 while read origin
370                 do
371                         database_build_get_new_pkgname "$origin"
372                 done < $srcfile | grep -v '^[[:space:]]*$' | sort -u > $savefile
373         fi
374         cat "$savefile" 2> /dev/null || :
375 }
376
377 # ============= Build the original message tag showing the version upgrade =============
378 database_build_create_pkgtag ()
379 {
380         local origin dbdir pkg_init pkg_new pkgtag
381         origin=$1
382         dbdir=${DBDIR}/moved_from/$origin
383         mkdir -p "$dbdir"
384         pkg_init=`database_build_get_pkgname "$origin"`
385         [ -n "$pkg_init" -a ! -e "$dbdir/installed_version" ] && \
386                 echo -n "$pkg_init" > $dbdir/installed_version
387         pkg_new=`database_build_get_new_pkgname "$origin"`
388         pkgtag=$pkg_init
389         [ -n "$pkgtag" ] || pkgtag=$pkg_new
390         if [ -z "$pkgtag" ]
391         then
392                 pkgtag='?'
393         
394         elif [ "x$pkg_init" != "x$pkg_new" ]
395         then
396                 if [ -n "$pkg_init" ]
397                 then
398                         pkgtag="$pkg_init => $pkg_new"
399                 else
400                         pkgtag="[new] $pkg_new"
401                 fi
402         fi
403         echo "$pkgtag" > $dbdir/pkgtag.orig
404         echo "$pkgtag" > $dbdir/pkgtag
405 }
406
407 # ============= Update the message tag showing the version upgrade =============
408 database_build_update_pkgtag ()
409 {
410         local origin dbdir pkg_init pkg_bak pkg_cur detail pkgtag
411         origin=$1
412         dbdir=${DBDIR}/moved_from/$origin
413         mkdir -p "$dbdir"
414         pkg_init=`cat "$dbdir/installed_version" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
415         pkg_bak=`cat "$dbdir/backedup_version" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
416         pkg_cur=`database_build_get_pkgname "$origin" | tr '\n' ' ' | sed 's/ *$//'`
417         detail=
418         if [ "x$pkg_init" != "x$pkg_cur" ]
419         then
420                 if [ -n "$pkg_cur" ]
421                 then
422                         detail=" [currently installed version: $pkg_cur]"
423                 elif [ -n "$pkg_bak" ]
424                 then
425                         detail=" [currently deinstalled, previously installed version: $pkg_bak]"
426                 else
427                         detail=" [currently deinstalled]"
428                 fi
429         fi
430         pkgtag=`cat "$dbdir/pkgtag.orig"`
431         echo "$pkgtag$detail" > $dbdir/pkgtag
432 }
433
434 # ============= Check whether the currently installed package version is the latest =============
435 database_build_is_currentpkg_latest ()
436 {
437         local origin pkg_cur pkg_new
438         origin=$1
439         pkg_cur=`database_build_get_pkgname "$origin" | tr '\n' ' ' | sed 's/ *$//'`
440         pkg_new=`database_build_get_new_pkgname "$origin"`
441         [ "x$pkg_cur" = "x$pkg_new" ]
442 }
443 # ============= Configure the port option to determine the true flavor =============
444 database_build_determine_port_option ()
445 {
446         local origin
447         origin=$1
448         if [ $opt_apply_default_config = yes ]
449         then
450                 if ! pkgsys_is_dialog4ports_used
451                 then
452                         printf '\t\n' | database_build_make "$origin" config-conditional > /dev/null
453                 fi
454         else
455                 database_build_make "$origin" config-conditional
456         fi
457 }
458
459 # ============= Get the true flavor to determine the flavored port origin =============
460 database_build_determine_flavored_origin ()
461 {
462         local origin origin_unflavored flavor_trial origin_trial flavors_ptn flavor
463         origin=$1
464         origin_unflavored=`pkgsys_get_unflavored_origin "$origin"`
465         flavor_trial=`pkgsys_get_flavor_from_origin "$origin"`
466         if [ -n "$flavor_trial" ]
467         then
468                 flavors_ptn="^("`database_build_make "$origin" -V FLAVORS 2> /dev/null | sed -E 's/[[:space:]]+/|/g'`")$"
469                 echo "$flavor_trial" | grep -qE "$flavors_ptn" || flavor_trial=
470         fi
471         origin_trial=`pkgsys_compose_flavored_origin "$origin_unflavored" "$flavor_trial"`
472         flavor=`database_build_make "$origin_trial" -V FLAVOR 2> /dev/null || :`
473         pkgsys_compose_flavored_origin "$origin_unflavored" "$flavor"
474 }
475
476 # ============= Escape of inspection conflict =============
477 database_build_escape_inspect_conflict ()
478 {
479         local origin dbpath
480         dbpath=${DBDIR}/requires/$origin
481         if [ -e "$dbpath/CONFLICT.conf" ]
482         then
483                 message_echo "${DEPTH_INDEX}  ===> Escaping inspection conflict..."
484                 pkgsys_eval_ports_glob `cat "$dbpath/CONFLICT.conf"` | while read origin_conflict
485                 do
486                         pkg_conflict=`pkgsys_get_installed_pkg_from_origin "$origin_conflict"`
487                         [ -n "$pkg_conflict" ] || continue
488                         message_echo "${DEPTH_INDEX}  ===> Escaping $pkg_conflict..."
489                         pkgarc=`pkgsys_create_backup_pkg "$pkg_conflict" "${DBDIR}/backup_packages" 2> /dev/null` || \
490                                 message_echo "${DEPTH_INDEX}  ===> (WARNING: Failed to back up)"
491                         pkg_delete_f "$pkg_conflict" > /dev/null 2>&1 || \
492                                 message_echo "${DEPTH_INDEX}  ===> (WARNING: Failed to delete)"
493                         [ -n "$pkgarc" ] && printf '%s\t%s\n' "$pkg_conflict" "$pkgarc" >> $dbpath/CONFLICT_pkgarc.lst
494                 done
495         fi
496 }
497
498 # ============= Restoration of escaped inspection conflict =============
499 database_build_restore_inspect_conflict ()
500 {
501         local origin dbpath
502         dbpath=${DBDIR}/requires/$origin
503         if [ -e "$dbpath/CONFLICT.conf" ]
504         then
505                 message_echo "${DEPTH_INDEX}  ===> Restoring inspection conflict..."
506                 cat "$dbpath/CONFLICT_pkgarc.lst" 2> /dev/null | while read pkg_conflict pkgarc
507                 do
508                         pkg_info_e "$pkg_conflict" && continue
509                         message_echo "${DEPTH_INDEX}  ===> Restoring $pkg_conflict..."
510                         pkg_add_f "$pkgarc" > /dev/null 2>&1 || \
511                                 message_echo "${DEPTH_INDEX}  ===> (WARNING: Failed to restore $pkg_conflict)"
512                 done
513                 rm -f "$dbpath/CONFLICT_pkgarc.lst"
514         fi
515 }
516
517 # ============= Recursively inspect dependencies of a port and build a node database of the information =============
518 database_build_inspect_dependencies ()
519 {
520         local origin_orig origin_dependent origin_orig_regexp origin_replace origin tag stage level dbpath dbpath_prev origin_id tmp_config origin_dependency DEPTH_INDEX_orig nlines iline dist_subdir_rpl inspected_level inspected_levels_compatible origin_tmp inspected_level_tmp conf_updated tmp_portsdb_work tmp_portopt same_as_prevset dbfile installed_version frompath variable pkg_new
521         origin_orig=$1
522         origin_dependent=$2
523         [ -z "$origin_orig" ] && return
524         if ! origin=`database_build_is_port_already_inspected_in_required_level "$origin_orig" "$origin_dependent"`
525         then
526                 DEPTH_INDEX_orig=${DEPTH_INDEX}
527                 DEPTH_INDEX="${DEPTH_INDEX}--"
528                 message_echo "${DEPTH_INDEX} $origin_orig"
529                 database_build_convert_and_register_origin_if_obsolete__reset_origins_old
530                 origin_id=`echo "$origin_orig" | tr / :`
531                 database_build_setup_initial_node "$origin_orig"
532                 # Replacement specified by the configuration file, knobs and port options
533                 tmp_config=${TMPDIR}/database_build_inspect_dependencies:confi
534                 database_build_setup_replace_node "$origin_orig" "$tmp_config.before" "$tmp_config.after"
535                 if [ -e "${DBDIR}/replace/$origin_orig/origin" ]
536                 then
537                         origin=`cat "${DBDIR}/replace/$origin_orig/origin"`
538                 else
539                         origin=$origin_orig
540                 fi
541                 # Build the database for this port
542                 inspected_level=
543                 inspected_levels_compatible=
544                 if [ -n "$origin" ]
545                 then
546                         frompath=${DBDIR}/moved_from/$origin
547                         mkdir -p "$frompath"
548                         database_build_convert_and_register_origin_if_obsolete__save_origins_old | \
549                                 fileedit_add_lines_if_new "$frompath/old_origs"
550                         # Check the package name initially installed
551                         installed_version=`cat "${DBDIR}/initial/$origin_orig/installed_version" 2> /dev/null || :`
552                         [ -n "$installed_version" ] && fileedit_add_a_line_if_new "$installed_version" "$frompath/installed_version"
553                         [ "x$origin_orig" = "x$origin" ] || fileedit_add_a_line_if_new "$origin_orig" "$frompath/initial_orig"
554                         [ -e "${DBDIR}/initial/$origin_orig/SUPPRESSED_SELF" ] && touch "$frompath/SUPPRESSED_SELF"
555                         [ -e "${DBDIR}/initial/$origin_orig/SUPPRESSED_PKGNG" ] && touch "$frompath/SUPPRESSED_PKGNG"
556                         if ! grep -qFx "$origin" "${DBDIR}/done_required_ports_to_inspect" 2> /dev/null
557                         then
558                                 fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports"
559                                 dbpath=${DBDIR}/requires/$origin
560                                 dbpath_prev=${DBDIR}/prevset/requires/$origin
561                                 if [ ! -e "$dbpath/complete_as_node" ] || \
562                                         ! diff "$tmp_config.before" "$tmp_config.after" > /dev/null 2> /dev/null
563                                 then
564                                         # Notify reconfiguration of the port option
565                                         conf_updated=
566                                         if [ -e "$dbpath/complete_as_node" ] || \
567                                                 grep -q -Fx -e "$origin_orig" -e "$origin" "${DBDIR}/to_be_reconf" 2> /dev/null
568                                         then
569                                                 message_echo "${DEPTH_INDEX}  ===> Reconfigured"
570                                                 conf_updated=y
571                                         fi
572                                         # Reset the database
573                                         rm -rf "$dbpath"
574                                         mkdir -p "$dbpath"
575                                         [ -n "$conf_updated" ] && touch "$dbpath/conf_updated"
576                                         if [ -d "${DBDIR}/conf/each_port/$origin" ]
577                                         then
578                                                 cp -R "${DBDIR}/conf/each_port/$origin/"* "$dbpath/" > /dev/null 2>&1 || :
579                                         fi
580                                         # Escape of inspection conflict
581                                         database_build_escape_inspect_conflict "$origin"
582                                         # Check the change of the port option from the default
583                                         tmp_portsdb_work=${TMPDIR}/database_build_inspect_dependencies:portsdb_work
584                                         tmp_portopt=${TMPDIR}/database_build_inspect_dependencies:portopt
585                                         [ -d "$tmp_portsdb_work" ] || mkdir "$tmp_portsdb_work"
586                                         ( set -e
587                                                 export PORT_DBDIR=$tmp_portsdb_work
588                                                 export __MAKE_CONF=
589                                                 if database_build_make "$origin" showconfig > $tmp_portopt
590                                                 then
591                                                         cp "$tmp_portopt" "$dbpath"/ports_options.default
592                                                 else
593                                                         cat "$tmp_portopt" >&2
594                                                         message_echo 'Error in detecting the default options.' 2>&1
595                                                         exit 1
596                                                 fi
597                                         )
598                                         if [ `wc -c < $dbpath/ports_options.default` -gt 0 ]
599                                         then
600                                                 if database_build_make "$origin" showconfig > $tmp_portopt
601                                                 then
602                                                         cp "$tmp_portopt" "$dbpath"/ports_options.current
603                                                 else
604                                                         cat "$tmp_portopt" >&2
605                                                         message_echo 'Error in detecting the current options.' 2>&1
606                                                         exit 1
607                                                 fi
608                                         else
609                                                 cp /dev/null "$dbpath/ports_options.current"
610                                         fi
611                                         pkgsys_save_port_oprion_timestamp "$origin"
612                                         # Get the lists of requirements in the flavored form
613                                         database_build_create_pkgtag "$origin"
614                                         for variable in PKG_DEPENDS EXTRACT_DEPENDS PATCH_DEPENDS FETCH_DEPENDS BUILD_DEPENDS LIB_DEPENDS
615                                         do
616                                                 database_build_make "$origin" -V $variable
617                                         done > ${TMPDIR}/database_build_inspect_dependencies:build_depends_list
618                                         for variable in LIB_DEPENDS RUN_DEPENDS
619                                         do
620                                                 database_build_make "$origin" -V $variable
621                                         done > ${TMPDIR}/database_build_inspect_dependencies:run_depends_list
622                                         for tag in run build
623                                         do
624                                                 tr ' ' '\n' < ${TMPDIR}/database_build_inspect_dependencies:${tag}_depends_list | \
625                                                         sed -E 's#.*:([^:/]+/[^:/]+|[^:/]+/[^:/]+:[^:/]*)$#\1#' | cut -d : -f 1 | sort -u | \
626                                                         grep -Ev "`pkgsys_pkgtools_ports_filter_regexp`" \
627                                                                 | while read origin_flavor_incomplete
628                                                                 do
629                                                                         ( set -e
630                                                                                 opt_apply_default_config=yes
631                                                                                 database_build_determine_port_option "$origin_flavor_incomplete"
632                                                                         )
633                                                                         database_build_determine_flavored_origin "$origin_flavor_incomplete"
634                                                                 done | grep -v '^$' | sort -u > $dbpath/requirements.$tag.orig || :
635                                                 sed -E -f "${DBDIR}/conf/REPLACE.sed_pattern" "$dbpath/requirements.$tag.orig" \
636                                                         | grep -v '^$' | sort -u > $dbpath/requirements.$tag.src || :
637                                         done
638                                         for stage in orig src
639                                         do
640                                                 sort -u "$dbpath/requirements.run.${stage}" "$dbpath/requirements.build.${stage}" \
641                                                         > $dbpath/requirements.all.direct.${stage}
642                                                 mv "$dbpath/requirements.build.${stage}" "$dbpath/requirements.build.direct.${stage}"
643                                                 mv "$dbpath/requirements.run.${stage}" "$dbpath/requirements.run.direct.${stage}"
644                                         done
645                                         # Record the completion
646                                         touch "$dbpath/complete_as_node"
647                                         fileedit_rm_a_line "$origin_orig" "${DBDIR}/to_be_reconf"
648                                         fileedit_rm_a_line "$origin" "${DBDIR}/to_be_reconf"
649                                         # Restoration of escaped inspection conflict
650                                         database_build_restore_inspect_conflict "$origin"
651                                 else
652                                         # Restoration of escaped inspection conflict
653                                         database_build_restore_inspect_conflict "$origin"
654                                         # Reset the complied lists of requirements
655                                         for level in direct full
656                                         do
657                                                 for tag in run build
658                                                 do
659                                                         rm -f "$dbpath/requirements.${tag}.${level}"
660                                                 done
661                                         done
662                                         for origin_tmp in "$origin" "$origin_orig"
663                                         do
664                                                 for inspected_level_tmp in full direct node
665                                                 do
666                                                         fileedit_rm_a_line "$origin_tmp" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list"
667                                                 done
668                                         done
669                                 fi
670                                 # Inspect the requirements
671                                 inspected_level=`database_build_get_inspected_level "$origin" "$origin_dependent"`
672                                 case $inspected_level in
673                                 full )
674                                         grep -v -Fx -f "${DBDIR}/installed_ports" \
675                                                 "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || :
676                                         inspected_levels_compatible='full direct node'
677                                         ;;
678                                 direct )
679                                         grep -v -Fx -f "${DBDIR}/installed_ports" \
680                                                 "$dbpath/requirements.all.direct.src" > ${TMPDIR}/missing.$origin_id || :
681                                         inspected_levels_compatible='direct node'
682                                         ;;
683                                 node )
684                                         cp /dev/null "${TMPDIR}/missing.$origin_id"
685                                         inspected_levels_compatible='node'
686                                         ;;
687                                 esac
688                                 rm -rf "$dbpath/rename_requirements.sed.pattern"
689                                 nlines=`wc -l < ${TMPDIR}/missing.$origin_id`
690                                 iline=1
691                                 while [ $iline -le $nlines ]
692                                 do
693                                         origin_dependency=`sed -n ${iline}p "${TMPDIR}/missing.$origin_id"`
694                                         iline=$(($iline+1))
695                                         grep -q -Fx "$origin_dependency" "${DBDIR}/ports.inspected.list" 2> /dev/null && \
696                                                         continue
697                                         database_build_inspect_dependencies "$origin_dependency" "$origin"
698                                 done
699                                 if [ -e "$dbpath/rename_requirements.sed.pattern" ]
700                                 then
701                                         for tag in run build all
702                                         do
703                                                 sed -E -i .unrenamed -f "$dbpath/rename_requirements.sed.pattern" "$dbpath/requirements.${tag}.direct.src"
704                                         done
705                                 fi 
706                                 rm -f "${TMPDIR}/missing.$origin_id"
707                                 # Inspect the distfiles
708                                 dist_subdir_rpl=`database_query_get_makevar_val "$origin" DIST_SUBDIR | str_escape_replaceval_filter` || :
709                                 [ -n "$dist_subdir_rpl" ] && dist_subdir_rpl="$dist_subdir_rpl\/"
710                                 database_build_make "$origin" fetch-urlall-list \
711                                         | sed -E "s/.*\/([^\/]+)$/$dist_subdir_rpl\1/" \
712                                         | sort -u | fileedit_add_lines_if_new "${DBDIR}/distfiles.inspected"
713                                 # Transfer data from the previous database if existent, successful and no change
714                                 pkg_new=`cat "$dbpath/new_version"`
715                                 if [ ! -e "$dbpath/conf_updated" -a -d "$dbpath_prev" ] && pkg_info_e "$pkg_new" 2> /dev/null && \
716                                         ! grep -qFx "$origin" "$dbpath_prev/to_be_reconf" 2> /dev/null
717                                 then
718                                         same_as_prevset=yes
719                                         for dbfile in new_version CONFLICT.conf BUILDCONFLICT.conf MARG.conf MENV.conf \
720                                                 ports_options.default ports_options.current \
721                                                 rename_requirements.sed.pattern \
722                                                 requirements.run.direct.orig requirements.run.direct.src \
723                                                 requirements.build.direct.orig requirements.build.direct.src
724                                         do
725                                                 [ ! -e "$dbpath/$dbfile" -a ! -e "$dbpath_prev/$dbfile" ] && continue
726                                                 if ! diff "$dbpath/$dbfile"  "$dbpath_prev/$dbfile" 2> /dev/null > /dev/null
727                                                 then
728                                                         same_as_prevset=no
729                                                         break
730                                                 fi
731                                         done
732                                         if [ $same_as_prevset = yes ]
733                                         then
734                                                 nlines=`wc -l < $dbpath/requirements.all.direct.src`
735                                                 iline=1
736                                                 while [ $iline -le $nlines ]
737                                                 do
738                                                         origin_dependency=`sed -n ${iline}p "$dbpath/requirements.all.direct.src"`
739                                                         iline=$(($iline+1))
740                                                         if [ ! -e "${DBDIR}/requires/$origin_dependency/same_as_prevset" ]
741                                                         then
742                                                                 same_as_prevset=no
743                                                                 break
744                                                         fi
745                                                 done
746                                         fi
747                                         if [ $same_as_prevset = yes ]
748                                         then
749                                                 for dbfile in failed.list damaged_package manually_done.list
750                                                 do
751                                                         if grep -qFx "$origin" "${DBDIR}/prevset/$dbfile" 2> /dev/null
752                                                         then
753                                                                 same_as_prevset=no
754                                                                 break
755                                                         fi
756                                                 done
757                                         fi
758                                         if [ $same_as_prevset = yes ]
759                                         then
760                                                 rm -rf "$dbpath"
761                                                 cp -Rp "$dbpath_prev" "$dbpath"
762                                                 if [ -d "${DBDIR}/prevset/notes/$origin" ]
763                                                 then
764                                                         rm -rf "${DBDIR}/notes/$origin"
765                                                         mkdir -p "${DBDIR}/notes"
766                                                         cp -Rp "${DBDIR}/prevset/notes/$origin" "${DBDIR}/notes/$origin"
767                                                 fi
768                                                 {
769                                                         for tag in all run build none
770                                                         do
771                                                                 for level in full direct
772                                                                 do
773                                                                         echo "success.$tag.$level.list"
774                                                                 done
775                                                         done
776                                                 } | while read dbfile
777                                                 do
778                                                         if grep -Fxq "$origin" "${DBDIR}/prevset/$dbfile" 2> /dev/null
779                                                         then
780                                                                 fileedit_add_a_line_if_new "$origin" "${DBDIR}/$dbfile"
781                                                         fi
782                                                 done
783                                                 touch "$dbpath/same_as_prevset"
784                                                 message_echo "${DEPTH_INDEX}  ===> No update from the previous reinstallation. Progress status inherited."
785                                         fi
786                                 fi
787                                 # Record the completion
788                                 if [ "x$origin_orig" != "x$origin" ]
789                                 then
790                                         for inspected_level_tmp in $inspected_levels_compatible
791                                         do
792                                                 fileedit_add_a_line_if_new "$origin" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list"
793                                         done
794                                         fileedit_add_a_line_if_new "$origin" "${DBDIR}/ports.inspected.list"
795                                         fileedit_add_a_line_if_new "$origin" "${DBDIR}/inspected_ports.update"
796                                         fileedit_rm_a_line "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
797                                 fi
798                                 fileedit_add_a_line_if_new "$origin" "${DBDIR}/done_required_ports_to_inspect"
799                         else
800                                 message_echo "${DEPTH_INDEX}  ===> Already inspected merged port"
801                                 fileedit_rm_a_line "$origin_orig" "${DBDIR}/to_be_reconf"
802                                 for inspected_level_tmp in full direct node
803                                 do
804                                         fileedit_rm_a_line "$origin_orig" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list"
805                                 done
806                         fi
807                 fi
808                 # Record the completion
809                 for inspected_level_tmp in $inspected_levels_compatible
810                 do
811                         fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/ports.inspected.${inspected_level_tmp}.list"
812                 done
813                 fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/ports.inspected.list"
814                 fileedit_add_a_line_if_new "$origin_orig" "${DBDIR}/inspected_ports.update"
815                 fileedit_rm_a_line "$origin_orig" "${DBDIR}/stage.loop_list/ports_to_inspect.remain"
816                 message_echo "${DEPTH_INDEX}  ===> ok"
817                 DEPTH_INDEX=${DEPTH_INDEX_orig}
818         fi
819         if [ -n "$origin_dependent" -a "x$origin_orig" != "x$origin" ]
820         then
821                 origin_orig_regexp=`str_escape_regexp "$origin_orig"`
822                 origin_replace=`str_escape_replaceval "$origin"`
823                 fileedit_add_a_line_if_new "s/^$origin_orig_regexp$/$origin_replace/" "${DBDIR}/requires/$origin_dependent/rename_requirements.sed.pattern"
824         fi
825 }
826
827 # ============= Filter ignored dependencies from a list given by the standard input =============
828 database_build_filter_ignored_requirements ()
829 {
830         local origin pattern
831         origin=$1
832         pattern=${DBDIR}/requires/$origin/ignored_requirements.filter
833         if [ -e "$pattern" ]
834         then
835                 grep -Fxvq -f "$pattern"
836         else
837                 cat
838         fi 2> /dev/null || :
839 }
840
841 # ============= Build and get a list of the complete recursive dependencies of a port =============
842 database_build_get_complete_recursive_dependency ()
843 {
844         local tag origin suffix tmppath dbpath srcfile dstfile num_parents loophead dstfile_tmp tmpdstpath index_loop loop_len origin_target origin_ref dbpath_target
845         tag=$1
846         origin=$2
847         suffix=$3
848         tmppath=${TMPDIR}/database_build_get_complete_recursive_dependency
849         dbpath=${DBDIR}/requires/$origin
850         srcfile=$dbpath/requirements.${tag}.direct${suffix}
851         dstfile=$dbpath/requirements.${tag}.full${suffix}
852         if [ ! -e "$srcfile" ]
853         then
854                 [ -d "$dbpath" ] && rm -f "$dstfile"
855                 return 0
856         fi
857         if [ ! -e "$dstfile" ]
858         then
859                 touch "$tmppath.parents"
860                 num_parents=`wc -l < $tmppath.parents`
861                 if grep -Fxq "$origin" "$tmppath.parents"
862                 then
863                         loophead=`grep -Fxn "$origin" "$tmppath.parents" | tail -n 1 | cut -d : -f 1`
864                         if [ "x$opt_force_continuation_for_looped_dependency" = xno ]
865                         then
866                                 message_echo "ERROR: The following loop was found for requirements.${tag}${suffix}:" >&2
867                         else
868                                 message_echo "WARNING: The following loop was found for requirements.${tag}${suffix}:" >&2
869                         fi
870                         message_echo "  $origin" >&2
871                         sed -n $(($loophead+1)),\$p "$tmppath.parents" > $tmppath.ports_in_loop.tmp
872                         sed 's/^/  -->/' "$tmppath.ports_in_loop.tmp" | message_cat >&2
873                         message_echo "  -->$origin" >&2
874                         if [ "x$opt_disallow_force_continuation_for_looped_dependency" = xyes ]
875                         then
876                                 message_echo 'Resolve the problem manually and then retry by executing' >&2
877                                 message_echo "        ${APPNAME} reset keepopts" >&2
878                                 message_echo "        ${APPNAME}" >&2
879                                 exit 1
880                         else
881                                 message_echo 'Exploring a node port to terminate the loop by evaluating only build-and-run-time dependencies as essential ones.' >&2
882                                 echo "$origin" > $tmppath.ports_in_loop
883                                 cat "$tmppath.ports_in_loop.tmp" >> $tmppath.ports_in_loop
884                                 echo "$origin" >> $tmppath.ports_in_loop
885                                 index_loop=1
886                                 loop_len=`wc -l < $tmppath.ports_in_loop`
887                                 while [ $index_loop -lt $loop_len ]
888                                 do
889                                         origin_target=`sed -n ${index_loop}p "$tmppath.ports_in_loop"`
890                                         origin_ref=`sed -n $((${index_loop}+1))p "$tmppath.ports_in_loop"`
891                                         dbpath_target=${DBDIR}/requires/$origin_target
892                                         if ! grep -Fxq "$origin_ref" "$dbpath_target/requirements.run.direct${suffix}" 2> /dev/null || \
893                                                 ! grep -Fxq "$origin_ref" "$dbpath_target/requirements.build.direct${suffix}" 2> /dev/null
894                                         then
895                                                 message_echo 'INFO: The dependency of '$origin_target' on '$origin_ref' is ignored to terminate the loop.' >&2
896                                                 break
897                                         fi
898                                         index_loop=$((${index_loop}+1))
899                                 done
900                                 if [ $index_loop -eq $loop_len ]
901                                 then
902                                         message_echo 'WARNING: The loop cannot be resolved. Continuing by forcible ignorance of the dependency of '$origin_target' on '$origin_ref'. This may cause confusion in the later processes.' >&2
903                                 fi
904                                 for suffix_tmp in '' .orig
905                                 do
906                                         for tag_tmp in run build
907                                         do
908                                                 grep -Fxq "$origin_ref" "$dbpath_target/requirements.${tag_tmp}.direct${suffix_tmp}" 2> /dev/null && \
909                                                         fileedit_add_a_line_if_new "$origin_ref" "$dbpath_target/ignored_requirements.${tag_tmp}${suffix_tmp}"
910                                         done
911                                         cat "$dbpath_target/ignored_requirements.run${suffix_tmp}" "$dbpath_target/ignored_requirements.build${suffix_tmp}" 2> /dev/null | sort -u > $dbpath_target/ignored_requirements.all${suffix_tmp}
912                                 done
913                                 cat "$dbpath_target/ignored_requirements.all"* 2> /dev/null | sort -u > $dbpath_target/ignored_requirements.filter
914                         fi
915                 fi
916                 echo "$origin" >> $tmppath.parents
917                 tmpdstpath=${TMPDIR}/requires/$origin
918                 dstfile_tmp=$tmpdstpath/requirements.${tag}.full${suffix}
919                 mkdir -p "$tmpdstpath"
920                 database_build_filter_ignored_requirements "$origin" < $srcfile | while read origin_requirement
921                 do
922                         database_build_get_complete_recursive_dependency "$tag" "$origin_requirement" "$suffix" \
923                                 > $tmppath.recursive_dependency
924                         [ -e "$dbpath/ignored_requirements.filter" ] && \
925                                 echo "$origin_requirement" | grep -Fxq -f "$dbpath/ignored_requirements.filter" 2> /dev/null && \
926                                 continue
927                         echo "$origin_requirement"
928                         cat "$tmppath.recursive_dependency"
929                 done > $dstfile_tmp
930                 sed -n ${num_parents}p "$tmppath.parents" > $tmppath.parents.tmp
931                 mv "$tmppath.parents.tmp" "$tmppath.parents"
932                 if [ ! -e "$dstfile" ]
933                 then
934                         sort -u "$dstfile_tmp" > $dstfile
935                         rm "$dstfile_tmp"
936                 fi
937         fi
938         cat "$dstfile"
939 }
940
941 # ============= Inspect the necessity of requirements of a necessary port even in case of skipping unchanged ports =============
942 # Here the "necessity" means that a port must be kept installed, newly installed or reinstalled for run- or build-time operations.
943 # In other words, "unnecessary" ports are what are not yet installed and not required by any "necessary" ports neither in run- or build-time.
944 database_build_inspect_necessity_for_only_new_upgrade ()
945 {
946         local origin level dbpath tmpfile
947         origin=$1
948         level=$2
949         dbpath=${DBDIR}/requires/$origin
950         [ ! -d "$dbpath" -o -e "$dbpath/necessary_port.${level}" ] && return
951         tmpfile=${TMPDIR}/database_build_inspect_necessity_for_only_new_upgrade:`echo "$origin" | tr / :`
952         if database_query_does_a_port_need_update "$origin"
953         then
954                 sort -u "$dbpath/requirements.build.direct" "$dbpath/requirements.run.${level}" || :
955         else
956                 cat "$dbpath/requirements.run.${level}" || :
957         fi 2> /dev/null | database_build_filter_ignored_requirements "$origin" > $tmpfile
958         while read origin_requirement
959         do
960                 database_build_inspect_necessity_for_only_new_upgrade "$origin_requirement" "$level"
961         done < $tmpfile
962         rm "$tmpfile"
963         touch "$dbpath/necessary_port.${level}"
964 }
965
966 # ============= Build complement relations to new dependents for targets recursively =============
967 database_build_complement_to_new_dependents_for_targets ()
968 {
969         local origin dbdir reqdir level
970         origin=$1
971         dbdir=${DBDIR}/targets/$origin
972         reqdir=${DBDIR}/requires/$origin
973         [ -d "$dbdir" ] || return 0
974         echo "$origin" >> ${DBDIR}/stage.loop_list/parse_target_attr_info
975         if [ -e "$dbdir/target_itself" ] && database_query_does_a_port_need_update "$origin"
976         then
977                 for level in direct full
978                 do
979                         cat "$reqdir/requirements.all.${level}" 2> /dev/null | \
980                                 database_build_filter_ignored_requirements "$origin" | \
981                                 while read origin_requirement
982                         do
983                                 fileedit_add_a_line_if_new "$origin" \
984                                         "${DBDIR}/targets/$origin_requirement/complement_for_new_dependents.${level}"
985                         done
986                 done
987                 cat "$reqdir/requirements.all.direct" "$reqdir/requirements.all.full" 2> /dev/null | \
988                         sort -u | database_build_filter_ignored_requirements "$origin" | \
989                         while read origin_requirement
990                 do
991                         database_build_complement_to_new_dependents_for_targets "$origin_requirement"
992                 done
993         fi
994 }
995
996 # ============= Build target attribute files recursively =============
997 database_build_target_attributes ()
998 {
999         local origin dbdir reqdir _is_target _is_requires_requirements _is_initial_requirements _is_requires_dependents _is_initial_dependents _is_requires_requirements_complement _is_relevant tag level database table
1000         origin=$1
1001         dbdir=${DBDIR}/targets/$origin
1002         reqdir=${DBDIR}/requires/$origin
1003         [ -d "$dbdir" ] || return 0
1004         [ -e "$dbdir/COMPLETE_ATTRS" ] && return
1005         _is_target=
1006         [ -e "$dbdir/target_itself" ] && _is_target=y
1007         for tag in all run build none
1008         do
1009                 for level in direct full
1010                 do
1011                         _is_relevant=${_is_target}
1012                         _is_requires_requirements=
1013                         _is_initial_requirements=
1014                         _is_requires_dependents=
1015                         _is_initial_dependents=
1016                         _is_requires_requirements_complement=
1017                         for database in requires initial
1018                         do
1019                                 for table in requirements dependents
1020                                 do
1021                                         if [ -e "$dbdir/target_${database}_${table}.${tag}.${level}" ]
1022                                         then
1023                                                 eval _is_${database}_${table}=y
1024                                                 _is_relevant=y
1025                                         fi
1026                                 done
1027                         done
1028                         if [ -z "${_is_requires_requirements}" -a -e "$dbdir/complement_for_new_dependents.${level}" ]
1029                         then
1030                                 _is_requires_requirements_complement=y
1031                                 _is_relevant=y
1032                         fi
1033                         [ -n "${_is_relevant}" ] && cat > $dbdir/attrs.${tag}.${level} << eof
1034 _is_target=${_is_target}
1035 _is_requires_requirements=${_is_requires_requirements}
1036 _is_initial_requirements=${_is_initial_requirements}
1037 _is_requires_dependents=${_is_requires_dependents}
1038 _is_initial_dependents=${_is_initial_dependents}
1039 _is_requires_requirements_complement=${_is_requires_requirements_complement}
1040 eof
1041                 done
1042         done
1043         touch "$dbdir/COMPLETE_ATTRS"
1044 }
1045
1046 # ============= Order the ports considering dependencies =============
1047 database_build_order_ports_considering_dependencies ()
1048 {
1049         touch "${DBDIR}/reinst_order.list.tmp"
1050         (cd "${DBDIR}/requires" && \
1051                 find . -depth 3 -name requirements.all.full -exec echo {} \; -exec cat {} \; -exec echo \;) | \
1052                 env "DBDIR=${DBDIR}" awk -f "${LIBEXECDIR}"/order_dependencies.awk || return
1053         grep -v '^$' "${DBDIR}/reinst_order.list.tmp" > "${DBDIR}/reinst_order.list" || :
1054 }
1055
1056 # ============= [Sub-function] Common operations for resetting configurations for a port =============
1057 _database_build_reset_a_port_confdb ()
1058 {
1059         local origin origin_replace db
1060         origin=$1
1061         [ -d "${DBDIR}/initial/$origin" -o -d "${DBDIR}/replace/$origin" \
1062                 -o -d "${DBDIR}/requires/$origin" -o -d "${DBDIR}/targets/$origin" ] || return 0
1063         touch "${DBDIR}/inspected_ports_only_partially"
1064         {
1065                 echo "$origin"
1066                 cat "${DBDIR}/replace/$origin/origin" 2> /dev/null || :
1067                 for dbtag in initial requires
1068                 do
1069                         for tabel in requirements dependents
1070                         do
1071                                 cat "${DBDIR}/$dbtag/$origin/$tabel.all.full" 2> /dev/null || :
1072                                 cat "${DBDIR}/$dbtag/$origin/$tabel.all.full.orig" 2> /dev/null || :
1073                                 rm -rf "${DBDIR}/$dbtag/$origin/$tabel.run.full" \
1074                                         "${DBDIR}/$dbtag/$origin/$tabel.build.full"
1075                         done
1076                         rm -rf "${DBDIR}/$dbtag/$origin/is_customized"
1077                 done
1078         } | sort -u >> ${DBDIR}/inspected_ports.update
1079         for level in full direct node
1080         do
1081                 fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.${level}.list"
1082         done
1083         fileedit_rm_a_line "$origin" "${DBDIR}/obsolete_ports"
1084         fileedit_rm_a_line "$origin" "${DBDIR}/ports.inspected.list"
1085         cat "${DBDIR}/replace/$origin/origin" 2> /dev/null || :
1086 }
1087
1088 # ============= Clear database directories for a flavored origin =============
1089 database_build_clear_db_dirs ()
1090 {
1091         local origin db
1092         origin=$1
1093         for db in requires replace targets obsolete
1094         do
1095                 rm -rf "${DBDIR}/$db/$origin"
1096         done
1097 }
1098
1099 # ============= Remove configurations for a port permanently =============
1100 database_build_forget ()
1101 {
1102         local origin origin_replace
1103         origin=$1
1104         origin_replace=`_database_build_reset_a_port_confdb "$origin"`
1105         fileedit_rm_a_line "$origin" "${DBDIR}/targets_specified_so_far"
1106         [ -z "$origin_replace" ] || database_build_forget "$origin_replace"
1107         database_build_clear_db_dirs "$origin"
1108 }
1109
1110 # ============= Overlay onto the temporary database so as to re-inspect and reinstall ports whose configurations were changed =============
1111 database_build_patch_reconf ()
1112 {
1113         local origin origin_replace
1114         origin=$1
1115         origin_replace=`_database_build_reset_a_port_confdb "$origin"`
1116         [ -d "${DBDIR}/initial/$origin" -o -d "${DBDIR}/requires/$origin" ] && \
1117                 fileedit_add_a_line_if_new "$origin" "${DBDIR}/stage.loop_list/ports_to_inspect"
1118         fileedit_add_a_line_if_new "$origin" "${DBDIR}/to_be_reconf"
1119         fileedit_rm_a_line "$origin" "${DBDIR}/done_required_ports_to_inspect"
1120         [ -z "$origin_replace" ] || database_build_patch_reconf "$origin_replace"
1121         database_build_clear_db_dirs "$origin"
1122 }
1123
1124 # ============= Post-processes after finishing to inspect dependencies =============
1125 database_build_post_inspect_dependencies ()
1126 {
1127         local table tmpfile
1128         tmpfile=${TMPDIR}/database_build_post_inspect_dependencies
1129         touch "${DBDIR}/obsolete_ports" "${DBDIR}/inspected_ports.update"
1130         find "${DBDIR}/requires" -depth 2 -type d \
1131                 | sed -E 's|.*/([^/]+/[^/]+)$|\1|' > ${DBDIR}/inspected_ports
1132         find "${DBDIR}/initial" -depth 2 -type d \
1133                 | sed -E 's|.*/([^/]+/[^/]+)$|\1|' > ${DBDIR}/inspected_ports.initial
1134         sort -u "${DBDIR}/inspected_ports" "${DBDIR}/inspected_ports.initial" > ${DBDIR}/inspected_ports.all
1135         {
1136                 cat "${DBDIR}/conf/HOLD:PORTS.parsed" || :
1137                 cat "${DBDIR}/need.list" || :
1138         } 2> /dev/null | sort -u > $tmpfile.obsolete_ports.exclude
1139         grep -v -Fx -f "$tmpfile.obsolete_ports.exclude" "${DBDIR}/obsolete_ports" > ${DBDIR}/obsolete_ports.can_be_deleted || :
1140         cp /dev/null "${DBDIR}/REPLACE.complete_sed_pattern.tmp"
1141         find "${DBDIR}/replace" -depth 3 -type f -name origin | while read nodepath
1142         do
1143                 origin_orig=`expr "$nodepath" : '.*/\([^/][^/]*/[^/][^/]*\)/origin$'`
1144                 origin=`cat "$nodepath"`
1145                 origin_orig_regexp=`str_escape_regexp "$origin_orig"`
1146                 origin_esc=`str_escape_replaceval "$origin"`
1147                 echo "s/^$origin_orig_regexp$/$origin_esc/" >> ${DBDIR}/REPLACE.complete_sed_pattern.tmp
1148         done
1149         mv "${DBDIR}/REPLACE.complete_sed_pattern.tmp" "${DBDIR}/REPLACE.complete_sed_pattern"
1150         if [ `cat "${DBDIR}/inspected_ports.update" 2> /dev/null | wc -l` -gt 0 ]
1151         then
1152                 grep -Fx -f "${DBDIR}/inspected_ports.all" "${DBDIR}/inspected_ports.update" \
1153                         > ${DBDIR}/inspected_ports.update.tmp 2> /dev/null || :
1154                 mv "${DBDIR}/inspected_ports.update.tmp" "${DBDIR}/inspected_ports.update"
1155                 if [ $opt_only_target_scope = yes ]
1156                 then
1157                         touch "${DBDIR}/inspected_ports_only_partially"
1158                 else
1159                         rm -f "${DBDIR}/inspected_ports_only_partially"
1160                 fi
1161                 if program_chk_stage_loop_complete CONVERT_REQUIREMENTS_LIST
1162                 then
1163                         mv "${DBDIR}/inspected_ports.update" "${DBDIR}/stage.loop_list/convert_dependency_lists"
1164                 else
1165                         cat "${DBDIR}/inspected_ports.update" "${DBDIR}/stage.loop_list/convert_dependency_lists" \
1166                                 2> /dev/null | sort -u > ${DBDIR}/stage.loop_list/convert_dependency_lists.tmp
1167                         mv "${DBDIR}/stage.loop_list/convert_dependency_lists.tmp" \
1168                                 "${DBDIR}/stage.loop_list/convert_dependency_lists"
1169                         rm -f "${DBDIR}/inspected_ports.update"
1170                 fi
1171         else
1172                 program_chk_stage_loop_complete CONVERT_REQUIREMENTS_LIST \
1173                         && rm -f "${DBDIR}/stage.loop_list/convert_dependency_lists"
1174         fi
1175         {
1176                 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" "${DBDIR}/need.list" || :
1177                 cat "${DBDIR}/need.list" || :
1178         } 2> /dev/null | sort -u > ${DBDIR}/need.with_replaced.list
1179         for table in requirements dependents itself
1180         do
1181                 [ -e "${DBDIR}/stage.loop_list/target_$table.specified" ] || continue
1182                 sed -E -f "${DBDIR}/REPLACE.complete_sed_pattern" \
1183                         "${DBDIR}/stage.loop_list/target_$table.specified" \
1184                         > ${DBDIR}/stage.loop_list/target_$table.replaced.specified
1185         done
1186         cp /dev/null "${DBDIR}/update_dependencies"
1187 }