From: Michael Tremer Date: Mon, 14 Dec 2009 18:31:14 +0000 (+0100) Subject: naoki: Add some caching functions to speed up meta data fetching. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e0769d0a0a3c4ba8ee7e4f953570f5d505adde5;p=ipfire-3.x.git naoki: Add some caching functions to speed up meta data fetching. --- diff --git a/tools/common-constants b/tools/common-constants index 9b8e98658..871a564d2 100644 --- a/tools/common-constants +++ b/tools/common-constants @@ -24,3 +24,6 @@ DIR_PACKAGES_TOOLCHAIN=${DIR_PACKAGES}_toolchain DIR_PATCHES=${DIR_CACHE}/patches DIR_PKGS=${BASEDIR}/pkgs DIR_TARBALLS=${DIR_CACHE}/tarballs + +PACKAGES_CACHE=${DIR_CACHE}/.naoki.packages +[ -e "${PACKAGES_CACHE}" ] || touch ${PACKAGES_CACHE} diff --git a/tools/common-package-functions b/tools/common-package-functions index 5bc707bfc..bc658e50e 100644 --- a/tools/common-package-functions +++ b/tools/common-package-functions @@ -154,16 +154,52 @@ function package_info() { fi } +function package_cache_update() { + local p=$(find_package ${1}) + + fingerprint=$(__package_cache_get "${p}" "FINGERPRINT") + if [ -n "${fingerprint}" ]; then + if [ "$(package_fingerprint ${p})" = "${fingerprint}" ]; then + return + fi + fi + + log DEBUG "Cache information of ${p} needs update." + + local line object data + + cat ${PACKAGES_CACHE} | grep -v "^${1}.${2}" > ${PACKAGES_CACHE} + + package_info ${p} | \ + while read line; do + object=${line%%=*} + data=${line##*=} + + __package_cache_set "${p}" "${object}" "$(tr -d '"' <<<${data})" + done + __package_cache_set "${p}" "FINGERPRINT" "$(package_fingerprint ${p})" +} + +function __package_cache_set() { + echo -e "${1}\t${2}\t${3}" >> ${PACKAGES_CACHE} +} + +function __package_cache_get() { + local output=$(grep -e "^${1}.${2}" ${PACKAGES_CACHE}) + echo "${output:$(( ${#1} + ${#2} + 2))}" +} + function package_get() { - local package=$(find_package ${1}) - local item=${2} + local p=$(find_package ${1}) + local object=${2} + + # Check if cache data is up2date + package_cache_update ${p} - package_info ${package} | \ - grep "^${item}" | \ - awk -F= '{ print $NF }' | \ - tr -d '"' + __package_cache_get "${p}" "${object}" } + function package_name() { package_get ${1} PKG_NAME } @@ -452,3 +488,9 @@ function package_download() { fi fi } + +function package_fingerprint() { + local p=$(find_package ${1}) + # time of modification in seconds since Epoch + stat --printf="%Y" ${DIR_PKGS}/${p}/${p##*/}.nm +}