#!/bin/bash
# Usage: # ./formula-fetch.sh <Formula URL> <Name> <Branch> # # Example: # GIT_FORMULAS_PATH=.vendor/formulas ./formula-fetch.sh github.com/salt-formulas/salt-formula-salt # – # GIT_FORMULAS_PATH=/usr/share/salt-formulas/env/_formulas # xargs -n1 ./formula-fetch.sh < dependencies.txt
# Parse git dependencies from metadata.yml # $1 - path to <formula>/metadata.yml # sample to output: # github.com/salt-formulas/salt-formula-git git # github.com/salt-formulas/salt-formula-salt salt function fetchDependencies() {
METADATA="$1"; grep -E "^dependencies:" "$METADATA" >/dev/null || return 0 # shellcheck disable=SC2086 (python - "$METADATA" | while read -r dep; do fetchGitFormula $dep; done) <<-DEPS import sys,yaml for dep in yaml.load(open(sys.argv[1], "ro"))["dependencies"]: print("{source} {name}").format(**dep) DEPS
}
# Fetch formula from git repo # $1 - formula git repo url # $2 - formula name (optional) # $3 - branch (optional) function fetchGitFormula() {
test -n "${FETCHED}" || declare -a FETCHED=() export GIT_FORMULAS_PATH=${GIT_FORMULAS_PATH:-/usr/share/salt-formulas/env/_formulas} mkdir -p "$GIT_FORMULAS_PATH" if [ -n "$1" ]; then source="$1" name="$2" test -n "$name" || name="${source//*salt-formula-}" test -z "$3" && branch=master || branch=$3 if ! [[ "${FETCHED[*]}" =~ $name ]]; then # dependency not yet fetched echo "Fetching: $name" if test -e "$GIT_FORMULAS_PATH/$name"; then pushd "$GIT_FORMULAS_PATH/$name" &>/dev/null || exit test ! -e .git || git pull -r popd &>/dev/null || exit else echo "git clone $source $GIT_FORMULAS_PATH/$name -b $branch" git clone "$source" "$GIT_FORMULAS_PATH/$name" -b "$branch" fi # install dependencies FETCHED+=("$name") if [ -e "$GIT_FORMULAS_PATH/$name/metadata.yml" ]; then fetchDependencies "$GIT_FORMULAS_PATH/$name/metadata.yml" fi fi else echo Usage: fetchGitFormula "<git repo>" "[local formula directory name]" "[branch]" fi
}
function linkFormulas() {
# OPTIONAL: Link formulas from git/pkg SALT_ROOT=$1 SALT_ENV=${2:-/usr/share/salt-formulas/env} if [[ -e "$SALT_ENV" ]]; then # form git, development versions if [[ -e "$SALT_ENV/_formulas" ]]; then GIT_FORMULA_LIST=$(find "$SALT_ENV"/_formulas -maxdepth 1 -mindepth 1 -type d) for formula in $GIT_FORMULA_LIST do name=$(basename "$formula") if [[ ! -L "$SALT_ROOT/$name" ]]; then ln -fs "$formula/$name" "$SALT_ROOT/$name" fi find "$formula" -maxdepth 1 -mindepth 1 -type d |grep -E "_(modules|states|grains|renderers|returners)" | xargs -I{} \ basename {}| xargs -I{} cp -rs "$formula"/{} "$SALT_ROOT"/ done fi # form pkgs find "$SALT_ENV" -maxdepth 1 -mindepth 1 -path "*_formulas*" -prune -o -name "*" -type d -print0| xargs -I{} -0 -n1 --no-run-if-empty basename {} | xargs -I{} --no-run-if-empty \ ln -fs "$SALT_ENV"/{} "$SALT_ROOT"/{}; fi
}
# detect if file is being sourced
- [ “$0” != “${BASH_SOURCE}” ]
-
|| {
# if executed, run implicit function fetchGitFormula "${@}"
}