Implemented non-map manifest and sections

This commit is contained in:
Fabio Tudone 2014-09-18 21:01:36 +02:00
parent c78a8110a8
commit bd6d25b323

View file

@ -19,29 +19,48 @@
(.replace path "\\" "/")) (.replace path "\\" "/"))
(def ^:private default-manifest (def ^:private default-manifest
{"Created-By" (str "Leiningen " (main/leiningen-version)) [["Created-By" (str "Leiningen " (main/leiningen-version))]
"Built-By" (System/getProperty "user.name") ["Built-By" (System/getProperty "user.name")]
"Build-Jdk" (System/getProperty "java.version")}) ["Build-Jdk" (System/getProperty "java.version")]])
(declare ^:private manifest-entry)
(defn- manifest-entries [project manifest-seq]
(map (partial manifest-entry project) manifest-seq))
(defn- manifest-entry [project [k v]] (defn- manifest-entry [project [k v]]
(cond (symbol? v) (manifest-entry project [k (resolve v)]) (cond (symbol? v) (manifest-entry project [k (resolve v)])
(fn? v) (manifest-entry project [k (v project)]) (fn? v) (manifest-entry project [k (v project)])
(coll? v) (->> v ;; Sub-manifest = manifest section
(manifest-entries project)
(cons (str "\nName: " (name k) "\n"))
(string/join))
:else (->> (str (name k) ": " v) :else (->> (str (name k) ": " v)
(partition-all 70) ;; Manifest spec says lines <= 72 chars (partition-all 70) ;; Manifest spec says lines <= 72 chars
(map (partial apply str)) (map (partial apply str))
(string/join "\n ") ;; Manifest spec says join with "\n " (string/join "\n ") ;; Manifest spec says join with "\n "
(format "%s\n")))) (format "%s\n"))))
(defn- manifest-map-to-reordered-seq [mf]
(sort
(comparator
(fn [e1 e2]
(not (coll? (second e1)))))
(seq mf)))
(defn ^:internal make-manifest [project] (defn ^:internal make-manifest [project]
(->> (merge default-manifest (:manifest project) (let [initial-mf
(concat (conj default-manifest
(if-let [main (:main project 'clojure.main)] (if-let [main (:main project 'clojure.main)]
{"Main-Class" (munge (str main))})) ["Main-Class" (munge (str main))]))
(map (partial manifest-entry project)) (manifest-map-to-reordered-seq (:manifest project)))]
(cons "Manifest-Version: 1.0\n") ;; Manifest-Version line must be first (->> initial-mf
(string/join "") (manifest-entries project)
.getBytes (cons "Manifest-Version: 1.0\n") ;; Manifest-Version line must be first
ByteArrayInputStream. (string/join "")
Manifest.)) .getBytes
ByteArrayInputStream.
Manifest.)))
(defn ^:internal manifest-map [manifest] (defn ^:internal manifest-map [manifest]
(let [attrs (.getMainAttributes manifest)] (let [attrs (.getMainAttributes manifest)]