Author: zooey Date: 2011-05-13 22:38:02 +0200 (Fri, 13 May 2011) New Revision: 41478 Changeset: https://dev.haiku-os.org/changeset/41478 Modified: haiku/trunk/build/jam/FileRules Log: * add support for generating a useful haiku-revision from a git repository Modified: haiku/trunk/build/jam/FileRules =================================================================== --- haiku/trunk/build/jam/FileRules 2011-05-13 18:33:51 UTC (rev 41477) +++ haiku/trunk/build/jam/FileRules 2011-05-13 20:38:02 UTC (rev 41478) @@ -334,21 +334,56 @@ actions CopySetHaikuRevision1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) - # Try svn or git-svn - # Extract from "Revision: 12345" line - revision=`(LC_ALL=C LANG=C svn info $(HAIKU_TOP) || - (cd $(HAIKU_TOP) && [ -d .git/svn ] && LC_ALL=C LANG=C git svn info)) 2> /dev/null | - grep Revision | awk '{printf $2}'` - if [ "$revision" = 0 -o "$revision" = "" ]; then - # git-svn not present or not configured for this repository - # Try searching git logs for last git-svn commit - # Extract from " git-svn-id: .../haiku/trunk@12345 ..." line - revision=`cd $(HAIKU_TOP) && - git log --max-count=1 --grep="git-svn-id:" 2> /dev/null | - grep "git-svn-id:" | cut -d '@' -f 2 | - awk '{printf $1}'` - fi - if [ "$revision" = 0 -o "$revision" = "" ]; then + + originalDir=`pwd` + cd $(HAIKU_TOP) + export LC_ALL=C + if [ -d .svn ]; then + revision=`svn info 2>/dev/null | grep Revision | awk '{printf $2}'` + elif [ -d .git/svn ]; then + revision=`git svn info 2>/dev/null | grep Revision | awk '{printf $2}'` + elif [ -d .git ]; then + revision=`cat $(HAIKU_BUILD_OUTPUT_DIR)/haiku-revision 2>/dev/null` + lastBuiltRevision=`cat $(HAIKU_BUILD_OUTPUT_DIR)/last-built-revision \ + 2>/dev/null` + localRev=`git rev-list -n1 HEAD` + + # only determine the haiku-revision if anything has changed from + # last build + if [ -z "$revision" -o "$lastBuiltRevision" != "$localRev" ]; then + currentBranch=`git branch --contains HEAD | awk '{printf $2}'` + haikuTip=`git rev-list -n1 haiku/${currentBranch}.tip` + + # make sure that haiku-tip matches the remote tracking branch, + # otherwise the tag hasn't been fetched/updated and we should + # print a warning + trackingBranch=`git branch -r --contains $haikuTip \ + | grep -v -- '->' | tr -d ' '` + haikuTipLag=`git rev-list --count ${haikuTip}..$trackingBranch` + if [ "$haikuTipLag" != "0" ]; then + echo "*********************************************************" + echo "!!! haiku/${currentBranch}.tip is $haikuTipLag behind \ + remote tracking branch" + echo "!!! you may want to 'git fetch --tags' to update the tag" + echo "*********************************************************" + fi + + # the haiku revision the HEAD is based on is the nearest common ancestor + # of these two (i.e. the merge base) + haikuBaseRev=`git merge-base $localRev $haikuTip` + + # the revision we use is the description of HEAD with + # respect to the root of the current branch + revision=`git describe --dirty --long --match=haiku/$currentBranch` + if [ "$localRev" != "$haikuBaseRev" ]; then + # HEAD is not a changeset from Haiku's central repo, so we add + # a description of the changeset in Haiku's repo HEAD is based on + haikuBaseRevDescr=`git describe --long --match=haiku/$currentBranch $haikuBaseRev` + revision="$revision [$haikuBaseRevDescr]" + fi + echo $localRev >$(HAIKU_BUILD_OUTPUT_DIR)/last-built-revision + fi + elif [ -d .hg ]; then # Try searching hg log for last svn commit # Extract from "(svn r12345) ..." line revision=`(cd $(HAIKU_TOP) && @@ -359,6 +394,8 @@ if [ "$revision" = "" ]; then revision=0 fi + echo $revision >$(HAIKU_BUILD_OUTPUT_DIR)/haiku-revision + cd $originalDir $(2[1]) --data $(2[3]) $(1) && $(2[2]) $(1) ${revision} }