summaryrefslogtreecommitdiffstatshomepage
path: root/scripts/.scripts/init-git.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/.scripts/init-git.sh')
-rwxr-xr-xscripts/.scripts/init-git.sh193
1 files changed, 193 insertions, 0 deletions
diff --git a/scripts/.scripts/init-git.sh b/scripts/.scripts/init-git.sh
new file mode 100755
index 0000000..0a45b90
--- /dev/null
+++ b/scripts/.scripts/init-git.sh
@@ -0,0 +1,193 @@
+#!/usr/bin/env bash
+
+# Global
+SCRIPT="$(basename $0)"
+SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
+GITATTRIBUTES_URL="https://gist.githubusercontent.com/tobyvin/70f3671c76016063594ea45edbb97094/raw"
+
+# Defaults
+VERBOSE=0
+QUIET=0
+INTERACTIVE=0
+TEMPLATE="visualstudiocode"
+LICENSE="mit"
+
+# Usage output
+read -r -d '' USAGE <<USAGE
+USAGE: $SCRIPT [OPTIONS] <IGNORE_TEMPLATE>
+
+OPTIONS:
+ -h, --help Show this message
+ -v, --verbose Show more output
+ -q, --quiet Suppress all output
+ -i, --interactive Run command interactivly
+
+ -l, --license [LICENSE_ID]
+ Specify which license to generate. Defaults to '$LICENSE'
+
+ -t, --template [IGNORE_TEMPLATE,...]
+ Project template(s) used when generating the .gitignore file. It
+ can also be a comma seperated list or templates. Use '-t list' to
+ see available templates. Defaults to '$TEMPLATE'
+USAGE
+
+# Options
+SHORT=hvqil:t:
+LONG=help,verbose,quiet,interactive,license:,template:
+
+# Test getopt
+getopt --test 2>/dev/null
+if [[ $? -ne 4 ]]; then
+ read -r -d '' message <<EOF
+GNU's enhanced getopt is required to run this script
+You can usually find this in the util-linux package
+On MacOS/OS X see homebrew's package: http://brewformulas.org/Gnu-getopt
+For anyone else, build from source: http://frodo.looijaard.name/project/getopt
+EOF
+ echo "$message" >&2
+ exit 1
+fi
+
+# Parse options
+TEMP=$(getopt \
+ --options ${SHORT} \
+ --longoptions ${LONG} \
+ --name ${SCRIPT} \
+ -- "$@")
+
+# Exit on failed getopt
+if [ $? != 0 ]; then
+ echo "Error in getopt. Terminating..." >&2
+ exit 1
+fi
+
+eval set -- "${TEMP}"
+unset TEMP
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ -h | --help)
+ echo "$USAGE"
+ exit 0
+ ;;
+ -v | --verbose)
+ VERBOSE=1
+ shift
+ ;;
+ -q | --quiet)
+ QUIET=1
+ shift
+ ;;
+ -i | --interactive)
+ INTERACTIVE=1
+ shift
+ ;;
+ -l | --license)
+ LICENSE="$2"
+ shift 2
+ ;;
+ -t | --template)
+ TEMPLATE="$2"
+ shift 2
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *) break ;;
+ esac
+done
+
+VALID_TEMPLATES=$(curl -L -s "https://www.toptal.com/developers/gitignore/api/list")
+
+validate-template() {
+ local template="$1"
+ local templates="$2"
+ if [[ ",$2," == *",$template,"* ]]; then
+ [ "$QUIET" != 1 ] && printf "'%s' is already added.\n" "$template" >&2
+ return 1
+ elif ! [[ $VALID_TEMPLATES =~ "$template" ]]; then
+ [ "$QUIET" != 1 ] && printf "'%s' is not a valid template.\n" "$template" >&2
+ return 1
+ else
+ [ "$VERBOSE" == 1 ] && printf "Added template: %s\n" "$template" >&2
+ return 0
+ fi
+}
+
+get-gitignore() {
+ local templates=''
+ IFS=',' read -ra input <<<"$1"
+
+ for template in "${input[@]}"; do
+ if validate-template "$template" "$templates"; then
+ templates+="${template},"
+ fi
+ done
+
+ echo ${templates%?}
+}
+
+get-gitignore-interactive() {
+ local templates=''
+
+ while true; do
+ read -p 'Input gitignore template(s): ' -i "$1" readInput
+ echo ""
+
+ IFS=', ' input=$readInput
+ [ -z "$input" ] && break
+ if [[ "$input" == "list" ]]; then
+ echo "$VALID_TEMPLATES" >&2
+ else
+ for template in $input; do
+ if validate-template "$template" "$templates"; then
+ templates+="${template},"
+ fi
+ done
+ fi
+ [ "$QUIET" != 1 ] && printf "\nTemplates: %s\n" "${templates%?}" >&2
+ done
+
+ echo "${templates%?}"
+}
+
+get-license() {
+ licenseJson="$(curl -sH 'Accept: application/vnd.github.v3+json' https://api.github.com/licenses/$1)"
+ # not_found='"message": "Not Found"'
+ if [[ $licenseJson =~ '"message": "Not Found"' ]]; then
+ [ "$QUIET" != 1 ] && printf "'%s' is not a valid license identifier.\n" "$LICENSE" >&2
+ else
+ echo $licenseJson | grep -oP '.*"body":\s*"\K.*(?=\s*",)' |
+ tr '\n' '\0' | xargs -0 printf '%b\n' |
+ sed "s/\\[year\\]/$(date +'%Y')/" |
+ sed "s/\\[fullname\\]/$(git config --get user.name)/"
+ fi
+}
+
+if [[ "$TEMPLATE" == "list" ]]; then
+ echo "$VALID_TEMPLATES"
+ exit 0
+fi
+
+if [ $INTERACTIVE -eq 0 ]; then
+ gitignore_cmd=get-gitignore
+else
+ gitignore_cmd=get-gitignore-interactive
+fi
+
+TEMPLATES=$($gitignore_cmd $TEMPLATE)
+
+# .gitignore
+[ "$VERBOSE" == 1 ] && printf "Creating .gitignore using: %s\n" "$TEMPLATES" >&1
+curl -L -s "https://www.toptal.com/developers/gitignore/api/${TEMPLATES}" >.gitignore
+
+# .gitattributes
+[ "$VERBOSE" == 1 ] && printf "Creating .gitattributes\n" >&1
+curl -sL "$GITATTRIBUTES_URL" >.gitattributes
+
+# LICENSE
+[ "$VERBOSE" == 1 ] && printf "Creating LICENSE using: %s\n" "$LICENSE" >&1
+get-license $LICENSE >LICENSE
+
+echo "$PWD"