Hello,
I did some playing around with the ant build script and here is
what the interaction can look like:
user=> version
{:major 0, :minor 1, :rev 999, :java "1.6.0_07 Java HotSpot(TM)
Client VM", :system "i386 Linux 2.6.22-2-686", :tstamp "15-Aug-08
12:02 PM", :short-version user.fn__2139@1f10a67, :long-version
user.fn__2142@1e2161d}
user=> (version-str)
"Clojure 0.1 r999 "
user=> (version-long-str)
"Clojure 0.1 r999 (1.6.0_07 Java HotSpot(TM) Client VM: i386
Linux 2.6.22-2-686: 15-Aug-08 12:02 PM)"
user=>
I have also added the time stamp above which might be handy
once official jars start going out.
As Shawn suggested, the API can probably be refined further
but this seems ok for now.
Basically, I created a file version_base.clj with the "version"
function
and two tags: subversion_revision and clj_build_stamp.
[parth:~/src/clojure]% grep "@" version_base.clj
:rev (new Integer "@subversion_revision@")
:tstamp "@clj_build_tstamp@"
To build.xml I added a task "make_version". This task creates a new
file "version.clj" from "version_base.clj" after substituting the
above tags for the relevant values.
This seems like a clean solution to me as there are no hook
scripts and stuff but there is one constraint.
This currently works only with subversion checkouts as "make_version"
uses "svn info" to extract revision number.
I looked at the git-svn but it seems git-svn basically keeps
the local copy in git format so "svn info" doesn't work there.
I am not an ant expert, possibly someone familier enough with
ant can comment if we can conditionally have the task take the
rev number using "git" command in case of a git repo and using
svn info in case of svn checkout.
Rich, is there someting like a "official" version control system
and an "official" build system (ant or maven) for Clojure.
IMHO supporting specialized builds across multiple version
control systems and build systems may turn out to be a bit of
a pain.
Rich, for now, I am using this feature by simply loading
version.clj in my rc file and this works fine.
If you see value in this feature and based on your project
priorities it would be nice if this can go somewhere in
the Clojure core so that any clojure.jar contains
"version" relates commands. Thanks.
Diffs and version_base.clj below.
Parth
[parth:~/src/clojure]% svn diff build.xml
Index: build.xml
===================================================================
--- build.xml (revision 999)
+++ build.xml (working copy)
@@ -12,7 +12,7 @@
<property name="clojure_jar" location="clojure.jar"/>
<property name="bootclj" location="${cljsrc}/clojure/boot.clj"/
>
- <target name="init">
+ <target name="init" depends="make_version">
<tstamp/>
<mkdir dir="${build}"/>
</target>
@@ -38,4 +38,22 @@
<delete dir="${build}"/>
</target>
+<target name="make_version" description="create version.clj from
version_base.clj">
+ <property name="revision" value="HEAD"/>
+ <exec executable="svn" output="rev.xml">
+ <arg line="info --xml"/>
+ </exec>
+ <xmlproperty file="rev.xml" collapseAttributes="true"/>
+ <echo>${info.entry.revision}</echo>
+ <tstamp>
+ <format property="clj_build_tstamp"
+ pattern="dd-MMM-yy hh:mm aa" unit="hour"/>
+ </tstamp>
+ <copy file="version_base.clj" tofile="version.clj">
+ <filterset begintoken="@" endtoken="@">
+ <filter token="subversion_revision" value="$
{info.entry.revision}"/>
+ <filter token="clj_build_tstamp" value="${clj_build_tstamp}"/>
+ </filterset>
+ </copy>
+</target>
</project>
[parth:~/src/clojure]% cat version_base.clj
(def
#^{:doc "A map of the Clojure and underlying system info."}
version (array-map
:major 0
:minor 1
:rev (new Integer "@subversion_revision@")
:java (str (. System getProperty "java.version") " "
(. System getProperty "
java.vm.name"))
:system (str (. System getProperty "os.arch") " "
(. System getProperty "
os.name") " "
(. System getProperty "os.version"))
:tstamp "@clj_build_tstamp@"
:short-version (fn []
(str "Clojure "
(version :major) "."
(version :minor) " r"
(version :rev) " "))
:long-version (fn []
(str ((version :short-version)) " ("
(version :java) ": "
(version :system) ": "
(version :tstamp) ")"))))
(def version-str (version :short-version))
(def version-long-str (version :long-version))
[parth:~/src/clojure]%
>
> Rich