68 lines
No EOL
2 KiB
Python
68 lines
No EOL
2 KiB
Python
# see https://forgejo.org/docs/latest/user/packages/generic/
|
|
# We need to delete the previous version to
|
|
# FIXME we're leaking credentials in the process listing(args can be seen in ps(1) output)
|
|
# solvable by using a temporary .netrc file(create with umask 0600 or smth)
|
|
|
|
_TEMPLATE = """#!/bin/sh
|
|
set -eux
|
|
: ${GENERIC_USERNAME:=__USERNAME__}
|
|
: ${GENERIC_PASSWORD:=__PASSWORD__}
|
|
: ${GENERIC_REPO:=__REPOSITORY__}
|
|
|
|
URL="$GENERIC_REPO"'/__PACKAGE__/UNVERSIONED/__FILENAME__'
|
|
CREDS="$GENERIC_USERNAME:$GENERIC_PASSWORD"
|
|
|
|
delete_previous_version() {
|
|
curl \
|
|
--fail \
|
|
--user "$CREDS" \
|
|
-X DELETE \
|
|
"$URL" || true
|
|
}
|
|
|
|
publish_new_version() {
|
|
curl \
|
|
--fail \
|
|
--user "$CREDS" \
|
|
--upload-file '__SOURCE__' \
|
|
"$URL"
|
|
}
|
|
|
|
echo "Deleting previous version at $URL"
|
|
delete_previous_version || echo "Note: 404 is expected if this is the first published version"
|
|
echo "Pushing new version to $URL"
|
|
publish_new_version
|
|
"""
|
|
|
|
def _publish_plugin_impl(ctx):
|
|
script = ctx.actions.declare_file(ctx.label.name + "_publisher")
|
|
src = ctx.attr.src[DefaultInfo].files.to_list()[0]
|
|
repository = ctx.var.get("generic_repo", "")
|
|
username = ctx.var.get("generic_user", "")
|
|
password = ctx.var.get("generic_password", "")
|
|
ctx.actions.write(
|
|
output = script,
|
|
is_executable = True,
|
|
content = _TEMPLATE
|
|
.replace("__USERNAME__", username)
|
|
.replace("__PASSWORD__", password)
|
|
.replace("__REPOSITORY__", repository)
|
|
.replace("__PACKAGE__", ctx.attr.package)
|
|
.replace("__SOURCE__", src.short_path)
|
|
.replace("__FILENAME__", ctx.attr.filename)
|
|
)
|
|
|
|
return DefaultInfo(
|
|
executable = script,
|
|
runfiles = ctx.runfiles(files = [src]),
|
|
)
|
|
|
|
publish_plugin = rule(
|
|
implementation = _publish_plugin_impl,
|
|
executable = True,
|
|
attrs = {
|
|
"src": attr.label(allow_single_file = True, mandatory = True),
|
|
"package": attr.string(mandatory = True),
|
|
"filename": attr.string(mandatory = True),
|
|
},
|
|
) |