| #!/bin/sh |
| |
| glob() { set +o noglob; echo ${@}; set -o noglob; }; |
| map() { local _ifs="${IFS}" _sep="${1}"; shift; IFS="${_sep}"; echo "${*}"; IFS="${_ifs}"; }; |
| rc() { echo "${@}"; "${@}"; }; |
| |
| rotate_build() { |
| local _build_dname="${1}" _hostname="${2}" _limit="${3}"; |
| local _dist_dates=""; |
| for _dist_fname in $(glob \ |
| ${_build_dname}/*.tar.* \ |
| ${_build_dname}/*.zip \ |
| ${_build_dname}/*.zip.*); do |
| if [ -e "${_dist_fname}" ]; then |
| _dist_date="${_dist_fname#*@${_hostname}-}"; |
| _dist_date="${_dist_date%.tar.*}"; |
| _dist_date="${_dist_date%.zip}"; |
| _dist_date="${_dist_date%.zip.*}"; |
| _dist_date="${_dist_date%-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]}"; |
| _dist_dates="${_dist_dates:+${_dist_dates} }${_dist_date}"; |
| fi; |
| done; |
| if [ -n "${_dist_dates}" ]; then |
| rotate_build_dates "${_build_dname}" "${_dist_dates}" "${_limit}"; |
| fi; |
| }; |
| |
| rotate_build_dates() { |
| local _build_dname="${1}" _dist_dates="${2}" _limit="${3}"; |
| local _dist_dates_count="" _dist_dates_count_limit="" _dist_fname="" _nl=" |
| "; _dist_dates="$(map "${_nl}" ${_dist_dates} | sort | uniq)"; |
| _dist_dates_count="$(echo "${_dist_dates}" | wc -l)"; |
| if [ "${_dist_dates_count}" -gt "${_limit}" ]; then |
| _dist_dates_count_limit=$((${_dist_dates_count}-${_limit})); |
| _dist_dates="$(echo "${_dist_dates}" |\ |
| sed -n "1,${_dist_dates_count_limit}p")"; |
| for _dist_date in ${_dist_dates}; do |
| for _dist_fname in $(glob \ |
| ${_build_dname}/*-${_dist_date}-*.tar.xz*); do |
| rc rm -f "${_dist_fname}"; |
| done; |
| done; |
| fi; |
| }; |
| |
| rotate_builds() { |
| local _build_dnames="${1}" _limit="${2}"; |
| local _hostname="$(hostname)"; |
| for _build_dname in ${_build_dnames}; do |
| rotate_build "${_build_dname}" "${_hostname}" "${_limit}"; |
| done; |
| }; |
| |
| set -o errexit -o noglob; |
| rotate_builds "${1}" "${2:-3}"; |
| |
| |