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. -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