added 1 changeset to branch 'refs/remotes/HaikuPM-github/package-management' old head: ce4f36769285c1c491491dac6a909c76b7d761ad new head: a1e681690c19a50d6c61e6c8bd98d6af4be146d4 overview: https://github.com/haiku/HaikuPM/compare/ce4f367...a1e6816 ---------------------------------------------------------------------------- a1e6816: Rework rule CopySetHaikuRevision * Remove support for VCSs other than git. * Make the haiku-revision file a regular build target and make sure it is built only once. * Make determine_haiku_revision an actual shell script and simplify it a bit. [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- Commit: a1e681690c19a50d6c61e6c8bd98d6af4be146d4 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Mon Aug 26 14:38:50 2013 UTC ---------------------------------------------------------------------------- 2 files changed, 75 insertions(+), 82 deletions(-) build/jam/FileRules | 54 +++++++++------ build/scripts/determine_haiku_revision | 103 ++++++++++++----------------- ---------------------------------------------------------------------------- diff --git a/build/jam/FileRules b/build/jam/FileRules index 0285d30..85dd45c 100644 --- a/build/jam/FileRules +++ b/build/jam/FileRules @@ -328,51 +328,63 @@ rule ObjectReferences } } + rule CopySetHaikuRevision target : source { # CopySetHaikuRevision <target> : <source> # - # Copy <source> to <target>, writing the SVN revision of the working root + # Copy <source> to <target>, writing the Git revision of the working # directory into the haiku revision section of <target>. # # <target> - Output file target. Gristed and located target. # <source> - ELF object to be copied. Gristed and located target. - # If existent, make the target depend on the .svn/entries file in the + # If existing, make the target depend on the .git/index file in the # root directory, so it gets updated when the revision changes due to - # "svn up". - if [ Glob [ FDirName $(HAIKU_TOP) .svn ] : entries ] { - local svnEntries = <haiku-rootdir-svn>entries ; - SEARCH on $(svnEntries) = [ FDirName $(HAIKU_TOP) .svn ] ; - Depends $(target) : $(svnEntries) ; - } else if [ Glob [ FDirName $(HAIKU_TOP) .git ] : index ] { - local gitIndex = <haiku-rootdir-git>index ; - SEARCH on $(gitIndex) = [ FDirName $(HAIKU_TOP) .git ] ; - Depends $(target) : $(gitIndex) ; - } else if [ Glob [ FDirName $(HAIKU_TOP) .hg ] : store ] { - local hgStore = <haiku-rootdir-hg>store ; - SEARCH on $(hgStore) = [ FDirName $(HAIKU_TOP) .hg ] ; - Depends $(target) : $(hgStore) ; + # commits or merges. + local gitIndex = <haiku-rootdir-git>index ; + local revisionFile = <haiku-rootdir-git>haiku-revision ; + if ! [ on $(gitIndex) return $(HAIKU_GIT_REVISION_DETERMINED) ] { + if [ Glob [ FDirName $(HAIKU_TOP) .git ] : index ] { + HAIKU_GIT_REVISION_DETERMINED on $(gitIndex) = 1 ; + SEARCH on $(gitIndex) = [ FDirName $(HAIKU_TOP) .git ] ; + MakeLocate $(revisionFile) : $(HAIKU_BUILD_OUTPUT_DIR) ; + Depends $(revisionFile) : $(gitIndex) ; + DetermineHaikuRevision $(revisionFile) : $(gitIndex) ; + } else { + revisionFile = ; + } } PropagateContainerUpdateTargetFlags $(target) : $(source) ; - Depends $(target) : <build>copyattr <build>set_haiku_revision $(source) ; + Depends $(target) + : <build>copyattr <build>set_haiku_revision $(source) $(revisionFile) ; CopySetHaikuRevision1 $(target) - : <build>copyattr <build>set_haiku_revision $(source) ; + : <build>copyattr <build>set_haiku_revision $(source) $(revisionFile) ; } + actions CopySetHaikuRevision1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) - . $(HAIKU_TOP)/build/scripts/determine_haiku_revision - determineHaikuRevision $(HAIKU_TOP) $(HAIKU_BUILD_OUTPUT_DIR) + $(2[1]) --data $(2[3]) $(1) || exit 1 + + revision=0 + if [ -n "$(2[4]:E=)" ]; then + revision="`cat $(2[4]:E=)`" + fi + $(2[2]) $(1) "$revision" +} + - $(2[1]) --data $(2[3]) $(1) && - $(2[2]) $(1) ${revision} +actions DetermineHaikuRevision +{ + $(HAIKU_TOP)/build/scripts/determine_haiku_revision $(HAIKU_TOP) $(1) } + rule DataFileToSourceFile sourceFile : dataFile : dataVariable : sizeVariable { sourceFile = [ FGristFiles $(sourceFile) ] ; diff --git a/build/scripts/determine_haiku_revision b/build/scripts/determine_haiku_revision old mode 100644 new mode 100755 index 012c090..465180a --- a/build/scripts/determine_haiku_revision +++ b/build/scripts/determine_haiku_revision @@ -1,70 +1,51 @@ #!/bin/sh -determineGitRevision() -{ - haikuTop=$1 - haikuBuildOutputDir=$2 +haikuTop=$1 +revisionFile=$2 +haikuBuildOutputDir=`dirname $revisionFile` +lastBuiltRevisionFile=${haikuBuildOutputDir}/last-built-revision - revision=`cat ${haikuBuildOutputDir}/haiku-revision 2>/dev/null` - lastBuiltRevision=`cat ${haikuBuildOutputDir}/last-built-revision \ - 2>/dev/null` - localRev=`git rev-parse HEAD` - - # only determine the haiku-revision if anything has changed from - # last build - if [ -z "$revision" -o "$lastBuiltRevision" != "$localRev" ]; then - # the revision we use is the description of HEAD with respect to the - # last reachable hrev-(haiku-revision-)tag - revision=`git describe --dirty --tags --match=hrev*` - if [ -z "$revision" ]; then - # failed to find any hrev tags, use short hash instead - revision=`git rev-parse --short HEAD` - elif echo "$revision" | grep -- '-' >/dev/null; then - # HEAD is not directly a changeset from Haiku's central repo, so we - # add the current branch name as additional info - branchName=`git branch | grep '*' | cut -b 3-` - revision="$revision [$branchName]" - fi - echo $localRev >${haikuBuildOutputDir}/last-built-revision - fi -} +case `uname` in +Darwin) + SED=gsed + ;; +*) + SED=sed + ;; +esac +export SED +revision=`cat ${revisionFile} 2>/dev/null` +lastBuiltRevision=`cat $lastBuiltRevisionFile 2>/dev/null` -determineHaikuRevision() -{ - haikuTop=$1 - haikuBuildOutputDir=$2 +originalDir=`pwd` +cd ${haikuTop} +export LC_ALL=C - case `uname` in - Darwin) - SED=gsed - ;; - *) - SED=sed - ;; - esac - export SED +localRev=`git rev-parse HEAD` - originalDir=`pwd` - cd ${haikuTop} - 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 - determineGitRevision $haikuTop $haikuBuildOutputDir - elif [ -d .hg ]; then - # Try searching hg log for last svn commit - # Extract from "(svn r12345) ..." line - revision=`(cd ${haikuTop} && - hg log --no-merges --template "{desc|firstline}\n") 2> /dev/null | - grep --max-count=1 "(svn r" | - $SED -n -e 's,(svn r\(.*\)).*,\1,p'` - fi +# only determine the haiku-revision if anything has changed from +# last build +if [ -z "$revision" -o "$lastBuiltRevision" != "$localRev" ]; then + # the revision we use is the description of HEAD with respect to the + # last reachable hrev-(haiku-revision-)tag + revision=`git describe --dirty --tags --match=hrev*` if [ -z "$revision" ]; then - revision=0 + # failed to find any hrev tags, use short hash instead + revision=`git rev-parse --short HEAD` + elif echo "$revision" | grep -- '-' >/dev/null; then + # HEAD is not directly a changeset from Haiku's central repo, so we + # add the current branch name as additional info + branchName=`git branch | grep '*' | cut -b 3-` + revision="$revision [$branchName]" fi - echo $revision >${haikuBuildOutputDir}/haiku-revision - cd $originalDir -} +fi + +cd $originalDir + +if [ -z "$revision" ]; then + revision=0 +fi + +echo $localRev >${lastBuiltRevisionFile} +echo $revision >${revisionFile}