Files
debian-vnc-xfce-g3/utils/util-readme.sh
2024-01-29 19:43:18 -06:00

372 lines
11 KiB
Bash
Executable File

#!/bin/bash -e
### @accetto, December 2020
### https://github.com/accetto/ubuntu-vnc-xfce-g3
### https://github.com/accetto/ubuntu-vnc-xfce-g3/wiki
# ARG_VERSION([echo $0 v22.11.04])
# ARG_HELP([Utility for previewing README files intended for Docker Hub. The prepared files can be manually copy-and-pasted to Docker Hub. The utility should be run from the '/utils' directory.])
#
# ARG_POSITIONAL_SINGLE([command],[Command to execute. Available commands: \n \
# cleanup - Deletes the previously generated README preview and other helper files. \n \
# This is the default command if both <command> and <repo> are empty. \n \
# preview - Generates the README preview file and checks its length. \n \
# This is the default command if <command> is empty, but <repo> is not. \n \
#],[""])
#
# ARG_DEFAULTS_POS([])
# ARG_POSITIONAL_DOUBLEDASH([])
#
# ARG_OPTIONAL_SINGLE([repo],[],[Target Docker Hub repository (owner/repo)],[""])
# ARG_OPTIONAL_SINGLE([context],[],[Path to the readme files (relative to '/utils', e.g. '../docker/xfce')],[""])
# ARG_OPTIONAL_SINGLE([readme],[],[Readme file main part name],[README-dockerhub.md])
# ARG_OPTIONAL_SINGLE([template],[],[Readme appendix template file name],[readme-append.template])
# ARG_OPTIONAL_SINGLE([limit],[],[Max. length of the final README file in bytes (max. 25000)],[25000])
# ARG_OPTIONAL_SINGLE([gist],[],[Gist ID containing off-line metadata (e.g. badge endpoints)(alternatively set 'DEPLOY_GIST_ID' environment variable)])
#
# ARGBASH_GO()
# needed because of Argbash --> m4_ignore([
### START OF CODE GENERATED BY Argbash v2.10.0 one line above ###
# Argbash is a bash code generator used to get arguments parsing right.
# Argbash is FREE SOFTWARE, see https://argbash.dev for more info
die()
{
local _ret="${2:-1}"
test "${_PRINT_HELP:-no}" = yes && print_help >&2
echo "$1" >&2
exit "${_ret}"
}
begins_with_short_option()
{
local first_option all_short_options='vh'
first_option="${1:0:1}"
test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0
}
# THE DEFAULTS INITIALIZATION - POSITIONALS
_positionals=()
_arg_command=""
# THE DEFAULTS INITIALIZATION - OPTIONALS
_arg_repo=""
_arg_context=""
_arg_readme="README-dockerhub.md"
_arg_template="readme-append.template"
_arg_limit="25000"
_arg_gist=
print_help()
{
printf '%s\n' "Utility for previewing README files intended for Docker Hub. The prepared files can be manually copy-and-pasted to Docker Hub. The utility should be run from the '/utils' directory."
printf 'Usage: %s [-v|--version] [-h|--help] [--repo <arg>] [--context <arg>] [--readme <arg>] [--template <arg>] [--limit <arg>] [--gist <arg>] [--] [<command>]\n' "$0"
printf '\t%s\n' "<command>: Command to execute. Available commands:
\
# cleanup - Deletes the previously generated README preview and other helper files.
\
# This is the default command if both <command> and <repo> are empty.
\
# preview - Generates the README preview file and checks its length.
\
# This is the default command if <command> is empty, but <repo> is not.
\
# (default: '""')"
printf '\t%s\n' "-v, --version: Prints version"
printf '\t%s\n' "-h, --help: Prints help"
printf '\t%s\n' "--repo: Target Docker Hub repository (owner/repo) (default: '""')"
printf '\t%s\n' "--context: Path to the readme files (relative to '/utils', e.g. '../docker/xfce') (default: '""')"
printf '\t%s\n' "--readme: Readme file main part name (default: 'README-dockerhub.md')"
printf '\t%s\n' "--template: Readme appendix template file name (default: 'readme-append.template')"
printf '\t%s\n' "--limit: Max. length of the final README file in bytes (max. 25000) (default: '25000')"
printf '\t%s\n' "--gist: Gist ID containing off-line metadata (e.g. badge endpoints)(alternatively set 'DEPLOY_GIST_ID' environment variable) (no default)"
}
parse_commandline()
{
_positionals_count=0
while test $# -gt 0
do
_key="$1"
if test "$_key" = '--'
then
shift
test $# -gt 0 || break
_positionals+=("$@")
_positionals_count=$((_positionals_count + $#))
shift $(($# - 1))
_last_positional="$1"
break
fi
case "$_key" in
-v|--version)
echo $0 v22.11.04
exit 0
;;
-v*)
echo $0 v22.11.04
exit 0
;;
-h|--help)
print_help
exit 0
;;
-h*)
print_help
exit 0
;;
--repo)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_repo="$2"
shift
;;
--repo=*)
_arg_repo="${_key##--repo=}"
;;
--context)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_context="$2"
shift
;;
--context=*)
_arg_context="${_key##--context=}"
;;
--readme)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_readme="$2"
shift
;;
--readme=*)
_arg_readme="${_key##--readme=}"
;;
--template)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_template="$2"
shift
;;
--template=*)
_arg_template="${_key##--template=}"
;;
--limit)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_limit="$2"
shift
;;
--limit=*)
_arg_limit="${_key##--limit=}"
;;
--gist)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_gist="$2"
shift
;;
--gist=*)
_arg_gist="${_key##--gist=}"
;;
*)
_last_positional="$1"
_positionals+=("$_last_positional")
_positionals_count=$((_positionals_count + 1))
;;
esac
shift
done
}
handle_passed_args_count()
{
test "${_positionals_count}" -le 1 || _PRINT_HELP=yes die "FATAL ERROR: There were spurious positional arguments --- we expect between 0 and 1, but got ${_positionals_count} (the last one was: '${_last_positional}')." 1
}
assign_positional_args()
{
local _positional_name _shift_for=$1
_positional_names="_arg_command "
shift "$_shift_for"
for _positional_name in ${_positional_names}
do
test $# -gt 0 || break
eval "$_positional_name=\${1}" || die "Error during argument parsing, possibly an Argbash bug." 1
shift
done
}
parse_commandline "$@"
handle_passed_args_count
assign_positional_args 1 "${_positionals[@]}"
# OTHER STUFF GENERATED BY Argbash
### END OF CODE GENERATED BY Argbash (sortof) ### ])
# [ <-- needed because of Argbash
### #####################
### USER CODE BEGINS HERE
### #####################
dump_args() {
printf "Value of '%s': %s\\n" 'command' "${_arg_command}"
printf "Value of '%s': %s\\n" 'repo' "${_arg_repo}"
printf "Value of '%s': %s\\n" 'context' "${_arg_context}"
printf "Value of '%s': %s\\n" 'readme' "${_arg_readme}"
printf "Value of '%s': %s\\n" 'template' "${_arg_template}"
printf "Value of '%s': %s\\n" 'limit' "${_arg_limit}"
printf "Value of '%s': %s\\n" 'gist' "${_arg_gist}"
}
do_cleanup() {
rm -f "${_scrap_append_file}" "${_readme_upload_file}"
echo "Cleanup finished."
}
do_preview() {
local repo="${_arg_repo}"
local readme_context="${_arg_context}"
local readme_main="${_arg_readme}"
local readme_append="${_arg_template}"
local gist="${_arg_gist:-${DEPLOY_GIST_ID}}"
local readme_append_file
local readme_main_file
local repo_name
local repo_owner
local -i size
local -i delta
if [[ -z ${_arg_repo} ]] ; then
die "Repository (owner/repo) must be provided."
fi
if [[ -z "${readme_context}" ]] ; then
die "Readme context must be provided."
fi
if [[ -z "${readme_main}" ]] ; then
die "Readme main part file name must be provided."
fi
readme_main_file="${readme_context}/${readme_main}"
if [[ ! -f "${readme_main_file}" ]] ; then
die "Missing readme main part file: '${readme_main_file}' "
fi
### readme appendix template is optional
if [[ -n "${readme_append}" ]] ; then
readme_append_file="${readme_context}/${readme_append}"
if [[ ! -f "${readme_append_file}" ]] ; then
die "Missing readme appendix template file: '${readme_append_file}' "
fi
if [[ -z "${gist}" ]] ; then
die "Deployment gist ID must provided as a parameter or 'DEPLOY_GIST_ID' environment variable!"
fi
fi
### extract the repo owner and its name
### alternative 1
repo_name="$(basename $repo)"
repo_owner="$(basename $(dirname ${repo}))"
### alternative 2
# repo_name="${repo##*/}"
# repo_owner="${repo%$repo_name}" ; repo_owner="${repo_owner::-1}" ; repo_owner="${repo_owner##*/}"
### also ensure that the deployment repo has only two parts like 'repo_owner/repo_name'
# _deployment_repo="$(basename $(dirname ${repo}))/$(basename ${repo})"
_deployment_repo="${repo_owner}/${repo_name}"
### create the actual README file for Docker Hub by replacing the variables in the append-template (badge links)
### and appending it to the main-readme partial file
### it is expected that the readme include template contains the following variables:
### ${OWNER} - owner of the deployment repository and also the related deployment gist
### ${GIST} - gist containing the badge endpoints
### ${REPO} - name of the deployment repository
### readme appendix templating is optional
if [[ -n "${readme_append}" ]] ; then
### replace the environment variables in the template
( OWNER="${repo_owner}" GIST="${gist}" REPO="${repo_name}" envsubst < "${readme_append_file}" > "${_scrap_append_file}" )
### append the updated template to the main readme part
cat "${readme_main_file}" "${_scrap_append_file}" > "${_readme_upload_file}"
rm -f "${_scrap_append_file}"
else
### no appendix and no templating
cp "${readme_main_file}" "${_readme_upload_file}"
fi
echo "Readme preview: ${_readme_upload_file} "
size=$( wc --bytes "${_readme_upload_file}" | awk '{print $1}' )
delta=$((_arg_limit-size))
echo "Readme length is ${size} bytes, leaving ${delta} bytes available (max. ${_arg_limit}). "
}
main() {
### just debugging support
# dump_args
case ${_arg_command,,} in
cleanup )
do_cleanup "${_scrap_append_file}" "${_readme_upload_file}"
;;
preview )
do_cleanup "${_scrap_append_file}" "${_readme_upload_file}"
do_preview
;;
* )
if [[ -z "${_arg_command}" ]] ; then
if [[ -z "${_arg_repo}" ]] ; then
do_cleanup
else
do_preview
fi
else
die "Unsupported command '${_arg_command}' "
fi
;;
esac
}
### ################
### MAIN ENTRY POINT
### ################
declare _current_dir
declare _deployment_repo
declare _readme_upload_file
declare _scrap_append_file
_current_dir=$(dirname $0)
_scrap_append_file="${_current_dir}/scrap-append.tmp"
_readme_upload_file="${_current_dir}/scrap-readme.md"
main
# ] <-- needed because of Argbash