Skip to content

Commit 35cedff

Browse files
committed
write-pom - add new :pom-data that can include arbitrary pom data when generating a new pom, such as license info
1 parent 2e54897 commit 35cedff

3 files changed

Lines changed: 75 additions & 29 deletions

File tree

src/main/clojure/clojure/tools/build/api.clj

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,18 @@
385385
See: https://maven.apache.org/pom.html#SCM for details
386386
:src-dirs - coll of src dirs
387387
:resource-dirs - coll of resource dirs
388-
:repos - map of repo name to repo config, replaces repos from deps.edn"
388+
:repos - map of repo name to repo config, replaces repos from deps.edn
389+
:pom-data - vector of hiccup-style extra pom top elements to include when
390+
no :src-pom is provided:
391+
[[:licenses
392+
[:license
393+
[:name \"Eclipse Public License 1.0\"]
394+
[:url \"https://opensource.org/license/epl-1-0/\"]
395+
[:distribution \"repo\"]]]
396+
[:organization \"Super Corp\"]]
397+
The pom-data MUST NOT include:
398+
:modelVersion, :packaging, :groupId, :artifactId, :version, :name,
399+
:deps, :repositories, :build, or :scm"
389400
[params]
390401
(assert-required "write-pom" params [:basis :lib :version])
391402
(assert-specs "write-pom" params
@@ -396,7 +407,8 @@
396407
:version string?
397408
:scm map?
398409
:src-dirs ::specs/paths
399-
:resource-dirs ::specs/paths)
410+
:resource-dirs ::specs/paths
411+
:pom-data vector?)
400412
((requiring-resolve 'clojure.tools.build.tasks.write-pom/write-pom) params))
401413

402414
(defn jar

src/main/clojure/clojure/tools/build/tasks/write_pom.clj

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
[clojure.data.xml :as xml]
1414
[clojure.data.xml.tree :as tree]
1515
[clojure.data.xml.event :as event]
16+
[clojure.walk :as walk]
1617
[clojure.zip :as zip]
1718
[clojure.tools.deps.util.maven :as maven]
1819
[clojure.tools.deps.util.io :refer [printerrln]]
@@ -23,6 +24,8 @@
2324
[java.util Date]))
2425

2526
(xml/alias-uri 'pom "http://maven.apache.org/POM/4.0.0")
27+
(def ^:private pom-ns (name (.-name ^clojure.lang.Namespace (get (ns-aliases *ns*) 'pom))))
28+
2629

2730
(defn- to-dep
2831
[[lib {:keys [mvn/version exclusions optional] :as coord}]]
@@ -88,35 +91,43 @@
8891
[::pom/repositories
8992
(map to-repo repos)])
9093

94+
(defn- pomify
95+
[val]
96+
(if (and (vector? val) (keyword? (first val)))
97+
(into [(keyword pom-ns (name (first val)))] (rest val))
98+
val))
99+
91100
(defn- gen-pom
92-
[{:keys [deps src-paths resource-paths repos group artifact version scm]
101+
[{:keys [deps src-paths resource-paths repos group artifact version scm pom-data]
93102
:or {version "0.1.0"}}]
94103
(let [[path & paths] src-paths
95104
{:keys [connection developerConnection tag url]} scm]
96105
(xml/sexp-as-element
97-
[::pom/project
98-
{:xmlns "http://maven.apache.org/POM/4.0.0"
99-
(keyword "xmlns:xsi") "http://www.w3.org/2001/XMLSchema-instance"
100-
(keyword "xsi:schemaLocation") "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"}
101-
[::pom/modelVersion "4.0.0"]
102-
[::pom/packaging "jar"]
103-
[::pom/groupId group]
104-
[::pom/artifactId artifact]
105-
[::pom/version version]
106-
[::pom/name artifact]
107-
(gen-deps deps)
108-
(when (or path (seq resource-paths))
109-
(when (seq paths) (apply printerrln "Skipping paths:" paths))
110-
[::pom/build
111-
(when path (gen-source-dir path))
112-
(when (seq resource-paths) (gen-resources resource-paths))])
113-
(gen-repos repos)
114-
(when scm
115-
[::pom/scm
116-
(when connection [::pom/connection connection])
117-
(when developerConnection [::pom/developerConnection developerConnection])
118-
(when tag [::pom/tag tag])
119-
(when url [::pom/url url])])])))
106+
(into
107+
[::pom/project
108+
{:xmlns "http://maven.apache.org/POM/4.0.0"
109+
(keyword "xmlns:xsi") "http://www.w3.org/2001/XMLSchema-instance"
110+
(keyword "xsi:schemaLocation") "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"}
111+
[::pom/modelVersion "4.0.0"]
112+
[::pom/packaging "jar"]
113+
[::pom/groupId group]
114+
[::pom/artifactId artifact]
115+
[::pom/version version]
116+
[::pom/name artifact]
117+
(gen-deps deps)
118+
(when (or path (seq resource-paths))
119+
(when (seq paths) (apply printerrln "Skipping paths:" paths))
120+
[::pom/build
121+
(when path (gen-source-dir path))
122+
(when (seq resource-paths) (gen-resources resource-paths))])
123+
(gen-repos repos)
124+
(when scm
125+
[::pom/scm
126+
(when connection [::pom/connection connection])
127+
(when developerConnection [::pom/developerConnection developerConnection])
128+
(when tag [::pom/tag tag])
129+
(when url [::pom/url url])])]
130+
(walk/postwalk pomify pom-data)))))
120131

121132
(defn- make-xml-element
122133
[{:keys [tag attrs] :as node} children]
@@ -221,7 +232,7 @@
221232

222233
(defn write-pom
223234
[params]
224-
(let [{:keys [basis class-dir target src-pom lib version scm src-dirs resource-dirs repos]} params
235+
(let [{:keys [basis class-dir target src-pom lib version scm src-dirs resource-dirs repos pom-data]} params
225236
{:keys [libs]} basis
226237
root-deps (libs->deps libs)
227238
src-pom-file (api/resolve-path (or src-pom "pom.xml"))
@@ -246,7 +257,8 @@
246257
:group (namespace lib)
247258
:artifact (name lib)}
248259
version (assoc :version version)
249-
scm (assoc :scm scm))))
260+
scm (assoc :scm scm)
261+
pom-data (assoc :pom-data pom-data))))
250262
pom-dir-file (file/ensure-dir
251263
(cond
252264
class-dir (jio/file (api/resolve-path class-dir) (meta-maven-path {:lib lib}))

src/test/clojure/clojure/tools/build/tasks/test_pom.clj

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@
212212
:version "1.2.3"
213213
:target "target/output-pom.xml"
214214
:src-dirs ["src"]
215-
:src-pom "pom.xml"
216215
:resource-dirs ["resources"]
217216
:basis (api/create-basis nil)})
218217
(is (.exists (jio/file (project-path "target/output-pom.xml"))))))
@@ -233,6 +232,29 @@
233232
(catch Throwable t
234233
(is true)))))
235234

235+
(deftest test-pom-data
236+
(with-test-dir "test-data/p1"
237+
(api/set-project-root! (.getAbsolutePath *test-dir*))
238+
(api/delete {:path "target"})
239+
(api/write-pom {:lib 'test/p1
240+
:version "1.2.3"
241+
:target "target"
242+
:src-dirs ["src"]
243+
:resource-dirs ["resources"]
244+
:basis (api/create-basis nil)
245+
:pom-data [[:licenses
246+
[:license
247+
[:name "Apache-2.0"]
248+
[:url "https://www.apache.org/licenses/LICENSE-2.0.txt"]
249+
[:distribution "repo"]
250+
[:comments "OSS license"]]]
251+
[:foo
252+
[:bar "hello"]]]})
253+
(is (.exists (jio/file (project-path "target/pom.xml"))))
254+
(let [written-pom (slurp (project-path "target/pom.xml"))]
255+
(is (str/includes? written-pom "<name>Apache-2.0</name>"))
256+
(is (str/includes? written-pom "<bar>hello</bar>")))))
257+
236258
(comment
237259
(run-tests)
238260
(test-validate-lib)

0 commit comments

Comments
 (0)