From 0652a9ba6101a29082ef83da8a46d9b184205305 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Sun, 27 Jul 2014 09:40:06 +0100 Subject: [PATCH] Serious work on the buildall script (and project.clj) to capture a build signature in the MANIFEST.MF file; also, getting rid of dependency on collage. --- buildall.sh | 193 +++++++++++++++++++++++++++++------- project.clj | 14 ++- src/mw_engine/heightmap.clj | 14 +-- 3 files changed, 171 insertions(+), 50 deletions(-) diff --git a/buildall.sh b/buildall.sh index 4db243e..b6e2506 100755 --- a/buildall.sh +++ b/buildall.sh @@ -8,27 +8,123 @@ # Simon Broooke +email=`grep ${USER} /etc/passwd | awk -F\: '{print $5}' | awk -F\, '{print $4}'` +fullname=`grep ${USER} /etc/passwd | awk -F\: '{print $5}' | awk -F\, '{print $1}'` +webappsdir="/var/lib/tomcat7/webapps" release="" +trial="FALSE" -case $1 in - build) - # 'build' is the expected normal case. - ;; - release) - # release is branch a release and upversion to new label - release=$2; - if [ "${release}" = "" ] - then - echo "Release flagged, but no release tag supplied" 1>&2; - exit 1; - fi;; - *) - echo "Usage:" 1>&2; - echo " ${0} build Build all components and commit to master" 1>&2; - echo " ${0} release [LABEL] Build all components, branch for release on " 1>&2; - echo " old label, then upversion to new LABEL and commit to master" 1>&2; - exit 1;; -esac +# Builds the build signature properties in the manifest map file +# expected arguments: old version tag, version tag, full name of user, +# email of user; if not passed, all these will be set to "unset". +# The objective I'm trying to achieve is that when committed to version +# control, these are all always unset; but they're all valid in a build. +function setup-build-sig { + if [ "${1}" = "" ] + then + o="unset" + else + o="${1}" + fi + if [ "${2}" = "" ] + then + v="unset" + else + v="${2}" + fi + if [ "${3}" = "" ] + then + u="unset" + else + u="${3}" + fi + if [ "${4}" = "" ] + then + e="unset" + else + e="${4}" + fi + + if [ "${2}${3}${4}" = "" ] + then + t="unset" + else + t=`date --rfc-3339 seconds` + fi + + if [ ! -d "target" ] + then + mkdir "target" + fi + +cat <<-EOF > target/manifest.sed +s/${o}/${v}/g +s/^ *"build-signature-version" ".*" *\$/\t\t"build-signature-version" "${v}"/ +s/^ *"build-signature-user" ".*" *\$/\t\t"build-signature-user" "${u}"/ +s/^ *"build-signature-email" ".*" *\$/\t\t"build-signature-email" "${e}"/ +s/^ *"build-signature-timestamp" ".*" *\$/\t\t"build-signature-timestamp" "${t}"/ +EOF +} + +if [ $# -lt 1 ] +then + cat <<-EOF 1>&2 + Usage: + -build Build all components and commit to master. + -email [ADDRESS] Your email address, to be recorded in the build signature. + -fullname [NAME] Your full name, to be recorded in the build signature. + -release [LABEL] Build all components, branch for release on old label, then + upversion to new LABEL and commit to master. + -trial Trial build only, do not commit. + -webapps [PATH] Set the path to the local tomcat webapps directory +EOF + exit 1 +fi +while (( "$#" )) +do + case $1 in + -b|-build) + # 'build' is the expected normal case. + trial="FALSE"; + ;; + -e|-email) + shift; + email=$1;; + -f|-fullname) + shift; + fullname=$1;; + -r|-release) + # release is branch a release and upversion to new label + shift; + release=$1; + trial="FALSE"; + if [ "${release}" = "" ] + then + echo "Release flagged, but no release tag supplied" 1>&2; + exit 1; + fi;; + -t|-trial) + trial="TRUE";; + -w|-webapps) + # Set the tomcat webapps directory to release to + shift; + webappsdir=$1;; + *) + echo "Unrecognised option '${1}', exiting." 1>&2; + exit 1;; + esac + + shift +done + +echo "Trial: ${trial}; email: ${email}; fullname ${fullname}; release: ${release}; webapps: $webappsdir" + +ls mw-* > /dev/null 2>&1 +if [ $? -ne 0 ] +then + echo "No subdirectories matching 'mw-*' found, exiting." 1>&2; + exit 1; +fi for dir in mw-* do @@ -51,7 +147,8 @@ do exit 1; fi cat project.clj > project.bak.1 - sed "s/${old}/${interim}/" project.bak.1 > project.clj + setup-build-sig "${old}" "${interim}" "${fullname}" "${email}" + sed -f target/manifest.sed project.bak.1 > project.clj message="Upversioned from ${old} to ${interim} for release" old=${interim} fi @@ -67,7 +164,7 @@ do exit 1 fi - lein test + lein test if [ $? -ne 0 ] then echo "Sub-project ${dir} failed in test" 1>&2 @@ -77,21 +174,33 @@ do lein marg lein install - if [ "${message}" = "" ] + cat project.clj > project.bak.2 + setup-build-sig "${old}" + sed -f target/manifest.sed project.bak.2 > project.clj + + if [ "${trial}" = "FALSE" ] then - git commit -a - else - git commit -a -m "$message" + if [ "${message}" = "" ] + then + git commit -a + else + git commit -a -m "$message" + fi + git push origin master fi - git push origin master if [ "${release}" != "" ] then branch="${old}_MAINTENANCE" - git branch "${branch}" - # git push origin "${branch}" - cat project.clj > project.bak.2 - sed "s/${interim}/${release}-SNAPSHOT/" project.bak.2 > project.clj + if [ "${trial}" = "FALSE" ] + then + git branch "${branch}" + git push origin "${branch}" + fi + + cat project.clj > project.bak.3 + setup-build-sig "${old}" "${release}-SNAPSHOT" "${fullname}" "${email}" + sed -f target/manifest.sed project.bak.3 > project.clj message="Upversioned from ${interim} to ${release}-SNAPSHOT" echo $message @@ -105,19 +214,27 @@ do fi lein marg lein install - git commit -a -m "${message}" - echo ${message} - git push origin master + + cat project.clj > project.bak.4 + setup-build-sig "${release}-SNAPSHOT" + sed -f target/manifest.sed project.bak.4 > project.clj + + if [ "${trial}" = "FALSE" ] + then + git commit -a -m "${message}" + echo ${message} + git push origin master + fi fi - # Finally, if we're in the UI project, build the uberwar - and should probably deploy it - # to local Tomcat for test + # Finally, if we're in the UI project, build the uberwar - and should + # probably deploy it to local Tomcat for test if [ "${dir}" = "mw-ui" ] - then - lein ring uberwar + then + lein ring uberwar sudo cp target/microworld.war /var/lib/tomcat7/webapps echo "Deployed new WAR file to local Tomcat" - fi + fi popd done diff --git a/project.clj b/project.clj index a18131a..1f55623 100644 --- a/project.clj +++ b/project.clj @@ -1,11 +1,19 @@ (defproject mw-engine "0.1.2-SNAPSHOT" :description "Cellular automaton world builder." - :url "http://example.com/FIXME" + :url "http://www.journeyman.cc/microworld/" + :manifest { + ;; do not reformat this! It is important for the buildall script + ;; that each of these properties is on a line with nothing else. + "build-signature-version" "unset" + "build-signature-user" "unset" + "build-signature-email" "unset" + "build-signature-timestamp" "unset" + } + :license {:name "GNU General Public License v2" :url "http://www.gnu.org/licenses/gpl-2.0.html"} :plugins [[lein-marginalia "0.7.1"]] :dependencies [[org.clojure/clojure "1.5.1"] [org.clojure/math.combinatorics "0.0.7"] [org.clojure/tools.trace "0.7.8"] - [net.mikera/imagez "0.3.1"] - [fivetonine/collage "0.2.1"]]) + [net.mikera/imagez "0.3.1"]]) diff --git a/src/mw_engine/heightmap.clj b/src/mw_engine/heightmap.clj index 0d95753..98d540d 100644 --- a/src/mw_engine/heightmap.clj +++ b/src/mw_engine/heightmap.clj @@ -7,11 +7,8 @@ (:import [java.awt.image BufferedImage]) (:use mw-engine.utils mw-engine.world - ;; interestingly the imagez load-image is failing for me, while the - ;; collage version is problem free. - [mikera.image.core :only [filter-image get-pixels]] + [mikera.image.core :only [load-image filter-image get-pixels]] [mikera.image.filters] - [fivetonine.collage.util] )) (defn- abs @@ -42,7 +39,7 @@ [world] (map-world world tag-gradient)) -(defn transform-altitude +(defn tag-altitude "Set the altitude of this cell from the corresponding pixel of this heightmap. If the heightmap you supply is smaller than the world, this will break. @@ -52,7 +49,7 @@ * `heightmap` an (ideally) greyscale image, whose x and y dimensions should exceed those of the world of which the `cell` forms part." ([world cell heightmap] - (transform-altitude cell heightmap)) + (tag-altitude cell heightmap)) ([cell heightmap] (merge cell {:altitude @@ -73,14 +70,13 @@ a world the size of the heightmap will be created. * `imagepath` a file path or URL which indicates an image file." ([world imagepath] - ;; bizarrely, the collage load-util is working for me, but the imagez version isn't. (let [heightmap (filter-image (grayscale)(load-image imagepath))] (map-world - (map-world world transform-altitude (list heightmap)) + (map-world world tag-altitude (list heightmap)) tag-gradient))) ([imagepath] (let [heightmap (filter-image (grayscale)(load-image imagepath)) world (make-world (.getWidth heightmap) (.getHeight heightmap))] (map-world - (map-world world transform-altitude (list heightmap)) + (map-world world tag-altitude (list heightmap)) tag-gradient))))