From 9f1a71b3b19541a502623cd2dd75a0cf2fa80381 Mon Sep 17 00:00:00 2001 From: "Thomas G. Lopes" Date: Fri, 13 Mar 2026 12:33:07 +0000 Subject: [PATCH] test workflow update --- .gitea/scripts/commit-update.sh | 20 ++++ .gitea/scripts/create-gitea-pr.sh | 48 +++++++++ .gitea/scripts/update-appimage-nix.sh | 71 ++++++++++++++ .gitea/workflows/handy-update.yml | 123 ++++++----------------- .gitea/workflows/helium-update.yml | 124 ++++++------------------ .gitea/workflows/zen-browser-update.yml | 122 ++++++----------------- modules/pkgs/zen-browser.nix | 12 +-- 7 files changed, 232 insertions(+), 288 deletions(-) create mode 100644 .gitea/scripts/commit-update.sh create mode 100644 .gitea/scripts/create-gitea-pr.sh create mode 100644 .gitea/scripts/update-appimage-nix.sh diff --git a/.gitea/scripts/commit-update.sh b/.gitea/scripts/commit-update.sh new file mode 100644 index 0000000..c4d29dd --- /dev/null +++ b/.gitea/scripts/commit-update.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${BRANCH:?BRANCH is required}" +: "${FILE:?FILE is required}" +: "${COMMIT_MESSAGE:?COMMIT_MESSAGE is required}" + +git config user.name "gitea actions" +git config user.email "actions@localhost" + +git checkout -B "$BRANCH" +git add "$FILE" + +if git diff --cached --quiet; then + echo "No staged changes for ${FILE}; skipping commit" + exit 0 +fi + +git commit -m "$COMMIT_MESSAGE" +git push --force origin "$BRANCH" diff --git a/.gitea/scripts/create-gitea-pr.sh b/.gitea/scripts/create-gitea-pr.sh new file mode 100644 index 0000000..b4b0fdf --- /dev/null +++ b/.gitea/scripts/create-gitea-pr.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${GITEA_API:?GITEA_API is required}" +: "${GITEA_TOKEN:?GITEA_TOKEN is required}" +: "${BRANCH:?BRANCH is required}" +: "${TITLE:?TITLE is required}" +: "${BODY:?BODY is required}" + +owner_prefix="${HEAD_OWNER_PREFIX:-thomas}" + +existing=$(curl -fsS \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_API}/pulls?state=open" \ + | python -c 'import json,sys,os; d=json.load(sys.stdin); b=os.environ["BRANCH"]; print(next((str(pr["number"]) for pr in d if isinstance(pr,dict) and pr.get("head",{}).get("ref")==b), ""))') + +if [ -n "$existing" ]; then + echo "PR already exists: #$existing" + exit 0 +fi + +echo "Creating PR..." +created="false" +for head in "${BRANCH}" "${owner_prefix}:${BRANCH}"; do + echo "Trying head=${head}" + payload=$(HEAD_REF="$head" TITLE="$TITLE" BODY="$BODY" python -c 'import json,os; print(json.dumps({"title": os.environ["TITLE"], "head": os.environ["HEAD_REF"], "base": "main", "body": os.environ["BODY"]}))') + response=$(curl -sS -w '\n%{http_code}' -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + "${GITEA_API}/pulls" \ + -d "$payload") + + body=$(printf '%s\n' "$response" | sed '$d') + code=$(printf '%s\n' "$response" | tail -n1) + + echo "Create PR status: $code" + echo "$body" + + if [ "$code" -ge 200 ] && [ "$code" -lt 300 ]; then + created="true" + break + fi +done + +if [ "$created" != "true" ]; then + echo "PR creation failed" + exit 1 +fi diff --git a/.gitea/scripts/update-appimage-nix.sh b/.gitea/scripts/update-appimage-nix.sh new file mode 100644 index 0000000..3b7788d --- /dev/null +++ b/.gitea/scripts/update-appimage-nix.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${FILE:?FILE is required}" +: "${LATEST_RELEASE_URL:?LATEST_RELEASE_URL is required}" +: "${DOWNLOAD_URL_TEMPLATE:?DOWNLOAD_URL_TEMPLATE is required}" +: "${RELEASE_API_REPO:?RELEASE_API_REPO is required}" + +version_strip_prefix="${LATEST_VERSION_STRIP_PREFIX:-v}" +release_tag_template="${RELEASE_TAG_TEMPLATE:-{version}}" + +current_version=$(python - <<'PY' +import re +import os +p=os.environ['FILE'] +s=open(p).read() +m=re.search(r'version\s*=\s*"([^"]+)";', s) +print(m.group(1) if m else "") +PY +) + +latest_version=$(curl -fsSLI -o /dev/null -w '%{url_effective}' "$LATEST_RELEASE_URL" \ + | sed -E 's#.*/##') + +if [ -n "$version_strip_prefix" ]; then + latest_version="${latest_version#${version_strip_prefix}}" +fi + +echo "current=$current_version" +echo "latest=$latest_version" + +if [ -z "$latest_version" ] || [ "$latest_version" = "$current_version" ]; then + echo "updated=false" >> "$GITHUB_OUTPUT" + exit 0 +fi + +download_url="${DOWNLOAD_URL_TEMPLATE//\{version\}/$latest_version}" +new_hash=$(nix store prefetch-file --json "$download_url" | python -c 'import json,sys; print(json.load(sys.stdin)["hash"])') + +export LATEST_VERSION="$latest_version" +export NEW_HASH="$new_hash" + +python - <<'PY' +import os +import re +p=os.environ['FILE'] +s=open(p).read() +s=re.sub(r'version\s*=\s*"[^"]+"', f'version = "{os.environ["LATEST_VERSION"]}"', s, count=1) +s=re.sub(r'hash\s*=\s*"[^"]+"', f'hash = "{os.environ["NEW_HASH"]}"', s, count=1) +open(p,'w').write(s) +PY + +echo "updated=true" >> "$GITHUB_OUTPUT" +echo "version=$latest_version" >> "$GITHUB_OUTPUT" +echo "previous_version=$current_version" >> "$GITHUB_OUTPUT" + +release_tag="${release_tag_template//\{version\}/$latest_version}" +release_notes=$(curl -fsSL "https://api.github.com/repos/${RELEASE_API_REPO}/releases/tags/${release_tag}" \ + | python -c 'import json,sys; d=json.load(sys.stdin); print((d.get("body") or "").strip())' \ + || true) + +if [ -z "$release_notes" ]; then + release_notes="_No changelog found in upstream release notes._" +fi + +delimiter="CHANGELOG_$(date +%s%N)" +{ + echo "changelog<<${delimiter}" + printf '%s\n' "$release_notes" + echo "${delimiter}" +} >> "$GITHUB_OUTPUT" diff --git a/.gitea/workflows/handy-update.yml b/.gitea/workflows/handy-update.yml index f28377a..d580b8d 100644 --- a/.gitea/workflows/handy-update.yml +++ b/.gitea/workflows/handy-update.yml @@ -21,119 +21,54 @@ jobs: - name: check latest handy release and update file id: update + env: + FILE: modules/pkgs/handy.nix + LATEST_RELEASE_URL: https://github.com/cjpais/Handy/releases/latest + DOWNLOAD_URL_TEMPLATE: https://github.com/cjpais/Handy/releases/download/v{version}/Handy_{version}_amd64.AppImage + RELEASE_API_REPO: cjpais/Handy + RELEASE_TAG_TEMPLATE: v{version} shell: bash - run: | - set -euo pipefail - - FILE="modules/pkgs/handy.nix" - - current_version=$(python - <<'PY' - import re - s=open('modules/pkgs/handy.nix').read() - m=re.search(r'version\s*=\s*"([^"]+)";', s) - print(m.group(1) if m else "") - PY - ) - - latest_version=$(curl -fsSLI -o /dev/null -w '%{url_effective}' \ - 'https://github.com/cjpais/Handy/releases/latest' \ - | sed -E 's#.*/##' \ - | sed 's/^v//') - - echo "current=$current_version" - echo "latest=$latest_version" - - if [ -z "$latest_version" ] || [ "$latest_version" = "$current_version" ]; then - echo "updated=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - url="https://github.com/cjpais/Handy/releases/download/v${latest_version}/Handy_${latest_version}_amd64.AppImage" - new_hash=$(nix store prefetch-file --json "$url" | python -c 'import json,sys; print(json.load(sys.stdin)["hash"])') - - export LATEST_VERSION="$latest_version" - export NEW_HASH="$new_hash" - - python - <> "$GITHUB_OUTPUT" - echo "version=$latest_version" >> "$GITHUB_OUTPUT" + run: bash .gitea/scripts/update-appimage-nix.sh - name: create branch and commit if: steps.update.outputs.updated == 'true' shell: bash run: | set -euo pipefail - branch="bot/handy-${{ steps.update.outputs.version }}" + version="${{ steps.update.outputs.version }}" - git config user.name "gitea actions" - git config user.email "actions@localhost" - - git checkout -B "$branch" - git add modules/pkgs/handy.nix - git commit -m "update handy to ${{ steps.update.outputs.version }}" - git push --force origin "$branch" + BRANCH="bot/handy-${version}" \ + FILE="modules/pkgs/handy.nix" \ + COMMIT_MESSAGE="update handy to ${version}" \ + bash .gitea/scripts/commit-update.sh - name: open pull request if: steps.update.outputs.updated == 'true' env: GITEA_TOKEN: ${{ secrets.tea_token || secrets.TEA_TOKEN }} + CHANGELOG: ${{ steps.update.outputs.changelog }} shell: bash run: | set -euo pipefail - api="https://gitea.unrail.xyz/api/v1/repos/thomas/nixos-config" - branch="bot/handy-${{ steps.update.outputs.version }}" + version="${{ steps.update.outputs.version }}" + previous_version="${{ steps.update.outputs.previous_version }}" + release_url="https://github.com/cjpais/Handy/releases/tag/v${version}" - if [ -z "${GITEA_TOKEN:-}" ]; then - echo "GITEA_TOKEN is empty (check repo secret tea_token/TEA_TOKEN)" - exit 1 - fi + pr_body=$(cat <> "$GITHUB_OUTPUT" - exit 0 - fi - - url="https://github.com/imputnet/helium-linux/releases/download/${latest_version}/helium-${latest_version}-x86_64.AppImage" - new_hash=$(nix store prefetch-file --json "$url" | python -c 'import json,sys; print(json.load(sys.stdin)["hash"])') - - export LATEST_VERSION="$latest_version" - export NEW_HASH="$new_hash" - - python - <> "$GITHUB_OUTPUT" - echo "version=$latest_version" >> "$GITHUB_OUTPUT" + run: bash .gitea/scripts/update-appimage-nix.sh - name: create branch and commit if: steps.update.outputs.updated == 'true' shell: bash run: | set -euo pipefail - branch="bot/helium-${{ steps.update.outputs.version }}" + version="${{ steps.update.outputs.version }}" - git config user.name "gitea actions" - git config user.email "actions@localhost" - - git checkout -B "$branch" - git add modules/pkgs/helium.nix - git commit -m "update helium to ${{ steps.update.outputs.version }}" - git push --force origin "$branch" + BRANCH="bot/helium-${version}" \ + FILE="modules/pkgs/helium.nix" \ + COMMIT_MESSAGE="update helium to ${version}" \ + bash .gitea/scripts/commit-update.sh - name: open pull request if: steps.update.outputs.updated == 'true' env: GITEA_TOKEN: ${{ secrets.tea_token || secrets.TEA_TOKEN }} + CHANGELOG: ${{ steps.update.outputs.changelog }} shell: bash run: | set -euo pipefail - api="https://gitea.unrail.xyz/api/v1/repos/thomas/nixos-config" - branch="bot/helium-${{ steps.update.outputs.version }}" + version="${{ steps.update.outputs.version }}" + previous_version="${{ steps.update.outputs.previous_version }}" + release_url="https://github.com/imputnet/helium-linux/releases/tag/${version}" - if [ -z "${GITEA_TOKEN:-}" ]; then - echo "GITEA_TOKEN is empty (check repo secret tea_token/TEA_TOKEN)" - exit 1 - fi + pr_body=$(cat <> "$GITHUB_OUTPUT" - exit 0 - fi - - url="https://github.com/zen-browser/desktop/releases/download/${latest_version}/zen-x86_64.AppImage" - new_hash=$(nix store prefetch-file --json "$url" | python -c 'import json,sys; print(json.load(sys.stdin)["hash"])') - - export LATEST_VERSION="$latest_version" - export NEW_HASH="$new_hash" - - python - <> "$GITHUB_OUTPUT" - echo "version=$latest_version" >> "$GITHUB_OUTPUT" + run: bash .gitea/scripts/update-appimage-nix.sh - name: create branch and commit if: steps.update.outputs.updated == 'true' shell: bash run: | set -euo pipefail - branch="bot/zen-browser-${{ steps.update.outputs.version }}" + version="${{ steps.update.outputs.version }}" - git config user.name "gitea actions" - git config user.email "actions@localhost" - - git checkout -B "$branch" - git add modules/pkgs/zen-browser.nix - git commit -m "update zen browser to ${{ steps.update.outputs.version }}" - git push --force origin "$branch" + BRANCH="bot/zen-browser-${version}" \ + FILE="modules/pkgs/zen-browser.nix" \ + COMMIT_MESSAGE="update zen browser to ${version}" \ + bash .gitea/scripts/commit-update.sh - name: open pull request if: steps.update.outputs.updated == 'true' env: GITEA_TOKEN: ${{ secrets.tea_token || secrets.TEA_TOKEN }} + CHANGELOG: ${{ steps.update.outputs.changelog }} shell: bash run: | set -euo pipefail - api="https://gitea.unrail.xyz/api/v1/repos/thomas/nixos-config" - branch="bot/zen-browser-${{ steps.update.outputs.version }}" + version="${{ steps.update.outputs.version }}" + previous_version="${{ steps.update.outputs.previous_version }}" + release_url="https://github.com/zen-browser/desktop/releases/tag/${version}" - if [ -z "${GITEA_TOKEN:-}" ]; then - echo "GITEA_TOKEN is empty (check repo secret tea_token/TEA_TOKEN)" - exit 1 - fi + pr_body=$(cat <