diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2013-06-08 17:13:03 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2013-06-18 17:23:23 +0200 |
commit | 3e5e19a2328dad13869502fadfcbe5c60ddc2e1f (patch) | |
tree | 37d21c1f11442f43fb413269d77fcf42eabea325 | |
parent | d2db00d4e82793b1da964efe1b89b9b2ead19dda (diff) | |
download | ptxdist-3e5e19a2328dad13869502fadfcbe5c60ddc2e1f.tar.gz ptxdist-3e5e19a2328dad13869502fadfcbe5c60ddc2e1f.tar.xz |
ptxd_make_get: support git urls
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r-- | scripts/lib/ptxd_make_get.sh | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/scripts/lib/ptxd_make_get.sh b/scripts/lib/ptxd_make_get.sh index 914b3d520..f8722a6b4 100644 --- a/scripts/lib/ptxd_make_get.sh +++ b/scripts/lib/ptxd_make_get.sh @@ -73,6 +73,74 @@ export -f ptxd_make_get_http # +# in env: +# +# ${path} : local file name +# ${url} : the url to download +# ${opts[]} : an array of options +# +ptxd_make_get_git() { + set -- "${opts[@]}" + unset opts + local tag + local mirror="${url#[a-z]*//}" + mirror="$(dirname "${path}")/${mirror//\//.}" + local prefix="$(basename "${path}")" + prefix="${prefix%.tar.*}/" + + case "${path}" in + *.tar.gz|*.tar.bz2|*.tar.xz|*.zip) + ;; + *) + ptxd_bailout "Only .tar.gz, .tar.bz2, .tar.xz and .zup archives are supported for git downloads." + ;; + esac + + # + # scan for valid options + # + while [ ${#} -ne 0 ]; do + local opt="${1}" + shift + + case "${opt}" in + tag=*) + tag="${opt#tag=}" + ;; + *) + ptxd_bailout "invalid option '${opt}' to ${FUNCNAME}" + ;; + esac + done + unset opt + + if [ -z "${tag}" ]; then + ptxd_bailout "git url '${url}' has no 'tag' option" + fi + + echo "${PROMPT}git: fetching '${url} into '${mirror}'..." + if [ ! -d "${mirror}" ]; then + git init --bare --shared "${mirror}" + else + git --git-dir="${mirror}" remote remove origin + fi + # overwrite everything so the git repository is in a defined state + git --git-dir="${mirror}" config transfer.fsckObjects true && + git --git-dir="${mirror}" config tar.tar.bz2.command "bzip2 -c" && + git --git-dir="${mirror}" config tar.tar.xz.command "xz -c" + git --git-dir="${mirror}" remote add origin "${url}" && + git --git-dir="${mirror}" fetch --progress -pf origin "+refs/*:refs/*" && + + if ! git --git-dir="${mirror}" rev-parse --verify -q "${tag}" > /dev/null; then + ptxd_bailout "git: tag '${tag}' not found in '${url}'" + fi && + + git --git-dir="${mirror}" archive --prefix="${prefix}" -o "${path}" "${tag}" +} +export -f ptxd_make_get_git + + +# # check if download is disabled # # in env: @@ -154,6 +222,18 @@ ptxd_make_get() { mrd=true fi ;; + git://*|http://*".git;"*|https://*".git;"*) + # restrict donwload only to the PTXMIRROR + if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then + # keep original URL + argv[${#argv[@]}]="${url}" + fi + # add mirror to URLs, but only once + if ! ${mrd}; then + ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" + mrd=true + fi + ;; http://*|https://*|ftp://*) # restrict donwload only to the PTXMIRROR if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then @@ -196,6 +276,10 @@ ptxd_make_get() { shift case "${url}" in + git://*|http://*.git|https://*.git) + ptxd_make_get_download_permitted && + ptxd_make_get_git && return + ;; http://*|https://*|ftp://*) ptxd_make_get_download_permitted && ptxd_make_get_http && return |