On Mon, Aug 10, 2015 at 05:52:00PM -0700, Jason Gerecke wrote:
> The latest-and-greatest copy of release.sh from Xorg now replaces our
> current version of the script which largely dates back to 2010. This
> script brings several new features along with it, with stronger checks
> and PGP signing probably being the two worth noting.
> 
> A very small number of modifications to the upstream version of this
> script (commit 65cb27b) have been made to support this project. The only
> one of note is a change to 'generate_announce' which changes it to
> use the 'Reply-To' header instead of 'Cc' (since the announce list will
> bounce unauthorized messages back).
> 
> Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
> ---
> I'm thinking about using this patch instead of the "Auto-generate
> configure.ac version numbers" one I submitted to the list earlier. Any
> thoughts or opinions, Peter?

looks good. I only glanced through it and something decided to mess up the
linewrapping. Only request I have: check the indentation in the wacom
bits, at least the section_path looks off.

Acked-by: Peter Hutterer <peter.hutte...@who-t.net>

Don't know if you already tried this, but there's a --dry-run option so you
can test the script.

Cheers,
   Peter


>co 
>  release.sh | 1027
> ++++++++++++++++++++++++++++++++++++++++++++++++------------
>  1 file changed, 827 insertions(+), 200 deletions(-)
> 
> diff --git a/release.sh b/release.sh
> index 449177e..4419e67 100755
> --- a/release.sh
> +++ b/release.sh
> @@ -1,245 +1,872 @@
> -#!/bin/sh
> +#!/bin/bash
> +#
> +#            Creates and upload a git module tarball
> +#
>  # Release script for xf86-input-wacom.
>  # This is essentially a copy of the X.Org util/modular/release.sh script
>  # with a few modified parameters.
> +#
> +# 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.
> +#
> +#
>  -set -e
> +export LC_ALL=C
>  -announce_list="linuxwacom-annou...@lists.sourceforge.net"
> -discuss_list="linuxwacom-disc...@lists.sourceforge.net"
> -module=xf86-input-wacom
> -user=${USER}@
> -host=shell.sourceforge.net
> -remote=origin
> +#------------------------------------------------------------------------------
> +#                    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
> +}
>  -usage()
> -{
> -    cat <<HELP
> -Usage: `basename $0` [options] <tag_previous> <tag_current>
> +#------------------------------------------------------------------------------
> +#                    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
>  -Options:
> -  --force       force overwritting an existing release
> -  --user <name> username on $host
> -  --help        this help message
> -  --ignore-local-changes        don't abort on uncommitted local changes
> -  --remote      git remote where the change should be pushed (default
> "origin")
> -  --module <module>     release the given module. Default: xf86-input-wacom
> -                        Supported modules: xf86-input-wacom, libwacom
> -HELP
> +    # 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
>  }
>  -abort_for_changes()
> -{
> -    cat <<ERR
> -Uncommitted changes found. Did you forget to commit? Aborting.
> -Use --ignore-local-changes to skip this check.
> -ERR
> -    exit 1
> +#------------------------------------------------------------------------------
> +#                    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
> +
>  }
>  -gen_announce_mail()
> +#------------------------------------------------------------------------------
> +#                    Function: generate_announce
> +#------------------------------------------------------------------------------
> +#
> +generate_announce()
>  {
> -case "$tag_previous" in
> -initial)
> -     range="$tag_current"
> -     ;;
> -*)
> -     range="$tag_previous".."$tag_current"
> -     ;;
> -esac
> -
> -MD5SUM=`which md5sum || which gmd5sum`
> -SHA1SUM=`which sha1sum || which gsha1sum`
> -
>      cat <<RELEASE
> -Subject: [ANNOUNCE] $module $version
> -To: $announce_list
> -Reply-To: $discuss_list
> +Subject: [ANNOUNCE] $pkg_name $pkg_version
> +To: $list_to
> +Reply-To: $list_cc
> +
> +`git log --no-merges "$tag_range" | git shortlog`
>  -`git log --no-merges "$range" | git shortlog`
> +git tag: $tag_name
>  -git tag: $tag_current
> +RELEASE
>  -http://$webpath/$tarbz2/download
> -MD5:  `cd $tarball_dir && $MD5SUM $tarbz2`
> -SHA1: `cd $tarball_dir && $SHA1SUM $tarbz2`
> +    for tarball in $tarbz2 $targz $tarxz; do
> +     cat <<RELEASE
> +http://$host_current/$section_path/$tarball
> +MD5:  `$MD5SUM $tarball`
> +SHA1: `$SHA1SUM $tarball`
> +SHA256: `$SHA256SUM $tarball`
> +PGP:  http://${host_current}/${section_path}/${tarball}.sig
>   RELEASE
> +    done
>  }
>  -export LC_ALL=C
> +#------------------------------------------------------------------------------
> +#                    Function: read_modfile
> +#------------------------------------------------------------------------------
> +#
> +# Read the module names from the file and set a variable to hold them
> +# This will be the same interface as cmd line supplied modules
> +#
> +read_modfile() {
> +
> +    if [ x"$MODFILE" != x ]; then
> +     # Make sure the file is sane
> +     if [ ! -r "$MODFILE" ]; then
> +         echo "Error: module file '$MODFILE' is not readable or does not
> exist."
> +         exit 1
> +     fi
> +     # read from input file, skipping blank and comment lines
> +     while read line; do
> +         # skip blank lines
> +         if [ x"$line" = x ]; then
> +             continue
> +         fi
> +         # skip comment lines
> +         if echo "$line" | $GREP -q "^#" ; then
> +             continue;
> +         fi
> +         INPUT_MODULES="$INPUT_MODULES $line"
> +     done <"$MODFILE"
> +    fi
> +    return 0
> +}
>  -while [ $# != 0 ]; do
> -    case "$1" in
> -    --force)
> -        force="yes"
> -        shift
> -        ;;
> -    --help)
> -        usage
> -        exit 0
> -        ;;
> -    --user)
> -     shift
> -     user=$1@
> -     shift
> -     ;;
> -    --ignore-local-changes)
> -        ignorechanges=1
> -        shift
> -        ;;
> -    --remote)
> -        shift
> -        remote=$1
> -        shift
> -        ;;
> -    --module)
> -        shift
> -        module=$1
> -        shift
> -        ;;
> -    --*)
> -        echo "error: unknown option"
> -        usage
> -        exit 1
> -        ;;
> -    *)
> -        tag_previous="$1"
> -        tag_current="$2"
> -        shift 2
> -        if [ $# != 0 ]; then
> -            echo "error: unknown parameter"
> -            usage
> -            exit 1
> +#------------------------------------------------------------------------------
> +#                    Function: print_epilog
> +#------------------------------------------------------------------------------
> +#
> +print_epilog() {
> +
> +    epilog="========  Successful Completion"
> +    if [ x"$NO_QUIT" != x ]; then
> +     if [ x"$failed_modules" != x ]; then
> +         epilog="========  Partial Completion"
> +     fi
> +    elif [ x"$failed_modules" != x ]; then
> +     epilog="========  Stopped on Error"
> +    fi
> +
> +    echo ""
> +    echo "$epilog `date`"
> +
> +    # Report about modules that failed for one reason or another
> +    if [ x"$failed_modules" != x ]; then
> +     echo "  List of failed modules:"
> +     for mod in $failed_modules; do
> +         echo "      $mod"
> +     done
> +     echo "========"
> +     echo ""
> +    fi
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    Function: process_modules
> +#------------------------------------------------------------------------------
> +#
> +# Loop through each module to release
> +# Exit on error if --no-quit was not specified
> +#
> +process_modules() {
> +    for MODULE_RPATH in ${INPUT_MODULES}; do
> +     if ! process_module ; then
> +         echo "Error: processing module \"$MODULE_RPATH\" failed."
> +         failed_modules="$failed_modules $MODULE_RPATH"
> +         if [ x"$NO_QUIT" = x ]; then
> +             print_epilog
> +             exit 1
> +         fi
> +     fi
> +    done
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    Function: get_section
> +#------------------------------------------------------------------------------
> +# Code 'return 0' on success
> +# Code 'return 1' on error
> +# Sets global variable $section
> +get_section() {
> +    local module_url
> +    local full_module_url
> +
> +    # Obtain the git url in order to find the section to which this
> module belongs
> +    full_module_url=`git config --get remote.$remote_name.url | sed
> 's:\.git$::'`
> +    if [ $? -ne 0 ]; then
> +     echo "Error: unable to obtain git url for remote \"$remote_name\"."
> +     return 1
> +    fi
> +
> +    # The last part of the git url will tell us the section. Look for
> xorg first
> +    echo "$full_module_url"
> +    module_url=`echo "$full_module_url" | $GREP -o "/xorg/.*"`
> +    if [ $? -eq 0 ]; then
> +     module_url=`echo $module_url | cut -d'/' -f3,4`
> +    else
> +     # The look for mesa, xcb, etc...
> +     module_url=`echo "$full_module_url" | $GREP -o -e "/mesa/.*" -e
> "/xcb/.*" -e "/xkeyboard-config" -e "/nouveau/xf86-video-nouveau" -e
> "/libevdev" -e "/wayland/.*" -e "/evemu" -e "/linuxwacom/.*"`
> +     if [ $? -eq 0 ]; then
> +          module_url=`echo $module_url | cut -d'/' -f2,3`
> +     else
> +         echo "Error: unable to locate a valid project url from
> \"$full_module_url\"."
> +         echo "Cannot establish url as one of linuxwacom, xorg, mesa, xcb,
> xf86-video-nouveau, xkeyboard-config or wayland"
> +         cd $top_src
> +         return 1
> +     fi
> +    fi
> +
> +    # Find the section (subdirs) where the tarballs are to be uploaded
> +    # The module relative path can be app/xfs, xserver, or mesa/drm for
> example
> +    section=`echo $module_url | cut -d'/' -f1`
> +    if [ $? -ne 0 ]; then
> +     echo "Error: unable to extract section from $module_url first field."
> +     return 1
> +    fi
> +
> +    if [ x"$section" = xmesa ]; then
> +     section=`echo $module_url | cut -d'/' -f2`
> +     if [ $? -ne 0 ]; then
> +         echo "Error: unable to extract section from $module_url second 
> field."
> +         return 1
> +     elif [ x"$section" != xdrm ]; then
> +         echo "Error: section $section is not supported, only libdrm is."
> +         return 1
> +     fi
> +    fi
> +
> +    if [ x"$section" = xwayland ]; then
> +     section=`echo $module_url | cut -d'/' -f2`
> +     if [ $? -ne 0 ]; then
> +         echo "Error: unable to extract section from $module_url second 
> field."
> +         return 1
> +     fi
> +    fi
> +
> +    if [ x"$section" = xlinuxwacom ]; then
> +     section=`echo $module_url | cut -d'/' -f2`
> +     if [ $? -ne 0 ]; then
> +         echo "Error: unable to extract section from $module_url second 
> field."
> +         return 1
> +     fi
> +    fi
> +
> +    return 0
> +}
> +
> +#                       Function: sign_or_fail
> +#------------------------------------------------------------------------------
> +#
> +# Sign the given file, if any
> +# Output the name of the signature generated to stdout (all other output to
> +# stderr)
> +# Return 0 on success, 1 on fail
> +#
> +sign_or_fail() {
> +    if [ -n "$1" ]; then
> +     sig=$1.sig
> +     rm -f $sig
> +     $GPG -b $1 1>&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\"."
> +
> +    # Obtain the section
> +    get_section
> +    if [ $? -ne 0 ]; then
> +     cd $top_src
> +     return 1
> +    fi
> +
> +    # 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"
> +    host_xorg="xorg.freedesktop.org"
> +    host_dri="dri.freedesktop.org"
> +    host_wayland="wayland.freedesktop.org"
> +    host_linuxwacom="shell.sourceforge.net"
> +
> +    # Mailing lists where to post the all [Announce] e-mails
> +    list_to="xorg-annou...@lists.freedesktop.org"
> +
> +    # Mailing lists to be CC according to the project (xorg|dri|xkb)
> +    list_xorg_user="x...@lists.freedesktop.org"
> +    list_dri_devel="dri-de...@lists.freedesktop.org"
> +    list_xkb="x...@listserv.bat.ru"
> +    list_xcb="x...@lists.freedesktop.org"
> +    list_nouveau="nouv...@lists.freedesktop.org"
> +    list_wayland="wayland-de...@lists.freedesktop.org"
> +    list_linuxwacom="linuxwacom-disc...@lists.sourceforge.net"
> +
> +    # nouveau is very special.. sigh
> +    if [ x"$section" = xnouveau ]; then
> +            section=driver
> +            list_cc=$list_nouveau
> +    else
> +            list_cc=$list_xorg_user
> +    fi
> +
> +    host_current=$host_xorg
> +    section_path=archive/individual/$section
> +    srv_path="/srv/$host_current/$section_path"
> +
> +    # Handle special cases such as non xorg projects or migrated xorg
> projects
> +    # Xcb has a separate mailing list
> +    if [ x"$section" = xxcb ]; then
> +     list_cc=$list_xcb
> +    fi
> +
> +    # Module mesa/drm goes in the dri "libdrm" section
> +    if [ x"$section" = xdrm ]; then
> +        host_current=$host_dri
> +        section_path=libdrm
> +        srv_path="/srv/$host_current/www/$section_path"
> +        list_cc=$list_dri_devel
> +    fi
> +
> +    # Module xkeyboard-config goes in a subdir of the xorg "data" section
> +    if [ x"$section" = xxkeyboard-config ]; then
> +     host_current=$host_xorg
> +     section_path=archive/individual/data/$section
> +     srv_path="/srv/$host_current/$section_path"
> +     list_cc=$list_xkb
> +    fi
> +
> +    if [ x"$section" = xlibevdev ]; then
> +     host_current=$host_fdo
> +     section_path="software/$section"
> +     srv_path="/srv/$host_current/www/$section_path"
> +     list_to=input-to...@lists.freedesktop.org
> +     unset list_cc
> +    fi
> +
> +    if [ x"$section" = xwayland ] ||
> +       [ x"$section" = xweston ]; then
> +        host_current=$host_wayland
> +        section_path="releases"
> +        srv_path="/srv/$host_current/www/releases"
> +        list_to=$list_wayland
> +        unset list_cc
> +    elif [ x"$section" = xlibinput ]; then
> +        host_current=$host_fdo
> +        section_path="software/libinput"
> +        srv_path="/srv/$host_current/www/$section_path"
> +        list_to=$list_wayland
> +        unset list_cc
> +    elif [ x"$section" = xevemu ]; then
> +        host_current=$host_fdo
> +        section_path="software/evemu"
> +        srv_path="/srv/$host_current/www/$section_path"
> +        list_to=input-to...@lists.freedesktop.org
> +        unset list_cc
> +    fi
> +
> +    if [ x"$section" = xxf86-input-wacom ] ||
> +       [ x"$section" = xinput-wacom ] ||
> +       [ x"$section" = xlibwacom ]; then
> +        # input-wacom files are in a subdirectory for whatever reason
> +        if [ x"%section" = xinput-wacom]; then
> +            section="xf86-input-wacom/input-wacom"
>          fi
> -        ;;
> -    esac
> -done
>  -case "$module" in
> -    libwacom)
> -        ;;
> -    xf86-input-wacom)
> -        ;;
> -    input-wacom)
> -        ;;
> -    *)
> -        echo "error: unknown module '$module'"
> -        exit 1
> -esac
> -
> -if [ -z "$tag_previous" ] || [ -z "$tag_current" ]; then
> -    echo "error: missing previous or current tag"
> -    usage
> -    exit 1
> -fi
> +        hostname=$host_linuxwacom
> +        host_current="sourceforge.net"
> +     section_path="projects/linuxwacom/files/$section"
> +        srv_path="/home/frs/project/linuxwacom/$section"
> +        list_to="linuxwacom-annou...@lists.sourceforge.net"
> +        list_cc=$list_linuxwacom
> +
> +        echo "creating shell on sourceforge for $USER"
> +        echo "Simply log out once you get to the prompt"
> +     ssh -t ${USER_NAME%@},linuxwacom@$hostname create
> +        echo "Sleeping for 30 seconds, because this sometimes helps
> against sourceforge's random authentication denials"
> +        sleep 30
> +    fi
>  +    # Use personal web space on the host for unit testing (leave
> commented out)
> +    # srv_path="~/public_html$srv_path"
>  -# Check for uncommitted/queued changes.
> -if [ "x$ignorechanges" != "x1" ]; then
> -    set +e
> -    git diff --exit-code > /dev/null 2>&1
> +    # Check that the server path actually does exist
> +    ssh $USER_NAME$hostname ls $srv_path >/dev/null 2>&1 ||
>      if [ $? -ne 0 ]; then
> -        abort_for_changes
> +     echo "Error: the path \"$srv_path\" on the web server does not exist."
> +     cd $top_src
> +     return 1
>      fi
> -    set -e
> -fi
>  -# Check if the object has been pushed. Do do so
> -# 1. Check if the current branch has the object. If not, abort.
> -# 2. Check if the object is on $remote/branchname. If not, abort.
> -local_sha=`git rev-list -1 $tag_current`
> -current_branch=`git branch | grep "\*" | sed -e "s/\* //"`
> -set +e
> -git rev-list $current_branch | grep $local_sha > /dev/null
> -if [ $? -eq 1 ]; then
> -    echo "Cannot find tag '$tag_current' on current branch. Aborting."
> -    echo "Switch to the correct branch and re-run the script."
> -    exit 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
>  -revs=`git rev-list $remote/$current_branch..$current_branch | wc -l`
> -if [ $revs -ne 0 ]; then
> -    git rev-list $remote/$current_branch..$current_branch | grep
> $local_sha > /dev/null
> +    MD5SUM=`which md5sum || which gmd5sum`
> +    SHA1SUM=`which sha1sum || which gsha1sum`
> +    SHA256SUM=`which sha256sum || which gsha256sum`
>  -    if [ $? -ne 1 ]; then
> -        echo "$remote/$current_branch doesn't have object $local_sha"
> -        echo "for tag '$tag_current'. Did you push branch first? Aborting."
> -        exit 1
> +    # --------- 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
> -fi
> -set -e
> -
> -tarball_dir="$(dirname $(find . -name config.status))"
> -module="${tag_current%-*}"
> -if [ "x$module" = "x$tag_current" ]; then
> -    # version-number-only tag.
> -    pwd=`pwd`
> -    module=`basename $pwd`
> -    version="$tag_current"
> -else
> -    # module-and-version style tag
> -    version="${tag_current##*-}"
> -fi
>  -detected_module=`grep 'PACKAGE = ' $tarball_dir/Makefile | sed
> 's|PACKAGE = ||'`
> -if [ -f $detected_module-$version.tar.bz2 ]; then
> -    module=$detected_module
> -fi
>  -modulever=$module-$version
> -tarbz2="$modulever.tar.bz2"
> -announce="$tarball_dir/$modulever.announce"
> -srv_path=/home/frs/project/linuxwacom/$module
> -webpath=sourceforge.net/projects/linuxwacom/files/$module
> -
> -echo "checking parameters"
> -if ! [ -f "$tarball_dir/$tarbz2" ]; then
> -    echo "error: incorrect parameters!"
> -    usage
> -    exit 1
> -fi
> +    # --------- Successful completion --------------------------
> +    cd $top_src
> +    return 0
>  -echo "checking for proper current dir"
> -if ! [ -d .git ]; then
> -    echo "error: do this from your git dir, weenie"
> -    exit 1
> -fi
> +}
>  -echo "checking for an existing tag"
> -if ! git tag -l $tag_current >/dev/null; then
> -    echo "error: you must tag your release first!"
> -    exit 1
> -fi
> +#------------------------------------------------------------------------------
> +#                    Function: usage
> +#------------------------------------------------------------------------------
> +# Displays the script usage and exits successfully
> +#
> +usage() {
> +    basename="`expr "//$0" : '.*/\([^/]*\)'`"
> +    cat <<HELP
> +
> +Usage: $basename [options] path...
>  -echo "creating shell on sourceforge for $USER"
> -echo "Simply log out once you get to the prompt"
> -ssh -t ${user/%@},linuxwa...@shell.sourceforge.net create
> +Where "path" is a relative path to a git module, including '.'.
>  -echo "Sleeping for 30 seconds, because this sometimes helps against
> sourceforge's random authentication denials"
> -sleep 30
> +Options:
> +  --dist              make 'dist' instead of 'distcheck'; use with caution
> +  --distcheck         Default, ignored for compatibility
> +  --dry-run           Does everything except tagging and uploading tarballs
> +  --force             Force overwriting an existing release
> +  --help              Display this help and exit successfully
> +  --modfile <file>    Release the git modules specified in <file>
> +  --moduleset <file>  The jhbuild moduleset full pathname to be updated
> +  --no-quit           Do not quit after error; just print error message
> +  --user <name>@      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"}
>  -echo "checking for an existing release"
> -if ssh $user$host_people ls $srv_path/$module/$tarbz2 >/dev/null 2>&1; then
> -if [ "x$force" = "xyes" ]; then
> -echo "warning: overriding released file ... here be dragons."
> -else
> -echo "error: file already exists!"
> -exit 1
> +# 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
>  -echo "generating announce mail template, remember to sign it"
> -gen_announce_mail >$announce
> -echo "    at: $announce"
> +# 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 <file>
> +    --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
>  -echo "Sleeping for 30 seconds, because this sometimes helps against
> sourceforge's random authentication denials"
> -sleep 30
> +# If no modules specified (blank cmd line) display help
> +check_modules_specification
>  -echo "installing release into server"
> -scp $tarball_dir/$tarbz2 $user$host:$srv_path
> +# Read the module file and normalize input in INPUT_MODULES
> +read_modfile
>  -echo "pushing tag upstream"
> -git push $remote $tag_current
> +# Loop through each module to release
> +# Exit on error if --no-quit no specified
> +process_modules
>  -echo "All done. Please bump configure.ac to x.y.99 now"
> +# Print the epilog with final status
> +print_epilog
> -- 
> 2.5.0
> 

------------------------------------------------------------------------------
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to