Signed-off-by: Aaron Armstrong Skomra <[email protected]>
---
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.
-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="[email protected]"
+ list_cc="[email protected]"
+
+ # 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel