Skip to content

Instantly share code, notes, and snippets.

@StephenKing
Created February 4, 2017 19:54
Show Gist options
  • Save StephenKing/030bc4f2c9bf2077087d3f325702e261 to your computer and use it in GitHub Desktop.
Save StephenKing/030bc4f2c9bf2077087d3f325702e261 to your computer and use it in GitHub Desktop.
Parses git diff to upload changes of main chef-repo (data bags, environments, roles)
#!/usr/bin/env bash
# This file should be called with one argument, which is a list of commits
# from the previous one (the one which should be seen as "processed) until
# to the latest one, which should be included.
#
# Repo as at commit a123. Now new commits b234 and c345 pushed.
# Expected command:
# upload-changes.sh a123..c345
#
set -euo pipefail
REFS="${1:=HEAD}"
GIT=$(which git)
PATTERN_ADDED="A"
PATTERN_MODIFIED="CMRTUXB"
PATTERN_DELETED="D"
changes() {
TYPE=$1 # supplied to --diff-filter. = added / modified / deleted
PATH=${2:=.} # directory, to narrow down
if [ -z "$TYPE" ]; then
echo "Parameter TYPE missing"
exit 1
fi
$GIT diff --color=always --diff-filter=$TYPE --name-only $REFS -- $PATH
}
COL_DEFAULT="\e[0m"
COL_ADD="\e[92m"
COL_DEL="\e[93m"
COL_HEAD="\e[44m"
header() {
echo -e $COL_HEAD
echo
echo " $1"
echo -e $COL_DEFAULT
}
header "data_bags"
for item in $(changes "$PATTERN_ADDED$PATTERN_MODIFIED" "data_bags/"); do
databag=$(basename $(dirname "$item"))
filename=$(basename $item)
db_item=${filename%.*}
echo -e "${COL_ADD}Uploading data bag $databag/$db_item${COL_DEFAULT}"
git diff $REFS -- $item
knife data bag from file $databag $item
done
for item in $(changes "$PATTERN_DELETED" "data_bags/"); do
databag=$(basename $(dirname "$item"))
filename=$(basename $item)
db_item=${filename%.*}
echo -e "${COL_DEL}Deleting data bag $databag/$db_item${COL_DEFAULT}"
knife data bag delete -y $databag $db_item
done
header "environments"
for item in $(changes "$PATTERN_ADDED$PATTERN_MODIFIED" "environments/"); do
echo -e "${COL_ADD}Uploading environment from $item"
git diff $REFS -- $item
knife environment from file $item
done
for item in $(changes "$PATTERN_DELETED" "environments/"); do
filename=$(basename $item)
env_name=${filename%.*}
echo -e "${COL_DEL}Deleting environment $env_name${COL_DEFAULT}"
knife environment delete -y $env_name
done
header "roles"
for item in $(changes "$PATTERN_ADDED$PATTERN_MODIFIED" "roles/"); do
echo -e "${COL_ADD}Uploading role from $item"
git diff $REFS -- $item
knife role from file $item
done
for item in $(changes "$PATTERN_DELETED" "roles/"); do
filename=$(basename $item)
role_name=${filename%.*}
echo -e "${COL_DEL}Deleting role $role_name${COL_DEFAULT}"
knife role delete -y $role_name
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment