forked from HPR/hpr-tools
		
	
		
			
	
	
		
			303 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			303 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/bin/bash - | ||
|  | #=============================================================================== | ||
|  | # | ||
|  | #         FILE: do_state_change | ||
|  | # | ||
|  | #        USAGE: ./do_state_change [-h] [-D] [-m] [-s] [-Y] <epno> | ||
|  | # | ||
|  | #  DESCRIPTION: Script to be invoked via symlinks to perform related tasks | ||
|  | #               relating to show states. | ||
|  | # | ||
|  | #               - When called as 'do_reserve' toggles a '.reserved' marker. | ||
|  | #               - When called as 'do_block' creates the directory if necessary | ||
|  | #                 and makes a dummy 'shownotes.json' as well as a file called | ||
|  | #                 '.dummy'. Doesn't delete any of this since other software | ||
|  | #                 will tidy things. | ||
|  | # | ||
|  | #      OPTIONS: --- | ||
|  | # REQUIREMENTS: --- | ||
|  | #         BUGS: --- | ||
|  | #        NOTES: --- | ||
|  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||
|  | #      VERSION: 0.0.6 | ||
|  | #      CREATED: 2021-06-05 22:04:26 | ||
|  | #     REVISION: 2024-02-06 15:36:02 | ||
|  | # | ||
|  | #=============================================================================== | ||
|  | 
 | ||
|  | set -o nounset                              # Treat unset variables as an error | ||
|  | 
 | ||
|  | SCRIPT=${0##*/} | ||
|  | #DIR=${0%/*} | ||
|  | 
 | ||
|  | # shellcheck disable=SC2034 | ||
|  | VERSION="0.0.6" | ||
|  | 
 | ||
|  | STDOUT="/dev/fd/2" | ||
|  | 
 | ||
|  | # | ||
|  | # Load library functions | ||
|  | # | ||
|  | LIB="$HOME/bin/function_lib.sh" | ||
|  | [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; } | ||
|  | # shellcheck source=/home/cendjm/bin/function_lib.sh | ||
|  | source "$LIB" | ||
|  | 
 | ||
|  | # | ||
|  | # Colour codes | ||
|  | # | ||
|  | define_colours | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _usage | ||
|  | #  DESCRIPTION: Report usage | ||
|  | #   PARAMETERS: None | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | _usage () { | ||
|  |     cat >$STDOUT <<-endusage | ||
|  | Usage: ./${SCRIPT} [-h] [-D] [-m] [-s] [-Y] shownumber | ||
|  | 
 | ||
|  | Version: $VERSION | ||
|  | 
 | ||
|  | Script to be invoked via symlinks to perform related tasks relating to show states | ||
|  | 
 | ||
|  | Options: | ||
|  |   -h                    Print this help | ||
|  |   -D                    Run in debug mode where a lot more information is | ||
|  |                         reported | ||
|  |   -m                    Monochrome mode - no colours | ||
|  |   -s                    Silent mode, output less text about actions | ||
|  |   -Y                    Assume 'Yes' in answer to the prompt | ||
|  | 
 | ||
|  | Arguments: | ||
|  |     shownumber | ||
|  | 
 | ||
|  | Examples | ||
|  |   ./${SCRIPT} -h | ||
|  |   ./${SCRIPT} -m 3112 | ||
|  |   ./${SCRIPT} -D 3112 | ||
|  |   ./${SCRIPT} 3112 | ||
|  |   ./${SCRIPT} -Y 3112 | ||
|  | 
 | ||
|  | endusage | ||
|  |     exit | ||
|  | } | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: exists | ||
|  | #  DESCRIPTION: Determines wheher all paths given as arguments exist | ||
|  | #   PARAMETERS: List of paths | ||
|  | #      RETURNS: True if they all exist, otherwise false | ||
|  | #=============================================================================== | ||
|  | exists () { | ||
|  | 
 | ||
|  |     for path in "$@"; do | ||
|  |         if [[ ! -e $path ]]; then | ||
|  |             return 1 | ||
|  |         fi | ||
|  |     done | ||
|  | 
 | ||
|  |     return | ||
|  | } | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _DEBUG | ||
|  | #  DESCRIPTION: Writes one or more messages if in DEBUG mode. Each argument is | ||
|  | #               seen as a message and is written on a separate line. | ||
|  | #               References the global variable 'DEBUG' which is expected to be | ||
|  | #               True if debug output is wanted. | ||
|  | #   PARAMETERS: List of messages | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | _DEBUG () { | ||
|  |     [ "$DEBUG" == 0 ] && return | ||
|  |     for msg in "$@"; do | ||
|  |         printf 'D> %s\n' "$msg" | ||
|  |     done | ||
|  | } | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _verbose | ||
|  | #  DESCRIPTION: Writes a message in verbose mode | ||
|  | #   PARAMETERS: $1      message | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | _verbose () { | ||
|  |     [ "$VERBOSE" -eq 0 ] && return | ||
|  |     for msg in "$@"; do | ||
|  |         printf '%s\n' "$msg" | ||
|  |     done | ||
|  | } | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _silent | ||
|  | #  DESCRIPTION: Writes a message unless in silent mode | ||
|  | #   PARAMETERS: $1      message | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | _silent () { | ||
|  |     [ "$SILENT" -eq 1 ] && return | ||
|  |     for msg in "$@"; do | ||
|  |         printf '%s\n' "$msg" | ||
|  |     done | ||
|  | } | ||
|  | 
 | ||
