#!/bin/bash . "$(dirname $0)/../db-functions" . "$(dirname $0)/../config" script_lock for repo in ${PKGREPOS[@]}; do for arch in ${ARCHES[@]}; do repo_lock ${repo} ${arch} || exit 1 done done #adjust the nice level to run at a lower priority renice +10 -p $$ > /dev/null for repo in ${PKGREPOS[@]}; do for arch in ${ARCHES[@]}; do repodb="${FTP_BASE}/${repo}/os/${arch}/${repo}${DBEXT}" filedb="${FTP_BASE}/${repo}/os/${arch}/${repo}${FILESEXT}" if [ ! -f "${repodb}" ]; then continue fi # get a list of package files defined in the repo db mkdir -p "${WORKDIR}/db-dir-${repo}-${arch}" bsdtar -xf "${repodb}" -C "${WORKDIR}/db-dir-${repo}-${arch}" # This should actualy be faster than reading all the just extracted files bsdtar -xOf "${repodb}" | awk '/^%FILENAME%/{getline;print}' | sort > "${WORKDIR}/db-${repo}-${arch}" # get a list of package files defined in the files db mkdir -p "${WORKDIR}/files-current-dir-${repo}-${arch}" if [ ! -f "${filedb}" ]; then touch "${WORKDIR}/files-${repo}-${arch}" else bsdtar -xf "${filedb}" -C "${WORKDIR}/files-current-dir-${repo}-${arch}" bsdtar -xOf "${filedb}" | awk '/^%FILENAME%/{getline;print}' | sort > "${WORKDIR}/files-${repo}-${arch}" fi done done case "${FILESEXT}" in *.gz) TAR_OPT="z" ;; *.bz2) TAR_OPT="j" ;; *.xz) TAR_OPT="J" ;; *) die "Unknown compression type for FILESEXT=${FILESEXT}" ;; esac for repo in ${PKGREPOS[@]}; do for arch in ${ARCHES[@]}; do filedb="${FTP_BASE}/${repo}/os/${arch}/${repo}${FILESEXT}" if [ ! -f "${WORKDIR}/db-${repo}-${arch}" ]; then # remove any files db that might be in this empty repo if [ -f "${filedb}" ]; then rm -f "${filedb}" fi continue fi # Check if updating the files db is needed if ! diff -q "${WORKDIR}/db-${repo}-${arch}" "${WORKDIR}/files-${repo}-${arch}" >/dev/null; then mkdir -p "${WORKDIR}/files-new-dir-${repo}-${arch}" # Include all unchanged file lists # Note: deleted packages are implicitly excluded for f in $(comm -12 "${WORKDIR}/db-${repo}-${arch}" "${WORKDIR}/files-${repo}-${arch}"); do mv "${WORKDIR}/files-current-dir-${repo}-${arch}/${f%*-*${PKGEXT}}" \ "${WORKDIR}/files-new-dir-${repo}-${arch}" done # Create file lists for new packages for f in $(comm -23 "${WORKDIR}/db-${repo}-${arch}" "${WORKDIR}/files-${repo}-${arch}"); do tdir="${WORKDIR}/files-new-dir-${repo}-${arch}/${f%*-*${PKGEXT}}" mkdir "${tdir}" echo '%FILES%' > "${tdir}/files" bsdtar --exclude=.* -tf "${FTP_BASE}/${repo}/os/${arch}/${f}" >> "${tdir}/files" # add desc and depends file from db dbdir="${WORKDIR}/db-dir-${repo}-${arch}/${f%*-*${PKGEXT}}" mv "${dbdir}/desc" "${tdir}/desc" mv "${dbdir}/depends" "${tdir}/depends" done # Create the actual file db pushd "${WORKDIR}/files-new-dir-${repo}-${arch}" >/dev/null bsdtar -c${TAR_OPT}f "${WORKDIR}/${arch}-${repo}${FILESEXT}" * popd >/dev/null mv -f "${WORKDIR}/${arch}-${repo}${FILESEXT}" "${filedb}" ln -sf "${repo}${FILESEXT}" "${filedb%.tar.*}" fi done done for repo in ${PKGREPOS[@]}; do for arch in ${ARCHES[@]}; do repo_unlock ${repo} ${arch} done done script_unlock