name: "[Icon] Icon update approved" on: issues: types: [labeled] jobs: update-icon: runs-on: ubuntu-latest # This condition ensures the job only runs when the 'approved' label is updated and the issue title starts with 'feat(icons): update ' if: | contains(github.event.issue.labels.*.name, 'approved') && startsWith(github.event.issue.title, 'feat(icons): update ') env: ICON_TYPE: ${{ contains(github.event.issue.labels.*.name, 'normal-icon') && 'normal' || 'monochrome' }} steps: - name: Obtain token id: obtainToken uses: tibdex/github-app-token@v2 with: private_key: ${{ secrets.DASHBOARD_ICONS_MANAGER_APP_PRIVATE_KEY }} app_id: ${{ vars.DASHBOARD_ICONS_MANAGER_APP_ID }} - name: Checkout repository uses: actions/checkout@v4 env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} - name: Set Up Python uses: actions/setup-python@v4 with: python-version: "3.11" - name: Install Dependencies run: | pip install cairosvg pillow requests sudo apt-get update sudo apt-get install -y zopfli webp - name: Parse issue form id: parse_issue_form run: echo "ISSUE_FORM=$(python scripts/parse_issue_form.py)" >> "$GITHUB_OUTPUT" env: INPUT_ISSUE_BODY: ${{ github.event.issue.body }} - name: Validate Categories run: | import json import sys import os # Load allowed categories from metadata.map.json map_file = "metadata.map.json" try: with open(map_file, 'r', encoding='utf-8') as f: map_data = json.load(f) # Assuming the first key in the map holds the example structure example_key = list(map_data.keys())[0] allowed_categories = set(map_data[example_key]['categories']) print(f"Loaded {len(allowed_categories)} allowed categories from {map_file}") except Exception as e: print(f"::error file={map_file}::Failed to load or parse allowed categories from {map_file}: {e}") sys.exit(1) # Load submitted form data form_json_string = os.environ.get('INPUT_ISSUE_FORM') if not form_json_string: print("::error::Failed to get form JSON from environment variable.") sys.exit(1) try: form_data = json.loads(form_json_string) except json.JSONDecodeError as e: print(f"::error::Failed to parse form JSON: {e}") print(f"Form JSON string was: {form_json_string}") sys.exit(1) # Extract submitted categories (handle potential missing key or None value) # NOTE: The update forms might not have a 'Categories' field if categories aren't updatable via that form. # If 'Categories' is missing or None in the form data, validation passes trivially. submitted_categories_str = form_data.get('Categories') # Label from issue form submitted_categories = set() if submitted_categories_str: submitted_categories = set(cat.strip() for cat in submitted_categories_str.split('\\n') if cat.strip()) if not submitted_categories_str: print("No categories submitted in this form, skipping validation.") else: print(f"Submitted categories: {submitted_categories}") # Validate invalid_categories = submitted_categories - allowed_categories if invalid_categories: print(f"::error::Invalid categories found: {', '.join(sorted(list(invalid_categories)))}") print("Please ensure all submitted categories exist in metadata.map.json.") sys.exit(1) else: print("All submitted categories are valid.") env: INPUT_ISSUE_FORM: ${{ steps.parse_issue_form.outputs.ISSUE_FORM }} - name: Update metadata file run: python scripts/generate_metadata_file.py ${{ env.ICON_TYPE }} update env: INPUT_ISSUE_FORM: ${{ steps.parse_issue_form.outputs.ISSUE_FORM }} INPUT_ISSUE_AUTHOR_ID: ${{ github.event.issue.user.id }} INPUT_ISSUE_AUTHOR_LOGIN: ${{ github.event.issue.user.login }} - name: Generate icons run: python scripts/generate_icons.py ${{ env.ICON_TYPE }} update env: INPUT_ISSUE_FORM: ${{ steps.parse_issue_form.outputs.ISSUE_FORM }} - name: Generate File Tree run: python scripts/generate_file_tree.py svg png webp - name: Generate full metadata file run: python scripts/generate_metadata.py - name: Extract icon name id: extract_icon_name run: echo "ICON_NAME=$(python scripts/print_icon_name.py ${{ env.ICON_TYPE }} update)" >> "$GITHUB_OUTPUT" env: INPUT_ISSUE_FORM: ${{ steps.parse_issue_form.outputs.ISSUE_FORM }} - name: Compress icons run: | echo "Compressing PNGs..." find png/ -iname "${{ steps.extract_icon_name.outputs.ICON_NAME }}*.png" -print0 | xargs -0 -P 4 -I{} zopflipng -y {} {} echo "Compressing WEBPs..." find webp/ -iname "${{ steps.extract_icon_name.outputs.ICON_NAME }}*.webp" -print0 | xargs -0 -P 4 -I{} bash -c 'cwebp -quiet -lossless "$1" -o "$1"' _ {} - name: Commit changes run: | git config --global user.email "193821040+dashboard-icons-manager[bot]@users.noreply.github.com" git config --global user.name "Dashboard Icons Manager" git add . git commit -m "feat(icons): update ${{ steps.extract_icon_name.outputs.ICON_NAME }}" - name: Create Pull Request uses: peter-evans/create-pull-request@v7 with: token: ${{ steps.obtainToken.outputs.token }} branch: icons/update-${{steps.extract_icon_name.outputs.ICON_NAME}} base: main title: "feat(icons): update ${{steps.extract_icon_name.outputs.ICON_NAME}}" delete-branch: true body: | This PR updates the icon ${{steps.extract_icon_name.outputs.ICON_NAME}} like requested in #${{github.event.issue.number}} to the project. Closes #${{github.event.issue.number}}