[PATCH] mk/git-package.mk (Re: migrate to git for emacs-current (24.0.50) ?

Makoto Fujiwara <[email protected]>
Newsgroups gmane.os.netbsd.devel.pkgsrc.wip.general
Message-ID <yfmvd9t3dy8.wl%[email protected]>
  I have experimental patch for adding cache capability for
git-package.mk.  This is reminded by emacs-current conversion
to git as attached mail.  The code is derived from
cvs-package.mk.

I believe git-package.mk is used by following 4 now.
  cinelerra-cv
  darcs-to-git
  pan2-git
  xf86-video-nv-current
darcs-to-git does not support x86_64, so it is not confirmed yet.
Others should be OK with this patch (pan2-git needs to add one line).

| From: Makoto Fujiwara <[email protected]>
| Subject: migrate to git for emacs-current (24.0.50) ?
| Date: Tue, 08 Jun 2010 01:32:59 +0900

MEF> It doesn't seems to me the cvs repository which wip/emacs-current 
MEF> downloads from, is being updated.

MEF> Shall I convert its cvs to git repository ?

MEF> It may download huge directory and takes time. But I
MEF> don't think there is another way to go :-)

MEF> ------
MEF> modena@makoto 01:24:24/100608(..wip/emacs-current)% du -sk  work/emacs/.git
MEF> 284066  work/emacs/.git
MEF> ------
---
Makoto Fujiwara, 
Chiba, Japan, Narita Airport and Disneyland prefecture.

Index: mk/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
--- mk/git-package.mk	3 Mar 2010 05:06:26 -0000	1.2
+++ mk/git-package.mk	8 Jun 2010 12:19:56 -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,21 +63,83 @@
 
 _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} ;     \
+        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
 
 .PHONY: do-git-extract
 do-git-extract:
 .for _repo_ in ${GIT_REPOSITORIES}
-	${_PKG_SILENT}${_PKG_DEBUG}set -e;				\
+	${_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";				\
+	  fi								\
+	else								\
+	  touch ${_GIT_NEED_CLONE};					\
+        fi;                                                             \
+	if [ -r ${_GIT_NEED_CLONE} ]; then				\
+        ${STEP_MSG} "(3a) git clone from "${GIT_MODULE.${_repo_}:Q}"." ; \
 		${_GIT_CMD} clone					\
 			${_GIT_FLAGS}		 			\
-			${GIT_REPO.${_repo_}:Q}
+			${GIT_REPO.${_repo_}:Q};			\
+	else								\
+	${STEP_MSG} "(3b) git checkout from "${GIT_MODULE.${_repo_}:Q} "." ; \
+		(cd ${GIT_MODULE};${_GIT_CMD} checkout -q -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}						\

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.