--- epatch.eclass.orig 2017-10-16 04:04:23.039920786 +0000 +++ epatch.eclass 2017-10-16 03:49:12.049931705 +0000 @@ -423,23 +423,37 @@ # don't clobber any EPATCH vars that the parent might want local EPATCH_SOURCE check for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}{,:${SLOT%/*}}; do - EPATCH_SOURCE=${EPATCH_USER_SOURCE}/${CTARGET}/${check} - [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${EPATCH_USER_SOURCE}/${CHOST}/${check} - [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${EPATCH_USER_SOURCE}/${check} - if [[ -d ${EPATCH_SOURCE} ]] ; then - local old_n_applied_patches=${EPATCH_N_APPLIED_PATCHES:-0} - EPATCH_SOURCE=${EPATCH_SOURCE} \ - EPATCH_SUFFIX="patch" \ - EPATCH_FORCE="yes" \ - EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \ - epatch - echo "${EPATCH_SOURCE}" > "${applied}" - if [[ ${old_n_applied_patches} -lt ${EPATCH_N_APPLIED_PATCHES} ]]; then - has epatch_user_death_notice ${EBUILD_DEATH_HOOKS} || \ - EBUILD_DEATH_HOOKS+=" epatch_user_death_notice" + set -- \ + ${EPATCH_USER_SOURCE}/${CTARGET}/${check} \ + ${EPATCH_USER_SOURCE}/${CHOST}/${check} \ + ${EPATCH_USER_SOURCE}/${check} + while true; do + EPATCH_SOURCE=$1 + if [[ -d ${EPATCH_SOURCE} || -L ${EPATCH_SOURCE} ]] \ + && [[ ! -r ${EPATCH_SOURCE} ]]; then + die "Unable to open user patch directory '${EPATCH_SOURCE}'; permission denied" fi - return 0 + if [[ -d ${EPATCH_SOURCE} ]]; then + # viable patch directory found + break + fi + if ! shift || [[ $# -eq 0 ]]; then + # no viable patch directories found; proceed to next 'check' + continue 2 + fi + done + local old_n_applied_patches=${EPATCH_N_APPLIED_PATCHES:-0} + EPATCH_SOURCE=${EPATCH_SOURCE} \ + EPATCH_SUFFIX="patch" \ + EPATCH_FORCE="yes" \ + EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \ + epatch + echo "${EPATCH_SOURCE}" > "${applied}" + if [[ ${old_n_applied_patches} -lt ${EPATCH_N_APPLIED_PATCHES} ]]; then + has epatch_user_death_notice ${EBUILD_DEATH_HOOKS} || \ + EBUILD_DEATH_HOOKS+=" epatch_user_death_notice" fi + return 0 done echo "none" > "${applied}" return 1