|  | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|  | 
 | ||
|  | # | ||
|  | # Paths to files | ||
|  | # | ||
|  | BASENAME="$HOME/HPR/Show_Submission" | ||
|  | TPL="$BASENAME/shownotes/hpr%d/%s" | ||
|  | 
 | ||
|  | # | ||
|  | # Option defaults | ||
|  | # | ||
|  | COLOUR=1 # use colours by default | ||
|  | YES=0    # prompt for yes/no by default | ||
|  | TOGGLE=0 # marker can't be removed by default | ||
|  | 
 | ||
|  | # | ||
|  | # Process options | ||
|  | # | ||
|  | while getopts :hDmsY opt | ||
|  | do | ||
|  |     case "${opt}" in | ||
|  |         h) _usage;; | ||
|  |         D) DEBUG=1;; | ||
|  |         m) COLOUR=0;; | ||
|  |         s) SILENT=1;; | ||
|  |         Y) YES=1;; | ||
|  |         ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;; | ||
|  |     esac | ||
|  | done | ||
|  | shift $((OPTIND - 1)) | ||
|  | 
 | ||
|  | DEBUG=${DEBUG:-0} | ||
|  | SILENT=${SILENT:-0} | ||
|  | 
 | ||
|  | # | ||
|  | # Cancel colours if requested | ||
|  | # | ||
|  | if [[ $COLOUR -eq 0 ]]; then | ||
|  |     undefine_colours | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Determine actions depending on how the script was called. Save filenames in | ||
|  | # an array. | ||
|  | # | ||
|  | declare -a MK MFILES | ||
|  | case "${SCRIPT#*/}" in | ||
|  |     do_reserve) | ||
|  |         MK+=('.reserved') | ||
|  |         state='reserved' | ||
|  |         TOGGLE=1 | ||
|  |         ;; | ||
|  |     do_block) | ||
|  |         echo "Blocking of pending shows is not needed any more." | ||
|  |         echo "See Journal for details (2024-02-06)" | ||
|  |         exit | ||
|  | #         MK+=('shownotes.json') | ||
|  | #         MK+=('.dummy') | ||
|  | #         state='blocked' | ||
|  | #         TOGGLE=0 | ||
|  |         ;; | ||
|  |     *) | ||
|  |         echo "Don't call this script directly; use one of its soft links" | ||
|  |         echo "D> $0 $*" | ||
|  |         exit 1 | ||
|  |         ;; | ||
|  | esac | ||
|  | 
 | ||
