From f69a8b6641715a655a9a472842066617d2c65fb5 Mon Sep 17 00:00:00 2001 From: j-hc Date: Mon, 9 Jan 2023 17:37:04 +0300 Subject: [PATCH 1/3] implement semver compare --- build.sh | 6 +- scripts/service.sh | 2 +- semver | 150 --------------------------------------------- utils.sh | 70 +++++++++++---------- 4 files changed, 43 insertions(+), 185 deletions(-) delete mode 100755 semver diff --git a/build.sh b/build.sh index a491c62..74a081f 100755 --- a/build.sh +++ b/build.sh @@ -24,7 +24,7 @@ for t in $(toml_get_all_tables); do enabled=$(toml_get "$t" enabled) || enabled=true if [ "$enabled" = false ]; then continue; fi - if [ $idx -ge "$PARALLEL_JOBS" ]; then wait -n; else idx=$((idx + 1)); fi + if (( idx >= PARALLEL_JOBS )); then wait -n; else idx=$((idx + 1)); fi declare -A app_args merge_integrations=$(toml_get "$t" merge-integrations) || merge_integrations=false excluded_patches=$(toml_get "$t" excluded-patches) || excluded_patches="" @@ -72,9 +72,9 @@ rm -rf temp/tmp.* if [ "$BUILD_MINDETACH_MODULE" = true ]; then echo "Building mindetach module" cp -f $PKGS_LIST mindetach-magisk/mindetach/detach.txt - cd mindetach-magisk/mindetach/ + pushd mindetach-magisk/mindetach/ zip -r ../../build/mindetach-"$(grep version= module.prop | cut -d= -f2)".zip . - cd ../../ + popd fi youtube_mode=$(toml_get "YouTube" "build-mode") || youtube_mode="module" diff --git a/scripts/service.sh b/scripts/service.sh index 7988f3c..e3c6f2a 100644 --- a/scripts/service.sh +++ b/scripts/service.sh @@ -5,7 +5,7 @@ RVPATH=/data/adb/__PKGNAME_rv.apk until [ "$(getprop sys.boot_completed)" = 1 ]; do sleep 1; done until [ -d /sdcard ]; do sleep 1; done -ln -f $MODDIR/base.apk $RVPATH +ln $MODDIR/base.apk $RVPATH BASEPATH=$(pm path __PKGNAME | grep base) BASEPATH=${BASEPATH#*:} if [ $BASEPATH ] && [ -d ${BASEPATH%base.apk}lib ]; then diff --git a/semver b/semver deleted file mode 100755 index 7f6d410..0000000 --- a/semver +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env bash -#github.com/fsaintjacques/semver-tool - -NAT='0|[1-9][0-9]*' -ALPHANUM='[0-9]*[A-Za-z-][0-9A-Za-z-]*' -IDENT="$NAT|$ALPHANUM" -FIELD='[0-9A-Za-z-]+' -SEMVER_REGEX="\ -^[vV]?\ -($NAT)\\.($NAT)\\.($NAT)\ -(\\-(${IDENT})(\\.(${IDENT}))*)?\ -(\\+${FIELD}(\\.${FIELD})*)?$" - -function validate_version { - local version=$1 - if [[ "$version" =~ $SEMVER_REGEX ]]; then - if [ "$#" -eq "2" ]; then - local major=${BASH_REMATCH[1]} - local minor=${BASH_REMATCH[2]} - local patch=${BASH_REMATCH[3]} - local prere=${BASH_REMATCH[4]} - local build=${BASH_REMATCH[8]} - eval "$2=(\"$major\" \"$minor\" \"$patch\" \"$prere\" \"$build\")" - else - echo "$version" - fi - fi -} - -function is_nat { - [[ "$1" =~ ^($NAT)$ ]] -} - -function is_null { - [ -z "$1" ] -} - -function order_nat { - [ "$1" -lt "$2" ] && { - echo -1 - return - } - [ "$1" -gt "$2" ] && { - echo 1 - return - } - echo 0 -} - -function order_string { - [[ $1 < $2 ]] && { - echo -1 - return - } - [[ $1 > $2 ]] && { - echo 1 - return - } - echo 0 -} - -function compare_fields { - local l="$1[@]" - local r="$2[@]" - local leftfield=("${!l}") - local rightfield=("${!r}") - local left - local right - local i=$((-1)) - local order=$((0)) - while true; do - [ $order -ne 0 ] && { - echo $order - return - } - : $((i++)) - left="${leftfield[$i]}" - right="${rightfield[$i]}" - - is_null "$left" && is_null "$right" && { - echo 0 - return - } - is_null "$left" && { - echo -1 - return - } - is_null "$right" && { - echo 1 - return - } - is_nat "$left" && is_nat "$right" && { - order=$(order_nat "$left" "$right") - continue - } - is_nat "$left" && { - echo -1 - return - } - is_nat "$right" && { - echo 1 - return - } - { - order=$(order_string "$left" "$right") - continue - } - done -} - -# shellcheck disable=SC2206 -function compare_version { - local order - validate_version "$1" V - validate_version "$2" V_ - local left=("${V[0]}" "${V[1]}" "${V[2]}") - local right=("${V_[0]}" "${V_[1]}" "${V_[2]}") - - order=$(compare_fields left right) - [ "$order" -ne 0 ] && { - echo "$order" - return - } - local prerel="${V[3]:1}" - local prerel_="${V_[3]:1}" - local left=(${prerel//./ }) - local right=(${prerel_//./ }) - [ -z "$prerel" ] && [ -z "$prerel_" ] && { - echo 0 - return - } - [ -z "$prerel" ] && { - echo 1 - return - } - [ -z "$prerel_" ] && { - echo -1 - return - } - compare_fields left right -} - -function command_compare { - local v - local v_ - v=$(validate_version "$1") - v_=$(validate_version "$2") - set +u - compare_version "$v" "$v_" -} diff --git a/utils.sh b/utils.sh index 4d05185..6dd5d8b 100755 --- a/utils.sh +++ b/utils.sh @@ -1,7 +1,5 @@ #!/usr/bin/env bash -source semver - MODULE_TEMPLATE_DIR="revanced-magisk" MODULE_SCRIPTS_DIR="scripts" TEMP_DIR="temp" @@ -13,7 +11,7 @@ if [ "${GITHUB_TOKEN+x}" ]; then else GH_AUTH_HEADER="" fi -GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-$"j-hc/revanced-magisk-module"} +GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-"j-hc/revanced-magisk-module"} NEXT_VER_CODE=${NEXT_VER_CODE:-$(date +'%Y%m%d')} WGET_HEADER="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0" DRYRUN=false @@ -22,16 +20,9 @@ SERVICE_SH=$(cat $MODULE_SCRIPTS_DIR/service.sh) CUSTOMIZE_SH=$(cat $MODULE_SCRIPTS_DIR/customize.sh) UNINSTALL_SH=$(cat $MODULE_SCRIPTS_DIR/uninstall.sh) -json_get() { - grep -o "\"${1}\":[^\"]*\"[^\"]*\"" | sed -E 's/".*".*"(.*)"/\1/' -} - -toml_prep() { - __TOML__=$(echo "$1" | tr -d '\t\r' | tr "'" '"' | grep -o '^[^#]*' | grep -v '^$' | sed -r 's/(\".*\")|\s*/\1/g') -} -toml_get_all_tables() { - echo "$__TOML__" | grep -x '\[.*\]' | tr -d '[]' || return 1 -} +json_get() { grep -o "\"${1}\":[^\"]*\"[^\"]*\"" | sed -E 's/".*".*"(.*)"/\1/'; } +toml_prep() { __TOML__=$(echo "$1" | tr -d '\t\r' | tr "'" '"' | grep -o '^[^#]*' | grep -v '^$' | sed -r 's/(\".*\")|\s*/\1/g'); } +toml_get_all_tables() { echo "$__TOML__" | grep -x '\[.*\]' | tr -d '[]' || return 1; } toml_get() { local table=$1 key=$2 val=$(echo "$__TOML__" | sed -n "/\[${table}]/,/^\[.*]$/p" | grep "^${key}=") @@ -96,14 +87,37 @@ gh_req() { wget -nv -O "$2" --header="$GH_AUTH_HEADER" "$1"; } log() { echo -e "$1 " >>build.md; } get_largest_ver() { local max=0 - while read -r v || [ -n "$v" ]; do - #shellcheck disable=SC2001 - if [ "$(command_compare "$(sed 's/\./-/3' <<<"$v")" "$(sed 's/\./-/3' <<<"$max")")" = 1 ]; then max=$v; fi + while read -r v; do + if [ "$max" != 0 ] && ! semver_validate "$max" "$v"; then return 0; fi + if [ "$(semver_cmp "$max" "$v")" = 1 ]; then max=$v; fi done - if [[ $max != 0 ]]; then echo "$max"; fi + if [ "$max" != 0 ]; then echo "$max"; fi } get_patch_last_supported_ver() { - unzip -p "$RV_PATCHES_JAR" | strings -s , | sed -rn "s/.*${1},versions,(([0-9.]*,*)*),Lk.*/\1/p" | tr ',' '\n' | get_largest_ver + local vs + vs=$(unzip -p "$RV_PATCHES_JAR" | strings -s , | sed -rn "s/.*${1},versions,(([0-9.]*,*)*),Lk.*/\1/p" | tr ',' '\n') + printf "%s\n" "$vs" | get_largest_ver +} +semver_cmp() { + local IFS=. + read -r -a v1 <<<"${1//[^.0-9]/}" + read -r -a v2 <<<"${2//[^.0-9]/}" + for i in ${!v1[*]}; do + if ((v1[i] > v2[i])); then + echo -1 + return 0 + elif ((v2[i] > v1[i])); then + echo 1 + return 0 + fi + done + echo 0 +} +semver_validate() { + local a1="${1%-*}" a2="${2%-*}" + local c1="${a1//[^.]/}" c2="${a2//[^.]/}" + local a1c="${a1//[.0-9]/}" a2c="${a2//[.0-9]/}" + [ ${#c1} = ${#c2} ] && [ ${#a1c} = 0 ] && [ ${#a2c} = 0 ] } dl_if_dne() { @@ -136,18 +150,12 @@ get_apkmirror_vers() { vers=$(req "https://www.apkmirror.com/uploads/?appcategory=${apkmirror_category}" - | sed -n 's;.*Version:\(.*\) .*;\1;p') if [ "$allow_alpha_version" = false ]; then grep -i -v -e "beta" -e "alpha" <<<"$vers"; else echo "$vers"; fi } -get_apkmirror_pkg_name() { - req "$1" - | sed -n 's;.*id=\(.*\)" class="accent_color.*;\1;p' -} +get_apkmirror_pkg_name() { req "$1" - | sed -n 's;.*id=\(.*\)" class="accent_color.*;\1;p'; } # ------------------------------ # ------- uptodown ------------- -get_uptodown_resp() { - req "https://${1}.en.uptodown.com/android/versions" - -} -get_uptodown_vers() { - echo "$1" | grep -x '^[0-9.]* .*' | sed 's/ .*' | sed 's/ " -B 1 | head -1 | sed -n 's;.*data-url="\(.*\)".*;\1;p') @@ -177,9 +185,9 @@ zip_module() { local patched_apk=$1 module_name=$2 stock_apk=$3 pkg_name=$4 template_dir=$5 cp -f "$patched_apk" "${template_dir}/base.apk" cp -f "$stock_apk" "${template_dir}/${pkg_name}.apk" - cd "$template_dir" || abort "Module template dir not found" + pushd "$template_dir" || abort "Module template dir not found" zip -"$COMPRESSION_LEVEL" -FSr "../../${BUILD_DIR}/${module_name}" . - cd ../.. + popd || : } build_rv() { @@ -254,7 +262,7 @@ build_rv() { echo "ERROR: empty version" return 1 fi - echo "Choosing version '${version}'" + echo "Choosing version '${version}' (${args[app_name]})" local stock_apk="${TEMP_DIR}/${app_name_l}-stock-v${version}-${arch}.apk" local apk_output="${BUILD_DIR}/${app_name_l}-revanced-v${version}-${arch}.apk" @@ -324,7 +332,7 @@ build_rv() { } join_args() { - echo "$1" | tr -d '\t\r' | tr ' ' '\n' | grep -v '^$' | sed "s/^/${2} /" | paste -sd " " - || echo "" + echo "$1" | tr -d '\t\r' | tr ' ' '\n' | grep -v '^$' | sed "s/^/${2} /" | paste -sd " " - || : } uninstall_sh() { echo "${UNINSTALL_SH//__PKGNAME/$1}" >"${2}/uninstall.sh"; } From f26cb5019546a70eaf743ea55e308515921ae8fd Mon Sep 17 00:00:00 2001 From: j-hc <25510067+j-hc@users.noreply.github.com> Date: Mon, 9 Jan 2023 23:15:54 +0300 Subject: [PATCH 2/3] Update build.yml --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fb33fae..85ccb68 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,7 @@ on: [workflow_call, workflow_dispatch] jobs: run: + permissions: write-all runs-on: ubuntu-latest steps: - uses: actions/setup-java@v3 From 74b3cf3b11dab2a947514ff92532ef22375fb836 Mon Sep 17 00:00:00 2001 From: j-hc <25510067+j-hc@users.noreply.github.com> Date: Tue, 10 Jan 2023 16:43:35 +0300 Subject: [PATCH 3/3] Update ci.yml --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f76097..a459c75 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,6 +60,7 @@ jobs: SHOULD_BUILD: ${{ steps.should_build.outputs.SHOULD_BUILD }} build: + permissions: write-all needs: check uses: ./.github/workflows/build.yml if: ${{ needs.check.outputs.SHOULD_BUILD == 1 }}