PageRenderTime 38ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/utils/release/notification-helpers/release-sourceforge.sh

https://gitlab.com/Datse-Multimedia-Productions/LedgerSMB
Shell | 245 lines | 183 code | 31 blank | 31 comment | 23 complexity | 1849095ebed5ea8c0d83150594f23570 MD5 | raw file
  1. #!/bin/bash
  2. # import some functions that we need, like reading values from our config file.
  3. ConfigFile=~/.lsmb-release
  4. ############
  5. # Set internal variables so $1 and $2 are effectively available inside functions
  6. ############
  7. export release_type="${1:-${release_type:-unknown}}"
  8. export release_version="${2:-${release_version:-unknown}}"
  9. ############
  10. # Check our arguments are sane
  11. ############
  12. if ! [[ ${release_type} == 'stable' ]]; then
  13. printf "\n\n\n";
  14. printf "=====================================================================\n";
  15. printf "=====================================================================\n";
  16. printf "==== \$1 = %-10s ====\n" "$1";
  17. printf "==== We can only make changes to the default link ====\n";
  18. printf "==== when \$1 = stable ====\n";
  19. printf "=====================================================================\n";
  20. printf "=====================================================================\n";
  21. printf "Exiting Now....\n\n\n";
  22. exit 1;
  23. fi
  24. if [[ -z $release_version ]]; then
  25. printf "\n\n\n";
  26. printf "=====================================================================\n";
  27. printf "=====================================================================\n";
  28. printf "==== Essential Argument not available: ====\n";
  29. printf "==== One of the following must be set ====\n";
  30. printf "==== \$release_version = %-10s ====\n" "$release_version";
  31. printf "==== \$2 = %-10s ====\n" "$2";
  32. printf "=====================================================================\n";
  33. printf "=====================================================================\n";
  34. printf "Exiting Now....\n\n\n";
  35. exit 1;
  36. fi
  37. libFile=` readlink -f ./bash-functions.sh`
  38. [[ -f $libFile ]] && { [[ -r $libFile ]] && source $libFile; } || {
  39. printf "\n\n\n";
  40. printf "=====================================================================\n";
  41. printf "=====================================================================\n";
  42. printf "==== Essential Library not readable: ====\n";
  43. printf "==== %-51s ====\n" $libFile;
  44. printf "=====================================================================\n";
  45. printf "=====================================================================\n";
  46. printf "Exiting Now....\n\n\n";
  47. exit 1;
  48. }
  49. # set DEBUG=true to get dump of returned JSON for each command
  50. DEBUG=${cfgValue[sourceforge_Debug]};
  51. : ${DEBUG:+true};
  52. : ${DEBUG:=false};
  53. ############
  54. # Test Config to make sure we have everything we need
  55. ############
  56. HowToGetAPIkey() {
  57. cat <<-EOF
  58. Here is how to get your API key:
  59. Go to your account page by....
  60. * login
  61. * click on down arrow next to "me" top right of page
  62. * click on account settings
  63. * at the bottom of the preferences tab
  64. Click on the "Generate" button under the Releases API Key.
  65. Copy and paste the key that appears into
  66. $ConfigFile
  67. [sourceforge]
  68. ApiKey = YourKey
  69. EOF
  70. }
  71. while true; do
  72. # test for the apikey first so we can display help on getting it.
  73. if ( [[ ! -v cfgValue[sourceforge_ApiKey] ]] || [[ -z "${cfgValue[sourceforge_ApiKey]}" ]] ); then HowToGetAPIkey; fi #return; fi
  74. TestConfigInit;
  75. TestConfig4Key 'sourceforge' 'Project' 'ledgersmb'
  76. TestConfig4Key 'sourceforge' 'ReadlineHistory' '/tmp/sourceforge.history'
  77. TestConfig4Key 'sourceforge' 'ApiKey' 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  78. TestConfig4Key 'sourceforge' 'DefaultFileTemplate' 'Releases/${release_version}/ledgersmb-${release_version}.tar.gz'
  79. TestConfig4Key 'sourceforge' 'download_label' 'Download Latest ($release_version)'
  80. TestConfig4Key 'sourceforge' 'OS_List' 'windows mac linux bsd solaris others'
  81. if TestConfigAsk "Sourceforge Default Link Update"; then break; fi
  82. done
  83. getCurrentProjectInfo() { # Stores result in Project_JSON stores release.filename in Project_Filename stores release.sf_platform_default in Project_OS_list
  84. # {"release": null, "platform_releases": {"windows": null, "mac": null, "linux": null}}
  85. local _URL="https://sourceforge.net/projects/${cfgValue[sourceforge_Project]}/best_release.json"
  86. declare -g Project_JSON=''
  87. declare -g Project_Filename=''
  88. printf "===================================================\n"
  89. printf "===================================================\n"
  90. printf "==== Retrieving Default Link for Project ====\n"
  91. printf "==== %-35s ====\n" "${cfgValue[sourceforge_Project]}"
  92. printf "===================================================\n"
  93. printf "===================================================\n\n"
  94. Project_JSON=`curl -s -X GET "$_URL"`
  95. ${DEBUG:-false} && {
  96. echo "\n==================================================="
  97. echo "==================================================="
  98. echo "==== Debug Output from getCurrentProjectInfo() ===="
  99. echo "==================================================="
  100. echo "==================================================="
  101. jq . <<< "$Project_JSON"
  102. echo
  103. }
  104. Project_Filename=`jq -c .release.filename <<< "$Project_JSON"`
  105. Project_OS_list=`jq -c .release.sf_platform_default <<< "$Project_JSON"`
  106. printf "filename ='%s'\n" "$Project_Filename"
  107. printf "OS list ='%s'\n" "$Project_OS_list"
  108. echo
  109. }
  110. #### "${cfgValue[_]}"
  111. updateSourceforge() { # $1 = New Version $2 = New Date
  112. #https://sourceforge.net/p/forge/community-docs/Using%20the%20Release%20API/
  113. #https://sourceforge.net/p/forge/documentation/Allura%20API/
  114. local _DefaultFile="$(envsubst '$release_version' <<<${cfgValue[sourceforge_DefaultFileTemplate]})"
  115. local _OS_List='';
  116. local _Download_Label="sf_download_label=\"$(envsubst '$release_version' <<<${cfgValue[sourceforge_download_label]})\""
  117. declare -g Request_JSON=''
  118. declare -g Request_Filename=''
  119. declare -g Request_OS_list=''
  120. for i in ${cfgValue[sourceforge_OS_List]}; do
  121. _OS_List="${_OS_List:+${_OS_List}&}default=${i}";
  122. done
  123. #echo done; return
  124. printf "===================================================\n"
  125. printf "===================================================\n"
  126. printf "==== Updating Sourceforge Default link ====\n"
  127. printf "==== for project %-25s ====\n" "${cfgValue[sourceforge_Project]}"
  128. printf "===================================================\n"
  129. printf "===================================================\n\n"
  130. Request_JSON=`curl -s -H "Accept: application/json" -X PUT \
  131. -d "$_OS_List" \
  132. -d "$_Download_Label" \
  133. -d "api_key=${cfgValue[sourceforge_ApiKey]}" \
  134. "https://sourceforge.net/projects/${cfgValue[sourceforge_Project]}/files/$_DefaultFile"`
  135. ${DEBUG:-false} && {
  136. echo "==================================================="
  137. echo "==================================================="
  138. echo "==== Debug Output from updateSourceforge() ===="
  139. echo "==================================================="
  140. echo "==================================================="
  141. jq . <<< "$Request_JSON"
  142. echo "---------------------------------------------------"
  143. echo "Download_Label : $_Download_Label"
  144. echo "OS_List : $_OS_List"
  145. echo "api_key : ${cfgValue[sourceforge_ApiKey]}"
  146. echo "DefaultFileTemplate : ${cfgValue[sourceforge_DefaultFileTemplate]}"
  147. echo "URL : https://sourceforge.net/projects/${cfgValue[sourceforge_Project]}/files/$_DefaultFile"
  148. echo "---------------------------------------------------"
  149. echo
  150. }
  151. Request_Filename=`jq -c .result.name <<< "$Request_JSON"`
  152. Request_OS_list=`jq -c .result.x_sf.default <<< "$Request_JSON"`
  153. printf "filename ='%s'\n" "$Request_Filename"
  154. printf "OS list ='%s'\n" "$Request_OS_list"
  155. echo
  156. }
  157. RunAllUpdates() {
  158. getCurrentProjectInfo;
  159. updateSourceforge "$release_version";
  160. }
  161. ValidateEnvironment() {
  162. ############
  163. # Require some binaries
  164. ############
  165. # envsubst lets us safely substitute envvars into strings that would other wise need eval running on them. it is part of gettext-base
  166. MSG="install with\n\tapt-get install gettext-base" REQUIRE_bin "envsubst"
  167. # jq is used to assist with Jason parsing. we could do away with it if it becomes a burdon
  168. MSG="install with\n\tapt-get install jq" REQUIRE_bin "jq"
  169. ############
  170. # Test Config to make sure we have everything we need
  171. ############
  172. while true; do
  173. TestConfigInit;
  174. TestConfig4Key 'sourceforge' 'ApiKey' 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  175. if ! [[ "${cfgValue[sourceforge_ApiKey]}" =~ ^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}$ ]]; then
  176. printf "%% your ApiKey looks like it could be invalid %%\n"
  177. printf "%% xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx %%\n"
  178. printf "%% %36s %%\n" "${cfgValue[sourceforge_ApiKey]}"
  179. GetKey " " "Press any key to continue"
  180. fi
  181. TestConfig4Key 'sourceforge' 'Project' 'ledger-smb'
  182. TestConfig4Key 'sourceforge' 'Debug' '[true | false]'
  183. if TestConfigAsk "Sourceforge Default Download Update"; then break; fi
  184. done
  185. ############
  186. # Test Environment to make sure we have everything we need
  187. ############
  188. local _envGOOD=true;
  189. [[ -z $release_version ]] && { _envGOOD=false; echo "release_version is unavailable"; }
  190. # [[ -z $release_date ]] && { _envGOOD=false; echo "release_date is unavailable"; }
  191. [[ -z $release_type ]] && { _envGOOD=false; echo "release_type is unavailable"; } # one of stable | preview
  192. # [[ -z $release_branch ]] && { _envGOOD=false; echo "release_branch is unavailable"; } # describes the ????
  193. $_envGOOD || exit 1;
  194. }
  195. main() {
  196. clear;
  197. cat <<-EOF
  198. _________________________________________________
  199. /________________________________________________/|
  200. | | |
  201. | Ready update the Sourceforge default link | |
  202. | for project | |
  203. | * $(printf "%-33s" "${cfgValue[sourceforge_Project]}";)| |
  204. | | |
  205. | DEBUG=$DEBUG | |
  206. |_______________________________________________|/
  207. EOF
  208. GetKey 'Yn' "Continue and Update Sourceforge Default Link?";
  209. if TestKey "Y"; then RunAllUpdates $Version $Date; fi
  210. echo
  211. echo
  212. }
  213. main;
  214. exit;