diff --git a/build/update-repo.sh b/build/update-repo.sh index b8f3d78..26559f4 100755 --- a/build/update-repo.sh +++ b/build/update-repo.sh @@ -24,23 +24,45 @@ fi # Add all packages to the database (only latest version of each) echo "==> Adding packages to database..." -ls -t *.pkg.tar.* 2>/dev/null | grep -v '\.sig$' | awk ' -{ - # Extract package name without version-rel-arch.pkg.tar.ext - pkgfile = $0 - gsub(/\.pkg\.tar\.(zst|xz|gz)$/, "", pkgfile) - split(pkgfile, parts, "-") - # Rebuild name without last 3 parts (version-rel-arch) - pkgname = parts[1] - for (i = 2; i <= length(parts) - 3; i++) { - pkgname = pkgname "-" parts[i] - } - - if (!seen[pkgname]++) { - print $0 - } + +# Build list of latest packages using vercmp for proper version sorting +declare -A latest_pkgs +declare -A latest_vers + +# Helper to extract pkgname and version from filename +# Uses bsdtar to read .PKGINFO for accurate info +get_pkg_info() { + local pkg="$1" + bsdtar -xOqf "$pkg" .PKGINFO 2>/dev/null | awk ' + /^pkgname = / { name = substr($0, 11) } + /^pkgver = / { ver = substr($0, 10) } + END { print name " " ver } + ' } -' | xargs repo-add "$DB_FILE" || { + +for pkg in *.pkg.tar.*(N); do + [[ "$pkg" == *.sig ]] && continue + + read -r name ver <<< "$(get_pkg_info "$pkg")" + [[ -z "$name" ]] && continue + + if [[ -z "${latest_pkgs[$name]}" ]]; then + latest_pkgs[$name]="$pkg" + latest_vers[$name]="$ver" + else + if [[ $(vercmp "$ver" "${latest_vers[$name]}") -gt 0 ]]; then + latest_pkgs[$name]="$pkg" + latest_vers[$name]="$ver" + fi + fi +done + +# Add latest packages to repo +for pkg in "${latest_pkgs[@]}"; do + echo " Adding: $pkg" +done | sort + +repo-add "$DB_FILE" "${latest_pkgs[@]}" || { echo "==> Failed to update repository database" exit 1 }