generated from osc/skins-template
Update .gitea/workflows/test-skins.yml
This commit is contained in:
@@ -23,43 +23,47 @@ jobs:
|
||||
ERRORS=()
|
||||
|
||||
############################################################
|
||||
# FIXED: SAFE URL DECODER (no null bytes!)
|
||||
# Remove all NUL/control characters BEFORE any decoding
|
||||
############################################################
|
||||
sanitize_url() {
|
||||
printf '%s' "$1" \
|
||||
| tr -d '\000' \
|
||||
| tr -d '\r' \
|
||||
| sed 's/[[:cntrl:]]//g'
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Safe unicode URL decode (no null bytes)
|
||||
############################################################
|
||||
urldecode() {
|
||||
local url="$1"
|
||||
url="${url//+/ }"
|
||||
# Perl decoding avoids raw NUL bytes and handles unicode correctly
|
||||
printf '%s' "$url" | perl -pe 's/%([A-Fa-f0-9]{2})/chr(hex($1))/eg'
|
||||
}
|
||||
|
||||
############################################################
|
||||
# FIXED: Gitea "soft 404" detection (HTML body says 404)
|
||||
# Detect Gitea "soft 404" even when status=200 OK
|
||||
############################################################
|
||||
check_http() {
|
||||
local url="$1"
|
||||
echo " → Checking external: $url"
|
||||
|
||||
# HEAD
|
||||
local status
|
||||
local status body
|
||||
|
||||
# Try HEAD first
|
||||
status=$(curl -Is --max-time 10 "$url" | head -n1 | awk '{print $2}')
|
||||
|
||||
if [[ "$status" =~ ^2|3 ]]; then
|
||||
local body
|
||||
body=$(curl -Ls --max-time 10 "$url")
|
||||
|
||||
if echo "$body" | grep -qiE "404 Not Found|Path .* doesn't exist|File not found|does not exist|Not Found"; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
# GET fallback
|
||||
# Try GET fallback
|
||||
status=$(curl -Is --max-time 10 -X GET "$url" | head -n1 | awk '{print $2}')
|
||||
|
||||
if [[ "$status" =~ ^2|3 ]]; then
|
||||
local body
|
||||
body=$(curl -Ls --max-time 10 "$url")
|
||||
|
||||
if echo "$body" | grep -qiE "404 Not Found|Path .* doesn't exist|File not found|does not exist|Not Found"; then
|
||||
return 1
|
||||
fi
|
||||
@@ -74,20 +78,17 @@ jobs:
|
||||
############################################################
|
||||
check_local() {
|
||||
local path="$1"
|
||||
path="${path#/}"
|
||||
path="${path#/}" # strip leading slash
|
||||
local decoded
|
||||
decoded=$(urldecode "$path")
|
||||
|
||||
echo " → Checking local: $decoded"
|
||||
|
||||
if [[ ! -e "$decoded" ]]; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
[[ -e "$decoded" ]]
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Extract *all* link types from a Markdown file
|
||||
# Extract URLs from Markdown + HTML
|
||||
############################################################
|
||||
extract_links() {
|
||||
local f="$1"
|
||||
@@ -115,34 +116,31 @@ jobs:
|
||||
echo "🔍 Scanning Markdown files..."
|
||||
echo
|
||||
|
||||
############################################################
|
||||
# Process all markdown files
|
||||
############################################################
|
||||
find . -type f -name '*.md' | while IFS= read -r mdfile; do
|
||||
echo "📄 Checking: $mdfile"
|
||||
|
||||
############################################
|
||||
# For each file, extract and test links
|
||||
############################################
|
||||
while IFS= read -r url; do
|
||||
[[ -z "$url" ]] && continue
|
||||
[[ "$url" == mailto:* ]] && continue
|
||||
|
||||
# Skip versioned /src/tag links inside docs/ (quietly)
|
||||
if [[ "$mdfile" == ./docs/* ]] && [[ "$url" == *"/src/tag/"* ]]; then
|
||||
# Clean input BEFORE use
|
||||
cleaned=$(sanitize_url "$url")
|
||||
|
||||
# Skip tag-version links in docs
|
||||
if [[ "$mdfile" == ./docs/* ]] && [[ "$cleaned" == *"/src/tag/"* ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# External URLs
|
||||
if [[ "$url" == http* ]]; then
|
||||
if ! check_http "$url"; then
|
||||
ERRORS+=("❌ Broken external link: $url (in $mdfile)")
|
||||
# external
|
||||
if [[ "$cleaned" == http* ]]; then
|
||||
if ! check_http "$cleaned"; then
|
||||
ERRORS+=("❌ Broken external link: $cleaned (in $mdfile)")
|
||||
fi
|
||||
|
||||
# Local paths
|
||||
# local file
|
||||
else
|
||||
if ! check_local "$url"; then
|
||||
ERRORS+=("❌ Missing local file: $url (in $mdfile)")
|
||||
if ! check_local "$cleaned"; then
|
||||
ERRORS+=("❌ Missing local file: $cleaned (in $mdfile)")
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -152,7 +150,7 @@ jobs:
|
||||
done
|
||||
|
||||
############################################################
|
||||
# Final error reporting
|
||||
# Final result
|
||||
############################################################
|
||||
echo
|
||||
if (( ${#ERRORS[@]} > 0 )); then
|
||||
|
||||
Reference in New Issue
Block a user