diff --git a/scripts/release.sh b/scripts/release.sh deleted file mode 100755 index a3bafdc..0000000 --- a/scripts/release.sh +++ /dev/null @@ -1,693 +0,0 @@ -#!/bin/bash -# -# Creates and upload a git module tarball -# -# Note on portability: -# This script is intended to run on any platform supported by X.Org. -# Basically, it should be able to run in a Bourne shell. -# -# - -export LC_ALL=C - -#------------------------------------------------------------------------------ -# Function: check_local_changes -#------------------------------------------------------------------------------ -# -check_local_changes() { - git diff --quiet HEAD > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "" - echo "Uncommitted changes found. Did you forget to commit? Aborting." - echo "" - echo "You can perform a 'git stash' to save your local changes and" - echo "a 'git stash apply' to recover them after the tarball release." - echo "Make sure to rebuild and run 'make distcheck' again." - echo "" - echo "Alternatively, you can clone the module in another directory" - echo "and run ./configure. No need to build if testing was finished." - echo "" - return 1 - fi - return 0 -} - -#------------------------------------------------------------------------------ -# Function: check_option_args -#------------------------------------------------------------------------------ -# -# perform sanity checks on cmdline args which require arguments -# arguments: -# $1 - the option being examined -# $2 - the argument to the option -# returns: -# if it returns, everything is good -# otherwise it exit's -check_option_args() { - option=$1 - arg=$2 - - # check for an argument - if [ x"$arg" = x ]; then - echo "" - echo "Error: the '$option' option is missing its required argument." - echo "" - usage - exit 1 - fi - - # does the argument look like an option? - echo $arg | $GREP "^-" > /dev/null - if [ $? -eq 0 ]; then - echo "" - echo "Error: the argument '$arg' of option '$option' looks like an option itself." - echo "" - usage - exit 1 - fi -} - -#------------------------------------------------------------------------------ -# Function: check_modules_specification -#------------------------------------------------------------------------------ -# -check_modules_specification() { - -if [ x"$MODFILE" = x ]; then - if [ x"${INPUT_MODULES}" = x ]; then - echo "" - echo "Error: no modules specified (blank command line)." - usage - exit 1 - fi -fi - -} - -#------------------------------------------------------------------------------ -# Function: generate_announce -#------------------------------------------------------------------------------ -# -generate_announce() -{ - cat <&2 - if [ $? -ne 0 ]; then - echo "Error: failed to sign $1." >&2 - return 1 - fi - echo $sig - fi - return 0 -} - -#------------------------------------------------------------------------------ -# Function: process_module -#------------------------------------------------------------------------------ -# Code 'return 0' on success to process the next module -# Code 'return 1' on error to process next module if invoked with --no-quit -# -process_module() { - - top_src=`pwd` - echo "" - echo "======== Processing \"$top_src/$MODULE_RPATH\"" - - # This is the location where the script has been invoked - if [ ! -d $MODULE_RPATH ] ; then - echo "Error: $MODULE_RPATH cannot be found under $top_src." - return 1 - fi - - # Change directory to be in the git module - cd $MODULE_RPATH - if [ $? -ne 0 ]; then - echo "Error: failed to cd to $MODULE_RPATH." - return 1 - fi - - # ----- Now in the git module *root* directory ----- # - - # Check that this is indeed a git module - if [ ! -d .git ]; then - echo "Error: there is no git module here: `pwd`" - return 1 - fi - - # Change directory to be in the git build directory (could be out-of-source) - # More than one can be found when distcheck has run and failed - configNum=`find . -name config.status -type f | wc -l | sed 's:^ *::'` - if [ $? -ne 0 ]; then - echo "Error: failed to locate config.status." - echo "Has the module been configured?" - return 1 - fi - if [ x"$configNum" = x0 ]; then - echo "Error: failed to locate config.status, has the module been configured?" - return 1 - fi - if [ x"$configNum" != x1 ]; then - echo "Error: more than one config.status file was found," - echo " clean-up previously failed attempts at distcheck" - return 1 - fi - status_file=`find . -name config.status -type f` - if [ $? -ne 0 ]; then - echo "Error: failed to locate config.status." - echo "Has the module been configured?" - return 1 - fi - build_dir=`dirname $status_file` - cd $build_dir - if [ $? -ne 0 ]; then - echo "Error: failed to cd to $MODULE_RPATH/$build_dir." - cd $top_src - return 1 - fi - - # ----- Now in the git module *build* directory ----- # - - # Check for uncommitted/queued changes. - check_local_changes - if [ $? -ne 0 ]; then - cd $top_src - return 1 - fi - - # Determine what is the current branch and the remote name - current_branch=`git branch | $GREP "\*" | sed -e "s/\* //"` - remote_name=`git config --get branch.$current_branch.remote` - remote_branch=`git config --get branch.$current_branch.merge | cut -d'/' -f3,4` - echo "Info: working off the \"$current_branch\" branch tracking the remote \"$remote_name/$remote_branch\"." - - # Run 'make dist/distcheck' to ensure the tarball matches the git module content - # Important to run make dist/distcheck before looking in Makefile, may need to reconfigure - echo "Info: running \"make $MAKE_DIST_CMD\" to create tarballs:" - ${MAKE} $MAKEFLAGS $MAKE_DIST_CMD > /dev/null - if [ $? -ne 0 ]; then - echo "Error: \"$MAKE $MAKEFLAGS $MAKE_DIST_CMD\" failed." - cd $top_src - return 1 - fi - - # Find out the tarname from the makefile - pkg_name=`$GREP '^PACKAGE = ' Makefile | sed 's|PACKAGE = ||'` - pkg_version=`$GREP '^VERSION = ' Makefile | sed 's|VERSION = ||'` - tar_name="$pkg_name-$pkg_version" - targz=$tar_name.tar.gz - tarbz2=$tar_name.tar.bz2 - tarxz=$tar_name.tar.xz - - [ -e $targz ] && ls -l $targz || unset targz - [ -e $tarbz2 ] && ls -l $tarbz2 || unset tarbz2 - [ -e $tarxz ] && ls -l $tarxz || unset tarxz - - if [ -z "$targz" -a -z "$tarbz2" -a -z "$tarxz" ]; then - echo "Error: no compatible tarballs found." - cd $top_src - return 1 - fi - - # wayland/weston/libinput tag with the version number only - tag_name="$tar_name" - if [ x"$section" = xwayland ] || - [ x"$section" = xweston ] || - [ x"$section" = xlibinput ]; then - tag_name="$pkg_version" - fi - - # evemu tag with the version number prefixed by 'v' - if [ x"$section" = xevemu ]; then - tag_name="v$pkg_version" - fi - - gpgsignerr=0 - siggz="$(sign_or_fail ${targz})" - gpgsignerr=$((${gpgsignerr} + $?)) - sigbz2="$(sign_or_fail ${tarbz2})" - gpgsignerr=$((${gpgsignerr} + $?)) - sigxz="$(sign_or_fail ${tarxz})" - gpgsignerr=$((${gpgsignerr} + $?)) - if [ ${gpgsignerr} -ne 0 ]; then - echo "Error: unable to sign at least one of the tarballs." - cd $top_src - return 1 - fi - - # Obtain the top commit SHA which should be the version bump - # It should not have been tagged yet (the script will do it later) - local_top_commit_sha=`git rev-list --max-count=1 HEAD` - if [ $? -ne 0 ]; then - echo "Error: unable to obtain the local top commit id." - cd $top_src - return 1 - fi - - # Check that the top commit looks like a version bump - git diff --unified=0 HEAD^ | $GREP -F $pkg_version >/dev/null 2>&1 - if [ $? -ne 0 ]; then - # Wayland repos use m4_define([wayland_major_version], [0]) - git diff --unified=0 HEAD^ | $GREP -E "(major|minor|micro)_version" >/dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "Error: the local top commit does not look like a version bump." - echo " the diff does not contain the string \"$pkg_version\"." - local_top_commit_descr=`git log --oneline --max-count=1 $local_top_commit_sha` - echo " the local top commit is: \"$local_top_commit_descr\"" - cd $top_src - return 1 - fi - fi - - # Check that the top commit has been pushed to remote - remote_top_commit_sha=`git rev-list --max-count=1 $remote_name/$remote_branch` - if [ $? -ne 0 ]; then - echo "Error: unable to obtain top commit from the remote repository." - cd $top_src - return 1 - fi - if [ x"$remote_top_commit_sha" != x"$local_top_commit_sha" ]; then - echo "Error: the local top commit has not been pushed to the remote." - local_top_commit_descr=`git log --oneline --max-count=1 $local_top_commit_sha` - echo " the local top commit is: \"$local_top_commit_descr\"" - cd $top_src - return 1 - fi - - # If a tag exists with the the tar name, ensure it is tagging the top commit - # It may happen if the version set in configure.ac has been previously released - tagged_commit_sha=`git rev-list --max-count=1 $tag_name 2>/dev/null` - if [ $? -eq 0 ]; then - # Check if the tag is pointing to the top commit - if [ x"$tagged_commit_sha" != x"$remote_top_commit_sha" ]; then - echo "Error: the \"$tag_name\" already exists." - echo " this tag is not tagging the top commit." - remote_top_commit_descr=`git log --oneline --max-count=1 $remote_top_commit_sha` - echo " the top commit is: \"$remote_top_commit_descr\"" - local_tag_commit_descr=`git log --oneline --max-count=1 $tagged_commit_sha` - echo " tag \"$tag_name\" is tagging some other commit: \"$local_tag_commit_descr\"" - cd $top_src - return 1 - else - echo "Info: module already tagged with \"$tag_name\"." - fi - else - # Tag the top commit with the tar name - if [ x"$DRY_RUN" = x ]; then - git tag -s -m $tag_name $tag_name - if [ $? -ne 0 ]; then - echo "Error: unable to tag module with \"$tag_name\"." - cd $top_src - return 1 - else - echo "Info: module tagged with \"$tag_name\"." - fi - else - echo "Info: skipping the commit tagging in dry-run mode." - fi - fi - - # --------- Now the tarballs are ready to upload ---------- - - # The hostname which is used to connect to the development resources - hostname="annarchy.freedesktop.org" - - # Some hostnames are also used as /srv subdirs - host_fdo="www.freedesktop.org" - - list_to="virglrenderer-devel@lists.freedesktop.org" - - host_current=$host_fdo - section_path=software/virgl - srv_path="/srv/$host_current/www/$section_path" - - # Use personal web space on the host for unit testing (leave commented out) - # srv_path="~/public_html$srv_path" - - # Check that the server path actually does exist - ssh $USER_NAME$hostname ls $srv_path >/dev/null 2>&1 || - if [ $? -ne 0 ]; then - echo "Error: the path \"$srv_path\" on the web server does not exist." - cd $top_src - return 1 - fi - - # Check for already existing tarballs - for tarball in $targz $tarbz2 $tarxz; do - ssh $USER_NAME$hostname ls $srv_path/$tarball >/dev/null 2>&1 - if [ $? -eq 0 ]; then - if [ "x$FORCE" = "xyes" ]; then - echo "Warning: overwriting released tarballs due to --force option." - else - echo "Error: tarball $tar_name already exists. Use --force to overwrite." - cd $top_src - return 1 - fi - fi - done - - # Upload to host using the 'scp' remote file copy program - if [ x"$DRY_RUN" = x ]; then - echo "Info: uploading tarballs to web server:" - scp $targz $tarbz2 $tarxz $siggz $sigbz2 $sigxz $USER_NAME$hostname:$srv_path - if [ $? -ne 0 ]; then - echo "Error: the tarballs uploading failed." - cd $top_src - return 1 - fi - else - echo "Info: skipping tarballs uploading in dry-run mode." - echo " \"$srv_path\"." - fi - - # Pushing the top commit tag to the remote repository - if [ x$DRY_RUN = x ]; then - echo "Info: pushing tag \"$tag_name\" to remote \"$remote_name\":" - git push $remote_name $tag_name - if [ $? -ne 0 ]; then - echo "Error: unable to push tag \"$tag_name\" to the remote repository." - echo " it is recommended you fix this manually and not run the script again" - cd $top_src - return 1 - fi - else - echo "Info: skipped pushing tag \"$tag_name\" to the remote repository in dry-run mode." - fi - - MD5SUM=`which md5sum || which gmd5sum` - SHA1SUM=`which sha1sum || which gsha1sum` - SHA256SUM=`which sha256sum || which gsha256sum` - - # --------- Generate the announce e-mail ------------------ - # Failing to generate the announce is not considered a fatal error - - # Git-describe returns only "the most recent tag", it may not be the expected one - # However, we only use it for the commit history which will be the same anyway. - tag_previous=`git describe --abbrev=0 HEAD^ 2>/dev/null` - # Git fails with rc=128 if no tags can be found prior to HEAD^ - if [ $? -ne 0 ]; then - if [ $? -ne 0 ]; then - echo "Warning: unable to find a previous tag." - echo " perhaps a first release on this branch." - echo " Please check the commit history in the announce." - fi - fi - if [ x"$tag_previous" != x ]; then - # The top commit may not have been tagged in dry-run mode. Use commit. - tag_range=$tag_previous..$local_top_commit_sha - else - tag_range=$tag_name - fi - generate_announce > "$tar_name.announce" - echo "Info: [ANNOUNCE] template generated in \"$tar_name.announce\" file." - echo " Please pgp sign and send it." - - # --------- Update the JH Build moduleset ----------------- - # Failing to update the jh moduleset is not considered a fatal error - if [ x"$JH_MODULESET" != x ]; then - for tarball in $targz $tarbz2 $tarxz; do - if [ x$DRY_RUN = x ]; then - sha1sum=`$SHA1SUM $tarball | cut -d' ' -f1` - $top_src/util/modular/update-moduleset.sh $JH_MODULESET $sha1sum $tarball - echo "Info: updated jh moduleset: \"$JH_MODULESET\"" - else - echo "Info: skipping jh moduleset \"$JH_MODULESET\" update in dry-run mode." - fi - - # $tar* may be unset, so simply loop through all of them and the - # first one that is set updates the module file - break - done - fi - - - # --------- Successful completion -------------------------- - cd $top_src - return 0 - -} - -#------------------------------------------------------------------------------ -# Function: usage -#------------------------------------------------------------------------------ -# Displays the script usage and exits successfully -# -usage() { - basename="`expr "//$0" : '.*/\([^/]*\)'`" - cat < Release the git modules specified in - --moduleset The jhbuild moduleset full pathname to be updated - --no-quit Do not quit after error; just print error message - --user @ Username of your fdo account if not configured in ssh - -Environment variables defined by the "make" program and used by release.sh: - MAKE The name of the make command [make] - MAKEFLAGS: Options to pass to all \$(MAKE) invocations - -HELP -} - -#------------------------------------------------------------------------------ -# Script main line -#------------------------------------------------------------------------------ -# - -# Choose which make program to use (could be gmake) -MAKE=${MAKE:="make"} - -# Choose which grep program to use (on Solaris, must be gnu grep) -if [ "x$GREP" = "x" ] ; then - if [ -x /usr/gnu/bin/grep ] ; then - GREP=/usr/gnu/bin/grep - else - GREP=grep - fi -fi - -# Find path for GnuPG v2 -if [ "x$GPG" = "x" ] ; then - if [ -x /usr/bin/gpg2 ] ; then - GPG=/usr/bin/gpg2 - else - GPG=gpg - fi -fi - -# Set the default make tarball creation command -MAKE_DIST_CMD=distcheck - -# Process command line args -while [ $# != 0 ] -do - case $1 in - # Use 'dist' rather than 'distcheck' to create tarballs - # You really only want to do this if you're releasing a module you can't - # possibly build-test. Please consider carefully the wisdom of doing so. - --dist) - MAKE_DIST_CMD=dist - ;; - # Use 'distcheck' to create tarballs - --distcheck) - MAKE_DIST_CMD=distcheck - ;; - # Does everything except uploading tarball - --dry-run) - DRY_RUN=yes - ;; - # Force overwriting an existing release - # Use only if nothing changed in the git repo - --force) - FORCE=yes - ;; - # Display this help and exit successfully - --help) - usage - exit 0 - ;; - # Release the git modules specified in - --modfile) - check_option_args $1 $2 - shift - MODFILE=$1 - ;; - # The jhbuild moduleset to update with relase info - --moduleset) - check_option_args $1 $2 - shift - JH_MODULESET=$1 - ;; - # Do not quit after error; just print error message - --no-quit) - NO_QUIT=yes - ;; - # Username of your fdo account if not configured in ssh - --user) - check_option_args $1 $2 - shift - USER_NAME=$1 - ;; - --*) - echo "" - echo "Error: unknown option: $1" - echo "" - usage - exit 1 - ;; - -*) - echo "" - echo "Error: unknown option: $1" - echo "" - usage - exit 1 - ;; - *) - if [ x"${MODFILE}" != x ]; then - echo "" - echo "Error: specifying both modules and --modfile is not permitted" - echo "" - usage - exit 1 - fi - INPUT_MODULES="${INPUT_MODULES} $1" - ;; - esac - - shift -done - -# If no modules specified (blank cmd line) display help -check_modules_specification - -# Read the module file and normalize input in INPUT_MODULES -read_modfile - -# Loop through each module to release -# Exit on error if --no-quit no specified -process_modules - -# Print the epilog with final status -print_epilog