Skip to content

Instantly share code, notes, and snippets.

@linyows
Created February 16, 2012 06:19
Show Gist options
  • Save linyows/1842606 to your computer and use it in GitHub Desktop.
Save linyows/1842606 to your computer and use it in GitHub Desktop.
#!/bin/zsh
case "$1" in
test)
TYPE=$1
;;
clean)
TYPE=$1
;;
*)
echo "Usage: $0 {clean|test}"
exit 2
esac
note() { echo "\033[1;32m$1\033[0m" } # green
notice() { echo "\033[1;34m$1\033[0m" } # blue
alert() { echo "\033[1;33m$1\033[0m" } # yellow
warn() { echo "\033[1;31m$1\033[0m"; } # red
success_face() { echo "\033[1;32m$1\033[1;33m ;)\033[0m" } # green
warn_face() { echo "\033[1;31m$1\033[1;33m O_o\033[0m" } # red
LATEST_MAJOR=0
LATEST_MINOR=0
LATEST_FIXED=0
MAX_MINOR=0
MAX_FIXED=0
note "Begins git tags clean."
notice "git fetch --tags"
git fetch --tags
# set array of tag
TAGS=$(git tag)
TAG=(`echo $TAGS`)
# filtering
for i in `seq 1 ${#TAG[@]}`; do
if [[ "${TAG[$i]}" =~ ^[a-z]?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
FILTERD_TAG=(${FILTERD_TAG[@]} ${TAG[$i]})
fi
done
TAG=$FILTERD_TAG
notice "tags: $TAG"
# set last minor version
TAG_COUNT=${#TAG[@]}
LAST_TAG=${TAG[$TAG_COUNT]}
CONVERTED_LAST_TAG=`echo $LAST_TAG | sed 's/\./ /g'`
LAST_TAG_ARRAY=(`echo $CONVERTED_LAST_TAG`)
typeset -i LAST_MINOR=$LAST_TAG_ARRAY[2]
for i in `seq 1 ${#TAG[@]}`; do
VER=`echo ${TAG[$i]} | sed 's/\./ /g'`
VERS=(`echo $VER`)
typeset -i MAJOR=$VERS[1]
typeset -i MINOR=$VERS[2]
typeset -i FIXED=$VERS[3]
# $LATEST_MAJOR < $MAJOR
if [ $LATEST_MAJOR -lt $MAJOR ]; then
# $LATEST_MINOR < $MAX_MINOR
if [ $LATEST_MINOR -lt $MAX_MINOR ]; then
DELETE_TAGS=(${DELETE_TAGS[@]} ${TAG[$i-1]})
fi
#echo "A) Current: $MAJOR.$MINOR.$FIXED, Latest: $LATEST_MAJOR.$LATEST_MINOR.$LATEST_FIXED"
typeset -i LATEST_MAJOR=$VERS[1]
typeset -i LATEST_MINOR=$VERS[2]
typeset -i LATEST_FIXED=$VERS[3]
# $LATEST_MINOR < $MINOR
elif [ $LATEST_MINOR -lt $MINOR ]; then
# $LATEST_FIXED < $MAX_FIXED
if [ $LATEST_FIXED -lt $MAX_FIXED ]; then
DELETE_TAGS=(${DELETE_TAGS[@]} ${TAG[$i-1]})
fi
# $MAX_MINOR < $MINOR
if [ $MAX_MINOR -lt $MINOR ]; then
MAX_MINOR=$MINOR
fi
#echo "B) Current: $MAJOR.$MINOR.$FIXED, Latest: $LATEST_MAJOR.$LATEST_MINOR.$LATEST_FIXED"
typeset -i LATEST_MINOR=$VERS[2]
typeset -i LATEST_FIXED=$VERS[3]
else
# $LATEST_FIXED < $FIXED
if [ $LATEST_FIXED -lt $FIXED ]; then
# $MINOR < $LAST_MINOR
if [ $MINOR -lt $LAST_MINOR ]; then
DELETE_TAGS=(${DELETE_TAGS[@]} ${TAG[$i-1]})
fi
fi
# $MAX_FIXED < $FIXED
if [ $MAX_FIXED -lt $FIXED ]; then
MAX_FIXED=$FIXED
fi
#echo "C) Current: $MAJOR.$MINOR.$FIXED, Latest: $LATEST_MAJOR.$LATEST_MINOR.$LATEST_FIXED"
typeset -i LATEST_FIXED=$VERS[3]
fi
# for q in `seq 1 ${#VERS[@]}`; do
# echo ${VERS[$q]}
# done
done
if [ ${#DELETE_TAGS[@]} -ne 0 ]; then
if [ $TYPE = 'clean' ]; then
notice "git tag -d $DELETE_TAGS"
git tag -d $DELETE_TAGS
for i in `seq 1 ${#DELETE_TAGS[@]}`; do
DELETE_REMOTE_TAGS=(${DELETE_REMOTE_TAGS[@]} ":refs/tags/${DELETE_TAGS[$i]}")
done
notice "git push origin $DELETE_REMOTE_TAGS"
git push origin $DELETE_REMOTE_TAGS
else
notice "git tag -d $DELETE_TAGS"
for i in `seq 1 ${#DELETE_TAGS[@]}`; do
DELETE_REMOTE_TAGS=(${DELETE_REMOTE_TAGS[@]} ":refs/tags/${DELETE_TAGS[$i]}")
done
notice "git push origin $DELETE_REMOTE_TAGS"
fi
success_face "Successfully tag clean!"
else
success_face "Nothing tag clean!"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment