- Add joomla_manifest.sh library with manifest parsing functions - Add smoke_test.sh for repository validation - Add versions.sh for version management - Add JSON utilities to common.sh - Fix logging.sh with proper enhanced logging functions - Make all scripts executable Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
86 lines
2.3 KiB
Bash
Executable File
86 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SRC_DIR="${SRC_DIR:-src}"
|
|
LANG_ROOT="${LANG_ROOT:-${SRC_DIR}/language}"
|
|
|
|
json_escape() {
|
|
python3 -c 'import json,sys; print(json.dumps(sys.argv[1]))' "$1"
|
|
}
|
|
|
|
[ -d "${SRC_DIR}" ] || {
|
|
printf '{"status":"fail","error":%s}
|
|
' "$(json_escape "src directory missing")"
|
|
exit 1
|
|
}
|
|
|
|
python3 - <<'PY' "${LANG_ROOT}"
|
|
import json
|
|
import sys
|
|
import re
|
|
from pathlib import Path
|
|
|
|
lang_root = Path(sys.argv[1])
|
|
|
|
# Language directory is optional for some extension types
|
|
if not lang_root.exists():
|
|
print(json.dumps({"status":"ok","lang_root":str(lang_root),"languages":[],"warnings":["language_root_missing"]}, ensure_ascii=False))
|
|
sys.exit(0)
|
|
|
|
if not lang_root.is_dir():
|
|
print(json.dumps({"status":"fail","error":"language_root_not_directory","lang_root":str(lang_root)}, ensure_ascii=False))
|
|
sys.exit(1)
|
|
|
|
lang_dirs = sorted([p for p in lang_root.iterdir() if p.is_dir()])
|
|
|
|
# Joomla language tags: en-GB, fr-FR, etc.
|
|
pattern = re.compile(r'^[a-z]{2}-[A-Z]{2}$')
|
|
invalid = [p.name for p in lang_dirs if not pattern.match(p.name)]
|
|
|
|
warnings = []
|
|
|
|
# Soft expectation: en-GB exists if any language directories exist
|
|
if lang_dirs and not (lang_root / 'en-GB').exists():
|
|
warnings.append('en-GB_missing')
|
|
|
|
# Validate INI naming
|
|
missing_ini = []
|
|
nonmatching_ini = []
|
|
|
|
for d in lang_dirs:
|
|
ini_files = [p for p in d.glob('*.ini') if p.is_file()]
|
|
if not ini_files:
|
|
missing_ini.append(d.name)
|
|
continue
|
|
for ini in ini_files:
|
|
if not (ini.name.startswith(d.name + '.') or ini.name == f"{d.name}.ini"):
|
|
nonmatching_ini.append(str(ini))
|
|
|
|
result = {
|
|
"status": "ok",
|
|
"lang_root": str(lang_root),
|
|
"languages": [d.name for d in lang_dirs],
|
|
"warnings": warnings,
|
|
}
|
|
|
|
# Hard failures
|
|
if invalid:
|
|
result.update({"status":"fail","error":"invalid_language_tag_dir","invalid":invalid})
|
|
print(json.dumps(result, ensure_ascii=False))
|
|
sys.exit(1)
|
|
|
|
if nonmatching_ini:
|
|
result.update({"status":"fail","error":"ini_name_mismatch","nonmatching_ini":nonmatching_ini[:50]})
|
|
print(json.dumps(result, ensure_ascii=False))
|
|
sys.exit(1)
|
|
|
|
if missing_ini:
|
|
result.update({"status":"fail","error":"missing_ini_files","missing_ini":missing_ini})
|
|
print(json.dumps(result, ensure_ascii=False))
|
|
sys.exit(1)
|
|
|
|
print(json.dumps(result, ensure_ascii=False))
|
|
PY
|
|
|
|
echo "language_structure: ok"
|