|  | # | ||
|  | # Check the argument after any options | ||
|  | # | ||
|  | if [[ $# -ne 1 ]]; then | ||
|  |     echo "$SCRIPT: ${red}Usage: $SCRIPT shownumber${reset}" | ||
|  |     exit | ||
|  | fi | ||
|  | show="$1" | ||
|  | 
 | ||
|  | # | ||
|  | # I used 'hpr4065' by mistake today, so we need to check the show specification | ||
|  | # | ||
|  | if [[ $show =~ ^(hpr)?([0-9]+)$ ]]; then | ||
|  |     printf -v show '%04d' "${BASH_REMATCH[2]}" | ||
|  | else | ||
|  |     echo "$SCRIPT: ${red}Invalid show specification: $show${reset}" | ||
|  |     exit | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Build the path(s) to the marker(s) in an array | ||
|  | # | ||
|  | # shellcheck disable=SC2059 | ||
|  | for fn in "${MK[@]}"; do | ||
|  |     printf -v path "$TPL" "$show" "$fn" | ||
|  |     MFILES+=("$path") | ||
|  | done | ||
|  | 
 | ||
|  | # | ||
|  | # Path to the show directory | ||
|  | # | ||
|  | SHOWDIR="$BASENAME/shownotes/hpr${show}" | ||
|  | 
 | ||
|  | # | ||
|  | # Report the settings in debug mode | ||
|  | # | ||
|  | _DEBUG "Called as = $0" \ | ||
|  |        "Show number = $show" \ | ||
|  |        "MK = ${MK[*]}" \ | ||
|  |        "state = $state" \ | ||
|  |        "TOGGLE = $TOGGLE" \ | ||
|  |        "MFILES = ${MFILES[*]}" \ | ||
|  |        "SHOWDIR = $SHOWDIR" | ||
|  | 
 | ||
|  | # | ||
|  | # We need a show directory. If it doesn't exist then we'll create it because | ||
|  | # other scripts will use it. | ||
|  | # | ||
|  | if [[ ! -d $SHOWDIR ]]; then | ||
|  |     echo "${red}There is no directory for show $show${reset}" | ||
|  | 
 | ||
|  |     # | ||
|  |     # If the -Y option was not chosen ask with 'yes_no'. It -Y was chosen | ||
|  |     # we're to go ahead regardless. This relies on the fact that Bash | ||
|  |     # "short-circuits" logical expressions like this. | ||
|  |     # | ||
|  |     if [[ $YES -eq 1 ]] || yes_no 'Create directory? %s ' 'N'; then | ||
|  |         mkdir "$SHOWDIR" | ||
|  |         _silent "${green}Directory created for show $show${reset}" | ||
|  |     else | ||
|  |         _silent "${yellow}Not changed${reset}" | ||
|  |     fi | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # If the marker exists and we can toggle it, we'll do so. If no toggle, we | ||
|  | # report the marker presence or set it as appropriate. | ||
|  | # | ||
|  | if exists "${MFILES[@]}"; then | ||
|  |     if [[ $TOGGLE -eq 1 ]]; then | ||
|  |         _silent "${yellow}Show $show has a '$state' marker${reset}" | ||
|  |         if [[ $YES -eq 1 ]] || yes_no 'Remove marker? %s ' 'N'; then | ||
|  |             rm -f "${MFILES[@]}" | ||
|  |             _silent "${green}Removed '$state' marker for show $show${reset}" | ||
|  |         else | ||
|  |             _silent "${yellow}Not changed${reset}" | ||
|  |         fi | ||
|  |     else | ||
|  |         echo "${red}Show $show is already marked '$state'${reset}" | ||
|  |     fi | ||
|  | else | ||
|  |     _silent "${yellow}Show $show has no '$state' marker${reset}" | ||
|  |     touch "${MFILES[@]}" | ||
|  |     _silent "${green}Marked show $show as '$state'${reset}" | ||
|  | fi | ||
|  | 
 | ||
|  | exit | ||
|  | 
 | ||
|  | # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21 |