feat(gitea): add download() method
This commit is contained in:
161
resources/com/cadoles/gitea/gitea-download.sh
Normal file
161
resources/com/cadoles/gitea/gitea-download.sh
Normal file
@ -0,0 +1,161 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
GITEA_DOWNLOAD_PROJECT=${GITEA_DOWNLOAD_PROJECT}
|
||||
GITEA_DOWNLOAD_ORG=${GITEA_DOWNLOAD_ORG}
|
||||
GITEA_DOWNLOAD_BASE_URL=${GITEA_BASE_URL:-https://forge.cadoles.com}
|
||||
GITEA_DOWNLOAD_USERNAME=${GITEA_DOWNLOAD_USERNAME}
|
||||
GITEA_DOWNLOAD_PASSWORD=${GITEA_DOWNLOAD_PASSWORD}
|
||||
GITEA_DOWNLOAD_RELEASE_NAME=${GITEA_DOWNLOAD_RELEASE_NAME:-latest}
|
||||
GITEA_DOWNLOAD_TARGET_DIRECTORY=${GITEA_DOWNLOAD_TARGET_DIRECTORY:-gitea-dl}
|
||||
|
||||
function check_dependencies {
|
||||
assert_command_available 'curl'
|
||||
assert_command_available 'jq'
|
||||
}
|
||||
|
||||
function assert_command_available {
|
||||
local command=$1
|
||||
local command_path=$(which $command)
|
||||
|
||||
if [ -z "$command_path" ]; then
|
||||
echo "The '$command' command could not be found. Please install it before using this script." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function check_environment {
|
||||
assert_environment GITEA_DOWNLOAD_PROJECT
|
||||
assert_environment GITEA_DOWNLOAD_ORG
|
||||
assert_environment GITEA_DOWNLOAD_BASE_URL
|
||||
}
|
||||
|
||||
function source_env_file {
|
||||
if [ ! -f '.env' ]; then
|
||||
return 0
|
||||
fi
|
||||
set -o allexport
|
||||
source .env
|
||||
set +o allexport
|
||||
}
|
||||
|
||||
function assert_environment {
|
||||
local name=$1
|
||||
local value=${!name}
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
echo "The $"$name" environment variable is empty." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function ask_credentials {
|
||||
if [ -z "$GITEA_DOWNLOAD_USERNAME" ]; then
|
||||
echo -n "Username: "
|
||||
read GITEA_DOWNLOAD_USERNAME
|
||||
|
||||
fi
|
||||
if [ -z "$GITEA_DOWNLOAD_PASSWORD" ]; then
|
||||
echo -n "Password: "
|
||||
stty -echo
|
||||
read GITEA_DOWNLOAD_PASSWORD
|
||||
stty echo
|
||||
echo
|
||||
fi
|
||||
}
|
||||
|
||||
function retrieve_release_name {
|
||||
if [ ! -z "$GITEA_DOWNLOAD_RELEASE_NAME" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
echo -n "Release name: "
|
||||
read GITEA_DOWNLOAD_RELEASE_NAME
|
||||
}
|
||||
|
||||
function retrieve_target_directory {
|
||||
if [ ! -z "$GITEA_DOWNLOAD_TARGET_DIRECTORY" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
echo -n "Target directory: "
|
||||
read GITEA_DOWNLOAD_TARGET_DIRECTORY
|
||||
}
|
||||
|
||||
function json_set {
|
||||
local data=$1
|
||||
local key=$2
|
||||
local value=$3
|
||||
local use_raw_file=$4
|
||||
|
||||
if [ "$use_raw_file" != "true" ]; then
|
||||
echo $data | jq -cr --argjson v "$value" --arg k "$key" '.[$k] = $v'
|
||||
else
|
||||
local tmpfile=$(mktemp)
|
||||
echo "$value" > "$tmpfile"
|
||||
echo $data | jq -cr --rawfile v "$tmpfile" --arg k "$key" '.[$k] = $v'
|
||||
rm -f "$tmpfile"
|
||||
fi
|
||||
}
|
||||
|
||||
function gitea_api {
|
||||
local path=$1
|
||||
local args=${@:2}
|
||||
|
||||
curl -L \
|
||||
--fail \
|
||||
--ipv4 \
|
||||
-u "$GITEA_DOWNLOAD_USERNAME:$GITEA_DOWNLOAD_PASSWORD" \
|
||||
${args} \
|
||||
"$GITEA_DOWNLOAD_BASE_URL/api/v1$path"
|
||||
}
|
||||
|
||||
function gitea_download {
|
||||
local attachment_id=$1
|
||||
local output=$2
|
||||
|
||||
curl -L \
|
||||
--fail \
|
||||
--ipv4 \
|
||||
-u "$GITEA_DOWNLOAD_USERNAME:$GITEA_DOWNLOAD_PASSWORD" \
|
||||
--output "$output" \
|
||||
"$GITEA_DOWNLOAD_BASE_URL/attachments/$attachment_id"
|
||||
}
|
||||
|
||||
function download_release_files {
|
||||
local releases=$(gitea_api "/repos/${GITEA_DOWNLOAD_ORG}/${GITEA_DOWNLOAD_PROJECT}/releases")
|
||||
|
||||
local assets
|
||||
if [ "$GITEA_DOWNLOAD_RELEASE_NAME" == "latest" ]; then
|
||||
assets=$(echo $releases | jq -r '. | sort_by(.id) | reverse | .[0].assets')
|
||||
else
|
||||
assets=$(echo $releases | jq -r --arg name "$GITEA_DOWNLOAD_RELEASE_NAME" '. | map(select( .name == $name)) | .[0].assets')
|
||||
fi
|
||||
|
||||
if [ "$assets" == "null" ]; then
|
||||
echo 1>&2 "No release found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$GITEA_DOWNLOAD_TARGET_DIRECTORY"
|
||||
|
||||
local attachment_uuids=$(echo $assets | jq -r '.[].uuid')
|
||||
|
||||
for uuid in $attachment_uuids; do
|
||||
local filename=$(echo $assets | jq -r --arg uuid "$uuid" '. | map(select( .uuid == $uuid)) | .[0].name')
|
||||
gitea_download "$uuid" "$GITEA_DOWNLOAD_TARGET_DIRECTORY/$filename"
|
||||
done
|
||||
}
|
||||
|
||||
function main {
|
||||
check_dependencies
|
||||
source_env_file
|
||||
check_environment
|
||||
ask_credentials
|
||||
retrieve_release_name
|
||||
retrieve_target_directory
|
||||
download_release_files
|
||||
}
|
||||
|
||||
main
|
Reference in New Issue
Block a user