OSDN Git Service

dac453f8f386f11c6475c11785b6133c72e46957
[portsreinstall/current.git] / lib / main / libcommand.sh
1 #!/bin/sh -e
2 # ==============================================================================
3 # portsreinstall library script
4 # Overlay onto lib/libcommand.sh
5 # - Operations of commands as well as check of command line arguments -
6 # Copyright (C) 2013-2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
7 # This software is distributed under the 2-Clause BSD License.
8 # ==============================================================================
9
10 # ============= Check the necessity of opening notice =============
11 command_all_chk_need_opening_notice ()
12 {
13         [ $COMMAND_MODE = do -o $COMMAND_MODE = redo -o $COMMAND_MODE = forget ]
14 }
15
16 # ============= Execute command operations before getting the temporary database ready =============
17 command_all_exec_before_db_creation ()
18 {
19         local COMMAND_RESTART COMMAND_MODE COMMAND_OPERATION
20         COMMAND_RESTART="$@"
21         COMMAND_MODE=${1:-do}
22         shift || :
23         case $COMMAND_MODE in
24         clean )
25                 COMMAND_OPERATION=${1:-normal}
26                 shift || :
27                 _command_parse_args__chk_no_arg $#
28                 case $COMMAND_OPERATION in
29                 force )
30                         message_echo "INFO: The temporary database is tried to be cleaned up without checking the privilege."
31                         database_maintain_clean_all
32                         message_echo "Done"
33                         exit
34                         ;;
35                 esac
36                 ;;
37         esac
38 }
39
40 # ============= Check and parse command line arguments =============
41 command_all_parse_args ()
42 {
43         local num_args_init
44         num_args_init=$#
45         COMMAND_RESTART="$@"
46         COMMAND_MODE=${1:-do}
47         shift || :
48         case $COMMAND_MODE in
49         clean )
50                 COMMAND_OPERATION=${1:-normal}
51                 shift || :
52                 case $COMMAND_OPERATION in
53                 normal )
54                         misc_chk_privilege
55                         ;;
56                 esac
57                 _command_parse_args__chk_no_arg $#
58                 ;;
59         reset )
60                 misc_chk_privilege
61                 COMMAND_OPERATION=${1:-all}
62                 shift || :
63                 case $COMMAND_OPERATION in
64                 all | keepopts | keepstatus )
65                         ;;
66                 *)
67                         message_echo "ERROR: Invalid operation [$COMMAND_OPERATION]; it must be empty, \"all\" or \"keepopts\"." >&2
68                         exit 1
69                         ;;
70                 esac
71                 _command_parse_args__chk_no_arg $#
72                 ;;
73         ok | taboo | freeze | need | noneed )
74                 misc_chk_privilege
75                 [ $COMMAND_MODE = ok ] && database_query_chk_preparation_completion
76                 temp_warn_obsolete_temp_db >&2
77                 COMMAND_OPERATION=$1
78                 shift || :
79                 case $COMMAND_OPERATION in
80                 add | del )
81                         ;;
82                 '' )
83                         message_echo "ERROR: Missing operation which must be \"add\" or \"del\"." >&2
84                         exit 1
85                         ;;
86                 *)
87                         message_echo "ERROR: Invalid operation [$COMMAND_OPERATION]; it must be \"add\" or \"del\"." >&2
88                         exit 1
89                         ;;
90                 esac
91                 _command_parse_args__chk_glob_args $#
92                 ;;
93         reselect )
94                 misc_chk_privilege
95                 database_query_chk_preparation_completion
96                 temp_warn_obsolete_temp_db >&2
97                 COMMAND_OPERATION=$1
98                 shift || :
99                 case $COMMAND_OPERATION in
100                 leaves )
101                         if [ -e "${DBDIR}/inspected_ports_only_partially" ]
102                         then
103                                 message_echo "ERROR: Leaf ports cannot be analyzed because the dependency inspection is partial." >&2
104                                 message_echo "Executing redo command with -N option by disabling -o option fixes this situation." >&2
105                                 exit 1
106                         fi
107                         ;;
108                 obsolete )
109                         ;;
110                 '' )
111                         message_echo "ERROR: Missing operation which must be \"leaves\" or \"obsolete\"." >&2
112                         exit 1
113                         ;;
114                 *)
115                         message_echo "ERROR: Invalid operation [$COMMAND_OPERATION]; it must be \"leaves\" or \"obsolete\"." >&2
116                         exit 1
117                         ;;
118                 esac
119                 _command_parse_args__chk_glob_args $#
120                 ;;
121         save )
122                 misc_chk_privilege
123                 if [ ! -d "${DBDIR}" ]
124                 then
125                         message_echo "ERROR: The temporary database has not been created yet." >&2
126                         exit 1
127                 fi
128                 COMMAND_SAVE_DIR=$1
129                 shift || :
130                 _command_parse_args__chk_no_arg $#
131                 if [ -z "$COMMAND_SAVE_DIR" ]
132                 then
133                         message_echo "ERROR: Directory to save the temporary database archive is not specified." >&2
134                         exit 1
135                 fi
136                 if [ ! -d "$COMMAND_SAVE_DIR" ]
137                 then
138                         message_echo "ERROR: Directory [$COMMAND_SAVE_DIR] is not found." >&2
139                         exit 1
140                 fi
141                 ;;
142         load )
143                 misc_chk_privilege
144                 if database_maintain_chk_use
145                 then
146                         message_echo "ERROR: A temporary database exists." >&2
147                         message_echo "You must execute" >&2
148                         message_echo "        ${APPNAME} clean" >&2
149                         message_echo "before executing \"load\" command." >&2
150                         exit 1
151                 fi
152                 COMMAND_LOAD_FILE=$1
153                 shift || :
154                 _command_parse_args__chk_no_arg $#
155                 if [ -z "$COMMAND_LOAD_FILE" ]
156                 then
157                         message_echo "ERROR: No temporary database archive is specified." >&2
158                         exit 1
159                 fi
160                 if [ ! -f "$COMMAND_LOAD_FILE" ]
161                 then
162                         message_echo "ERROR: No such temporary database archive is found." >&2
163                         exit 1
164                 fi
165                 COMMAND_LOAD_FILE=`realpath "$COMMAND_LOAD_FILE"`
166                 ;;
167         glob | pkg )
168                 _command_parse_args__chk_glob_args $#
169                 ;;
170         options )
171                 _command_parse_args__chk_no_arg $#
172                 ;;
173         reconf | rmconf | forget | escape | restore | make )
174                 misc_chk_privilege
175                 temp_warn_obsolete_temp_db >&2
176                 _command_parse_args__chk_glob_args $#
177                 ;;
178         pkgsanity )
179                 misc_chk_privilege
180                 temp_warn_obsolete_temp_db >&2
181                 ;;
182         packupgrade )
183                 misc_chk_privilege
184                 COMMAND_OPERATION=$1
185                 shift || :
186                 case $COMMAND_OPERATION in
187                 create | clean )
188                         _command_parse_args__chk_no_arg $#
189                         ;;
190                 crop )
191                         COMMAND_PACKUPGRADE_SAVEPATH=${1:-${PROGRAM}-upgrade.tar.gz}
192                         shift || :
193                         _command_parse_args__chk_no_arg $#
194                         [ ! -d "${COMMAND_PACKUPGRADE_SAVEPATH}" ] ||  COMMAND_PACKUPGRADE_SAVEPATH=${COMMAND_PACKUPGRADE_SAVEPATH}/${PROGRAM}-upgrade.tar.gz
195                         ;;
196                 *)
197                         message_echo "ERROR: Invalid operation [$COMMAND_OPERATION]; it must be \"create\" \"crop\" or \"clean\"." >&2
198                         exit 1
199                         ;;
200                 esac
201                 ;;
202         show )
203                 case $COMMAND_SHOW_SUBJECT in
204                 todo | done | redo | resolved | failure | deleted | restored | fossil | conflict | leaves | obsolete )
205                         database_query_chk_preparation_completion;;
206                 esac
207                 temp_warn_obsolete_temp_db >&2
208                 if ! expr "$1" : '@.*' > /dev/null
209                 then
210                         COMMAND_SHOW_SUBJECT=${1:-todo}
211                         shift || :
212                 else
213                         COMMAND_SHOW_SUBJECT=todo
214                 fi
215                 COMMAND_SHOW_OPTIONS=$1
216                 if expr "$COMMAND_SHOW_OPTIONS" : '@.*' > /dev/null
217                 then
218                         COMMAND_SHOW_DEPTAG=`expr "$COMMAND_SHOW_OPTIONS," : '@\(.*\)' | cut -d , -f 1` || :
219                         COMMAND_SHOW_LEVEL=`expr "$COMMAND_SHOW_OPTIONS," : '@\(.*\)' | cut -d , -f 2` || :
220                         case $COMMAND_SHOW_DEPTAG in
221                         all | run | build | '' )        ;;
222                         *)
223                                 message_echo "ERROR: Invalid show option [$COMMAND_SHOW_OPTIONS]." >&2
224                                 exit 1
225                                 ;;
226                         esac
227                         case $COMMAND_SHOW_LEVEL in
228                         full | direct | '' )    ;;
229                         *)
230                                 message_echo "ERROR: Invalid show option [$COMMAND_SHOW_OPTIONS]." >&2
231                                 exit 1
232                                 ;;
233                         esac
234                         shift || :
235                 fi
236                 case $COMMAND_SHOW_SUBJECT in
237                 todo | done | redo | resolved | inst_by_pkg | inst_built_default | inst_built_custom | failure | taboo | freeze | need | noneed | restored | deleted | fossil | conflict )
238                         _command_parse_args__chk_no_arg $#
239                         ;;
240                 leaves | obsolete )
241                         COMMAND_SHOW_KEYWORD=$1
242                         case $COMMAND_SHOW_KEYWORD in
243                         '' | selected | unselected )    ;;
244                         *)
245                                 message_echo "ERROR: Invalid show $COMMAND_SHOW_SUBJECT keyword [$COMMAND_SHOW_KEYWORD]." >&2
246                                 exit 1
247                                 ;;
248                         esac
249                         shift || :
250                         _command_parse_args__chk_no_arg $#
251                         ;;
252                 build_conflict_pkgs | inst_conflict_pkgs | initrequirements | requirements | initdependents | dependents | conflict_files | status | errormessage )
253                         _command_parse_args__chk_glob_args $#
254                         ;;
255                 *)
256                         message_echo "ERROR: Invalid subject [$COMMAND_SHOW_SUBJECT]." >&2
257                         exit 1
258                         ;;
259                 esac
260                 ;;
261         all | prepare )
262                 COMMAND_DO_MODE=$COMMAND_MODE
263                 COMMAND_MODE=do
264                 misc_chk_privilege
265                 temp_warn_obsolete_temp_db >&2
266                 _command_parse_args__chk_no_arg $#
267                 ;;
268         redo | do )
269                 COMMAND_DO_MODE=${1:-all}
270                 shift || :
271                 case $COMMAND_DO_MODE in
272                 all | prepare );;
273                 *)
274                         message_echo "ERROR: Invalid operation mode [$COMMAND_DO_MODE]." >&2
275                         exit 1
276                         ;;
277                 esac
278                 misc_chk_privilege
279                 temp_warn_obsolete_temp_db >&2
280                 _command_parse_args__chk_no_arg $#
281                 if [ "$COMMAND_DO_MODE" = prepare ]
282                 then
283                         COMMAND_RESTART=prepare
284                 else
285                         COMMAND_RESTART=
286                 fi
287                 ;;
288         *)
289                 message_echo "ERROR: Invalid command [$COMMAND_MODE]." >&2
290                 exit 1
291                 ;;
292         esac
293         COMMAND_SHIFT=$(($num_args_init - $#))
294 }
295
296 # ============= Notify that option settings are reset =============
297 command_exec_without_pkgtools__notify_reset_options ()
298 {
299         message_echo "NOTE: Option settings are ignored (because of no effect) and reset."
300 }
301
302 # ============= Execute command operations which do not need package tools =============
303 command_all_exec_without_pkgtools ()
304 {
305         case $COMMAND_MODE in
306         clean | load )
307                 command_exec_without_pkgtools__notify_reset_options
308                 case $COMMAND_MODE in
309                 clean )
310                         message_echo "Starting to clean up the temporary database..."
311                         database_maintain_clean_all
312                         ;;
313                 load )
314                         message_echo "Starting to load the temporary database from the archive..."
315                         database_maintain_load "$COMMAND_LOAD_FILE"
316                         ;;
317                 esac
318                 message_echo "Done"
319                 exit
320                 ;;
321         esac
322 }
323
324 # ============= Execute command operations which are irrespective of option settings =============
325 command_all_exec_irrespective_of_saved_options ()
326 {
327         local arcfile origins_match pkgs_match
328         case $COMMAND_MODE in
329         ok )
330                 _command_exec_irrespective_of_saved_options__notify_ignored_options
331                 command_flexconf_update_ok "$@"
332                 exit
333                 ;;
334         taboo | freeze | need | noneed )
335                 _command_exec_irrespective_of_saved_options__notify_ignored_options
336                 mkdir -p "${DBDIR}/journal"
337                 echo "$@" >> ${DBDIR}/journal/$COMMAND_MODE
338                 case $COMMAND_MODE in
339                 taboo )
340                         command_flexconf_update_taboo "$@"
341                         ;;
342                 freeze )
343                         command_flexconf_update_freeze "$@"
344                         ;;
345                 need )
346                         program_deregister_stage_complete DETERMINE_SPECIFIED_TARGETS
347                         program_deregister_stage_complete ALL_COMPLETE
348                         command_flexconf_update_need "$@"
349                         ;;
350                 noneed )
351                         program_deregister_stage_complete INSPECT_PRIMARY_LEAF_PORTS
352                         program_deregister_stage_complete ALL_COMPLETE
353                         command_flexconf_update_noneed "$@"
354                         ;;
355                 esac
356                 exit
357                 ;;
358         reselect )
359                 case $COMMAND_OPERATION in
360                 leaves )
361                         if ! deinstall_select_leaf_ports_to_delete force
362                         then
363                                 case $? in
364                                 2 )
365                                         message_echo "INFO: No leaf port is found."
366                                         ;;
367                                 3 )
368                                         message_echo "INFO: Leaf ports are undefined because requirements of some ports are not fully inspected."
369                                         ;;
370                                 esac
371                         else
372                                 program_deregister_stage_complete COLLECT_LEAF_PORTS_TO_DELETE
373                                 program_deregister_stage_complete ALL_COMPLETE
374                         fi
375                         ;;
376                 obsolete )
377                         if ! deinstall_select_obsolete_ports_to_delete force
378                         then
379                                 case $? in
380                                 2 )
381                                         message_echo "INFO: No obsolete package is found."
382                                         ;;
383                                 esac
384                         else
385                                 program_deregister_stage_complete COLLECT_OBSOLETE_PORTS_TO_DELETE
386                                 program_deregister_stage_complete ALL_COMPLETE
387                         fi
388                         ;;
389                 esac
390                 exit
391                 ;;
392         save )
393                 _command_exec_irrespective_of_saved_options__notify_ignored_options
394                 arcfile=`realpath "$COMMAND_SAVE_DIR"`/${APPNAME}_`date +%Y%m%d_%H%M%S`.tar.gz
395                 message_echo "Starting to save the temporary database as [$arcfile]..."
396                 database_maintain_save "$arcfile"
397                 message_echo "Done"
398                 exit
399                 ;;
400         glob )
401                 _command_exec_irrespective_of_saved_options__notify_ignored_options
402                 origins_match=`pkgsys_eval_ports_glob "$@"`
403                 if  [ -n "$origins_match" ]
404                 then
405                         message_echo "Evaluated flavored port origins are as follows:"
406                         echo "$origins_match"
407                 else
408                         message_echo "No matching flavored port origin is found."
409                 fi
410                 exit
411                 ;;
412         pkg )
413                 _command_exec_irrespective_of_saved_options__notify_ignored_options
414                 message_echo "Evaluated installed package are as follows:"
415                 pkgs_match=`pkgsys_eval_ports_glob "$@" | while read origin
416                 do
417                         pkgsys_get_installed_pkg_from_origin "$origin"
418                 done`
419                 if  [ -n "$pkgs_match" ]
420                 then
421                         message_echo "Evaluated installed package are as follows:"
422                         echo "$pkgs_match"
423                 else
424                         message_echo "ERROR: No matching package is installed." >&2
425                         temp_terminate_process () { :; }
426                         exit 1
427                 fi
428                 exit
429                 ;;
430         reconf | rmconf | forget | escape | restore | pkgsanity | packupgrade )
431                 _command_exec_irrespective_of_saved_options__notify_ignored_options
432                 case $COMMAND_MODE in
433                 reconf | rmconf )
434                         command_pkgs_port_option_conf "$@"
435                         ;;
436                 forget )
437                         command_forget "$@"
438                         ;;
439                 escape )
440                         command_pkgs_escape "$@"
441                         ;;
442                 restore )
443                         command_pkgs_restore "$@"
444                         ;;
445                 pkgsanity )
446                         command_pkgs_pkgsanity "$@"
447                         ;;
448                 packupgrade )
449                         command_pkgs_packupgrade
450                         ;;
451                 esac
452                 message_echo "Done"
453                 exit
454                 ;;
455         redo )
456                 command_do_redo__command_all_exec_irrespective_of_saved_options
457                 ;;
458         esac
459 }
460
461 # ============= Execute command operations which should be done without upgrade of tools =============
462 command_all_exec_before_tools_upgrade ()
463 {
464         local glob origins errno
465         case $COMMAND_MODE in
466         reset )
467                 message_echo "Starting to reset the temporary database by preserving the initial snapshot of installed packages..."
468                 if [ ! -d "${DBDIR}" ]
469                 then
470                         message_echo "INFO: No temporary database is built yet."
471                 else
472                         database_maintain_reset "$COMMAND_OPERATION"
473                         message_echo "INFO: Option settings and taboo/freeze/need/noneed lists are preserved."
474                 fi
475                 message_echo "Done"
476                 exit
477                 ;;
478         options )
479                 options_show_all
480                 exit
481                 ;;
482         show )
483                 command_show "$@"
484                 exit
485                 ;;
486         make )
487                 command_pkgs_make_ports "$@"
488                 exit
489                 ;;
490         esac
491 }
492
493 # ============= Execute command operations which must be done before the database construction =============
494 command_all_exec_command_specific_preconfiguration ()
495 {
496         case $COMMAND_MODE in
497         do )
498                 command_do_do__command_all_exec_command_specific_preconfiguration
499                 ;;
500         redo )
501                 command_do_redo__command_all_exec_command_specific_preconfiguration
502                 ;;
503         esac
504 }
505
506 # ============= Execute command operations of database construction =============
507 command_all_exec_build_database ()
508 {
509         case $COMMAND_MODE in
510         do | redo )
511                 command_do_prepare
512                 ;;
513         esac
514 }
515
516 # ============= Execute command operations which must be done before the main process =============
517 command_all_exec_before_main ()
518 {
519         case $COMMAND_MODE in
520         do | redo )
521                 case $COMMAND_DO_MODE in
522                 prepare )
523                         command_do_end_at_prepare_complete
524                         exit
525                         ;;
526                 esac
527                 ;;
528         esac
529 }
530
531 # ============= Execute command operations as the main process =============
532 command_all_exec_main ()
533 {
534         case $COMMAND_MODE in
535         do | redo )
536                 command_do_main
537                 command_do_ending_process
538                 ;;
539         esac
540 }