golektruk-barebone/propagate-config-files.sh

199 lines
6.0 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Copyright (c) 2021 Razeware LLC
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom
# the Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# Notwithstanding the foregoing, you may not use, copy, modify,
# merge, publish, distribute, sublicense, create a derivative work,
# and/or sell copies of the Software in any work that is designed,
# intended, or marketed for pedagogical or instructional purposes
# related to programming, coding, application development, or
# information technology. Permission for such use, copying,
# modification, merger, publication, distribution, sublicensing,
# creation of derivative works, or sale is expressly withheld.
#
# This project and source code may use libraries or frameworks
# that are released under various Open-Source licenses. Use of
# those libraries and frameworks are governed by their own
# individual licenses.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
DEBUG=false
if [ "$DEBUG" = true ]; then
STD_OUT=/dev/tty
else
STD_OUT=/dev/null
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
IS_MACOS=true
else
IS_MACOS=false
fi
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
WANTED_SUBFOLDER_1='.idea'
WANTED_SUBFOLDER_2='.vscode'
WANTED_SUBFOLDER_3='android/app/src/google-services.json'
WANTED_SUBFOLDER_4='ios/Runner/GoogleService-Info.plist'
ARR_WANTED=(
"${WANTED_SUBFOLDER_1}"
"${WANTED_SUBFOLDER_2}"
"${WANTED_SUBFOLDER_3}"
"${WANTED_SUBFOLDER_4}"
)
# Get root directory: /mnt/c/scripts/epidemy/
ROOT_DIR="$(dirname "$(dirname "$(dirname "$(echo $SCRIPT_DIR)")")")"
# Double check our core locations aren't empty
[ -z "$ROOT_DIR" ] && echo 'ROOT_DIR variable is unset!' && exit 1
[ -z "$SCRIPT_DIR" ] && echo 'SCRIPT_DIR variable is unset!' && exit 1
# All folders within root (e.g. 01-, 02-, 03-, 04-)
ALL_ROOT=$(find "${ROOT_DIR}" -maxdepth 3 -type d | grep -E '/[0-9]{2}[^/]*/projects/(starter|final|challenge)')
# Just the folders we care about (not template)
FOLDERS=$(printf "${ALL_ROOT}" | grep -v $(printf ${SCRIPT_DIR}))
{
echo
echo ===Found Folders===
echo '(Template)' $SCRIPT_DIR
echo "${FOLDERS}"
echo
echo ===Creating Items===
printf "${FOLDERS}\n" | while read root ; do
echo $root
for wanted in "${ARR_WANTED[@]}"; do
orig_item="${SCRIPT_DIR}/${wanted}"
dest_item="${root}/${wanted}"
dest_dir=$(dirname "${dest_item}")
# Ensure template file exists
if [[ ! -e "${orig_item}" ]]; then
continue
fi
# Skip item if there isn't a path to copy destination
if [ ! -d "${dest_dir}" ]; then
printf "\tDestination Directory Missing - ${wanted}\n"
continue
fi
# =============COPY============= #
if [ "$IS_MACOS" = true ]; then
# Doesn't support -T, uses source trailing /
cp -r "${orig_item}" "${dest_item}"
else
# -T to copy entire folder, instead of contents
cp -rT "${orig_item}" "${dest_item}"
fi
printf "\tCreated! - ${wanted}\n"
# =============COPY============= #
done
echo
done
echo
echo ===Issues===
# Print an error only if we're missing both
ERR_IF_BOTH_1=(
"/src/google-services.json$"
"/Runner/GoogleService-Info.plist$"
)
BOTH_MISSING_1=true
# Print an error only if we're missing both
ERR_IF_BOTH_2=(
".idea$"
".vscode$"
)
BOTH_MISSING_2=true
# Don't perform basic missing check on these items
# Use this if other checks should be used, e.g. ERR_IF_BOTH
# Uses regex to check, note the $ for EOL and the OR symbol
NO_ERR="\/(src|Runner)\/(GoogleService-Info.plist|google-services.json)$"
NO_ERR="${NO_ERR}|\.(vscode|idea)$"
for wanted in "${ARR_WANTED[@]}"; do
orig_item="${SCRIPT_DIR}/${wanted}"
# Loop through and check if $wanted matches
for check in "${ERR_IF_BOTH_1[@]}"; do
# Check current item
echo "${wanted}" | grep -Eq ${check}
# Current item is in ERR_IF_BOTH_1
if [ $? -eq 0 ]; then
# Update flag if item does exist
[ -e "${orig_item}" ] && BOTH_MISSING_1=false
# End this checker if found a match
[ "$BOTH_MISSING_1" = false ] && break
fi
done
# Loop through and check if $wanted matches
for check in "${ERR_IF_BOTH_2[@]}"; do
# Check current item
echo "${wanted}" | grep -Eq ${check}
# Current item is in ERR_IF_BOTH_2
if [ $? -eq 0 ]; then
# Update flag if item does exist
[ -e "${orig_item}" ] && BOTH_MISSING_2=false
# End this checker if found a match
[ "$BOTH_MISSING_2" = false ] && break
fi
done
# Don't print missing file error,
# If item path matches NO_ERR pattern
echo ${wanted} | grep -Eq ${NO_ERR}
[ $? -eq 0 ] && continue
# Generic file missing error
[ ! -e "${orig_item}" ] && echo "${orig_item} Does not exist!" 1>&2
done
[ "$BOTH_MISSING_1" = true ] && echo "Your Firebase configuration file(s) couldnt be found. Please, make sure you have configured at least the dev app for Android or iOS. You won't be able to run the app otherwise." 1>&2 && exit 1
[ "$BOTH_MISSING_2" = true ] && echo "Your IDEs custom running configs couldnt be found. Please, try following the instructions again, or you'll need to run the app from the command line every time by using: flutter run --dart-define=fav-qs-app-token=YOUR_KEY" 1>&2 && exit 1
} > $STD_OUT
echo Done!
exit 0