# Scan srcpkgs/*/template for hashes and distfiles to determine # obsolete sources/by_sha256 files and their corresponding # sources/- files that can be purged purge_distfiles() { readonly HASHLEN=64 if [ -z "$XBPS_SRCDISTDIR" ]; then msg_error "The variable \$XBPS_SRCDISTDIR is not set." exit 1 fi # # Scan all templates for their current distfiles and checksums (hashes) # declare -A my_hashes templates=($(find srcpkgs -mindepth 1 -maxdepth 1 -type d -printf "srcpkgs/%f/template\n")) max=${#templates[@]} cur=0 if [ -z "$max" ]; then msg_error "No srcpkgs/*/template files found. Wrong working directory?" exit 1 fi percent=-1 for template in ${templates[@]}; do pkg=${template#*/} pkg=${pkg%/*} if [ ! -L "srcpkgs/$pkg" ]; then checksum="$(grep -Ehrow [0-9a-f]{$HASHLEN} ${template}|sort|uniq|tr '\n' ' ')" read -a _my_hashes <<< ${checksum} i=0 while [ -n "${_my_hashes[$i]}" ]; do hash="${_my_hashes[$i]}" [ -z "${my_hashes[$hash]}" ] && my_hashes[$hash]=$template i=$((i + 1)) done fi cur=$((cur + 1)) pnew=$((100 * cur / max)) if [ $pnew -ne $percent ]; then percent=$pnew printf "\rScanning templates : %3d%% (%d/%d)" $percent $cur $max fi done echo echo "Number of hashes : ${#my_hashes[@]}" # # Collect inodes of all distfiles in $XBPS_SRCDISTDIR # declare -A inodes distfiles=($XBPS_SRCDISTDIR/*/*) max=${#distfiles[@]} if [ -z "$max" ]; then msg_error "No distfiles files found in '$XBPS_SRCDISTDIR'" exit 1 fi cur=0 percent=-1 for distfile in ${distfiles[@]}; do inode=$(stat "$distfile" --printf "%i") if [ -z "${inodes[$inode]}" ]; then inodes[$inode]="$distfile" else inodes[$inode]+="|$distfile" fi cur=$((cur + 1)) pnew=$((100 * cur / max)) if [ $pnew -ne $percent ]; then percent=$pnew printf "\rCollecting inodes : %3d%% (%d/%d)" $percent $cur $max fi done echo hashes=($XBPS_SRCDISTDIR/by_sha256/*) for file in ${hashes[@]}; do hash_distfile=${file##*/} hash=${hash_distfile:0:$HASHLEN} [ -n "${my_hashes[$hash]}" ] && continue inode=$(stat "$file" --printf "%i") echo "Obsolete $hash (inode: $inode)" ( IFS="|"; for f in ${inodes[$inode]}; do rm -vf "$f"; rmdir "${f%/*}" 2>/dev/null; done ) done echo "Done." }