From bd6d25b32351e1d97faa82b230d06f1fa94956f8 Mon Sep 17 00:00:00 2001 From: Fabio Tudone Date: Thu, 18 Sep 2014 21:01:36 +0200 Subject: [PATCH] Implemented non-map manifest and sections --- src/leiningen/jar.clj | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/leiningen/jar.clj b/src/leiningen/jar.clj index 82c1629c..cdecb9a6 100644 --- a/src/leiningen/jar.clj +++ b/src/leiningen/jar.clj @@ -19,29 +19,48 @@ (.replace path "\\" "/")) (def ^:private default-manifest - {"Created-By" (str "Leiningen " (main/leiningen-version)) - "Built-By" (System/getProperty "user.name") - "Build-Jdk" (System/getProperty "java.version")}) + [["Created-By" (str "Leiningen " (main/leiningen-version))] + ["Built-By" (System/getProperty "user.name")] + ["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]] (cond (symbol? v) (manifest-entry project [k (resolve v)]) (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) (partition-all 70) ;; Manifest spec says lines <= 72 chars (map (partial apply str)) (string/join "\n ") ;; Manifest spec says join with "\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] - (->> (merge default-manifest (:manifest project) + (let [initial-mf + (concat (conj default-manifest (if-let [main (:main project 'clojure.main)] - {"Main-Class" (munge (str main))})) - (map (partial manifest-entry project)) - (cons "Manifest-Version: 1.0\n") ;; Manifest-Version line must be first - (string/join "") - .getBytes - ByteArrayInputStream. - Manifest.)) + ["Main-Class" (munge (str main))])) + (manifest-map-to-reordered-seq (:manifest project)))] + (->> initial-mf + (manifest-entries project) + (cons "Manifest-Version: 1.0\n") ;; Manifest-Version line must be first + (string/join "") + .getBytes + ByteArrayInputStream. + Manifest.))) (defn ^:internal manifest-map [manifest] (let [attrs (.getMainAttributes manifest)]