name: Sync CI from skins-template to Every User Repository on: workflow_dispatch: env: TEMPLATE_REPO_URL: https://${{ secrets.TOKEN }}@${{ vars.CONTAINER_REGISTRY }}/osc/skins-template.git TEMPLATE_REL_PATH: .gitea/workflows/ci.yml GITEA_API: https://${{ vars.CONTAINER_REGISTRY }}/api/v1 jobs: sync-all: runs-on: ubuntu-latest container: image: ${{ vars.CONTAINER_REGISTRY }}/arlind/skins:latest steps: - name: Clone skins-template run: | echo "Clone skins-template" git clone --quiet "${{ env.TEMPLATE_REPO_URL }}" --depth 1 template-repo cd template-repo git checkout --quiet HEAD -- "${{ env.TEMPLATE_REL_PATH }}" echo "✓ Finished cloning osc/skins-template" - name: Fetch valid user repositories id: fetch_repos run: | page=1 per_page=50 valid_repos_file=$(mktemp) user_count_total=$(curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" "${{ env.GITEA_API }}/admin/users" | jq 'length') user_counter=1 while :; do users_json=$(curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" "${{ env.GITEA_API }}/admin/users?limit=$per_page&page=$page") users_count=$(echo "$users_json" | jq 'length') [ "$users_count" -eq 0 ] && break for i in $(seq 0 $((users_count - 1))); do user_login=$(echo "$users_json" | jq -r ".[$i].login") echo "[$user_counter/$user_count_total] Processing user: $user_login" repos_json=$(curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" "${{ env.GITEA_API }}/users/${user_login}/repos") repo_count=$(echo "$repos_json" | jq 'length') if [ "$repo_count" -eq 0 ]; then echo " ✖ User has no repositories." else repo_matched=false for j in $(seq 0 $((repo_count - 1))); do owner=$(echo "$repos_json" | jq -r ".[$j].owner.login") repo=$(echo "$repos_json" | jq -r ".[$j].name") readme_json=$(curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" "${{ env.GITEA_API }}/repos/$owner/$repo/contents/README.md" || echo "{}") content=$(echo "$readme_json" | jq -r .content 2>/dev/null | base64 -d 2>/dev/null || echo "") if echo "$content" | grep -qE "^---$" && \ echo "$content" | grep -q "^gitea: none" && \ echo "$content" | grep -q "^include_toc: true" && \ echo "$content" | grep -q "^# Skins"; then echo "$owner/$repo" >> "$valid_repos_file" echo " ✓ Added $owner/$repo to update list" repo_matched=true fi done [ "$repo_matched" = false ] && echo " ✓ User has no repositories matching the criteria" fi user_counter=$((user_counter + 1)) done page=$((page + 1)) done echo "valid_repos_file=$valid_repos_file" >> "$GITHUB_OUTPUT" - name: Update user repositories run: | valid_repos_file="${{ steps.fetch_repos.outputs.valid_repos_file }}" repo_total=$(wc -l < "$valid_repos_file") repo_counter=1 while read -r repo_full; do owner=$(echo "$repo_full" | cut -d'/' -f1) repo=$(echo "$repo_full" | cut -d'/' -f2) echo "[$repo_counter/$repo_total] Processing Repository: $owner/$repo" tmpdir=$(mktemp -d) git clone --quiet "https://${{ secrets.TOKEN }}@${{ vars.CONTAINER_REGISTRY }}/${owner}/${repo}.git" "$tmpdir" cd "$tmpdir" mkdir -p .gitea/workflows cp "/workspace/osc/skins/template-repo/${{ env.TEMPLATE_REL_PATH }}" .gitea/workflows/ci.yml git config user.email "arlind@sulej.ch" git config user.name "ci-bot" git add .gitea/workflows/ci.yml if ! git diff --cached --quiet; then latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || true) if [ -n "$latest_tag" ]; then git push origin :refs/tags/$latest_tag -q || true git tag -d "$latest_tag" -q || true fi git commit -m "Update CI" -q git push origin HEAD:main --tags --force -q echo " → Updated and pushed $owner/$repo" else echo " → No changes detected for $owner/$repo" fi cd - >/dev/null rm -rf "$tmpdir" echo " ✓ Completed $owner/$repo" repo_counter=$((repo_counter + 1)) done < "$valid_repos_file" rm "$valid_repos_file" echo "[Sync CI Complete]"