web/tools/init
Cotes Chung 7808ee157c
chore: move starter workflow into subfolder
The `.hook` suffix does not make it easy to maintain code in the editor
2024-04-14 04:45:52 +08:00

140 lines
2.5 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Init the environment for new user.
set -eu
# CLI Dependencies
CLI=("git" "npm")
ACTIONS_WORKFLOW=pages-deploy.yml
# temporary file suffixes that make `sed -i` compatible with BSD and Linux
TEMP_SUFFIX="to-delete"
_no_gh=false
help() {
echo "Usage:"
echo
echo " bash /path/to/init [options]"
echo
echo "Options:"
echo " --no-gh Do not deploy to Github."
echo " -h, --help Print this help information."
}
# BSD and GNU compatible sed
_sedi() {
regex=$1
file=$2
sed -i.$TEMP_SUFFIX "$regex" "$file"
rm -f "$file".$TEMP_SUFFIX
}
_check_cli() {
for i in "${!CLI[@]}"; do
cli="${CLI[$i]}"
if ! command -v "$cli" &>/dev/null; then
echo "Command '$cli' not found! Hint: you should install it."
exit 1
fi
done
}
_check_status() {
if [[ -n $(git status . -s) ]]; then
echo "Error: Commit unstaged files first, and then run this tool again."
exit 1
fi
}
_check_init() {
local _has_inited=false
if [[ ! -d .github ]]; then # using option `--no-gh`
_has_inited=true
else
if [[ -f .github/workflows/$ACTIONS_WORKFLOW ]]; then
# on BSD, the `wc` could contains blank
local _count
_count=$(find .github/workflows/ -type f -name "*.yml" | wc -l)
if [[ ${_count//[[:blank:]]/} == 1 ]]; then
_has_inited=true
fi
fi
fi
if $_has_inited; then
echo "Already initialized."
exit 0
fi
}
check_env() {
_check_cli
_check_status
_check_init
}
checkout_latest_release() {
hash=$(git log --grep="chore(release):" -1 --pretty="%H")
git reset --hard "$hash"
}
init_files() {
if $_no_gh; then
rm -rf .github
else
## Change the files of `.github`
mv .github/workflows/starter/$ACTIONS_WORKFLOW .
rm -rf .github && mkdir -p .github/workflows
mv ./$ACTIONS_WORKFLOW .github/workflows/${ACTIONS_WORKFLOW}
## Cleanup image settings in site config
_sedi "s/^cdn:.*/cdn:/;s/^avatar:.*/avatar:/" _config.yml
fi
# remove the other files
rm -rf _posts/*
# build assets
npm i && npm run build
# track the js output
_sedi "/^assets.*\/dist/d" .gitignore
}
commit() {
git add -A
git commit -m "chore: initialize the environment" -q
echo -e "\n[INFO] Initialization successful!\n"
}
main() {
check_env
checkout_latest_release
init_files
commit
}
while (($#)); do
opt="$1"
case $opt in
--no-gh)
_no_gh=true
shift
;;
-h | --help)
help
exit 0
;;
*)
# unknown option
help
exit 1
;;
esac
done
main