From 26944f5b48bf6a905837e0c83334b9414f934dd0 Mon Sep 17 00:00:00 2001 From: gjpin <3874515+gjpin@users.noreply.github.com> Date: Fri, 27 Dec 2024 12:08:06 +0000 Subject: [PATCH] fix gha --- .github/workflows/check-packages.yml | 73 +++++++++++++++++++--------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/.github/workflows/check-packages.yml b/.github/workflows/check-packages.yml index 4c38fcc..d1cb93a 100644 --- a/.github/workflows/check-packages.yml +++ b/.github/workflows/check-packages.yml @@ -26,33 +26,58 @@ jobs: - name: Extract and validate packages run: | + failed_packages=() + + validate_package() { + local package=$1 + # Skip if empty, starts with #, or starts with -- + if [ -z "$package" ] || [[ "$package" == \#* ]] || [[ "$package" == --* ]]; then + return 0 + fi + + if ! pacman -Ss "^${package}$" > /dev/null 2>&1; then + failed_packages+=("$package") + echo "❌ Package not found: $package" + else + echo "✅ Package exists: $package" + fi + } + # Find all .sh files in root directory for file in *.sh; do if [ -f "$file" ]; then - echo "Checking packages in $file..." - - # Extract package names from pacman commands - # Matches packages after "pacman -S --noconfirm \" until the next command - packages=$(awk '/pacman -S --noconfirm/{p=1;next} /^[a-z]/{p=0} p{if($1!="\\") print $1}' "$file" | - grep -v '^$' | - tr -d '\\') - - # Also catch single-line package installations - single_line_packages=$(grep -E "^pacman -S --noconfirm [^\\]" "$file" | - sed 's/pacman -S --noconfirm //') - - all_packages="$packages $single_line_packages" + echo "📄 Checking packages in $file..." - # Check each package - echo "$all_packages" | tr ' ' '\n' | while read -r package; do - if [ ! -z "$package" ]; then - if pacman -Ss "^${package}$" > /dev/null 2>&1; then - echo "✅ Package exists: $package" - else - echo "❌ Package not found: $package" - exit 1 - fi + # Extract multi-line package installations + while IFS= read -r line; do + if [[ "$line" =~ ^pacman\ -S\ --noconfirm ]]; then + # Start capturing packages + in_package_list=1 + # Extract packages from the first line, skipping pacman command and known arguments + packages=$(echo "$line" | sed 's/pacman -S --noconfirm//g' | sed 's/--ask [0-9]//g' | tr '\\' ' ') + for pkg in $packages; do + validate_package "$pkg" + done + elif [ "$in_package_list" = "1" ] && [[ "$line" =~ ^[[:space:]]*[^[:space:]].*\\ *$ ]]; then + # Continue capturing packages from continuation lines + packages=$(echo "$line" | sed 's/\\//g') + for pkg in $packages; do + validate_package "$pkg" + done + else + in_package_list=0 fi - done + done < "$file" fi - done \ No newline at end of file + done + + # Print summary of failed packages + if [ ${#failed_packages[@]} -eq 0 ]; then + echo "✅ All packages validated successfully!" + exit 0 + else + echo "❌ The following packages were not found:" + printf '%s\n' "${failed_packages[@]}" + echo "Total failed packages: ${#failed_packages[@]}" + exit 1 + fi \ No newline at end of file