Skip to content

Commit f7030dc

Browse files
authored
Create action.yml
1 parent b81a246 commit f7030dc

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

action.yml

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
name: Publish to Hackage
2+
description: Publish Haskell packages to Hackage
3+
4+
branding:
5+
icon: 'upload'
6+
color: 'green'
7+
8+
inputs:
9+
hackageServer:
10+
description: 'URL to the Hackage server'
11+
required: false
12+
default: 'http://hackage.haskell.org'
13+
14+
hackageToken:
15+
description: 'Authentication token for Hackage'
16+
required: true
17+
18+
publish:
19+
description: 'A flag indicating whether to publish the release on Hackage. Uploads a release candidate if set to false'
20+
required: false
21+
default: 'false'
22+
23+
packagesPath:
24+
description: 'Path that contains packages tarbals'
25+
required: true
26+
27+
docsPath:
28+
description: 'Path that contains packages documentation tarbals'
29+
required: false
30+
default: ''
31+
32+
runs:
33+
using: 'composite'
34+
steps:
35+
36+
- name: Publish packages
37+
shell: bash
38+
run: |
39+
HACKAGE_AUTH_HEADER="Authorization: X-ApiKey ${{ inputs.hackageToken }}"
40+
41+
42+
if [ "${{ inputs.publish }}" == "true" ];
43+
then
44+
TARGET_URL="${{ inputs.hackageServer }}/packages/upload";
45+
DOCS_URL="${{ inputs.hackageServer }}/package/$PACKAGE_NAME/docs"
46+
else
47+
TARGET_URL="${{ inputs.hackageServer }}/packages/candidates";
48+
DOCS_URL="${{ inputs.hackageServer }}/package/$PACKAGE_NAME/candidate/docs"
49+
fi
50+
51+
for PACKAGE_TARBALL in $(find "${{ inputs.packagesPath }}" -maxdepth 1 -name "*.tar.gz"); do
52+
PACKAGE_NAME=$(basename ${PACKAGE_TARBALL%.*.*})
53+
54+
HACKAGE_STATUS=$(curl --header "${HACKAGE_AUTH_HEADER}" --silent --head -w %{http_code} -XGET --anyauth ${{ inputs.hackageServer }}/package/${PACKAGE_NAME} -o /dev/null)
55+
56+
if [ "$HACKAGE_STATUS" = "404" ]; then
57+
echo "Uploading ${PACKAGE_NAME} to ${TARGET_URL}"
58+
curl -X POST -f --header "${HACKAGE_AUTH_HEADER}" ${TARGET_URL} -F "package=@$PACKAGE_TARBALL"
59+
echo "Uploaded ${PACKAGE_NAME}"
60+
61+
DOC_FILE_NAME="${{ inputs.docsPath }}/${PACKAGE_NAME}-docs.tar.gz"
62+
if [ -n "${{ inputs.docsPath }}" ] && [ -f "$DOC_FILE_NAME" ]; then
63+
echo "Uploading documentation for ${PACKAGE_NAME} to ${DOCS_URL}"
64+
curl -X PUT \
65+
-H 'Content-Type: application/x-tar' \
66+
-H 'Content-Encoding: gzip' \
67+
-H "${HACKAGE_AUTH_HEADER}" \
68+
--data-binary "@$DOC_FILE_NAME" \
69+
"$DOCS_URL"
70+
fi
71+
72+
else
73+
echo "Package ${PACKAGE_NAME}" already exists on Hackage.
74+
fi
75+
done

0 commit comments

Comments
 (0)