Index: clojure-contrib-svn/common.xml
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ clojure-contrib-svn/common.xml	2009-05-26 07:05:55.000000000 +0200
@@ -0,0 +1,111 @@
+<project name="common" default="artifacts"
+    xmlns:ivy="antlib:org.apache.ivy.ant">
+
+    <typedef resource="org/tigris/subversion/svnant/svnantlib.xml"
+        classpath="svnant.jar"/>
+
+    <property name="toplevel.dir" location="${basedir}/../.."/>
+    <property name="src.dir" location="${toplevel.dir}/src"/>
+    <property name="classes.dir" location="${basedir}/classes"/>
+    <property name="build.dir" location="${basedir}/build"/>
+    <property name="lib.dir" location="${basedir}/lib"/>
+
+    <property file="${toplevel.dir}/local.properties"/>
+
+    <ivy:settings file="${toplevel.dir}/ivysettings.xml" id="ivy.instance"/>
+
+    <target name="init" description="-> create build directories">
+        <tstamp/>
+        <mkdir dir="${classes.dir}"/>
+        <mkdir dir="${build.dir}"/>
+        <mkdir dir="${lib.dir}"/>
+    </target>
+
+    <target name="resolve" depends="init"
+        description="-> resolve and retrieve dependencies with ivy">
+        <ivy:resolve/>
+        <ivy:retrieve/>
+    </target>
+
+    <target name="compile" depends="init,resolve"
+        description="-> AOT compile Clojure sources">
+        <java classname="clojure.lang.Compile" failonerror="true" fork="true">
+            <classpath>
+                <path location="${classes.dir}"/>
+                <path location="${src.dir}"/>
+                <fileset dir="${lib.dir}" includes="**/*jar"/>
+            </classpath>
+            <sysproperty key="clojure.compile.path" value="${classes.dir}"/>
+            <arg line="${clojure.compile.namespaces}"/>
+        </java>
+    </target>
+
+    <target name="artifacts" depends="compile"
+        description="-> create source and artifact jar files">
+        <jar jarfile="${build.dir}/clojure-contrib-${ant.project.name}-source.jar">
+            <path location="epl-v10.html"/>
+            <fileset dir="${src.dir}"
+                includes="clojure/contrib/${ant.project.name}*"/>
+            <fileset dir="${src.dir}"
+                includes="clojure/contrib/${ant.project.name}/**/*"/>
+        </jar>
+
+        <jar jarfile="${build.dir}/clojure-contrib-${ant.project.name}.jar">
+            <path location="epl-v10.html"/>
+            <fileset dir="${classes.dir}" includes="**/*"/>
+            <manifest>
+                <attribute name="Class-Path" value="."/>
+            </manifest>
+        </jar>
+
+    </target>
+
+    <target name="clean" description="-> clean up generated files">
+        <delete dir="${classes.dir}"/>
+        <delete dir="${build.dir}"/>
+    </target>
+
+    <target name="clean-lib" description="-> clean up library files">
+        <delete dir="${lib.dir}"/>
+    </target>
+
+    <target name="clean-local"
+        description="-> clean up local repository files">
+        <ivy:info />
+        <delete
+            dir="${ivy.local.default.root}/${ivy.organisation}/${ivy.module}"/>
+    </target>
+
+    <target name="clean-all" depends="clean,clean-lib,clean-local"
+        description="-> run all other clean targets"/>
+
+    <target name="publish" depends="artifacts"
+        description="-> publish artifacts in the shared repository">
+        <ivy:info />
+        <svn javahl="false">
+            <info target="${toplevel.dir}/build.xml"/>
+        </svn>
+        <ivy:publish
+            resolver="shared"
+            artifactspattern="${build.dir}/[artifact].[ext]"
+            pubrevision="${svn.info.rev}"
+            update="true"
+            status="release"/>
+    </target>
+
+    <target name="publish-local" depends="artifacts"
+        description="-> publish artifacts in the local repository">
+        <tstamp>
+            <format property="now" pattern="yyyyMMddHHmmss"/>
+        </tstamp>
+        <ivy:info />
+        <ivy:publish
+            resolver="local"
+            artifactspattern="${build.dir}/[artifact].[ext]"
+            pubrevision="${now}"
+            pubdate="${now}"
+            status="integration"
+            forcedeliver="true"/>
+    </target>
+
+</project>
Index: clojure-contrib-svn/gen-modules.clj
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ clojure-contrib-svn/gen-modules.clj	2009-05-27 22:32:58.000000000 +0200
@@ -0,0 +1,239 @@
+(import '(java.io File FileOutputStream OutputStreamWriter))
+(require '[clojure.xml :as xml])
+
+(def default-configurations
+  {:source nil :compiled nil :default [:source :compiled]})
+
+(def default-dependencies
+  {"clojure" {:org "org.clojure" :name "clojure" :rev "1.0.0"
+              :conf {:* [(keyword "@")]}}})
+
+(def modules-info
+  [{:module "accumulators"
+    :dependencies
+    {"def" {}
+     "generic" {}}}
+   {:module "agent_utils" :dependencies {"walk" {}}}
+   {:module "classpath"   :dependencies {"jar"  {}}}
+   {:module "command_line"
+    :dependencies
+    {"seq_utils" {}
+     "str_utils" {}}}
+   {:module "cond"}
+   {:module "condt" :dependencies {"template" {}}}
+   {:module "core"  :dependencies {"def" {}}}
+   {:module "dataflow"
+    :dependencies
+    {"except" {}
+     "graph"  {}
+     "walk"   {}}}
+   {:module "datalog"
+    :dependencies
+    {"def"    {}
+     "except" {}
+     "graph"  {}
+     "seq_utils" {}
+     "set"    {}}}
+   {:module "def"}
+   {:module "duck_streams"}
+   {:module "except"}
+   {:module "error-kit"
+    :dependencies
+    {"def" {}
+     "stacktrace" {}}}
+   {:module "fcase"}
+   {:module "find_namespaces"
+    :dependencies
+    {"jar" {}
+     "classpath" {}}}
+   {:module "gen_html_docs"
+    :dependencies
+    {"def"          {}
+     "duck_streams" {}
+     "prxml"        {}
+     "repl_utils"   {}
+     "seq_utils"    {}
+     "str_utils"    {}}}
+   {:module "generic" :dependencies {"def" {}}}
+   {:module "graph"}
+   {:module "greatest_least"}
+   {:module "import_static"}
+   {:module "jar"}
+   {:module "javadoc"
+    :namespaces   ["javadoc.browse" "javadoc.browse-ui"]
+    :dependencies {"shell_out" {}}}
+   {:module "java_utils"}
+   {:module "json" :namespaces ["json.read" "json.write"]}
+   {:module "lazy_seqs" :dependencies {"def" {}}}
+   {:module "lazy_xml"
+    :configurations
+    {:with-xmlpull nil}
+    :dependencies
+    ; Needs special handling here because of with-xmlpull...
+    {"def"     {:conf {:source   [:source]
+                       :compiled [:compiled]
+                       :default  [:default]}}
+     "clojure" {:org "org.clojure" :name "clojure" :rev "1.0.0"
+                :conf {:source   [:source]
+                       :compiled [:compiled]
+                       :default  [:default]}}
+     "xmlpull" {:org "xmlpull" :rev "1.1.3.4d_b4_min"
+                :conf {:with-xmlpull [:default]}}}}
+   {:module "macros"}
+   {:module "map_utils"}
+   {:module "math"
+    :namespaces
+    ["combinatorics"
+     "complex-numbers"
+     "math"
+     "probabilities.finite-distributions"
+     "probabilities.monte-carlo"
+     "probabilities.random-numbers"]
+    :dependencies
+    {"accumulators" {}
+     "def"     {}
+     "generic" {}
+     "monads"  {}}}
+   {:module "miglayout"
+    :dependencies
+    {"except"     {}
+     "fcase"      {}
+     "java_utils" {}
+     "miglayout"  {:org "com.miglayout" :rev "3.7" :conf {:* [:default]}}}}
+   {:module "mmap"}
+   {:module "monads"   :dependencies {"accumulators" {}}}
+   {:module "ns_utils" :dependencies {"except" {}}}
+   {:module "pprint"
+    :namespaces
+    ["pprint.ColumnWriter"
+     "pprint.PrettyWriter"
+     "pprint"]}
+   {:module "profile"}
+   {:module "prxml"   :dependencies {"lazy_xml" {}}}
+   {:module "repl_ln" :dependencies {"def" {}}}
+   {:module "repl_utils"
+    :dependencies
+    {"javadoc"   {}
+     "seq_utils" {}
+     "str_utils" {}}}
+   {:module "seq_utils"}
+   {:module "server_socket"}
+   {:module "set"}
+   {:module "shell_out"}
+   {:module "sql"
+    :dependencies
+    {"def"        {}
+     "except"     {}
+     "java_utils" {}}}
+   {:module "stacktrace"}
+   {:module "str_utils"}
+   {:module "stream_utils"
+    :dependencies
+    {"def"       {}
+     "generic"   {}
+     "monads"    {}
+     "seq_utils" {}}}
+   {:module "template" :dependencies {"walk" {}}}
+   {:module "test_is"
+    :dependencies
+    {"template"   {}
+     "stacktrace" {}}}
+   {:module "trace"}
+   {:module "walk"}
+   {:module "with_ns"}
+   {:module "zip_filter"}])
+
+(defn ant-project
+  [module]
+  (let [namespaces (get module :namespaces [(.replace (:module module) \_ \-)])
+        namespaces (map #(str "clojure.contrib." %) namespaces)]
+    {:tag   :project
+     :attrs {:name (:module module) :default "artifacts"}
+     :content
+     [{:tag :property :attrs {:name  "clojure.compile.namespaces"
+                              :value (apply str (interpose " " namespaces))}}
+      {:tag :import   :attrs {:file  "${basedir}/../../common.xml"}}]}))
+
+(defn ivy-info
+  [module]
+  {:tag :info :attrs {:organisation "org.clojure.contrib"
+                      :module       (:module module)
+                      :status       "integration"}})
+
+(defn ivy-configurations
+  [module]
+  (let [configurations (merge default-configurations (:configurations module))]
+    {:tag :configurations
+     :content
+     (vec
+       (map (fn [[conf extends]]
+              (let [attrs {:name (name conf)}
+                    attrs (if extends
+                            (let [extends (map name extends)
+                                  extends (interpose "," extends)
+                                  extends (apply str extends)]
+                              (assoc attrs :extends extends))
+                            attrs)]
+                {:tag :conf :attrs attrs}))
+            configurations))}))
+
+(defn ivy-publications
+  [module]
+  {:tag :publications
+   :content
+   [{:tag   :artifact
+     :attrs {:name (str "clojure-contrib-" (:module module))
+             :type "jar"
+             :conf "compiled"}}
+    {:tag   :artifact
+     :attrs {:name (str "clojure-contrib-" (:module module) "-source")
+             :type "jar"
+             :conf "source"}}]})
+
+(defn ivy-dependencies
+  [module]
+  (let [dependencies (merge default-dependencies (:dependencies module))
+        dependencies (map (fn [[n d]] (assoc d :name n)) dependencies)]
+    {:tag :dependencies
+     :content
+     (vec
+       (map (fn [dep]
+              (let [dep  (merge {:org  "org.clojure.contrib"
+                                 :rev  "latest.integration"
+                                 :conf {:* [(keyword "@")]}}
+                                dep)
+                    conf (:conf dep)
+                    conf (map (fn [[l r]] (apply str (name l) "->"
+                                                 (interpose "," (map name r))))
+                              conf)
+                    conf (interpose ";" conf)
+                    conf (apply str conf)]
+                {:tag :dependency :attrs (if (not= conf "")
+                                           (assoc dep :conf conf)
+                                           dep)}))
+            dependencies))}))
+
+(defn ivy-module
+  [module]
+  {:tag :ivy-module :attrs {:version "2.0"}
+   :content
+   (vector
+     (ivy-info module)
+     (ivy-configurations module)
+     (ivy-publications module)
+     (ivy-dependencies module))})
+
+(doseq [module modules-info]
+  (.mkdirs (File. (str "modules/" (:module module))))
+  (with-open [build-xml (-> (str "modules/" (:module module) "/build.xml")
+                          (File.)
+                          (FileOutputStream.)
+                          (OutputStreamWriter.))
+              ivy-xml   (-> (str "modules/" (:module module) "/ivy.xml")
+                          (File.)
+                          (FileOutputStream.)
+                          (OutputStreamWriter.))]
+    (binding [*out* build-xml]
+      (xml/emit (ant-project module)))
+    (binding [*out* ivy-xml]
+      (xml/emit (ivy-module module)))))
Index: clojure-contrib-svn/ivy.xml
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ clojure-contrib-svn/ivy.xml	2009-05-26 23:55:36.000000000 +0200
@@ -0,0 +1,11 @@
+<ivy-module version="2.0">
+
+    <info organisation="org.clojure" module="clojure-contrib"
+        status="integration"/>
+
+    <dependencies>
+        <dependency org="org.clojure" name="clojure" rev="1.0.0"
+            conf="*->default"/>
+    </dependencies>
+
+</ivy-module>
Index: clojure-contrib-svn/ivysettings.xml
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ clojure-contrib-svn/ivysettings.xml	2009-05-25 23:12:26.000000000 +0200
@@ -0,0 +1,5 @@
+<ivysettings>
+    <!-- Load the standard Ivy settings. Which just extend them for Clojure. -->
+    <include url="${ivy.default.settings.dir}/ivysettings.xml"/>
+    <include url="http://kotka.de/ivy/ivysettings.xml"/>
+</ivysettings>
Index: clojure-contrib-svn/build+ivy.xml
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ clojure-contrib-svn/build+ivy.xml	2009-05-26 21:29:48.000000000 +0200
@@ -0,0 +1,56 @@
+<project name="clojure.contrib" xmlns:ivy="antlib:org.apache.ivy.ant">
+
+    <property name="modules.dir" value="${basedir}/modules"/>
+    <property name="lib.dir" value="${basedir}/lib"/>
+
+    <property file="local.properties"/>
+
+    <target name="init" description="-> create build directories">
+        <tstamp/>
+        <mkdir dir="${modules.dir}"/>
+        <mkdir dir="${lib.dir}"/>
+    </target>
+
+    <target name="resolve" depends="init"
+        description="-> resolve and retrieve dependencies with ivy">
+        <ivy:resolve/>
+        <ivy:retrieve/>
+    </target>
+
+    <target name="modules" depends="init,resolve"
+        description="-> generate ivy.xml and build.xml for the modules">
+        <java classname="clojure.main" failonerror="true">
+            <classpath>
+                <fileset dir="${lib.dir}" includes="**/*.jar"/>
+            </classpath>
+            <arg value="gen-modules.clj"/>
+        </java>
+    </target>
+
+    <target name="buildlist" depends="init,modules"
+        description="-> calculate build order for the modules">
+        <ivy:buildlist reference="build.list">
+            <fileset dir="${modules.dir}" includes="**/build.xml"/>
+        </ivy:buildlist>
+    </target>
+
+    <target name="publish-all-local" depends="modules,buildlist"
+        description="-> build all modules in correct order and publish them locally">
+        <subant target="publish-local" buildpathref="build.list"/>
+    </target>
+
+    <target name="publish-all" depends="modules,buildlist"
+        description="-> build all modules in correct order and publish them">
+        <subant target="publish" buildpathref="build.list"/>
+    </target>
+
+    <target name="clean-all" depends="modules,buildlist"
+        description="-> clean all modules">
+        <subant target="clean" buildpathref="build.list"/>
+    </target>
+
+    <target name="clean" description="-> clean the whole build tree">
+        <delete dir="${modules.dir}"/>
+    </target>
+
+</project>
