#!/bin/bash dirname="$(dirname "$(readlink -e "$0")")" source "${dirname}/../etc/dbscripts.cfg" source "${dirname}/../share/db-functions" pushd "${work_directory}" >/dev/null script_lock for repo in "${repositories[@]}"; do for arch in "${native_architectures[@]}"; do repo_lock "${repo}" "${arch}" || exit 1 done done #adjust the nice level to run at a lower priority renice +10 -p $$ > /dev/null # Create a readable file for each repo with the following format # - [ ] for repo in "${repositories[@]}"; do for arch in "${native_architectures[@]}"; do # Repo does not exist; skip it if [ ! -f "${root_dir}/${repo}/os/${arch}/${repo}${database_extension_suffixfile}" ]; then continue fi bsdtar -xOf "${root_dir}/${repo}/os/${arch}/${repo}${database_extension_suffixfile}" \ | awk '/^%NAME%/ { getline b }; /^%BASE%/ { getline b }; /^%VERSION%/ { getline v }; /^%LICENSE%/,/^$/ { if ( !/^%LICENSE%/ ) { l=l" "$0 } }; /^%ARCH%/ { getline a; printf "%s %s %s %s\n", b, v, a, l; l=""; }' done | sort -u > "${work_directory}/db-${repo}" done for repo in "${repositories[@]}"; do for arch in "${native_architectures[@]}"; do repo_unlock "${repo}" "${arch}" done done # Create a list of all available source package file names find "${root_dir}/${sources_pool}" -xtype f -name "*${source_extension_suffixfile}" -printf '%f\n' | sort -u > "${work_directory}/available-src-pkgs" # Check for all packages if we need to build a source package for repo in "${repositories[@]}"; do newpkgs=() failedpkgs=() while read line; do pkginfo=("${line}") pkgbase=${pkginfo[0]} pkgver=${pkginfo[1]} pkgarch=${pkginfo[2]} pkglicense=("${pkginfo[@]:3}") # Should this package be skipped? if grep -Fqx "${pkgbase}" "${dirname}/sourceballs.skip"; then continue fi # Commenting out, we'll sourceball everything # Check if the license or .force file does not enforce creating a source package # if ! (chk_license ${pkglicense[@]} || grep -Fqx "${pkgbase}" "${dirname}/sourceballs.force"); then # continue # fi # Store the expected file name of the source package echo "${pkgbase}-${pkgver}${source_extension_suffixfile}" >> "${work_directory}/expected-src-pkgs" # Build the source package if its not already there if ! grep -Fqx "${pkgbase}-${pkgver}${source_extension_suffixfile}" "${work_directory}/available-src-pkgs"; then # Check if we had failed before if in_array "${pkgbase}-${pkgver}${source_extension_suffixfile}" "${failedpkgs[@]}"; then continue fi # Get the sources from xbs mkdir -p -m0770 "${work_directory}/pkgbuilds/${repo}-${pkgarch}" cp -a "$(xbs releasepath "${pkgbase}" "${repo}" "${pkgarch}")" \ "${work_directory}/pkgbuilds/${repo}-${pkgarch}/${pkgbase}" >/dev/null 2>&1 if [ $? -ge 1 ]; then failedpkgs+=("${pkgbase}-${pkgver}${source_extension_suffixfile}") continue fi # Build the actual source package pushd "${work_directory}/pkgbuilds/${repo}-${pkgarch}/${pkgbase}" >/dev/null SRCPKGDEST=. makepkg --nocolor --allsource --ignorearch --skippgpcheck >"${work_directory}/${pkgbase}.log" 2>&1 if [ $? -eq 0 ] && [ -f "${pkgbase}-${pkgver}${source_extension_suffixfile}" ]; then mv_acl "${pkgbase}-${pkgver}${source_extension_suffixfile}" "${root_dir}/${sources_pool}/${pkgbase}-${pkgver}${source_extension_suffixfile}" # Avoid creating the same source package for every arch echo "${pkgbase}-${pkgver}${source_extension_suffixfile}" >> "${work_directory}/available-src-pkgs" newpkgs+=("${pkgbase}-${pkgver}${source_extension_suffixfile}") else failedpkgs+=("${pkgbase}-${pkgver}${source_extension_suffixfile}") cat "${work_directory}/${pkgbase}.log" >> "${work_directory}/makepkg-fail.log" fi popd >/dev/null fi done < "${work_directory}/db-${repo}" if [ ${#newpkgs[@]} -ge 1 ]; then msg "Adding source packages for [%s]..." "${repo}" for new_pkg in "${newpkgs[@]}"; do msg2 '%s' "${new_pkg}" done fi if [ ${#failedpkgs[@]} -ge 1 ]; then msg "Failed to create source packages for [%s]..." "${repo}" for failed_pkg in "${failedpkgs[@]}"; do msg2 '%s' "${failed_pkg}" done fi done # Cleanup old source packages cat "${work_directory}/expected-src-pkgs" | sort -u > "${work_directory}/expected-src-pkgs.sort" cat "${work_directory}/available-src-pkgs" | sort -u > "${work_directory}/available-src-pkgs.sort" old_pkgs=($(comm -23 "${work_directory}/available-src-pkgs.sort" "${work_directory}/expected-src-pkgs.sort")) if [ ${#old_pkgs[@]} -ge 1 ]; then msg "Removing old source packages..." "${source_cleanup_dryrun}" && warning 'dry run mode is active' for old_pkg in "${old_pkgs[@]}"; do msg2 '%s' "${old_pkg}" if ! "${source_cleanup_dryrun}"; then mv_acl "${root_dir}/${sources_pool}/${old_pkg}" "${source_cleanup_destination_directory}/${old_pkg}" touch "${source_cleanup_destination_directory}/${old_pkg}" fi done fi old_pkgs=($(find "${source_cleanup_destination_directory}" -type f -name "*${source_extension_suffixfile}" -mtime +"${source_cleanup_keep}" -printf '%f\n')) if [ ${#old_pkgs[@]} -ge 1 ]; then msg "Removing old source packages from the cleanup directory..." for old_pkg in "${old_pkgs[@]}"; do msg2 '%s' "${old_pkg}" "${source_cleanup_dryrun}" || rm -f "${source_cleanup_destination_directory}/${old_pkg}" done fi if [ -f "${work_directory}/makepkg-fail.log" ]; then msg "Log of failed packages" cat "${work_directory}/makepkg-fail.log" fi script_unlock