#!/bin/bash . "$(dirname "$(readlink -e "$0")")/config" . "$(dirname "$(readlink -e "$0")")/db-functions" if (( $# >= 1 )); then warning "Calling %s with a specific repository is no longer supported" "${0##*/}" exit 1 fi # Find repos with packages to release mapfile -t -d '' staging_repos < <( for f in "${STAGING}"/**/*${PKGEXTS}; do printf '%s\0' "${f%/*}" done | sort -uz ) repos=() for staging_repo in "${staging_repos[@]##*/}"; do if in_array "${staging_repo}" "${PKGREPOS[@]}"; then repos+=("${staging_repo}") fi done # TODO: this might lock too much (architectures) for repo in "${repos[@]}"; do for pkgarch in "${ARCHES[@]}"; do repo_lock "${repo}" "${pkgarch}" || exit 1 done done # check if packages are valid for repo in "${repos[@]}"; do if ! check_repo_permission "${repo}"; then die "You don't have permission to update packages in %s" "$repo" fi pkgs=($(getpkgfiles "${STAGING}/${repo}/"*${PKGEXTS})) if (( $? == 0 )); then for pkg in "${pkgs[@]}"; do if [[ -h ${pkg} ]]; then die "Package %s is a symbolic link" "$repo/${pkg##*/}" fi if ! check_pkgfile "${pkg}"; then die "Package %s is not consistent with its meta data" "$repo/${pkg##*/}" fi if ! pacman-key -v "${pkg}.sig" >/dev/null 2>&1; then die "Package %s does not have a valid signature" "$repo/${pkg##*/}" fi if ! check_pkgsvn "${pkg}" "${repo}"; then die "Package %s is not consistent with svn repository" "$repo/${pkg##*/}" fi if ! check_pkgrepos "${pkg}"; then die "Package %s already exists in another repository" "$repo/${pkg##*/}" fi if ! check_packager "${pkg}"; then die "Package %s does not have a valid packager" "$repo/${pkg##*/}" fi if ! check_buildinfo "${pkg}"; then die "Package %s does not have a .BUILDINFO file" "$repo/${pkg##*/}" fi if ! check_builddir "${pkg}"; then die "Package %s was not built in a chroot" "$repo/${pkg##*/}" fi done if ! check_splitpkgs "${repo}" "${pkgs[@]}"; then die "Missing split packages for %s" "$repo" fi else die "Could not read %s" "$STAGING" fi done for repo in "${repos[@]}"; do msg "Updating [%s]..." "$repo" any_pkgs=($(getpkgfiles "${STAGING}/${repo}/"*-any${PKGEXTS} 2>/dev/null)) for pkgarch in "${ARCHES[@]}"; do add_pkgs=() arch_pkgs=($(getpkgfiles "${STAGING}/${repo}/"*"-${pkgarch}"${PKGEXTS} 2>/dev/null)) for pkg in "${arch_pkgs[@]}" "${any_pkgs[@]}"; do pkgfile="${pkg##*/}" msg2 '%s (%s)' "$pkgfile" "$pkgarch" # any packages might have been moved by the previous run if [[ -f ${pkg} ]]; then mv "${pkg}" "$FTP_BASE/${PKGPOOL}" fi ln -s "../../../${PKGPOOL}/${pkgfile}" "$FTP_BASE/$repo/os/${pkgarch}" # also move signatures if [[ -f ${pkg}.sig ]]; then mv "${pkg}.sig" "$FTP_BASE/${PKGPOOL}" fi if [[ -f $FTP_BASE/${PKGPOOL}/${pkgfile}.sig ]]; then ln -s "../../../${PKGPOOL}/${pkgfile}.sig" "$FTP_BASE/$repo/os/${pkgarch}" fi add_pkgs+=("${pkgfile}") done if (( ${#add_pkgs[@]} >= 1 )); then arch_repo_modify add "${repo}" "${pkgarch}" ${add_pkgs[@]} fi done done for repo in "${repos[@]}"; do for pkgarch in "${ARCHES[@]}"; do repo_unlock "${repo}" "${pkgarch}" done done