mirror of
https://code.forgejo.org/actions/setup-forgejo.git
synced 2024-11-23 21:30:55 -05:00
118 lines
2.5 KiB
Bash
Executable file
118 lines
2.5 KiB
Bash
Executable file
#!/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"
|
|
|
|
if test -z "$token"; then
|
|
echo missing token argument
|
|
return 1
|
|
fi
|
|
|
|
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"
|
|
|
|
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
|
|
)
|
|
}
|
|
|
|
"$@"
|