#!/bin/sh
#
# Script for easily accessing gitignore boilerplates from
# https://github.com/github/gitignore

remote_repo=https://github.com/github/gitignore.git
local_repo=${GIBO_BOILERPLATES:-"$HOME/.gitignore-boilerplates"}
current_repo_rev=$(cd $local_repo 2>/dev/null && git rev-parse HEAD)
remote_web_root=https://raw.github.com/github/gitignore/$current_repo_rev

version() {
    echo "$(basename $0) 2.1.0 by Simon Whitaker <sw@netcetera.org>"
    echo "https://github.com/simonwhitaker/gibo"
}

usage() {
    version
cat << EOF >&2

Fetches gitignore boilerplates from https://github.com/github/gitignore

Usage:
    $(basename $0) [command]

Example:
    $(basename $0) dump Swift Xcode >> .gitignore

Commands:
    dump BOILERPLATE...   Write boilerplate(s) to STDOUT
    help                  Display this help text
    list                  List available boilerplates
    search STR            Search for boilerplates with STR in the name
    update                Update list of available boilerplates
    version               Display current script version
EOF
}

clone() {
    if [ $1 -a $1 = '--silently' ]; then
        git clone -q "$remote_repo" "$local_repo"
    else
        echo "Cloning $remote_repo to $local_repo"
        git clone "$remote_repo" "$local_repo"
    fi
}

init() {
    if [ ! -e "$local_repo/.git" ]; then
        clone $1
    fi
}

list() {
    init

    echo "=== Languages ==="
    echo
    for path in $(ls "$local_repo"/*.gitignore | sort -f); do
        filename=$(basename $path)
        echo "${filename%.*}"
    done | column

    echo
    echo "=== Global ==="
    echo
    for path in $(ls "$local_repo"/Global/*.gitignore | sort -f); do
        filename=$(basename $path)
        echo "${filename%.*}"
    done | column
}

search() {
    init
    for filename in $(find "$local_repo" -iname "*$**.gitignore" -exec basename \{\} .gitignore \; | sort); do
        echo $filename
    done
}

update() {
    if [ ! -e "$local_repo/.git" ]; then
        clone
    else
        cd "$local_repo"
        git pull --ff origin master
    fi
}

dump() {
    init --silently

    language_file=$(find "$local_repo" -maxdepth 1 -iname "$1.gitignore" | head -n 1)
    global_file=$(find "$local_repo/Global" -maxdepth 1 -iname "$1.gitignore" | head -n 1)

    if [ -n "$language_file" ]; then
        echo "### $remote_web_root/$(basename $language_file)"
        echo
        cat "$language_file"
        echo
        echo
    elif [ -n "$global_file" ]; then
        echo "### $remote_web_root/Global/$(basename $global_file)"
        echo
        cat "$global_file"
        echo
        echo
    else
        echo "Unknown argument: $1" >&2
    fi
}

# --- Main entry point ----------------------

if [ $# -eq 0 ]; then
    usage
    exit 1
fi

# Parse comand-line
should_dump=0
while [ $# -gt 0 ]; do
    case $1 in
        version )
            version
            exit 0
            ;;
        list )
            list
            exit 0
            ;;
        update )
            update
            exit 0
            ;;
        help )
            usage
            exit 0
            ;;
        dump )
            if [ $# -gt 1 ]; then
                should_dump=1
            else
                usage
                exit 1
            fi
            ;;
        search )
            if [ $# -gt 1 ]; then
                shift
                search $*
                exit 0
            else
                usage
                exit 1
            fi
            ;;
        * ) # default case
            if [ $should_dump -eq 1 ]; then
                dump $1
            else
                usage
                exit 1
            fi
            ;;
    esac
    shift
done
