diff --git a/README.md b/README.md index 9c220a3..7c53c08 100644 --- a/README.md +++ b/README.md @@ -334,6 +334,7 @@ bake make-release * Kyle Burton <kyle.burton@gmail.com> * Isaac Schaaf <zeekus99@gmail.com> +* Steve Hajducko <hajducko@gmail.com> # License diff --git a/bake b/bake index 3e7eb6c..e28cba6 100755 --- a/bake +++ b/bake @@ -4,7 +4,7 @@ set -Eeu -o pipefail # TODO: detect if we're being sourced or if we're being executed -BAKE_VERSION="2014-11-05" +BAKE_VERSION="1.0.15" BAKE_STDOUT_IS_TERMINAL="" BAKE_COLOR_NORMAL="" BAKE_COLOR_RED="" @@ -77,6 +77,15 @@ function bake_bakefile_dir () { BAKE_ROOT_DIR="$(bake_root_dir)" +function bake_looks_like_git () { + local thing="$1" + + if [[ $thing == git@* ]]; then + return 0 + fi + return 1 +} + function bake_looks_like_url () { local thing="$1" @@ -92,6 +101,10 @@ function bake_looks_like_url () { return 0 fi + if [[ $thing == ssh://* ]]; then + return 0 + fi + return 1 } @@ -140,48 +153,25 @@ function bake_require_from_fs () { function bake_url_to_package_path () { local url="$1" - # strip the http:// or https:// if present + # strip the *:// if present # then see if it exists as $BAKE_PACKAGES_PATH/$url local fpath - fpath="$(echo "$url" | sed 's/^https\?:\/\///')" + fpath=${url##*://} + fpath=${fpath##git@} + fpath=${fpath%%.git} echo "$BAKE_PACKAGES_PATH/$fpath" } -function bake_require_git () { +function bake_git_to_url () { local url="$1" - local libpath="$2" - local tag="${3:-master}" - - bake_ensure_bake_packages_path + local host + local path - pushd "$BAKE_PACKAGES_PATH" >/dev/null - - # git@github.com:kyleburton/bake-recipes.git - # https://github.com/kyleburton/bake-recipes.git - # strip the leading git@, http:// or https:// - local full_package_path - full_package_path="$(echo "$url" | sed 's/^git@//' | sed 's/https:\/\///' | sed 's/http:\/\///' | sed 's/.git$//' | sed 's/:/\//')" - local package_path - package_path="$(dirname "$full_package_path")" - - test -d "$package_path" || mkdir -p "$package_path" - cd "$package_path" - local dname - dname="$(basename "$full_package_path")" - if [ ! -d "$dname" ]; then - git clone "$url" - cd "$dname" - git fetch - git co "$tag" - fi - - popd > /dev/null - - # translate the require path to local fs path - # source it! - source "$BAKE_PACKAGES_PATH/$full_package_path/$libpath" + [[ $url =~ git@(.*):(.*) ]] && host=${BASH_REMATCH[1]} && path=${BASH_REMATCH[2]} + echo ssh://git@${host}/${path} } + function bake_ensure_bake_packages_path () { test -d "$BAKE_PACKAGES_PATH" || mkdir -p "$BAKE_PACKAGES_PATH" } @@ -189,20 +179,45 @@ function bake_ensure_bake_packages_path () { function bake_package_install () { local url="$1" local tag="${2:-master}" + local schema= + + trap "bake_echo_red 'Error[bake_package_install] git command not found in PATH'" EXIT + which git > /dev/null + trap EXIT # clear the trap + + # If no schema, assume it's https + if [[ $url != *://* ]]; then + url=https://${url} + fi + schema=${url%%://*} bake_ensure_bake_packages_path - pushd "$BAKE_PACKAGES_PATH" - local git_project_name - git_project_name="$(echo "$url" | awk -F/ '{print $3 }')" - local git_host_and_user - git_host_and_user="$(echo "$url" | awk -F/ '{print $1 "/" $2 }')" + pushd "$BAKE_PACKAGES_PATH" > /dev/null + + local git_project_name= + local git_host_and_user= + echo URL is $url + [[ $url =~ [a-zA-Z]+://([a-zA-Z0-9@-_.]+/[a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/(.*) ]] && \ + git_host_and_user=${BASH_REMATCH[1]} && \ + git_project_name=${BASH_REMATCH[2]} + + trap "bake_echo_red 'Error[bake_package_install] could not parse url $url'" EXIT + test -n "$git_host_and_user" + test -n "$git_project_name" + trap EXIT + local git_url - git_url="$(echo "$url" | awk -F/ '{print $1 "/" $2 "/" $3}')" + git_url=${git_host_and_user}/${git_project_name} + git_host_and_user=${git_host_and_user##git@} + git_project_name=${git_project_name%%.git} test -d "$git_host_and_user" || mkdir -p "$git_host_and_user" cd "$git_host_and_user" + if [ ! -e "$git_project_name" ]; then - git clone "https://$git_url" + git clone "$schema://$git_url" fi + + # Checkout the project and branch/tag cd "$git_project_name" git checkout . git pull @@ -217,6 +232,7 @@ function bake_require_from_url () { if [ -e "$fspath" ]; then # shellcheck disable=SC2064 + echo $fspath exists trap "bake_echo_red 'Error[bake_require_from_url] loading require: $fspath'" EXIT source "$fspath" trap EXIT # clear the trap @@ -242,6 +258,9 @@ function bake_require () { local module="$1" if bake_looks_like_url "$module"; then bake_require_from_url "$module" + elif bake_looks_like_git "$module"; then + module="$(bake_git_to_url "$module")" + bake_require_from_url "$module" else bake_require_from_fs "$module" fi