diff --git a/eclass/git-r3.eclass b/eclass/git-r3.eclass index 99f846b237b41..cd017977c7ddb 100644 --- a/eclass/git-r3.eclass +++ b/eclass/git-r3.eclass @@ -343,6 +343,47 @@ _git-r3_get_object_format() { esac } +# @FUNCTION: _git-r3_create_gitdir +# @USAGE: +# @RETURN: 0 if successful or GIT_DIR exists already, 1 if ls-remote failed +# @INTERNAL +# @DESCRIPTION: +# Create GIT_DIR if necessary. +_git-r3_create_gitdir() { + local repo_uri=${1} + + [[ -d ${GIT_DIR} ]] && return 0 + + if [[ ! -d ${EGIT3_STORE_DIR} ]]; then + ( + addwrite / + mkdir -p "${EGIT3_STORE_DIR}" + ) || die "Unable to create ${EGIT3_STORE_DIR}" + fi + + # determine the remote object format + local head_ref + head_ref=( + $(git ls-remote "${repo_uri}" "HEAD") + ) + [[ ${?} -ne 0 ]] && return 1 + local object_format=$(_git-r3_get_object_format "${head_ref[0]}") + + addwrite "${EGIT3_STORE_DIR}" + local saved_umask + if [[ ${EVCS_UMASK} ]]; then + saved_umask=$(umask) + umask "${EVCS_UMASK}" || die "Bad options to umask: ${EVCS_UMASK}" + fi + mkdir "${GIT_DIR}" || die + + git init --object-format="${object_format}" --bare -b __init__ || die + if [[ ${saved_umask} ]]; then + umask "${saved_umask}" || die + fi + return 0 +} + # @FUNCTION: _git-r3_set_gitdir # @USAGE: # @INTERNAL @@ -387,43 +428,6 @@ _git-r3_set_gitdir() { : "${EGIT3_STORE_DIR:=${distdir}/git3-src}" GIT_DIR=${EGIT3_STORE_DIR}/${repo_name} - - EVCS_STORE_DIRS+=( "${GIT_DIR}" ) - - if [[ ! -d ${EGIT3_STORE_DIR} && ! ${EVCS_OFFLINE} ]]; then - ( - addwrite / - mkdir -p "${EGIT3_STORE_DIR}" - ) || die "Unable to create ${EGIT3_STORE_DIR}" - fi - - addwrite "${EGIT3_STORE_DIR}" - if [[ ! -d ${GIT_DIR} ]]; then - if [[ ${EVCS_OFFLINE} ]]; then - eerror "A clone of the following repository is required to proceed:" - eerror " ${1}" - eerror "However, networking activity has been disabled using EVCS_OFFLINE and there" - eerror "is no local clone available." - die "No local clone of ${1}. Unable to proceed with EVCS_OFFLINE." - fi - - local saved_umask - if [[ ${EVCS_UMASK} ]]; then - saved_umask=$(umask) - umask "${EVCS_UMASK}" || die "Bad options to umask: ${EVCS_UMASK}" - fi - mkdir "${GIT_DIR}" || die - - # determine the remote object format - local head_ref=( - $(git ls-remote "${repo_uri}" "HEAD" || die) - ) - local object_format=$(_git-r3_get_object_format "${head_ref[0]}") - git init --object-format="${object_format}" --bare -b __init__ || die - if [[ ${saved_umask} ]]; then - umask "${saved_umask}" || die - fi - fi } # @FUNCTION: _git-r3_set_submodules @@ -619,6 +623,14 @@ git-r3_fetch() { local -x GIT_DIR _git-r3_set_gitdir "${repos[0]}" + if [[ ! -d ${GIT_DIR} && ${EVCS_OFFLINE} ]]; then + eerror "A clone of the following repository is required to proceed:" + eerror " ${repos[0]}" + eerror "However, network activity has been disabled using EVCS_OFFLINE and there" + eerror "is no local clone available." + die "No local clone of ${repos[0]}. Unable to proceed with EVCS_OFFLINE." + fi + EVCS_STORE_DIRS+=( "${GIT_DIR}" ) einfo "Repository id: ${GIT_DIR##*/}" @@ -692,6 +704,7 @@ git-r3_fetch() { for r in "${repos[@]}"; do if [[ ! ${EVCS_OFFLINE} ]]; then einfo "Fetching ${r} ..." + _git-r3_create_gitdir "${r}" || continue local fetch_command=( git fetch "${r}" ) local clone_type=${EGIT_CLONE_TYPE}