diff --git a/.github/workflows/daily_README.yaml b/.github/workflows/daily_README.yaml index 59e9e8517..515e2eb34 100644 --- a/.github/workflows/daily_README.yaml +++ b/.github/workflows/daily_README.yaml @@ -24,7 +24,8 @@ jobs: - name: Create README file run: | - # Init + set -euo pipefail + echo "Starting" # Prepare template @@ -32,7 +33,7 @@ jobs: ADDONSLINE="$(sed -n '/%%ADDONS_LIST%%/=' README2.md)" sed -i "/%%ADDONS_LIST%%/d" README2.md - # Helper to find a config file (json/yaml/yml) + # Helper: resolve config path (json/yaml/yml) get_cfg() { local dir="$1" for ext in json yaml yml; do @@ -44,7 +45,7 @@ jobs: return 1 } - # Sort folders by addon name (support json & yaml) + # Sort/rename addon folders by .name (supports JSON & YAML) # shellcheck disable=SC2046 for f in $( find -- * -maxdepth 0 -type d | sort -r ); do CFG="$(get_cfg "$f" || true)" @@ -64,22 +65,22 @@ jobs: echo "Project $f" - # Folder name in repo root (for links/badges) + # Folder name for links/badges (restore later) if [ -f "$f/oldname" ]; then FOLDERNAME="$(cat "$f/oldname")"; else FOLDERNAME="$f"; fi - # Choose badge type & extension for Shields + # Determine extension for shields (json/yaml) EXT="${CFG##*.}" BADGE_KIND="json" case "$EXT" in yaml|yml) BADGE_KIND="yaml" ;; esac - # Read fields using yq (works for both JSON & YAML) + # Read fields via yq (works for JSON & YAML) NAME="$(yq -r '.name // ""' "$CFG")" DESCRIPTION="$(yq -r '.description // ""' "$CFG")" PANEL_ICON="$(yq -r '.panel_icon // ""' "$CFG")" - # Icon (mdi:foo) + # mdi icon handling if [ -n "$PANEL_ICON" ] && [ "$PANEL_ICON" != "null" ]; then ICON_NAME="${PANEL_ICON#*:}" ICON="![image](https://api.iconify.design/mdi/$ICON_NAME.svg)" @@ -87,16 +88,17 @@ jobs: ICON="" fi - # Derived strings for checks + # Gather booleans/arrays as flat strings SCHEMA_STR="$(yq -o=json '.schema // {}' "$CFG" | tr -d '\n' || true)" SERVICES="$(yq -r '.services[]? // empty' "$CFG" | tr '\n' ' ' || true)" ARCHS="$(yq -r '.arch[]? // empty' "$CFG" | tr '\n' ' ' || true)" FULL_ACCESS="$(yq -r '.full_access // false' "$CFG" || true)" INGRESS="$(yq -r '.ingress // false' "$CFG" || true)" - # Write infos - echo "Writing infos" + # Insert a blank line block at the marker location sed -i "$ADDONSLINE"'{G;}' README2.md + + # Feature badges (same as before) if [[ "$SCHEMA_STR" == *"localdisks"* ]]; then sed -i "$ADDONSLINE"'a ![localdisks][localdisks-badge]' README2.md; fi if [[ "$SCHEMA_STR" == *"networkdisks"* ]]; then sed -i "$ADDONSLINE"'a ![smb][smb-badge]' README2.md; fi if [[ "$FULL_ACCESS" == "true" ]]; then sed -i "$ADDONSLINE"'a ![full_access][full_access-badge]' README2.md; fi @@ -104,21 +106,36 @@ jobs: if [[ "$SERVICES" == *"mysql"* ]]; then sed -i "$ADDONSLINE"'a ![MariaDB][mariadb-badge]' README2.md; fi if [[ "$INGRESS" == "true" ]]; then sed -i "$ADDONSLINE"'a ![ingress][ingress-badge]' README2.md; fi - if [[ " $ARCHS " == *" armv7 "* ]]; then sed -i "$ADDONSLINE"'a ![armv7][armv7-badge]' README2.md; else sed -i "$ADDONSLINE"'a ![armv7no][armv7no-badge]' README2.md; fi || true - if [[ " $ARCHS " == *" amd64 "* ]]; then sed -i "$ADDONSLINE"'a ![amd64][amd64-badge]' README2.md; else sed -i "$ADDONSLINE"'a ![amd64no][amd64no-badge]' README2.md; fi || true - if [[ " $ARCHS " == *" aarch64 "* ]]; then sed -i "$ADDONSLINE"'a ![aarch64][aarch64-badge]' README2.md; else sed -i "$ADDONSLINE"'a ![aarch64no][aarch64no-badge]' README2.md; fi || true + # Architecture shields: green if present, orange otherwise + if [[ " $ARCHS " == *" armv7 "* ]]; then + sed -i "$ADDONSLINE"'a ![armv7](https://img.shields.io/badge/armv7-supported-brightgreen)' README2.md + else + sed -i "$ADDONSLINE"'a ![armv7](https://img.shields.io/badge/armv7-unsupported-orange)' README2.md + fi + if [[ " $ARCHS " == *" amd64 "* ]]; then + sed -i "$ADDONSLINE"'a ![amd64](https://img.shields.io/badge/amd64-supported-brightgreen)' README2.md + else + sed -i "$ADDONSLINE"'a ![amd64](https://img.shields.io/badge/amd64-unsupported-orange)' README2.md + fi + if [[ " $ARCHS " == *" aarch64 "* ]]; then + sed -i "$ADDONSLINE"'a ![aarch64](https://img.shields.io/badge/aarch64-supported-brightgreen)' README2.md + else + sed -i "$ADDONSLINE"'a ![aarch64](https://img.shields.io/badge/aarch64-unsupported-orange)' README2.md + fi + # Optional updater badge if [[ -f "$f/updater.json" ]]; then sed -i "$ADDONSLINE"'a ![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2F'"$FOLDERNAME"'%2Fupdater.json)' README2.md fi - # Version badge: picks dynamic/json for JSON, dynamic/yaml for YAML + # Version badge: choose dynamic/json or dynamic/yaml sed -i "$ADDONSLINE"'a   ![Version](https://img.shields.io/badge/dynamic/'"$BADGE_KIND"'?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2F'"$FOLDERNAME"'%2Fconfig.'"$EXT"')' README2.md || true + # Title line sed -i "$ADDONSLINE"'a ✓ '"$ICON"' ['"$NAME"']('"$FOLDERNAME"'/) : '"$DESCRIPTION\\n" README2.md done - # Restore folders name + # Restore original folder names echo "Restore structure..." find -- * -maxdepth 0 -type d | sort -r | while read -r f; do if [ -f "$f/oldname" ]; then @@ -129,13 +146,20 @@ jobs: done echo "... done" - # Write stats + # Global stats echo "Global stats..." STATS_DOWNLOADS="$(awk 'NR==2{print $1}' Stats)" - sed -i "s|%%STATS_DOWNLOADS%%|$STATS_DOWNLOADS|g" README2.md && \ - sed -i "s|%%STATS_ADDONS%%|$(find . -type f \( -name 'config.json' -o -name 'config.yaml' -o -name 'config.yml' \) | wc -l)|g" README2.md && \ - STATS_ONE="$(awk 'NR==3{print $(NF)}' Stats)" && \ - STATS_TWO="$(awk 'NR==4{print $(NF)}' Stats)" && \ + # Count only config files at SECOND LEVEL (.//config.*), not deeper + STATS_CFG_COUNT="$( + find . -mindepth 2 -maxdepth 2 -type f \ + -regextype posix-extended \ + -regex '.*/config\.(json|ya?ml)$' \ + | wc -l + )" + sed -i "s|%%STATS_DOWNLOADS%%|$STATS_DOWNLOADS|g" README2.md + sed -i "s|%%STATS_ADDONS%%|$STATS_CFG_COUNT|g" README2.md + STATS_ONE="$(awk 'NR==3{print $(NF)}' Stats)" + STATS_TWO="$(awk 'NR==4{print $(NF)}' Stats)" STATS_THREE="$(awk 'NR==5{print $(NF)}' Stats)" echo "Best addon is $STATS_ONE" sed -i "s|%%STATS_ONE%%|${STATS_ONE^}|g" README2.md @@ -143,12 +167,12 @@ jobs: sed -i "s|%%STATS_THREE%%|${STATS_THREE^}|g" README2.md echo "... done" - # Breakdown per arch (unchanged) + # Breakdown per arch (unchanged logic) echo "Breakdown per arch..." STATS_ARMV7="$(awk '{SUM+=$3}END{print SUM}' Stats2)" STATS_AMD64="$(awk '{SUM+=$4}END{print SUM}' Stats2)" STATS_AARCH64="$(awk '{SUM+=$5}END{print SUM}' Stats2)" - STATS_DOWNLOADS="$(( STATS_ARMV7 + STATS_AMD64 + STATS_AARCH64 ))" + STATS_DOWNLOADS=$(( STATS_ARMV7 + STATS_AMD64 + STATS_AARCH64 )) STATS_ARMV7="$(awk -v t1="$STATS_ARMV7" -v t2="$STATS_AMD64" -v t3="$STATS_AARCH64" -v t4="$STATS_DOWNLOADS" 'BEGIN{printf "%.0f", t1/t4 * 100}')" STATS_AMD64="$(awk -v t1="$STATS_ARMV7" -v t2="$STATS_AMD64" -v t3="$STATS_AARCH64" -v t4="$STATS_DOWNLOADS" 'BEGIN{printf "%.0f", t2/t4 * 100}')" STATS_AARCH64="$(awk -v t1="$STATS_ARMV7" -v t2="$STATS_AMD64" -v t3="$STATS_AARCH64" -v t4="$STATS_DOWNLOADS" 'BEGIN{printf "%.0f", t3/t4 * 100}')" @@ -157,6 +181,7 @@ jobs: sed -i "s|%%STATS_AARCH64%%|aarch64: ${STATS_AARCH64}%|g" README2.md echo "... done" + # Top 3 breakdown injection for var in "$STATS_ONE" "$STATS_TWO" "$STATS_THREE"; do i=0 j=0