diff --git a/pkgtool.sh b/pkgtool.sh index 1b4da52..950595e 100755 --- a/pkgtool.sh +++ b/pkgtool.sh @@ -79,7 +79,8 @@ pkgtoolp_mirror() { pkgtoolp_mirror_fetch() { local _mirror_dname="${1}" _mirror_dname_git="${2}" _pkg_name="${3}" _pkg_name_real="${4}"\ - _fname="" _pkg_disabled=0 _pkg_fname="" _pkg_sha256sum="" _pkg_url="" _rc=0; + _fname="" _pkg_disabled=0 _pkg_fname="" _pkg_sha256sum="" _pkg_url="" _pkg_urls_git=""\ + _rc=0; if _pkg_disabled="$(rtl_get_var_unsafe -u "PKG_${_pkg_name_real}_DISABLED")"\ && [ "${_pkg_disabled:-0}" -eq 1 ]; then @@ -103,35 +104,34 @@ pkgtoolp_mirror_fetch() { || ! rtl_fetch_url_wget "${_pkg_url}" "${_pkg_sha256sum}" "${_mirror_dname}/${_pkg_name}" "${_pkg_fname}" "${_pkg_name_real}" ""; then _rc=1; rtl_log_msg warning "Failed to mirror package \`%s', skipping." "${_pkg_name}"; else - for _fname in $(find \ - "${_mirror_dname}/${_pkg_name}" \ - -type f \ - -not -name "${_pkg_fname}" \ - -not -name "${_pkg_fname}.fetched"); do - rtl_log_msg notice "Deleting redundant file \`%s' for package \`%s'." "${_fname}" "${_pkg_name}"; - rtl_fileop rm "${_fname}"; - done; + pkg_fetch_download_clean_dlcache "${_mirror_dname}" "${_pkg_name}" "${_pkg_fname}" "${_pkg_urls_git}"; fi; fi; - elif _pkg_url="$(rtl_get_var_unsafe -u "PKG_${_pkg_name_real}_URLS_GIT")"; then + fi; + if _pkg_urls_git="$(rtl_get_var_unsafe -u "PKG_${_pkg_name_real}_URLS_GIT")"; then if [ -z "${_mirror_dname_git}" ]; then _rc=0; rtl_log_msg notice "Git URL(s) mirroring disabled, skipping \`%s'." "${_pkg_name}"; elif [ "$(rtl_get_var_unsafe -u "PKG_${_pkg_name_real}_MIRRORS_GIT")" = "skip" ]; then _rc=0; rtl_log_msg notice "Package \`%s' specifies to skip Git URL(s) mirroring, skipping." "${_pkg_name}"; elif [ "${_pkg_name}" != "${_pkg_name_real}" ]; then - rtl_log_msg info "Mirroring package \`%s' (parent package: \`%s'), Git URL(s): \`%s'..." "${_pkg_name}" "${_pkg_name_real}" "${_pkg_url}"; + rtl_log_msg info "Mirroring package \`%s' (parent package: \`%s'), Git URL(s): \`%s'..." "${_pkg_name}" "${_pkg_name_real}" "${_pkg_urls_git}"; if ! rtl_fileop ln_symbolic "${_pkg_name_real}" "${_mirror_dname_git}/${_pkg_name}"; then _rc=1; rtl_log_msg warning "Failed to create symbolic link \`%s' for package \`%s' w/ parent package \`%s'."\ "${_mirror_dname_git}/${_pkg_name}" "${_pkg_name}" "${_pkg_name_real}"; fi; else - rtl_log_msg info "Mirroring package \`%s', Git URL(s): \`%s'..." "${_pkg_name}" "${_pkg_url}"; + rtl_log_msg info "Mirroring package \`%s', Git URL(s): \`%s'..." "${_pkg_name}" "${_pkg_urls_git}"; if ! rtl_fileop mkdir "${_mirror_dname_git}/${_pkg_name}"\ - || ! rtl_fetch_mirror_urls_git "${DEFAULT_GIT_ARGS}" "${_mirror_dname_git}/${_pkg_name}" ${_pkg_url}; then + || ! rtl_fetch_mirror_urls_git "${DEFAULT_GIT_ARGS}" "${_mirror_dname_git}/${_pkg_name}" ${_pkg_urls_git}; then _rc=1; rtl_log_msg warning "Failed to mirror package \`%s', skipping." "${_pkg_name}"; + else + pkg_fetch_download_clean_dlcache "${_mirror_dname_git}" "${_pkg_name}" "${_pkg_fname}" "${_pkg_urls_git}"; fi; fi; - else + fi; + if [ -z "${_pkg_url}" ]\ + && [ -z "${_pkg_sha256sum}" ]\ + && [ -z "${_pkg_urls_git}" ]; then _rc=0; rtl_log_msg notice "Package \`%s' has neither archive nor Git URL(s), skipping." "${_pkg_name}"; fi; fi; return "${_rc}"; diff --git a/subr.rtl/rtl_fetch.subr b/subr.rtl/rtl_fetch.subr index 1b230b9..f5410e3 100644 --- a/subr.rtl/rtl_fetch.subr +++ b/subr.rtl/rtl_fetch.subr @@ -6,8 +6,12 @@ rtl_fetch_mirror_urls_git() { local _git_args="${1}" _tgtdir="${2}" _rc=0 _repo_dname="" _subdir="" _url="" _url_spec=""; shift 2; for _url_spec in "${@}"; do - _subdir="${_url_spec%=*}"; _url="${_url_spec#*=}"; _url="${_url%@*}"; + _subdir="${_url_spec%=*}"; _subdir="${_subdir##*/}"; _url="${_url_spec#*=}"; _url="${_url%@*}"; _repo_dname="${_url##*/}"; [ "${_repo_dname%.git}" = "${_repo_dname}" ] && _repo_dname="${_repo_dname}.git"; + + if [ ! -e "$(rtl_dirname "${_tgtdir}")" ]; then + rtl_fileop mkdir "$(rtl_dirname "${_tgtdir}")"; + fi; (set -o errexit -o noglob -o nounset; rtl_flock_acquire 4 || exit "${?}"; trap "rm -f \"${_tgtdir}/.fetching\"" EXIT; @@ -23,22 +27,23 @@ rtl_fetch_mirror_urls_git() { rtlp_fetch_url_git() { local _cache_dname="${1}" _git_args="${2}" _git_branch="${3}" _mirrors="${4}" _pkg_name="${5}"\ - _subdir="${6}" _tgtdir="${7}" _url="${8}" _clonefl=0 _oldpwd="" _url_base=""; + _subdir="${6}" _tgtdir="${7}" _url="${8}" _cache_dname_full="" _clonefl=0 _oldpwd="" _url_base=""; + _cache_dname_full="${_cache_dname}/${_subdir##*/}"; (set -o errexit -o noglob -o nounset; rtl_flock_acquire 4 || exit "${?}"; - trap "rm -f \"${_cache_dname}/${_subdir%%[/]}.fetching\"" EXIT; - if [ -e "${_cache_dname}/${_subdir}" ]; then - (rtl_fileop cd "${_cache_dname}/${_subdir}" &&\ + trap "rm -f \"${_cache_dname_full%%[/]}.fetching\"" EXIT; + if [ -e "${_cache_dname_full}" ]; then + (rtl_fileop cd "${_cache_dname_full}" &&\ git pull ${_git_args} origin "${_git_branch:-main}") || return 1; - (rtl_fileop cd "${_cache_dname}/${_subdir}" &&\ + (rtl_fileop cd "${_cache_dname_full}" &&\ git submodule update) || return 1; - else if git clone ${_git_args} -b "${_git_branch:-main}" "${_url}" "${_cache_dname}/${_subdir}"; then + else if git clone ${_git_args} -b "${_git_branch:-main}" "${_url}" "${_cache_dname_full}"; then _clonefl=1; elif [ "${_mirrors}" = "skip" ]; then return 1; else for _url_base in ${_mirrors}; do - if git clone ${_git_args} -b "${_git_branch:-main}" "${_url_base}/${_pkg_name}/${_url##*/}" "${_cache_dname}/${_subdir}"; then + if git clone ${_git_args} -b "${_git_branch:-main}" "${_url_base}/${_pkg_name}/${_url##*/}" "${_cache_dname_full}"; then _clonefl=1; break; fi; done; @@ -46,19 +51,22 @@ rtlp_fetch_url_git() { if [ "${_clonefl}" -eq 0 ]; then return 1; else if [ -n "${_git_branch}" ]; then - (rtl_fileop cd "${_cache_dname}/${_subdir}" &&\ + (rtl_fileop cd "${_cache_dname_full}" &&\ git checkout "${_git_branch}") || return 1; fi; - (rtl_fileop cd "${_cache_dname}/${_subdir}" &&\ + (rtl_fileop cd "${_cache_dname_full}" &&\ git submodule update --init) || return 1; fi; fi; if [ "${_cache_dname}" != "${_tgtdir}" ]; then _oldpwd="${PWD}"; rtl_fileop cd "${_tgtdir}" || return 1; rtl_fileop rm "${_tgtdir}/${_subdir}" || return 1; - rtl_fileop cp "${_cache_dname}/${_subdir}" "${_tgtdir}" || return 1; + if [ ! -e "$(rtl_dirname "${_tgtdir}/${_subdir}")" ]; then + rtl_fileop mkdir "$(rtl_dirname "${_tgtdir}/${_subdir}")"; + fi; + rtl_fileop cp "${_cache_dname_full}" "${_tgtdir}/${_subdir}" || return 1; rtl_fileop cd "${_oldpwd}" || return 1; - fi) 4<>"${_cache_dname}/${_subdir%%[/]}.fetching"; + fi) 4<>"${_cache_dname_full%%[/]}.fetching"; if [ "${?}" -eq 0 ]; then cd "$(pwd)"; diff --git a/subr/ex_pkg_env.subr b/subr/ex_pkg_env.subr index ff2338e..ebfb8f4 100644 --- a/subr/ex_pkg_env.subr +++ b/subr/ex_pkg_env.subr @@ -24,7 +24,10 @@ exp_pkg_env_defaults() { : ${PKG_FNAME:="${PKG_URL##*/}"}; fi; if [ -z "${PKG_SUBDIR:-}" ]; then - if [ -n "${PKG_URLS_GIT:-}" ]; then + if [ -n "${PKG_URLS_GIT:-}" ]\ + && [ -n "${PKG_FNAME:-}" ]; then + rtl_log_msg fatalexit "Error: \${PKG_SUBDIR} must be specified given both \${PKG_FNAME} and \${PKG_URLS_GIT}."; + elif [ -n "${PKG_URLS_GIT:-}" ]; then PKG_SUBDIR="${PKG_URLS_GIT%%=*}"; else case "${PKG_FNAME:-}" in *.t*) PKG_SUBDIR="${PKG_FNAME%%.t*}"; ;; diff --git a/subr/pkg_configure_patch.subr b/subr/pkg_configure_patch.subr index 6b4bcdd..b789a80 100644 --- a/subr/pkg_configure_patch.subr +++ b/subr/pkg_configure_patch.subr @@ -3,8 +3,15 @@ # pkg_configure_patch() { - local _patch_dir="${MIDIPIX_BUILD_PWD}/patches" _patch_fname="" \ + local _patch_cwd="" _patch_dir="${MIDIPIX_BUILD_PWD}/patches" _patch_fname=""\ _patches_done="" _pkg_name_full="${PKG_NAME}${PKG_VERSION:+-${PKG_VERSION}}"; + + if [ -n "${PKG_FNAME}" ]\ + && [ -n "${PKG_URLS_GIT}" ]; then + _patch_cwd="${PKG_BASE_DIR}"; + else + _patch_cwd="${PKG_BASE_DIR}/${PKG_SUBDIR}"; + fi; set +o noglob; for _patch_fname in \ "${_patch_dir}/${_pkg_name}/"*.patch \ @@ -13,7 +20,7 @@ pkg_configure_patch() { ${PKG_PATCHES_EXTRA:-}; do if [ -r "${_patch_fname}" ]\ && ! rtl_lmatch "${_patches_done}" "${_patch_fname}"; then - if ! patch -b -d "${PKG_BASE_DIR}/${PKG_SUBDIR}" -p1 < "${_patch_fname}"; then + if ! patch -b -d "${_patch_cwd}" -p1 < "${_patch_fname}"; then set -o noglob; return 1; else _patches_done="$(rtl_lconcat "${_patches_done}" "${_patch_fname}")"; diff --git a/subr/pkg_fetch_download.subr b/subr/pkg_fetch_download.subr index 188c7f7..2b94d72 100644 --- a/subr/pkg_fetch_download.subr +++ b/subr/pkg_fetch_download.subr @@ -2,6 +2,29 @@ # set +o errexit -o noglob -o nounset is assumed. # +pkg_fetch_download_clean_dlcache() { + local _dlcachedir="${1}" _pkg_name="${2}" _pkg_fname="${3}" _pkg_urls_git="${4}"\ + _fname="" _pkg_urls_git_dname=""; + + if [ -n "${_pkg_urls_git}" ]; then + _pkg_urls_git_dname="${_pkg_urls_git%%=*}"; + _pkg_urls_git_dname="${_pkg_urls_git_dname##*/}"; + fi; + for _fname in $(cd "${_dlcachedir}/${_pkg_name}" && find \ + -mindepth 1 \ + -not -name "${_pkg_fname}" \ + -not -name "${_pkg_fname}.fetched" \ + ${_pkg_urls_git_dname:+ \ + -not -path "./${_pkg_urls_git_dname}" \ + -not -path "./${_pkg_urls_git_dname}/*" \ + -not -path "./${_pkg_urls_git_dname}.git" \ + -not -path "./${_pkg_urls_git_dname}.git/*"}); do + _fname="${_dlcachedir}/${_pkg_name}/${_fname#./}" + rtl_log_msg notice "Deleting redundant file \`%s' for package \`%s'." "${_fname}" "${_pkg_name}"; + rtl_fileop rm "${_fname}"; + done; +}; + pkg_fetch_download_dlcache_subdir() { if [ -n "${PKG_INHERIT_FROM:-}" ]\ && ! [ -e "${BUILD_DLCACHEDIR}/${PKG_NAME}" ]\ @@ -17,8 +40,6 @@ pkg_fetch_download_dlcache_subdir() { }; pkg_fetch_download() { - local _fname=""; - if [ "${ARG_FETCH_FORCE:-}" != "offline" ]; then if [ -n "${PKG_URL:-}" ]; then if ! pkg_fetch_download_dlcache_subdir; then @@ -27,15 +48,6 @@ pkg_fetch_download() { "${PKG_URL}" "${PKG_SHA256SUM}" "${BUILD_DLCACHEDIR}/${PKG_NAME}"\ "${PKG_FNAME}" "${PKG_NAME}" "${PKG_MIRRORS:-}"; then return 1; - else - for _fname in $(find \ - "${BUILD_DLCACHEDIR}/${PKG_NAME}" \ - -type f \ - -not -name "${PKG_FNAME}" \ - -not -name "${PKG_FNAME}.fetched"); do - rtl_log_msg notice "Deleting redundant file \`%s' for package \`%s'." "${_fname}" "${PKG_NAME}"; - rtl_fileop rm "${_fname}"; - done; fi; fi; if [ -n "${PKG_URLS_GIT:-}" ]; then @@ -47,6 +59,7 @@ pkg_fetch_download() { return 1; fi; fi; + pkg_fetch_download_clean_dlcache "${BUILD_DLCACHEDIR}" "${PKG_NAME}" "${PKG_FNAME}" "${PKG_URLS_GIT}"; fi; };