From 4e8db91ff07dea888773ca427db296d1517e076e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Fri, 12 Nov 2021 15:58:36 +0100 Subject: [PATCH] Update buildLabel.sh --- utils/buildLabel.sh | 173 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 134 insertions(+), 39 deletions(-) diff --git a/utils/buildLabel.sh b/utils/buildLabel.sh index d58df9f..bb4c12e 100755 --- a/utils/buildLabel.sh +++ b/utils/buildLabel.sh @@ -10,6 +10,80 @@ downloadURL=${1?:"need to provide a download URL."} # Usage # ./buildLabel.sh +# Mark: Functions + +xpath() { + # the xpath tool changes in Big Sur and now requires the `-e` option + if [[ $(sw_vers -buildVersion) > "20A" ]]; then + /usr/bin/xpath -e $@ + # alternative: switch to xmllint (which is not perl) + #xmllint --xpath $@ - + else + /usr/bin/xpath $@ + fi +} +# will get the latest release download from a github repo +downloadURLFromGit() { # $1 git user name, $2 git repo name + gitusername=${1?:"no git user name"} + gitreponame=${2?:"no git repo name"} + + if [[ $type == "pkgInDmg" ]]; then + filetype="dmg" + elif [[ $type == "pkgInZip" ]]; then + filetype="zip" + else + filetype=$type + fi + + if [ -n "$archiveDestinationName" ]; then + downloadURL=$(curl -sf "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }") + else + downloadURL=$(curl -sf "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }") + fi + + echo "$downloadURL" + return 0 +} +versionFromGit() { + # $1 git user name, $2 git repo name + gitusername=${1?:"no git user name"} + gitreponame=${2?:"no git repo name"} + + appNewVersion=$(curl --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g') + if [ -z "$appNewVersion" ]; then + printlog "could not retrieve version number for $gitusername/$gitreponame" + appNewVersion="" + else + echo "$appNewVersion" + return 0 + fi +} + +pkgInvestigation() { + echo "Package found" + teamID=$(spctl -a -vv -t install "$archiveName" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ) + echo "For PKGs it's advised to find packageID for version checking" + + pkgutil --expand "$pkgPath" "$archiveName"_pkg + cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null + packageID="$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | tr ' ' '\n' | grep -i "id" | cut -d \" -f 2)" + rm -r "$archiveName"_pkg + echo "$packageID" + echo "Above is the possible packageIDs that can be used, and the correct one is probably one of those with a version number. More investigation might be needed to figure out correct packageID if several are displayed." +} +appInvestigation() { + appName=${appPath##*/} + name=${appName%.*} + + # verify with spctl + echo "Verifying: $appPath" + if ! teamID=$(spctl -a -vv "$appPath" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ); then + echo "Error verifying $appPath" + exit 4 + fi +} + +# Mark: Code # Use working directory as download folder tmpDir="$(pwd)/$(date "+%Y-%m-%d-%H-%M-%S")" # Create a n almost unique folder name @@ -48,40 +122,6 @@ if ! downloadOut="$(curl -fL "$downloadURL" --remote-header-name --remote-name - fi fi -xpath() { - # the xpath tool changes in Big Sur and now requires the `-e` option - if [[ $(sw_vers -buildVersion) > "20A" ]]; then - /usr/bin/xpath -e $@ - # alternative: switch to xmllint (which is not perl) - #xmllint --xpath $@ - - else - /usr/bin/xpath $@ - fi -} - -pkgInvestigation() { - echo "Package found" - teamID=$(spctl -a -vv -t install "$archiveName" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ) - echo "For PKGs it's advised to find packageID for version checking" - - pkgutil --expand "$pkgPath" "$archiveName"_pkg - cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null - packageID="$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | tr ' ' '\n' | grep -i "id" | cut -d \" -f 2)" - rm -r "$archiveName"_pkg - echo "$packageID" - echo "Above is the possible packageIDs that can be used, and the correct one is probably one of those with a version number. More investigation might be needed to figure out correct packageID if several are displayed." -} -appInvestigation() { - appName=${appPath##*/} - - # verify with spctl - echo "Verifying: $appPath" - if ! teamID=$(spctl -a -vv "$appPath" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ); then - echo "Error verifying $appPath" - exit 4 - fi -} - #echo "downloadOut:\n${downloadOut}" archiveTempName=$( echo "${downloadOut}" | head -1 ) echo "archiveTempName: $archiveTempName" @@ -106,6 +146,7 @@ mv $archiveTempName $archiveName name=${archiveName%.*} echo "name: $name" archiveExt=${archiveName##*.} +type=$archiveExt echo "archiveExt: $archiveExt" identifier=${name:l} identifier=${identifier//\%[0-9a-fA-F][0-9a-fA-F]} @@ -155,6 +196,60 @@ elif [ "$archiveExt" = "zip" ] || [ "$archiveExt" = "tbz" ]; then fi +if echo "$downloadURL" | grep -i "github.com.*releases/download"; then + echo "\n**********\n\nFound GitHub path" + githubAuthor=$(echo "$downloadURL" | cut -d "/" -f4) + githubRepo=$(echo "$downloadURL" | cut -d "/" -f5) + if [[ ! -z $githubAuthor && $githubRepo ]] ; then + echo "Github place: $githubAuthor $githubRepo" + originalDownloadURL="$downloadURL" + githubDownloadURL=$(downloadURLFromGit "$githubAuthor" "$githubRepo") + githubAppNewVersion=$(versionFromGit "$githubAuthor" "$githubRepo") + downloadURL=$originalDownloadURL + echo "Latest URL on github: $githubDownloadURL \nLatest version: $githubAppNewVersion" + if [[ "$originalDownloadURL" == "$githubDownloadURL" ]]; then + echo "GitHub calculated URL matches entered URL." + downloadURL="\$(downloadURLFromGit $githubAuthor $githubRepo)" + appNewVersion="\$(versionFromGit $githubAuthor $githubRepo)" + else + if [[ "$( echo $originalDownloadURL | cut -d "/" -f1-7)" == "$( echo $githubDownloadURL | cut -d "/" -f1-7)" ]]; then + echo "Calculated GitHub URL almost identical, only this diff:" + echo "“$( echo $originalDownloadURL | cut -d "/" -f8-)” and “$( echo $githubDownloadURL | cut -d "/" -f8-)”" + echo "Could be version difference or difference in archiveName for a given release." + echo "Testing for version difference." + #Investigate if these strings match if numbers are removed. + if [[ "$( echo $originalDownloadURL | cut -d "/" -f8- | sed 's/[0-9.]*//g')" == "$( echo $githubDownloadURL | cut -d "/" -f8- | sed 's/[0-9.]*//g')" ]]; then + echo "“$( echo $originalDownloadURL | cut -d "/" -f8- | sed 's/[0-9.]*//g')” and “$( echo $githubDownloadURL | cut -d "/" -f8- | sed 's/[0-9.]*//g')”" + echo "Matching without numbers in string.\nVERY LIKELY a version difference." + echo "Try running again with URL: ${githubDownloadURL}" + else + echo "Not a version problem.\nTesting for difference in archiveName." + tempName=$(echo ${archiveName%.*} | grep -o "[0-9.]*") + archiveDestinationName="$(echo $archiveName | sed -E "s/^(.*)$tempName(.*)$/\1[0-9.]*\2/g")" + echo "archiveName=\"$archiveDestinationName\"" + githubDownloadURL=$(downloadURLFromGit "$githubAuthor" "$githubRepo") + githubAppNewVersion=$(versionFromGit "$githubAuthor" "$githubRepo") + downloadURL=$originalDownloadURL + echo "Latest URL on github: $githubDownloadURL \nLatest version: $githubAppNewVersion" + if [[ "$originalDownloadURL" == "$githubDownloadURL" ]]; then + echo "GitHub calculated URL matches entered URL." + downloadURL="\$(downloadURLFromGit $githubAuthor $githubRepo)" + appNewVersion="\$(versionFromGit $githubAuthor $githubRepo)" + else + echo "Not solved by using archiveName." + echo "Not sure what this can be." + archiveDestinationName="" + fi + fi + #downloadURL="\$(downloadURLFromGit $githubAuthor $githubRepo)" + #appNewVersion="\$(versionFromGit $githubAuthor $githubRepo)" + else + echo "GitHub URL not matching" + fi + fi + fi +fi + echo echo "**********" echo @@ -165,11 +260,14 @@ echo echo "$identifier)" echo " name=\"$name\"" echo " type=\"$archiveExt\"" -if [ "$packageID" != "" ]; then +if [ -n "$packageID" ]; then echo " packageID=\"$packageID\"" fi +if [ -n "$archiveDestinationName" ]; then +echo " archiveName=\"$archiveDestinationName\"" +fi echo " downloadURL=\"$downloadURL\"" -echo " appNewVersion=\"\"" +echo " appNewVersion=\"$appNewVersion\"" echo " expectedTeamID=\"$teamID\"" if [ -n "$appName" ] && [ "$appName" != "${name}.app" ]; then echo " appName=\"$appName\"" @@ -179,6 +277,3 @@ echo echo "Above should be saved in a file with exact same name as label, and given extension “.sh”." echo "Put this file in folder “fragments/labels”." echo - - -exit 0