From 29ad51a1ef634a62bf40029718988faae6fe48c8 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Fri, 27 Dec 2024 23:17:16 -0500 Subject: [PATCH] forgejo: backport from edge --- .forgejo/bin/build.sh | 2 +- .forgejo/bin/check_ver.sh | 41 ++++++ .forgejo/bin/clear-repo.sh | 17 +++ .forgejo/bin/create_issue.sh | 165 +++++++++++++++++++++++++ .forgejo/workflows/check-backports.yml | 28 +++++ .forgejo/workflows/check-community.yml | 27 ++++ .forgejo/workflows/check-testing.yml | 27 ++++ .forgejo/workflows/check-user.yml | 27 ++++ 8 files changed, 333 insertions(+), 1 deletion(-) create mode 100755 .forgejo/bin/check_ver.sh create mode 100755 .forgejo/bin/clear-repo.sh create mode 100755 .forgejo/bin/create_issue.sh create mode 100644 .forgejo/workflows/check-backports.yml create mode 100644 .forgejo/workflows/check-community.yml create mode 100644 .forgejo/workflows/check-testing.yml create mode 100644 .forgejo/workflows/check-user.yml diff --git a/.forgejo/bin/build.sh b/.forgejo/bin/build.sh index 8c732ec..d9e327f 100755 --- a/.forgejo/bin/build.sh +++ b/.forgejo/bin/build.sh @@ -108,7 +108,7 @@ set_repositories_for() { [ "$repo" = "$target_repo" ] && break done doas sh -c "printf '%s\n' $repos >> /etc/apk/repositories" - doas apk update + doas apk update || true } apply_offset_limit() { diff --git a/.forgejo/bin/check_ver.sh b/.forgejo/bin/check_ver.sh new file mode 100755 index 0000000..d2720f3 --- /dev/null +++ b/.forgejo/bin/check_ver.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# expects the following env variables: +# downstream: downstream repo + +repo=${downstream/*\/} + +curl --silent $downstream/x86_64/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX + +if [ "$ALL_PACKAGES" == "true" ]; then + owned_by_you=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) + echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages" +else + owned_by_you=$(awk -v RS= -v ORS="\n\n" '/m:Antoine Martin \(ayakael\) /' APKINDEX | awk -F ':' '{if($1=="o"){print $2}}' | sort | uniq) + echo "Found $(printf '%s\n' $owned_by_you | wc -l ) packages owned by you" +fi + +rm -f out_of_date not_in_anitya + +for pkg in $owned_by_you; do + upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].stable_version') + downstream_version=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}' | sort -V | tail -n 1) + downstream_version=${downstream_version/-*} + + # special cases + case $pkg in + freetube) upstream_version=$(curl --fail -X GET -sS -H 'Content-Type: application/json' "https://release-monitoring.org/api/v2/packages/?name=$pkg&distribution=Alpine" | jq -r '.items.[].version' | sed "s|-beta||");; + dotnet9-sdk|dotnet9-stage0) upstream_version=${upstream_version/-*};; + esac + + if [ -z "$upstream_version" ]; then + echo "$pkg not in anitya" + echo "$pkg" >> not_in_anitya + elif [ "$downstream_version" != "$(printf '%s\n' $upstream_version $downstream_version | sort -V | head -n 1)" ]; then + echo "$pkg higher downstream" + continue + elif [ "$upstream_version" != "$downstream_version" ]; then + echo "$pkg upstream version $upstream_version does not match downstream version $downstream_version" + echo "$pkg $downstream_version $upstream_version $repo" >> out_of_date + fi +done diff --git a/.forgejo/bin/clear-repo.sh b/.forgejo/bin/clear-repo.sh new file mode 100755 index 0000000..14110ea --- /dev/null +++ b/.forgejo/bin/clear-repo.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +TARGET_REPO=$1 +ARCH=$2 + + +curl --silent $TARGET_REPO/$ARCH/APKINDEX.tar.gz | tar -O -zx APKINDEX > APKINDEX + +pkgs=$(awk -F ':' '{if($1=="o"){print $2}}' APKINDEX | sort | uniq) + +for pkg in $pkgs; do + pkgvers=$(sed -n "/^P:$pkg$/,/^$/p" APKINDEX | awk -F ':' '{if($1=="V"){print $2}}') + for pkgver in $pkgvers; do + echo "Deleting $pkg-$pkgver of arch $ARCH from $TARGET_REPO" + curl -s --user $FORGE_REPO_USER:$FORGE_REPO_TOKEN -X DELETE $TARGET_REPO/$ARCH/$pkg-$pkgver.apk + done +done diff --git a/.forgejo/bin/create_issue.sh b/.forgejo/bin/create_issue.sh new file mode 100755 index 0000000..d162758 --- /dev/null +++ b/.forgejo/bin/create_issue.sh @@ -0,0 +1,165 @@ +#!/bin/bash + +# expects: +# env variable FORGEJO_TOKEN +# file out_of_date + +IFS=' +' +repo=${downstream/*\/} + +does_it_exist() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + + query="$repo/$name: upgrade to $upstream_version" + query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" + + result="$(curl --silent -X 'GET' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" + )" + + if [ "$result" == "[]" ]; then + return 1 + fi +} + +is_it_old() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + + query="$repo/$name: upgrade to" + query="$(echo $query | sed 's| |%20|g' | sed 's|:|%3A|g' | sed 's|/|%2F|g' )" + + result="$(curl --silent -X 'GET' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" + )" + + result_title="$(echo $result | jq -r '.[].title' )" + result_id="$(echo $result | jq -r '.[].number' )" + result_upstream_version="$(echo $result_title | awk '{print $4}')" + + if [ "$upstream_version" != "$result_upstream_version" ]; then + echo $result_id + else + echo 0 + fi +} + +update_title() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + id=$5 + + result=$(curl --silent -X 'PATCH' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"title\": \"$repo/$name: upgrade to $upstream_version\" + }" + ) + + return 0 +} + +create_issue() { + name=$1 + downstream_version=$2 + upstream_version=$3 + repo=$4 + + result=$(curl --silent -X 'POST' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"title\": \"$repo/$name: upgrade to $upstream_version\", + \"labels\": [ + $LABEL_NUMBER + ] + }") + + return 0 +} + +if [ -f out_of_date ]; then + out_of_date="$(cat out_of_date)" + + echo "Detected $(wc -l out_of_date) out-of-date packages, creating issues" + + for pkg in $out_of_date; do + name="$(echo $pkg | awk '{print $1}')" + downstream_version="$(echo $pkg | awk '{print $2}')" + upstream_version="$(echo $pkg | awk '{print $3}')" + repo="$(echo $pkg | awk '{print $4}')" + + if does_it_exist $name $downstream_version $upstream_version $repo; then + echo "Issue for $repo/$name already exists" + continue + fi + + id=$(is_it_old $name $downstream_version $upstream_version $repo) + + if [ "$id" != "0" ] && [ -n "$id" ]; then + echo "Issue for $repo/$name needs updating" + update_title $name $downstream_version $upstream_version $repo $id + continue + fi + + echo "Creating issue for $repo/$name" + create_issue $name $downstream_version $upstream_version $repo + done +fi + +if [ -f not_in_anitya ]; then + query="Add missing $repo packages to anitya" + query="$(echo $query | sed 's| |%20|g')" + + result="$(curl --silent -X 'GET' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" + )" + + if [ "$result" == "[]" ]; then + echo "Creating anitya issue" + result=$(curl --silent -X 'POST' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"title\": \"Add missing $repo packages to anitya\", + \"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\", + \"labels\": [ + $LABEL_NUMBER + ] + }") + + else + echo "Updating anitya issue" + result_id="$(echo $result | jq -r '.[].number' )" + result=$(curl --silent -X 'PATCH' \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$result_id" \ + -H 'accept: application/json' \ + -H "authorization: Basic $FORGEJO_TOKEN" \ + -H 'Content-Type: application/json' \ + -d "{ + \"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\" + }" + ) + fi +fi diff --git a/.forgejo/workflows/check-backports.yml b/.forgejo/workflows/check-backports.yml new file mode 100644 index 0000000..b9f76a6 --- /dev/null +++ b/.forgejo/workflows/check-backports.yml @@ -0,0 +1,28 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-backports: + name: Check backports repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://ayakael.net/api/packages/forge/alpine/v3.21/backports + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 1 + ALL_PACKAGES: true + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh diff --git a/.forgejo/workflows/check-community.yml b/.forgejo/workflows/check-community.yml new file mode 100644 index 0000000..9385687 --- /dev/null +++ b/.forgejo/workflows/check-community.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-community: + name: Check community repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/edge/community + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh diff --git a/.forgejo/workflows/check-testing.yml b/.forgejo/workflows/check-testing.yml new file mode 100644 index 0000000..2b8f7ed --- /dev/null +++ b/.forgejo/workflows/check-testing.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-community: + name: Check testing repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://dl-cdn.alpinelinux.org/alpine/edge/testing + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh diff --git a/.forgejo/workflows/check-user.yml b/.forgejo/workflows/check-user.yml new file mode 100644 index 0000000..09b0f3c --- /dev/null +++ b/.forgejo/workflows/check-user.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: + + schedule: + - cron: '0 5 * * *' + +jobs: + check-user: + name: Check user repo + runs-on: x86_64 + container: + image: alpine:latest + env: + downstream: https://ayakael.net/api/packages/forge/alpine/edge/user + FORGEJO_TOKEN: ${{ secrets.forgejo_token }} + LABEL_NUMBER: 4 + steps: + - name: Environment setup + run: apk add grep coreutils gawk curl wget bash nodejs git jq sed + - name: Get scripts + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Check out-of-date packages + run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh + - name: Create issues + run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh