You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
4.3 KiB
Bash
210 lines
4.3 KiB
Bash
# chezmoi:template:left-delimiter=#{{
|
|
#{{- /* vim: set filetype=sh: */ -}}
|
|
#shellcheck shell=sh
|
|
|
|
source_env_file() {
|
|
if [ ! -f "${1}" ]; then
|
|
return
|
|
fi
|
|
eval "$(
|
|
grep -v '^\s*\#' "${1}" |
|
|
grep -v '^\s*$' |
|
|
sed 's/^\s*export//g' |
|
|
sed 's/^/export /g'
|
|
)"
|
|
}
|
|
|
|
make_scripts() (
|
|
for FILE in "$@"; do
|
|
make_script "${FILE}"
|
|
done
|
|
)
|
|
|
|
go_deps() (
|
|
GO_MOD=${1:-go.mod}
|
|
START_AT=$(grep -n '^require ($' "${GO_MOD}" | awk -F : '{print $1}' | head -n 1)
|
|
END_AT=$(grep -n '^)$' "${GO_MOD}" | awk -F : '{print $1}' | head -n 1)
|
|
awk 'NR>'"${START_AT}"' && NR<'"${END_AT}"' {print $1}' "${GO_MOD}"
|
|
)
|
|
|
|
#{{ if lookPath "gem" -}}
|
|
#{{ if lookPath "dasel" -}}
|
|
#{{ if lookPath "jq" -}}
|
|
gem_env () (
|
|
NAME=${1:-}
|
|
if [ "$NAME" != '' ]; then
|
|
gem_env_json | jq --raw-output '.["'"${NAME}"'"]'
|
|
else
|
|
gem_env_json
|
|
fi
|
|
)
|
|
|
|
gem_env_json () (
|
|
gem environment \
|
|
| dasel --read yaml --write json \
|
|
| jq '.["RubyGems Environment"] | to_entries | map((.value | keys)[0] as $key | {key: $key, value: .value[$key] }) | from_entries'
|
|
)
|
|
#{{- end }}
|
|
#{{- end }}
|
|
#{{- end }}
|
|
|
|
make_script() (
|
|
cat <<-EOF > "${1}"
|
|
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
main() (
|
|
echo "todo"
|
|
)
|
|
|
|
main "$@"
|
|
EOF
|
|
chmod +x "${1}"
|
|
)
|
|
|
|
add_date_prefix() (
|
|
DIR=$(dirname "$1")
|
|
FILE=$(basename "$1")
|
|
DATE=$(date -r "$1" +"%F")
|
|
if [ ! -f "$1" ]; then
|
|
echo "unknown file: $1"
|
|
exit 1
|
|
fi
|
|
mv "$1" "$DIR/${DATE}_${FILE}"
|
|
)
|
|
|
|
get_bitrate() (
|
|
if [ ! -f "$1" ]; then
|
|
echo "[ERROR] unknown file: $1"
|
|
exit 1
|
|
fi
|
|
command_installed exiftool
|
|
exiftool -AudioBitrate "$1" | awk '{print $4}'
|
|
)
|
|
|
|
json_to_yaml() (
|
|
ARG=${1-}
|
|
command_installed bat dasel
|
|
if [ -z "${ARG}" ]; then
|
|
dasel --read json --write yaml | bat --language yaml
|
|
elif [ -f "${ARG}" ]; then
|
|
dasel --read json --write yaml --file "${ARG}" | bat --language yaml
|
|
else
|
|
echo "${ARG}" | dasel --read json --write yaml | bat --language yaml
|
|
fi
|
|
)
|
|
|
|
yaml_to_json() (
|
|
ARG=${1-}
|
|
command_installed bat dasel
|
|
if [ -z "${ARG}" ]; then
|
|
dasel --read yaml --write json | bat --language json
|
|
elif [ -f "${ARG}" ]; then
|
|
dasel --read yaml --write json --file "${ARG}" | bat --language json
|
|
else
|
|
echo "${ARG}" | dasel --read yaml --write json | bat --language json
|
|
fi
|
|
)
|
|
|
|
#{{ if lookPath "rg" -}}
|
|
github_install_scripts () (
|
|
rg github.com "${HOME}/.local/bin" \
|
|
| sed 's/:/ /' \
|
|
| sed 's/=/ /g' \
|
|
| awk '{print $3}' \
|
|
| sed 's|https://github.com/||g' \
|
|
| sed 's|/| |g' \
|
|
| awk '{print $1 " " $2}' \
|
|
| sed 's| |/|g' \
|
|
| sort \
|
|
| uniq
|
|
)
|
|
|
|
github_install_scripts_latest_releases() (
|
|
for REPO in $(github_install_scripts); do
|
|
echo "${REPO} $(github_latest_release "${REPO}")"
|
|
done
|
|
)
|
|
#{{- end }}
|
|
|
|
github_latest_release() (
|
|
github_tags "$@" | head -n 1
|
|
)
|
|
|
|
github_releases() (
|
|
USER=${1}
|
|
REPO=${2-}
|
|
command_installed curl
|
|
if [ -z "${REPO}" ]; then
|
|
USER=$(echo "${1}" | sed 's|/| |g' | awk '{print $1}')
|
|
REPO=$(echo "${1}" | sed 's|/| |g' | awk '{print $2}')
|
|
fi
|
|
curl --silent --header "Accept: application/vnd.github.v3+json" \
|
|
"https://api.github.com/repos/${USER}/${REPO}/releases"
|
|
)
|
|
|
|
github_tags() (
|
|
USER=${1}
|
|
REPO=${2-}
|
|
command_installed curl jq
|
|
if [ -z "${REPO}" ]; then
|
|
USER=$(echo "${1}" | sed 's|/| |g' | awk '{print $1}')
|
|
REPO=$(echo "${1}" | sed 's|/| |g' | awk '{print $2}')
|
|
fi
|
|
curl --silent --header "Accept: application/vnd.github.v3+json" \
|
|
"https://api.github.com/repos/${USER}/${REPO}/tags" |
|
|
jq -r '.[].name'
|
|
)
|
|
|
|
command_installed() (
|
|
set -ue
|
|
for cmd in "${@}"; do
|
|
if ! command -v "${cmd}" 1>&2 >/dev/null; then
|
|
echo "${cmd} not installed" 1>&2
|
|
exit 1
|
|
fi
|
|
done
|
|
)
|
|
|
|
min_jpg() (
|
|
set -ue
|
|
command_installed jpegtran
|
|
for FILE in "$@" ; do
|
|
PERMISSIONS=$(stat --format '%a' "${FILE}")
|
|
OUT_FILE=$(mktemp)
|
|
jpegtran -optimize -perfect -outfile "${OUT_FILE}" "${FILE}"
|
|
mv "${OUT_FILE}" "${FILE}"
|
|
chmod "${PERMISSIONS}" "${FILE}"
|
|
done
|
|
)
|
|
|
|
min_png() (
|
|
set -ue
|
|
command_installed pngcrush
|
|
for FILE in "$@" ; do
|
|
PERMISSIONS=$(stat --format '%a' "${FILE}")
|
|
OUT_FILE=$(mktemp)
|
|
pngcrush -rem alla -reduce -brute "${FILE}" "${OUT_FILE}"
|
|
mv "${OUT_FILE}" "${FILE}"
|
|
chmod "${PERMISSIONS}" "${FILE}"
|
|
done
|
|
)
|
|
|
|
get_create_date() (
|
|
date -r "$1" +"%F"
|
|
)
|
|
|
|
#shellcheck disable=SC2120
|
|
slugify() (
|
|
if [ "$#" -ne 0 ]; then
|
|
#shellcheck disable=SC2119
|
|
echo "$@" | slugify
|
|
else
|
|
iconv --to-code ascii//TRANSLIT |
|
|
sed -E 's/[^a-zA-Z0-9]+/-/g' |
|
|
sed -E 's/^-+\|-+$//g' |
|
|
tr '[:upper:]' '[:lower:]'
|
|
fi
|
|
)
|