Skip to content

Instantly share code, notes, and snippets.

@vaab vaab/autogen.sh
Last active Apr 12, 2017

Embed
What would you like to do?
tabs to space, depends fixes
#!/bin/sh
##
## You can download latest version of this file:
## $ wget https://gist.github.com/vaab/9118087/raw -O autogen.sh
## $ chmod +x autogen.sh
##
##
## Functions
##
exname="$(basename "$0")"
long_tag="[0-9]+\.[0-9]+(\.[0-9]+)?-[0-9]+-[0-9a-f]+"
short_tag="[0-9]+\.[0-9]+(\.[0-9]+)?"
get_short_tag="s/^($short_tag).*\$/\1/g"
get_path() { (
IFS=:
for d in $PATH; do
filename="$d/$1"
[ -f "$filename" -a -x "$filename" ] && {
echo "$d/$1"
return 0
}
done
return 1
) }
print_exit() {
echo "$@"
exit 1
}
print_syntax_error() {
[ "$*" ] || print_syntax_error "$FUNCNAME: no arguments"
print_exit "${ERROR}script error:${NORMAL} $@" >&2
}
print_syntax_warning() {
[ "$*" ] || print_syntax_error "$FUNCNAME: no arguments."
[ "$exname" ] || print_syntax_error "$FUNCNAME: 'exname' var is null or not defined."
echo "$exname: ${WARNING}script warning:${NORMAL} $@" >&2
}
print_error() {
[ "$*" ] || print_syntax_warning "$FUNCNAME: no arguments."
[ "$exname" ] || print_exit "$FUNCNAME: 'exname' var is null or not defined." >&2
print_exit "$exname: ${ERROR}error:${NORMAL} $@" >&2
}
depends() {
## Avoid colliding with variables that are created with depends.
local __i __tr __path __new_name
__tr=$(get_path "tr")
test "$__tr" ||
die "dependency check: couldn't find 'tr' command."
for __i in "$@"; do
if ! __path=$(get_path "$__i"); then
__new_name=$(echo "$__i" | "$__tr" '_' '-')
if [ "$__new_name" != "$__i" ]; then
depends "$__new_name"
else
print_error "dependency check: couldn't find '$__i' required command."
fi
else
if ! test -z "$__path" ; then
export "$(echo "$__i" | "$__tr" -- '- ' '__')"="$__path"
fi
fi
done
}
die() {
[ "$*" ] || print_syntax_warning "$FUNCNAME: no arguments."
[ "$exname" ] || print_exit "$FUNCNAME: 'exname' var is null or not defined." >&2
print_exit "$exname: ${ERROR}error:${NORMAL}" "$@" >&2
}
matches() {
echo "$1" | "$grep" -E "^$2\$" >/dev/null 2>&1
}
get_current_git_date_timestamp() {
"$git" show -s --pretty=format:%ct
}
dev_version_tag() {
compat_date "$(get_current_git_date_timestamp)" "+%Y%m%d%H%M"
}
get_current_version() {
version=$("$git" describe --tags)
if matches "$version" "$short_tag"; then
echo "$version"
else
version=$(echo "$version" | compat_sed "$get_short_tag")
echo "${version}.dev$(dev_version_tag)"
fi
}
get_release_changes() {
local prev_tag
prev_tag=$(git describe --tag --abbrev=0 HEAD^)
cur_tag=$(git describe --tag --abbrev=0 HEAD)
if [ "$prev_tag" = "$cur_tag" ]; then
die "Error: HEAD and HEAD^ are not on different tags."
fi
if get_path gitchangelog >/dev/null; then
gitchangelog "$prev_tag".."$cur_tag" | tail -n +4
if [ "$?" != 0 ]; then
die "Changelog NOT generated. An error occured while running \`\`gitchangelog\`\`." >&2
fi
else
die "Changelog NOT generated because \`\`gitchangelog\`\` could not be found."
fi
}
prepare_files() {
version=$(get_current_version)
short_version=$(echo "$version" | cut -f 1,2,3 -d ".")
for file in $FILES; do
if [ -e "$file" ]; then
compat_sed_i "s#%%version%%#$version#g;
s#%%short-version%%#${short_version}#g;
s#%%name%%#${NAME}#g;
s#%%author%%#${AUTHOR}#g;
s#%%email%%#${EMAIL}#g;
s#%%author-email%%#${AUTHOR_EMAIL}#g;
s#%%description%%#${DESCRIPTION}#g" \
"$file"
fi
done
echo "Version updated to $version."
}
##
## LOAD CONFIG
##
if [ -e ./.package ]; then
. ./.package
else
echo "'./.package' file is missing."
exit 1
fi
## list of files where %%version*%% macros are to be replaced:
[ -z "$FILES" ] && FILES="setup.cfg setup.py CHANGELOG.rst"
[ -z "$NAME" ] && die "No \$NAME was defined in './package'."
##
## CHECK DEPS
##
depends git grep
## BSD / GNU sed compatibility layer
if get_path sed >/dev/null; then
if sed --version >/dev/null 2>&1; then ## GNU
compat_sed() { sed -r "$@"; }
compat_sed_i() { sed -r -i "$@"; }
else ## BSD
compat_sed() { sed -E "$@"; }
compat_sed_i() { sed -E -i "" "$@"; }
fi
else
## Look for ``gsed``
if (get_path gsed && gsed --version) >/dev/null 2>&1; then
compat_sed() { gsed -r "$@"; }
compat_sed_i() { gsed -r -i "$@"; }
else
print_error "$exname: required GNU or BSD sed not found"
fi
fi
## BSD / GNU date compatibility layer
if get_path date >/dev/null; then
if date --version >/dev/null 2>&1 ; then ## GNU
compat_date() { date -d "@$1" "$2"; }
else ## BSD
compat_date() { date -j -f %s "$1" "$2"; }
fi
else
if (get_path gdate && gdate --version) >/dev/null 2>&1; then
compat_date() { gdate -d "@$1" "$2"; }
else
print_error "$exname: required GNU or BSD date not found"
fi
fi
if ! "$git" describe --tags >/dev/null 2>&1; then
die "Didn't find a git repository (or no tags found). " \
"\`\`./autogen.sh\`\` uses git to create changelog and version information."
fi
##
## CODE
##
while [ "$1" ]; do
case "$1" in
--get-release-changes) get_release_changes; exit $?;;
--get-version) get_current_version; exit $?;;
--get-name) echo "$NAME"; exit 0;;
--*|-*) die "unknown option '$1'";;
*) die "unknown argument '$1'";;
esac
shift
done
if get_path gitchangelog >/dev/null; then
gitchangelog > CHANGELOG.rst
if [ "$?" != 0 ]; then
echo "Changelog NOT generated. An error occured while running \`\`gitchangelog\`\`." >&2
else
echo "Changelog generated."
fi
else
echo "Changelog NOT generated because \`\`gitchangelog\`\` could not be found."
touch CHANGELOG.rst ## create it anyway because it's required by setup.py current install
fi
prepare_files
if [ "$?" != 0 ]; then
print_error "Error while updating version information."
fi
@vaab

This comment has been minimized.

Copy link
Owner Author

commented May 14, 2014

Updated to be compatible with BSD (MacOSX, and *BSD).
Usage of ".package" to configure most aspect of the current package.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.