summaryrefslogtreecommitdiffstats
path: root/packaging/packaging.functions
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/packaging.functions')
-rw-r--r--packaging/packaging.functions316
1 files changed, 316 insertions, 0 deletions
diff --git a/packaging/packaging.functions b/packaging/packaging.functions
new file mode 100644
index 00000000..397157fc
--- /dev/null
+++ b/packaging/packaging.functions
@@ -0,0 +1,316 @@
+#!/bin/bash
+
+packaging_check_init() {
+ version_check=
+}
+
+packaging_check_file() {
+ local filename="$1" status=0
+
+ case $filename in
+ configure.ac)
+ check_versions || status=1
+ version_check=Y
+ ;;
+ *.spec.in)
+ check_versions || status=1
+ version_check=Y
+ ;;
+ ChangeLog)
+ check_versions || status=1
+ version_check=Y
+ if [ $status -eq 0 ]
+ then
+ check_changelog || status=1
+ fi
+ ;;
+ *)
+ #echo "No checks found for $filename"
+ :
+ ;;
+ esac
+ return $status
+}
+
+packaging_check_fin() {
+ if [ "$version_check" ]
+ then
+ version=`get_configure_ac_version`
+ case "$(match_version $version)" in
+ prerelease|candidate|release)
+ try_build || status=1
+ if [ $status -eq 0 ]
+ then
+ cp $MYTMP/build/*.tar.* .
+ echo "Check $(cd $MYTMP/build && ls *.tar.gz) before pushing tags"
+ fi
+ ;;
+ esac
+ fi
+}
+
+get_staged_file() {
+ local optional=0
+ if [ "$1" = "-o" ]
+ then
+ optional=1
+ shift
+ fi
+
+ local dir="${1%/*}"
+ if [ "$dir" = "$1" ]; then dir="."; fi
+ mkdir -p $MYTMP/files/$dir
+
+ test -f $MYTMP/files/$1 && return 0
+
+ if [ "$from_cache" ]
+ then
+ if [ $optional -eq 1 ]
+ then
+ git show :$1 > $MYTMP/files/$1 2> /dev/null || rm -f $MYTMP/files/$1
+ else
+ git show :$1 > $MYTMP/files/$1
+ fi
+ else
+ if [ $optional -eq 0 -o -f $1 ]
+ then
+ cp $1 $MYTMP/files/$1
+ fi
+ fi
+}
+
+try_build() {
+ if [ -f $MYTMP/success ]; then return 0; fi
+ mkdir -p $MYTMP/build
+ git archive HEAD | tar -xf - -C "$MYTMP/build"
+ git diff --staged | patch -p1 -d "$MYTMP/build"
+ (cd $MYTMP/build; ./packaging/git-build || touch $MYTMP/fail)
+ if [ -f $MYTMP/fail ]; then return 1; fi
+ (cd $MYTMP/build; ./packaging/tar-compare . *.tar.gz || touch $MYTMP/fail)
+ if [ -f $MYTMP/fail ]; then return 1; fi
+ touch $MYTMP/success
+ return 0
+}
+
+get_changelog_version() {
+ get_staged_file ChangeLog
+ local v=`sed -ne '1s/.*(\(.*\)).*/\1/p' $MYTMP/files/ChangeLog`
+ if [ ! "$v" ]; then v="No version in ChangeLog!"; fi
+ echo "$v"
+}
+
+get_configure_ac_version() {
+ get_staged_file configure.ac
+ local v=`sed -n \
+ -e '/define(\[VERSION_\(MINOR\|FIX\)/s/.*\[\([^[]*\)\].*/.\1/p' \
+ -e '/define(\[VERSION_\(MAJOR\|SUFFIX\)/s/.*\[\([^[]*\)\].*/\1/p' \
+ $MYTMP/files/configure.ac | tr -d '\n'`
+ if [ ! "$v" ]; then v="No version in configure.ac!"; fi
+ echo "$v"
+}
+
+get_configure_ac_package() {
+ get_staged_file configure.ac
+ local v=`sed -n -e 's/AC_INIT(\[\([^]]*\)\].*/\1/p' configure.ac`
+ if [ ! "$v" ]; then v="noname"; fi
+ echo "$v"
+}
+
+get_configure_ac_rpmrel() {
+ get_staged_file configure.ac
+ local v=`sed -n -e 's/PACKAGE_RPM_RELEASE="\([^"]*\)".*/\1/p' configure.ac`
+ if [ ! "$v" ]; then v="norpmrel"; fi
+ echo "$v"
+}
+
+get_spec_version() {
+ get_staged_file "$1".spec.in
+ test -f $MYTMP/files/"$1".spec.in || return 0 # Spec file is optional
+ sed -n -e '1,/^%changelog/d' -e '/^*/{s/.*- \([0-9].*\)/\1/p;q}' "$1".spec.in
+}
+
+splitver() {
+ local maj min fix sfx IFS=.-_
+
+ maj=$1
+ min=$2
+ fix=$3
+ sfx=$4
+
+ set -- $5
+ eval $maj=\$1 $min=\$2 $fix=\$3 $sfx=\$4
+}
+
+match_version() {
+ case "$1" in
+ [0-9]*.[0-9]*.[0-9]*_*)
+ # x.y.z_ZZZZ = development branch (can be before or after pre/rc)
+ echo "development"
+ ;;
+ [0-9]*.[0-9]*.[0-9]-pre[0-9]*)
+ echo "prerelease"
+ ;;
+ [0-9]*.[0-9]*.[0-9]-rc.[0-9]*)
+ echo "candidate"
+ ;;
+ [0-9]*.[0-9]*.[0-9]*)
+ echo "release"
+ ;;
+ *)
+ # Unknown
+ :
+ ;;
+ esac
+}
+
+check_versions() {
+ local status=0 exact=0 prerelease=0
+
+ if [ -f $MYTMP/version-checked ]
+ then
+ read status < $MYTMP/version-checked
+ return $status
+ fi
+
+ local confver=`get_configure_ac_version`
+ case "$(match_version $confver)" in
+ development)
+ :
+ ;;
+ prerelease|candidate|release)
+ exact=1
+ ;;
+ *)
+ echo "Unrecognised version in configure.ac ($confver)"
+ status=1
+ ;;
+ esac
+
+ local clogver=`get_changelog_version`
+ case "$(match_version $clogver)" in
+ development)
+ echo "Do not include development branch version in ChangeLog ($clogver)"
+ status=1
+ ;;
+ prerelease|candidate)
+ prerelease=1
+ ;;
+ release)
+ :
+ ;;
+ *)
+ echo "Unrecognised version format in ChangeLog ($clogver)"
+ status=1
+ ;;
+ esac
+
+ local package=`get_configure_ac_package`
+ local specver=`get_spec_version $package`
+
+ local clogmaj clogmin clogfix clogsfx
+ local confmaj confmin conffix confsfx
+ local specmaj specmin specfix specsfx
+
+ splitver clogmaj clogmin clogfix clogsfx "$clogver"
+ splitver confmaj confmin conffix confsfx "$confver"
+ splitver specmaj specmin specfix specsfx "$specver"
+
+ if [ "$specver" ]
+ then
+ if [ $specmaj -ne $clogmaj \
+ -o $specmin -ne $clogmin \
+ -o $specfix -ne $clogfix ]
+ then
+ echo "Main version of $package.spec.in ($specver) differs from ChangeLog ($clogver)"
+ status=1
+ fi
+ fi
+
+ if [ $status -eq 0 -a $exact -eq 0 ]
+ then
+
+ if [ $confmaj -gt $clogmaj \
+ -o $confmin -gt $clogmin \
+ -o $conffix -gt $clogfix ]
+ then
+ :
+ elif [ $confmaj -eq $clogmaj \
+ -a $confmin -eq $clogmin \
+ -a $conffix -eq $clogfix \
+ -a $prerelease -eq 1 ]
+ then
+ :
+ else
+ echo "Version in configure.ac ($confver) lesser than ChangeLog ($clogver)"
+ status=1
+ fi
+ fi
+
+ if [ $exact -eq 1 ]
+ then
+ echo "Running additional release checks"
+
+ if [ "$confver" != "$clogver" ]
+ then
+ echo "Version in configure.ac ($confver) differs from ChangeLog ($clogver)"
+ status=1
+ elif [ "$(git tag -l v$confver)" ]
+ then
+ echo "Tag v$confver already exists"
+ status=1
+ fi
+
+ if [ "$specver" ]
+ then
+ local confrpmrel=`get_configure_ac_rpmrel`
+ if [ "$specsfx" != "$confrpmrel" ]
+ then
+ echo "%changelog suffix in $package.spec.in ($specsfx) differs from configure.ac PACKAGE_RPM_RELEASE ($confrpmrel)"
+ status=1
+ fi
+ fi
+
+ if [ "$(git config user.signingkey)" = "" ]
+ then
+ echo "You need to set up a PGP signing key e.g.:"
+ echo " gpg --list-keys"
+ echo "and"
+ echo " git config user.signingkey SHORTID"
+ echo "or"
+ echo " git config --global user.signingkey SHORTID"
+ status=1
+ fi
+
+ git status -s | grep "^?" > $MYTMP/needclean
+ if [ -s $MYTMP/needclean ]
+ then
+ echo "The following files must be dealt with before commit:"
+ cat $MYTMP/needclean
+ echo "e.g. add them to .gitignore or remove with 'git clean -fdx'"
+ status=1
+ fi
+ fi
+
+ echo $status > $MYTMP/version-checked
+ return $status
+}
+
+check_changelog() {
+ local status=0
+
+ if [ -f $MYTMP/changelog-checked ]
+ then
+ read status < $MYTMP/changelog-checked
+ return $status
+ fi
+
+ local version=`sed -ne '1s/.*(\(.*\)).*/\1/p' $filename`
+ if [ "`echo $version | grep '[[:space:]]'`" != "" ]
+ then
+ echo "ChangeLog version contains whitespace! Fix it!"
+ status=1
+ fi
+
+ echo $status > $MYTMP/changelog-checked
+ return $status
+}