Index: git-package.mk =================================================================== RCS file: /cvsroot/pkgsrc-wip/wip/mk/git-package.mk,v retrieving revision 1.2 diff -u -r1.2 git-package.mk --- git-package.mk 3 Mar 2010 05:06:26 -0000 1.2 +++ git-package.mk 11 Jun 2010 14:49:54 -0000 @@ -24,11 +24,15 @@ BUILD_DEPENDS+= scmgit-base>=1.6.4:../../devel/scmgit-base +# switch either (from scratch) clone is necessary or (already cloned) checkout is enough +_GIT_NEED_CLONE= ${WRKDIR}/.need_clone + # # defaults for user-visible input variables # GIT_TAG?= tip +GIT_MODULE?= ${PKGBASE} DISTFILES?= # empty .if empty(GIT_TAG) || ${GIT_TAG} == "tip" @@ -37,6 +41,10 @@ PKGREVISION?= ${GIT_TAG} .endif +# +# Input validation +# + .if !defined(GIT_REPOSITORIES) PKG_FAIL_REASON+= "[git-package.mk] GIT_REPOSITORIES must be set." GIT_REPOSITORIES?= # none @@ -55,9 +63,49 @@ _GIT_CMD= git _GIT_ENV= # empty -_GIT_FLAGS= --quiet --depth 1 +_GIT_FLAGS?= --quiet --depth 1 _GIT_PKGVERSION_CMD= ${DATE} -u +'%Y.%m.%d' _GIT_PKGVERSION= ${_GIT_PKGVERSION_CMD:sh} +_GIT_DISTDIR= ${DISTDIR}/git-package + +_GIT_TODAY_CMD= ${DATE} -u +'%Y-%m-%d' +_GIT_TODAY= ${_GIT_TODAY_CMD:sh} + +.for _repo_ in ${GIT_REPOSITORIES} +GIT_MODULE.${_repo_}?= ${GIT_MODULE} #${_repo_} + +## # determine appropriate checkout date or tag +## . if defined(GIT_TAG.${repo}) +## _GIT_TAG_FLAG.${repo}= -r${GIT_TAG.${repo}} +## _GIT_TAG.${repo}= ${GIT_TAG.${repo}} +## . elif defined(GIT_TAG) +## _GIT_TAG_FLAG.${repo}= -r${GIT_TAG} +## _GIT_TAG.${repo}= ${GIT_TAG} +## . elif defined(CHECKOUT_DATE) +## _GIT_TAG_FLAG.${repo}= -D${CHECKOUT_DATE:Q} +## _GIT_TAG.${repo}= ${CHECKOUT_DATE:Q} +## . else +## _GIT_TAG_FLAG.${repo}= '-D${_GIT_TODAY} 00:00 +0000' +_GIT_TAG.${_repo_}= ${_GIT_TODAY:Q} +## . endif + +# Cache support: +# cache file name (compression is not really effective) +_GIT_DISTFILE.${_repo_}= ${PKGBASE}-${GIT_MODULE.${_repo_}}-${_GIT_TAG.${_repo_}}.tar + +# command to extract cache file +_GIT_EXTRACT_CACHED.${_repo_}= \ + if [ -f ${_GIT_DISTDIR}/${_GIT_DISTFILE.${_repo_}:Q} ]; then \ + ${STEP_MSG} "(1) Extracting cached GIT archive "${_GIT_DISTFILE.${_repo_}:Q}"."; \ + pax -r -f ${_GIT_DISTDIR}/${_GIT_DISTFILE.${_repo_}:Q} && rm -f ${_GIT_NEED_CLONE} ; \ + fi + +# create cache archive +_GIT_CREATE_CACHE.${_repo_}= \ + ${STEP_MSG} "(4) Creating cached GIT archive "${_GIT_DISTFILE.${_repo_}:Q} "on" ${_GIT_DISTDIR:Q}"."; \ + ${MKDIR} ${_GIT_DISTDIR:Q}; \ + pax -w -f ${_GIT_DISTDIR}/${_GIT_DISTFILE.${_repo_}:Q} */.git || rm -f ${_GIT_DISTDIR}/${_GIT_DISTFILE.${_repo_}:Q} +.endfor pre-extract: do-git-extract @@ -66,10 +114,34 @@ .for _repo_ in ${GIT_REPOSITORIES} ${_PKG_SILENT}${_PKG_DEBUG}set -e; \ cd ${WRKDIR}; \ - ${SETENV} ${_GIT_ENV} \ + if [ ! -d ${_GIT_DISTDIR} ]; then mkdir -p ${_GIT_DISTDIR:Q}; fi; \ + ${_GIT_EXTRACT_CACHED.${_repo_}}; \ + p="$$(cd ${_GIT_DISTDIR} && ls -t ${PKGBASE}-${GIT_MODULE.${_repo_}}-* | head -n 1)"; \ + if [ -n "$$p" ]; then \ + if [ "$$p" != ${_GIT_DISTFILE.${_repo_}:Q} ]; then \ + ${STEP_MSG} "(2) Extracting cached GIT archive \"""$$p\"."; \ + pax -r -f ${_GIT_DISTDIR:Q}/"$$p" && rm -f ${_GIT_NEED_CLONE};\ + fi \ + else \ + touch ${_GIT_NEED_CLONE}; \ + fi; \ + if [ -r ${_GIT_NEED_CLONE} ]; then \ + ${STEP_MSG} "(3a) git clone from "${GIT_MODULE.${_repo_}:Q}" with "${_GIT_FLAGS}"." ; \ ${_GIT_CMD} clone \ ${_GIT_FLAGS} \ - ${GIT_REPO.${_repo_}:Q} + ${GIT_REPO.${_repo_}:Q}; \ + else \ + ${STEP_MSG} "(3b) git pull origin master from "${GIT_MODULE.${_repo_}:Q} "." ; \ + (cd ${GIT_MODULE}; \ + ${_GIT_CMD} pull --quiet origin master && \ + ${_GIT_CMD} checkout --quiet -f master ; ) \ + fi; \ + if [ "$$p" != ${_GIT_DISTFILE.${_repo_}:Q} ] || [ -r ${_GIT_NEED_CLONE} ]; then \ + ${_GIT_CREATE_CACHE.${_repo_}}; \ + else \ + ${STEP_MSG} "(5) Skipping write cache, the same date or newly cloned";\ + fi .endfor .endif +# ${SETENV} ${_GIT_ENV} \