Require at least 1 of Github/Sourceforge.

Ref: https://github.com/linuxwacom/xf86-input-wacom/issues/10

Signed-off-by: Aaron Armstrong Skomra <sko...@gmail.com>
Reviewed-by: Ping Cheng <ping.ch...@wacom.com>
Reviewed-by: Jason Gerecke <jason.gere...@wacom.com>
---
 release.sh | 288 ++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 207 insertions(+), 81 deletions(-)

diff --git a/release.sh b/release.sh
index f12073f97f3b..d082b3809f22 100755
--- a/release.sh
+++ b/release.sh
@@ -15,6 +15,14 @@
 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
 #------------------------------------------------------------------------------
 #
@@ -89,11 +97,160 @@ 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="xf86-input-wacom"
+    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
@@ -105,16 +262,14 @@ git tag: $tag_name
 
 RELEASE
 
-    for tarball in $tarbz2 $targz $tarxz; do
        cat <<RELEASE
-http://$host_current/$section_path/$tarball
+$DL_URL
 MD5:  `$MD5SUM $tarball`
 SHA1: `$SHA1SUM $tarball`
 SHA256: `$SHA256SUM $tarball`
-PGP:  http://${host_current}/${section_path}/${tarball}.sig
+PGP: $PGP_URL
 
 RELEASE
-    done
 }
 
 #------------------------------------------------------------------------------
@@ -474,76 +629,6 @@ process_module() {
        fi
     fi
 
-    # --------- Now the tarballs are ready to upload ----------
-
-    # 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"
-        list_to="linuxwacom-annou...@lists.sourceforge.net"
-        list_cc="linuxwacom-disc...@lists.sourceforge.net"
-
-        echo "creating shell on sourceforge for $USER"
-        ssh -t ${USER_NAME%@},linuxwacom@$hostname create
-        #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 that the server path actually does exist
-    ssh $USER_NAME$hostname ls $srv_path >/dev/null 2>&1 ||
-    if [ $? -ne 0 ]; then
-       echo "Error: the path \"$srv_path\" on the web server does not exist."
-       cd $top_src
-       return 1
-    fi
-
-    # Check for already existing tarballs
-    for tarball in $targz $tarbz2 $tarxz; do
-       ssh $USER_NAME$hostname ls $srv_path/$tarball  >/dev/null 2>&1
-       if [ $? -eq 0 ]; then
-           if [ "x$FORCE" = "xyes" ]; then
-               echo "Warning: overwriting released tarballs due to --force 
option."
-           else
-               echo "Error: tarball $tar_name already exists. Use --force to 
overwrite."
-               cd $top_src
-               return 1
-           fi
-       fi
-    done
-
-    # Upload to host using the 'scp' remote file copy program
-    if [ x"$DRY_RUN" = x ]; then
-       echo "Info: uploading tarballs to web server:"
-       scp $targz $tarbz2 $tarxz $siggz $sigbz2 $sigxz 
$USER_NAME$hostname:$srv_path
-       if [ $? -ne 0 ]; then
-           echo "Error: the tarballs uploading failed."
-           cd $top_src
-           return 1
-       fi
-    else
-       echo "Info: skipping tarballs uploading in dry-run mode."
-       echo "      \"$srv_path\"."
-    fi
-
     # Pushing the top commit tag to the remote repository
     if [ x$DRY_RUN = x ]; then
        echo "Info: pushing tag \"$tag_name\" to remote \"$remote_name\":"
@@ -558,13 +643,20 @@ process_module() {
        echo "Info: skipped pushing tag \"$tag_name\" to the remote repository 
in dry-run mode."
     fi
 
-    MD5SUM=`which md5sum || which gmd5sum`
-    SHA1SUM=`which sha1sum || which gsha1sum`
-    SHA256SUM=`which sha256sum || which gsha256sum`
+    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`
@@ -584,7 +676,26 @@ process_module() {
     fi
     generate_announce > "$tar_name.announce"
     echo "Info: [ANNOUNCE] template generated in \"$tar_name.announce\" file."
-    echo "      Please pgp sign and send it."
+    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
@@ -631,6 +742,9 @@ HELP
 # 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
@@ -696,11 +810,18 @@ do
     --no-quit)
        NO_QUIT=yes
        ;;
-    # Username of your fdo account if not configured in ssh
-    --user)
+    # Github username. Optional. Append colon and Personali
+    # 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
-       USER_NAME=$1
+       SF_USERNAME=$1
        ;;
     --*)
        echo ""
@@ -731,6 +852,11 @@ do
     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
 
-- 
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

Reply via email to