#!/bin/bash # SPDX-License-Identifier: MIT set -ex : ${LOOPS:=40} : ${LOOP_DELAY:=10} DIR=$(mktemp -d) trap "rm -fr $DIR" EXIT function check_status() { local url="$1" local repo="$2" local sha="$3" if ! which jq > /dev/null ; then apt-get install -y -qq jq fi local state=$(curl --fail -sS "$url/api/v1/repos/$repo/commits/$sha/status" | jq --raw-output .state) echo $state test "$state" != "" -a "$state" != "pending" -a "$state" != "running" -a "$state" != "null" } function wait_success() { local url="$1" local repo="$2" local sha="$3" for i in $(seq $LOOPS); do if check_status "$url" "$repo" "$sha"; then break fi test "$FORGEJO_RUNNER_LOGS" && tail $FORGEJO_RUNNER_LOGS sleep $LOOP_DELAY done if ! test "$(check_status "$url" "$repo" "$sha")" = "success" ; then test "$FORGEJO_RUNNER_LOGS" && cat $FORGEJO_RUNNER_LOGS return 1 fi } function push() { local directory="$1" local url="$2" local owner="$3" local project="$4" local self_action="$5" local token="$6" local dir="$DIR/$project" rsync -a $directory/ $dir/ local workflows=$dir/.forgejo/workflows/*.yml if test "$(echo $workflows)" != "$workflows"; then sed -i \ -e "s|SELF|$url/$owner/$self_action|g" \ -e "s|FORGEJO_TOKEN|$token|g" \ $dir/.forgejo/workflows/*.yml fi ( cd $dir git init git checkout -b main git config user.email root@example.com git config user.name username git add . git commit -m 'initial commit' git remote add origin $url/$owner/$project git push --force -u origin main sha=$(git rev-parse HEAD) echo $sha > SHA echo sha=$sha ) } function run_workflow() { local directory="$1" local url="$2" local owner="$3" local project="$4" local self_action="$5" local token="$6" if test -z "$token"; then echo missing token argument return 1 fi push "$directory" "$url" "$owner" "$project" "$self_action" "$token" wait_success "$url" "$owner/$project" $(cat $DIR/$project/SHA) } function push_self_action() { local url="$1" local owner="$2" local self_action="$3" local tag="$4" local dir="$DIR/self" git clone . $dir ( cd $dir rm -fr .forgejo .git git init git checkout -b main git remote add origin "$url/$owner/$self_action" git config user.email root@example.com git config user.name username git add . git commit -m 'initial commit' git push --force origin main git tag --force $tag HEAD git push --force origin $tag ) } "$@"