On Fri, May 18, 2018 at 02:18:40PM -0700, Aaron Armstrong Skomra wrote:
> Signed-off-by: Aaron Armstrong Skomra <sko...@gmail.com>
> ---
> Apparently the old release.sh in xf86-input-wacom also worked for
> libwacom. I missed this fact because the one time I did a libwacom
> release, I just followed the directions at the wiki. Those directions
> don't mention release.sh. 
> 
> I tested this against my fork, using 
> 
> git update-index --assume-unchanged release.sh
> 
> to target my repo as GH_REPO without angering the script which does
> not like uncommitted changes.

thanks! question though: rather than duplicating the script wouldn't it be
worth pushing it to a new github/linuxwacom/utils repository and making it
work for our repositories? At this point the script is different enough from
the xorg one that we might as well detach ourselves completely and not worry
about any leftover compatibility.

Cheers,
   Peter

> -Aaron
>  release.sh | 872 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 872 insertions(+)
>  create mode 100755 release.sh
> 
> diff --git a/release.sh b/release.sh
> new file mode 100755
> index 000000000000..185c8ee01e22
> --- /dev/null
> +++ b/release.sh
> @@ -0,0 +1,872 @@
> +#!/bin/bash
> +#
> +#            Creates and upload a git module tarball
> +#
> +# Release script for libwacom.
> +# 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.
> +#
> +#
> +
> +export LC_ALL=C
> +
> +#------------------------------------------------------------------------------
> +#                    Function: check_for_jq
> +#------------------------------------------------------------------------------
> +#
> +check_for_jq() {
> +    command -v jq >/dev/null 2>&1 || { echo >&2 "This script requires jq but 
> it is not installed. Exiting."; exit 1;}
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    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: release_to_sourceforge
> +#------------------------------------------------------------------------------
> +#
> +release_to_sourceforge () {
> +
> +    # Some hostnames are also used as /srv subdirs
> +    host_linuxwacom="shell.sourceforge.net"
> +
> +    section_path=archive/individual/$section
> +    srv_path="/srv/$host_current/$section_path"
> +
> +    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
> +
> +        hostname=$host_linuxwacom
> +        host_current="sourceforge.net"
> +        section_path="projects/linuxwacom/files/$section"
> +        srv_path="/home/frs/project/linuxwacom/$section"
> +
> +        echo "creating shell on sourceforge for $SF_USERNAME"
> +        ssh ${SF_USERNAME%@},linuxwacom@$hostname create
> +        #echo "Simply log out once you get to the prompt"
> +        #ssh -t ${SF_USERNAME%@},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 that the server path actually does exist
> +    ssh $SF_USERNAME$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 $SF_USERNAME$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 
> $SF_USERNAME$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
> +
> +    host_current="sourceforge.net"
> +    section_path="projects/linuxwacom/files/$section"
> +    # DL_URL & PGP_URL will be overwritten by the Github download url if 
> github was
> +    # enabled on the command line
> +    DL_URL="http://$host_current/$section_path/$tarbz2";
> +    PGP_URL="http://$host_current/$section_path/$tarbz2.sig";
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    Function: check_json_message
> +#------------------------------------------------------------------------------
> +#
> +# if we get json with a "message" from github there was an error
> +# $1 the JSON to parse
> +check_json_message() {
> +
> +    message=`echo $1 | jq ".message"`
> +    if [ "$message" != "null" ] ; then
> +        echo "Github release error: $1"
> +        exit 1
> +    fi
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    Function: release_to_github
> +#------------------------------------------------------------------------------
> +#
> +release_to_github() {
> +    # Creating a release on Github automatically creates a tag.
> +
> +    # dependency 'jq' for reading the json github sends us back
> +
> +    # note git_username should include the suffix ":KEY" if the user has 
> enabled 2FA
> +    # example skomra:de0e4dc3efbf2d008053027708227b365b7f80bf
> +
> +    GH_REPO="linuxwacom"
> +    PROJECT="libwacom"
> +    release_description="Temporary Empty Release Description"
> +    release_descr=$(jq -n --arg release_description "$release_description" 
> '$release_description')
> +
> +    # Create a Release
> +    api_json=$(printf '{"tag_name": "%s",
> +                        "target_commitish": "master",
> +                        "name": "%s",
> +                        "body": %s,
> +                        "draft": false,
> +                        "prerelease": false}' "$tar_name" "$tar_name" 
> "$release_descr")
> +    create_result=`curl -s --data "$api_json" -u $GH_USERNAME 
> https://api.github.com/repos/$GH_REPO/$PROJECT/releases`
> +    GH_RELEASE_ID=`echo $create_result | jq '.id'`
> +
> +    check_json_message "$create_result"
> +
> +    # Upload the tar to the release
> +    upload_result=`curl -s -u $GH_USERNAME \
> +        -H "Content-Type: application/x-bzip" \
> +        --data-binary @$tarbz2 \
> +        
> "https://uploads.github.com/repos/$GH_REPO/$PROJECT/releases/$GH_RELEASE_ID/assets?name=$tarbz2"`
> +    DL_URL=`echo $upload_result | jq -r '.browser_download_url'`
> +
> +    check_json_message "$upload_result"
> +
> +    # Upload the sig to the release
> +    sig_result=`curl -s -u $GH_USERNAME \
> +        -H "Content-Type: application/pgp-signature" \
> +        --data-binary @$tarbz2.sig \
> +        
> "https://uploads.github.com/repos/$GH_REPO/$PROJECT/releases/$GH_RELEASE_ID/assets?name=$tarbz2.sig"`
> +    PGP_URL=`echo $sig_result | jq -r '.browser_download_url'`
> +
> +    check_json_message "$sig_result"
> +
> +    echo "Github release created"
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    Function: generate_announce
> +#------------------------------------------------------------------------------
> +#
> +generate_announce()
> +{
> +    MD5SUM=`which md5sum || which gmd5sum`
> +    SHA1SUM=`which sha1sum || which gsha1sum`
> +    SHA256SUM=`which sha256sum || which gsha256sum`
> +
> +    cat <<RELEASE
> +Subject: [ANNOUNCE] $pkg_name $pkg_version
> +To: $list_to
> +Reply-To: $list_cc
> +
> +`git log --no-merges "$tag_range" | git shortlog`
> +
> +git tag: $tag_name
> +
> +RELEASE
> +
> +     cat <<RELEASE
> +$DL_URL
> + MD5:  `$MD5SUM $tarbz2`
> + SHA1: `$SHA1SUM $tarbz2`
> + SHA256: `$SHA256SUM $tarbz2`
> + PGP: $PGP_URL
> +
> +RELEASE
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    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
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    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 "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 linuxwacom"
> +         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" = 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
> +
> +    tag_name="$tar_name"
> +
> +    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
> +
> +    # 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
> +
> +    if [ -n "$SF_USERNAME" ]; then
> +        release_to_sourceforge
> +    fi
> +
> +    if [ -n "$GH_USERNAME" ]; then
> +        release_to_github
> +    fi
> +
> +    # --------- Generate the announce e-mail ------------------
> +    # Failing to generate the announce is not considered a fatal error
> +
> +    list_to="linuxwacom-annou...@lists.sourceforge.net"
> +    list_cc="linuxwacom-disc...@lists.sourceforge.net"
> +
> +    # 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 edit the .announce file to add a description of 
> what's interesting and then"
> +    echo "      pgp sign and send it."
> +
> +    # --------- Update the "body" text of the Github release with the 
> .announce file -----------------
> +
> +    if [ -n "$GH_RELEASE_ID" ]; then
> +        # Read the announce email and then escape it as a string in order to 
> add it to the JSON
> +        read -r -d '' release_description <"$tar_name.announce"
> +        release_descr=$(jq -n --arg release_description 
> "$release_description" '$release_description')
> +        api_json=$(printf '{"tag_name": "%s",
> +                            "target_commitish": "master",
> +                            "name": "%s",
> +                            "body": %s,
> +                            "draft": false,
> +                            "prerelease": false}' "$tar_name" "$tar_name" 
> "$release_descr")
> +        create_result=`curl -s -X PATCH --data "$api_json" -u $GH_USERNAME 
> https://api.github.com/repos/$GH_REPO/$PROJECT/releases/$GH_RELEASE_ID`
> +
> +        check_json_message "$create_result"
> +        echo "Git shortlog posted to the release at Github, please edit the 
> release to add a description of what's interesting."
> +    fi
> +
> +    # --------- Successful completion --------------------------
> +    cd $top_src
> +    return 0
> +
> +}
> +
> +#------------------------------------------------------------------------------
> +#                    Function: usage
> +#------------------------------------------------------------------------------
> +# Displays the script usage and exits successfully
> +#
> +usage() {
> +    basename="`expr "//$0" : '.*/\([^/]*\)'`"
> +    cat <<HELP
> +
> +Usage: $basename [options] path...
> +
> +Where "path" is a relative path to a git module, including '.'.
> +
> +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
> +  --github <name[:pat]>  Release project to Github with username / token
> +  --sourceforge <name>@  Release project to Sourceforge with username
> +
> +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"}
> +
> +# Check if the json parser 'jq' is installed
> +check_for_jq
> +
> +# 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 <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
> +     ;;
> +    # Github username. Optional. Append colon and Personal
> +    # Access Token to username if 2FA is enabled on the user
> +    # account doing the release
> +    --github)
> +     GH_USERNAME=$2
> +     shift
> +     ;;
> +    # Sourceforge username. Optional.
> +    --sourceforge)
> +     check_option_args $1 $2
> +     shift
> +     SF_USERNAME=$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 [[ x$GH_USERNAME = "x" ]] && [[ x$SF_USERNAME = "x" ]] ; then
> +    echo "At least one of --github or --sourceforge option required";
> +    exit 1;
> +fi
> +
> +# 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
> -- 
> 2.7.4
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Linuxwacom-devel mailing list
> Linuxwacom-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to