From 963bd7957a77f42bf1de1625e5c3bb19ace72107 Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Sat, 2 Apr 2022 08:51:08 -0600 Subject: [PATCH 01/11] Feature: declarative pods support in uberjars (#1217) * Store bb.edn in uberjar & load when run from there * Sync resources deps.edn w/ root * Throw error if --config arg doesn't exist ...instead of silently falling back on ./bb.edn * Fix jar file arg parsing Moving all arg parsing up above bb.edn ingestion made tasks turn into files to load. But this is a chicken-and-egg problem w/ uberjars b/c the bb.edn is inside the jar file, so we need that first. So I extracted the file parsing out into its own fn and put the full arg parsing back where it was after ingesting bb.edn. * Fix local pod key in error message * Ensure resources dir exists when copying bb.edn into it * Copy bb.edn to temp dir when building uberjar ..and add that dir to the classpath for the jar * Only put :pods in uberjar bb.edn * Small readability fix * Add ret val type hints for classpath/resource Got a reflection warning on one of my calls * Add a test for uberjars with bb.edn-declared pods * Only run uberjar-with-pods-test on amd64 for now --- src/babashka/impl/classpath.clj | 17 +++++----- src/babashka/impl/pods.clj | 2 +- src/babashka/main.clj | 60 ++++++++++++++++++++++----------- test/babashka/uberjar_test.clj | 37 ++++++++++++++++---- 4 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/babashka/impl/classpath.clj b/src/babashka/impl/classpath.clj index cd223e1f..1506b80e 100644 --- a/src/babashka/impl/classpath.clj +++ b/src/babashka/impl/classpath.clj @@ -5,7 +5,8 @@ [clojure.java.io :as io] [clojure.string :as str] [sci.core :as sci]) - (:import [java.util.jar JarFile Manifest])) + (:import [java.util.jar JarFile Manifest] + (java.net URL))) (set! *warn-on-reflection* true) @@ -106,11 +107,11 @@ [] (:cp @cp-state)) -(defn resource [path] - (when-let [st @cp-state] - (let [loader (:loader st)] - (if (str/starts-with? path "/") nil ;; non-relative paths always return nil - (getResource loader [path] true))))) +(defn resource + (^URL [path] (when-let [st @cp-state] (resource (:loader st) path))) + (^URL [loader path] + (if (str/starts-with? path "/") nil ;; non-relative paths always return nil + (getResource loader [path] true)))) (def cns (sci/create-ns 'babashka.classpath nil)) @@ -126,5 +127,5 @@ (def cp "src:feature-xml:feature-core-async:feature-yaml:feature-csv:feature-transit:feature-java-time:feature-java-nio:sci/src:babashka.curl/src:babashka.pods/src:resources:sci/resources:/Users/borkdude/.m2/repository/com/cognitect/transit-java/1.0.343/transit-java-1.0.343.jar:/Users/borkdude/.m2/repository/org/clojure/clojure/1.10.2-alpha1/clojure-1.10.2-alpha1.jar:/Users/borkdude/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar:/Users/borkdude/.m2/repository/org/clojure/tools.analyzer/1.0.0/tools.analyzer-1.0.0.jar:/Users/borkdude/.m2/repository/org/clojure/tools.logging/0.6.0/tools.logging-0.6.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44.jar:/Users/borkdude/.m2/repository/org/clojure/spec.alpha/0.2.187/spec.alpha-0.2.187.jar:/Users/borkdude/.m2/repository/org/clojure/tools.cli/1.0.194/tools.cli-1.0.194.jar:/Users/borkdude/.m2/repository/org/clojure/tools.analyzer.jvm/1.0.0/tools.analyzer.jvm-1.0.0.jar:/Users/borkdude/.m2/repository/borkdude/graal.locking/0.0.2/graal.locking-0.0.2.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.10.2/jackson-dataformat-cbor-2.10.2.jar:/Users/borkdude/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar:/Users/borkdude/.m2/repository/org/flatland/ordered/1.5.9/ordered-1.5.9.jar:/Users/borkdude/.m2/repository/org/postgresql/postgresql/42.2.12/postgresql-42.2.12.jar:/Users/borkdude/.m2/repository/fipp/fipp/0.6.22/fipp-0.6.22.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar:/Users/borkdude/.m2/repository/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar:/Users/borkdude/.m2/repository/org/ow2/asm/asm/5.2/asm-5.2.jar:/Users/borkdude/.gitlibs/libs/clj-commons/conch/9aa7724e925cb8bf163e0b62486dd420b84e5f0b/src:/Users/borkdude/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar:/Users/borkdude/.m2/repository/seancorfield/next.jdbc/1.0.424/next.jdbc-1.0.424.jar:/Users/borkdude/.m2/repository/org/clojure/data.xml/0.2.0-alpha6/data.xml-0.2.0-alpha6.jar:/Users/borkdude/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar:/Users/borkdude/.m2/repository/borkdude/edamame/0.0.11-alpha.9/edamame-0.0.11-alpha.9.jar:/Users/borkdude/.m2/repository/org/clojure/data.csv/1.0.0/data.csv-1.0.0.jar:/Users/borkdude/.m2/repository/com/cognitect/transit-clj/1.0.324/transit-clj-1.0.324.jar:/Users/borkdude/.m2/repository/clj-commons/clj-yaml/0.7.1/clj-yaml-0.7.1.jar:/Users/borkdude/.m2/repository/org/clojure/core.rrb-vector/0.1.1/core.rrb-vector-0.1.1.jar:/Users/borkdude/.m2/repository/persistent-sorted-set/persistent-sorted-set/0.1.2/persistent-sorted-set-0.1.2.jar:/Users/borkdude/.m2/repository/cheshire/cheshire/5.10.0/cheshire-5.10.0.jar:/Users/borkdude/.m2/repository/tigris/tigris/0.1.2/tigris-0.1.2.jar:/Users/borkdude/.m2/repository/org/clojure/tools.reader/1.3.2/tools.reader-1.3.2.jar:/Users/borkdude/.m2/repository/datascript/datascript/0.18.11/datascript-0.18.11.jar:/Users/borkdude/.m2/repository/org/hsqldb/hsqldb/2.4.0/hsqldb-2.4.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.memoize/0.8.2/core.memoize-0.8.2.jar:/Users/borkdude/.m2/repository/org/clojure/data.priority-map/0.0.7/data.priority-map-0.0.7.jar:/Users/borkdude/.m2/repository/org/clojure/java.data/1.0.64/java.data-1.0.64.jar:/Users/borkdude/.m2/repository/borkdude/sci.impl.reflector/0.0.1/sci.impl.reflector-0.0.1.jar:/Users/borkdude/.m2/repository/nrepl/bencode/1.1.0/bencode-1.1.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.cache/0.8.2/core.cache-0.8.2.jar:/Users/borkdude/.m2/repository/org/clojure/core.async/1.1.587/core.async-1.1.587.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.10.2/jackson-dataformat-smile-2.10.2.jar:/Users/borkdude/.m2/repository/org/clojure/data.codec/0.1.0/data.codec-0.1.0.jar:/Users/borkdude/.m2/repository/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar") (def l (loader cp)) (source-for-namespace l 'babashka.impl.cheshire nil) - (time (:file (source-for-namespace l 'cheshire.core nil))) ;; 20ms -> 2.25ms - ) + (time (:file (source-for-namespace l 'cheshire.core nil)))) ;; 20ms -> 2.25ms + diff --git a/src/babashka/impl/pods.clj b/src/babashka/impl/pods.clj index 37923471..fb07c087 100644 --- a/src/babashka/impl/pods.clj +++ b/src/babashka/impl/pods.clj @@ -28,7 +28,7 @@ (throw (IllegalArgumentException. (str (-> coord keys first) " is not a supported pod coordinate type. " - "Use :version for registry-hosted pods or :local/root " + "Use :version for registry-hosted pods or :path " "for pods on your local filesystem.")))))) {} pods-map)) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 9aa73460..b957d0c3 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -663,6 +663,15 @@ Use bb run --help to show this help output. [options opts-map]) [options opts-map]))) +(defn parse-file-opt + [options opts-map] + (let [opt (first options) + opts-key (if (str/ends-with? opt ".jar") + :jar :file)] + (assoc opts-map + opts-key opt + :command-line-args (next options)))) + (defn parse-opts ([options] (parse-opts options nil)) ([options opts-map] @@ -672,19 +681,18 @@ Use bb run --help to show this help output. ;; FILE > TASK > SUBCOMMAND (cond (.isFile (io/file opt)) - (if (str/ends-with? opt ".jar") - (assoc opts-map - :jar opt - :command-line-args (next options)) - (assoc opts-map - :file opt - :command-line-args (next options))) + (if (or (:file opts-map) (:jar opts-map)) + opts-map ; we've already parsed the file opt + (parse-file-opt options opts-map)) + (contains? tasks opt) (assoc opts-map :run opt :command-line-args (next options)) + (command? opt) (recur (cons (str "--" opt) (next options)) opts-map) + :else (parse-args options opts-map)))))) @@ -920,11 +928,19 @@ Use bb run --help to show this help output. (spit uberscript-out expression :append true))) (when uberjar (if-let [cp (cp/get-classpath)] - (uberjar/run {:dest uberjar - :jar :uber - :classpath cp - :main-class main - :verbose debug}) + (let [uber-params {:dest uberjar + :jar :uber + :classpath cp + :main-class main + :verbose debug}] + (if-let [bb-edn-pods (:pods @common/bb-edn)] + (fs/with-temp-dir [bb-edn-dir {}] + (let [bb-edn-resource (fs/file bb-edn-dir "bb.edn")] + (->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource)) + (let [cp-with-bb-edn (str cp cp/path-sep bb-edn-dir)] + (uberjar/run (assoc uber-params + :classpath cp-with-bb-edn))))) + (uberjar/run uber-params))) (throw (Exception. "The uberjar task needs a classpath.")))) exit-code)))) @@ -939,17 +955,21 @@ Use bb run --help to show this help output. (defn main [& args] (let [[args global-opts] (parse-global-opts args) + {:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile) + (parse-file-opt args global-opts)) config (:config global-opts) - bb-edn-file (or config - "bb.edn") - bb-edn (when (fs/exists? bb-edn-file) - (System/setProperty "babashka.config" - (.getAbsolutePath (io/file bb-edn-file))) + abs-path #(-> % io/file .getAbsolutePath) + bb-edn-file (cond + config (when (fs/exists? config) (abs-path config)) + jar (some-> jar cp/loader (cp/resource "bb.edn") .toString) + :else (when (fs/exists? "bb.edn") (abs-path "bb.edn"))) + bb-edn (when bb-edn-file + (System/setProperty "babashka.config" bb-edn-file) (let [raw-string (slurp bb-edn-file) edn (edn/read-string raw-string) edn (assoc edn - :raw raw-string - :file bb-edn-file) + :raw raw-string + :file bb-edn-file) edn (if-let [deps-root (or (:deps-root global-opts) (some-> config fs/parent))] (assoc edn :deps-root deps-root) @@ -961,7 +981,7 @@ Use bb run --help to show this help output. (binding [*out* *err*] (println (str "WARNING: this project requires babashka " min-bb-version " or newer, but you have: " version))))) - (exec (parse-opts args global-opts)))) + (exec (parse-opts args (merge global-opts file-opt))))) (def musl? "Captured at compile time, to know if we are running inside a diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index 66d94a13..fe2ed56a 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -3,14 +3,21 @@ [babashka.main :as main] [babashka.test-utils :as tu] [clojure.string :as str] - [clojure.test :as t :refer [deftest is testing]])) + [clojure.test :as t :refer [deftest is testing]] + [babashka.fs :as fs] + [clojure.edn :as edn]) + (:import (java.util.jar JarFile) + (java.io File InputStreamReader PushbackReader))) + +(defn jar-entries [jar] + (with-open [jar-file (JarFile. jar)] + (doall (enumeration-seq (.entries jar-file))))) (defn count-entries [jar] - (with-open [jar-file (java.util.jar.JarFile. jar)] - (count (map #_prn - identity - (enumeration-seq - (.entries jar-file)))))) + (-> jar jar-entries count)) + +(defn get-entry [^File jar entry-name] + (-> jar JarFile. (.getEntry entry-name))) (deftest uberjar-test (testing "uberjar with --main" @@ -54,6 +61,24 @@ ;; Only a manifest entry is added (is (< (count-entries path) 3))))) +(deftest uberjar-with-pods-test + (testing "jar contains bb.edn w/ only :pods when bb.edn has :pods" + (when (= "amd64" (System/getProperty "os.arch")) ; TODO: Build bootleg for aarch64 too or use a different pod + (let [tmp-file (java.io.File/createTempFile "uber" ".jar") + path (.getPath tmp-file)] + (.deleteOnExit tmp-file) + (let [config {:paths ["test-resources/babashka/uberjar/src"] + :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} + :pods '{retrogradeorbit/bootleg {:version "0.1.9"} + pod/test-pod {:path "test-resources/pod"}}}] + (tu/with-config config + (tu/bb nil "uberjar" path "-m" "my.main-main") + (let [bb-edn-entry (get-entry tmp-file "bb.edn") + bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) + InputStreamReader. PushbackReader. edn/read)] + (is (= #{:pods} (-> bb-edn keys set))) + (is (= (:pods config) (:pods bb-edn)))))))))) + (deftest throw-on-empty-classpath ;; this test fails the windows native test in CI (when-not main/windows? From ea4c4eae77909948d477e9cef70e3ade4d93d5de Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 2 Apr 2022 17:09:34 +0200 Subject: [PATCH 02/11] windows fix --- test/babashka/uberjar_test.clj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index fe2ed56a..4c9ab5de 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -1,13 +1,13 @@ (ns babashka.uberjar-test (:require - [babashka.main :as main] - [babashka.test-utils :as tu] - [clojure.string :as str] - [clojure.test :as t :refer [deftest is testing]] - [babashka.fs :as fs] - [clojure.edn :as edn]) - (:import (java.util.jar JarFile) - (java.io File InputStreamReader PushbackReader))) + [babashka.fs :as fs] + [babashka.main :as main] + [babashka.test-utils :as tu] + [clojure.edn :as edn] + [clojure.string :as str] + [clojure.test :as t :refer [deftest is testing]]) + (:import (java.io File InputStreamReader PushbackReader) + (java.util.jar JarFile))) (defn jar-entries [jar] (with-open [jar-file (JarFile. jar)] @@ -69,8 +69,8 @@ (.deleteOnExit tmp-file) (let [config {:paths ["test-resources/babashka/uberjar/src"] :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} - :pods '{retrogradeorbit/bootleg {:version "0.1.9"} - pod/test-pod {:path "test-resources/pod"}}}] + :pods (cond-> '{retrogradeorbit/bootleg {:version "0.1.9"} + (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"})})}] (tu/with-config config (tu/bb nil "uberjar" path "-m" "my.main-main") (let [bb-edn-entry (get-entry tmp-file "bb.edn") From 7af93adf15d11fd31144f051c9ce49af6a4269ef Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 2 Apr 2022 17:47:27 +0200 Subject: [PATCH 03/11] Fix test --- .../babashka/uberjar/src/my/main_pod.clj | 5 ++++ test/babashka/uberjar_test.clj | 30 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 test-resources/babashka/uberjar/src/my/main_pod.clj diff --git a/test-resources/babashka/uberjar/src/my/main_pod.clj b/test-resources/babashka/uberjar/src/my/main_pod.clj new file mode 100644 index 00000000..a3a0e46f --- /dev/null +++ b/test-resources/babashka/uberjar/src/my/main_pod.clj @@ -0,0 +1,5 @@ +(ns my.main-pod + (:require [pod.babashka.go-sqlite3 :as sqlite])) + +(defn -main [& _args] + (sqlite/query ":memory:" ["SELECT 1 + 2 as sum"])) diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index 4c9ab5de..4dd24d37 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -63,21 +63,21 @@ (deftest uberjar-with-pods-test (testing "jar contains bb.edn w/ only :pods when bb.edn has :pods" - (when (= "amd64" (System/getProperty "os.arch")) ; TODO: Build bootleg for aarch64 too or use a different pod - (let [tmp-file (java.io.File/createTempFile "uber" ".jar") - path (.getPath tmp-file)] - (.deleteOnExit tmp-file) - (let [config {:paths ["test-resources/babashka/uberjar/src"] - :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} - :pods (cond-> '{retrogradeorbit/bootleg {:version "0.1.9"} - (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"})})}] - (tu/with-config config - (tu/bb nil "uberjar" path "-m" "my.main-main") - (let [bb-edn-entry (get-entry tmp-file "bb.edn") - bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) - InputStreamReader. PushbackReader. edn/read)] - (is (= #{:pods} (-> bb-edn keys set))) - (is (= (:pods config) (:pods bb-edn)))))))))) + (let [tmp-file (java.io.File/createTempFile "uber" ".jar") + path (.getPath tmp-file)] + (.deleteOnExit tmp-file) + (let [config {:paths ["test-resources/babashka/uberjar/src"] + :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} + :pods (cond-> '{org.babashka/go-sqlite3 {:version "0.1.0"}} + (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"}))}] + (tu/with-config config + (tu/bb nil "uberjar" path "-m" "my.main-pod") + (let [bb-edn-entry (get-entry tmp-file "bb.edn") + bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) + InputStreamReader. PushbackReader. edn/read)] + (is (= #{:pods} (-> bb-edn keys set))) + (is (= (:pods config) (:pods bb-edn)))) + (is (str/includes? (tu/bb nil "--jar" path) "3"))))))) (deftest throw-on-empty-classpath ;; this test fails the windows native test in CI From e81ef4aac07860024fe3da4d345c0821fe628ea8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 2 Apr 2022 23:41:04 +0200 Subject: [PATCH 04/11] Declarative pod support for uberscript (#1227) --- src/babashka/main.clj | 43 +++++++++++-------- .../babashka/uberscript/src/my/main_pod.clj | 6 +++ .../uberscript/src/my/other_ns_with_pod.clj | 2 + test/babashka/uberscript_test.clj | 12 +++++- 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 test-resources/babashka/uberscript/src/my/main_pod.clj create mode 100644 test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj diff --git a/src/babashka/main.clj b/src/babashka/main.clj index b957d0c3..e1714279 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -52,11 +52,11 @@ [hf.depstar.uberjar :as uberjar] [sci.addons :as addons] [sci.core :as sci] + [sci.impl.io :as sio] [sci.impl.namespaces :as sci-namespaces] [sci.impl.types :as sci-types] [sci.impl.unrestrict :refer [*unrestricted*]] - [sci.impl.vars :as vars] - [sci.impl.io :as sio]) + [sci.impl.vars :as vars]) (:gen-class)) (def windows? @@ -669,8 +669,8 @@ Use bb run --help to show this help output. opts-key (if (str/ends-with? opt ".jar") :jar :file)] (assoc opts-map - opts-key opt - :command-line-args (next options)))) + opts-key opt + :command-line-args (next options)))) (defn parse-opts ([options] (parse-opts options nil)) @@ -765,16 +765,25 @@ Use bb run --help to show this help output. :expressions [(:source res)]}) {}) res)))) - (when-let [pod (get @pod-namespaces namespace)] - (pods/load-pod (:pod-spec pod) (:opts pod))) - (case namespace - clojure.spec.alpha - (binding [*out* *err*] - (println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) - clojure.core.specs.alpha - (binding [*out* *err*] - (println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) - nil))) + (if-let [pod (get @pod-namespaces namespace)] + (if uberscript + (do + (swap! uberscript-sources conj + (format + "(babashka.pods/load-pod '%s \"%s\" '%s)\n" + (:pod-spec pod) (:version (:opts pod)) + (dissoc (:opts pod) + :version :metadata))) + {}) + (pods/load-pod (:pod-spec pod) (:opts pod))) + (case namespace + clojure.spec.alpha + (binding [*out* *err*] + (println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) + clojure.core.specs.alpha + (binding [*out* *err*] + (println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) + nil)))) main (if (and jar (not main)) (when-let [res (cp/getResource (cp/loader jar) @@ -939,7 +948,7 @@ Use bb run --help to show this help output. (->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource)) (let [cp-with-bb-edn (str cp cp/path-sep bb-edn-dir)] (uberjar/run (assoc uber-params - :classpath cp-with-bb-edn))))) + :classpath cp-with-bb-edn))))) (uberjar/run uber-params))) (throw (Exception. "The uberjar task needs a classpath.")))) exit-code)))) @@ -968,8 +977,8 @@ Use bb run --help to show this help output. (let [raw-string (slurp bb-edn-file) edn (edn/read-string raw-string) edn (assoc edn - :raw raw-string - :file bb-edn-file) + :raw raw-string + :file bb-edn-file) edn (if-let [deps-root (or (:deps-root global-opts) (some-> config fs/parent))] (assoc edn :deps-root deps-root) diff --git a/test-resources/babashka/uberscript/src/my/main_pod.clj b/test-resources/babashka/uberscript/src/my/main_pod.clj new file mode 100644 index 00000000..139b5e48 --- /dev/null +++ b/test-resources/babashka/uberscript/src/my/main_pod.clj @@ -0,0 +1,6 @@ +(ns my.main-pod + (:require [my.other-ns-with-pod] + [pod.babashka.go-sqlite3 :as sqlite])) + +(defn -main [& _args] + (sqlite/query ":memory:" ["SELECT 1 + 2 as sum"])) diff --git a/test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj b/test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj new file mode 100644 index 00000000..b8f061ba --- /dev/null +++ b/test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj @@ -0,0 +1,2 @@ +(ns my.other-ns-with-pod + (:require [pod.babashka.go-sqlite3])) diff --git a/test/babashka/uberscript_test.clj b/test/babashka/uberscript_test.clj index 4fbc1af8..9a111b18 100644 --- a/test/babashka/uberscript_test.clj +++ b/test/babashka/uberscript_test.clj @@ -1,7 +1,8 @@ (ns babashka.uberscript-test (:require [babashka.test-utils :as tu] - [clojure.test :as t :refer [deftest is]])) + [clojure.test :as t :refer [deftest is]] + [clojure.string :as str])) (deftest basic-test (let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")] @@ -23,3 +24,12 @@ (is (= ":clojure.string/foo\ntrue\n(\"1\" \"2\" \"3\" \"4\")\n" (tu/bb nil "--file" (.getPath tmp-file) "1" "2" "3" "4")))))) +(deftest pods-test + (let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")] + (.deleteOnExit tmp-file) + (tu/with-config (pr-str '{:paths ["test-resources/babashka/uberscript/src"] + :pods {org.babashka/go-sqlite3 {:version "0.1.0"}}}) + (is (empty? (tu/bb nil "uberscript" (.getPath tmp-file) "-m" "my.main-pod"))) + (is (= 1 (count (re-seq #"load-pod 'org.babashka/go-sqlite3" + (str/join (str/split-lines (slurp tmp-file)))))))) + (is (str/includes? (tu/bb nil "--file" (.getPath tmp-file)) "3")))) From f09e085c75b749ce60139eafc760641ec74f6723 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 13:35:53 +0200 Subject: [PATCH 05/11] Move bb.edn in uberjar to META-INF --- sci | 2 +- src/babashka/main.clj | 7 ++++--- test/babashka/uberjar_test.clj | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sci b/sci index 2e7dd0d1..4e6d8e21 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 2e7dd0d1bc23f4d158ea592adf23dac971d4d8d4 +Subproject commit 4e6d8e215a379e3c1a36e39dce43148c8ab0915b diff --git a/src/babashka/main.clj b/src/babashka/main.clj index e1714279..41575a6e 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -944,9 +944,10 @@ Use bb run --help to show this help output. :verbose debug}] (if-let [bb-edn-pods (:pods @common/bb-edn)] (fs/with-temp-dir [bb-edn-dir {}] - (let [bb-edn-resource (fs/file bb-edn-dir "bb.edn")] + (let [bb-edn-resource (fs/file bb-edn-dir "META-INF" "bb.edn")] + (fs/create-dirs (fs/parent bb-edn-resource)) (->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource)) - (let [cp-with-bb-edn (str cp cp/path-sep bb-edn-dir)] + (let [cp-with-bb-edn (str bb-edn-dir cp/path-sep cp)] (uberjar/run (assoc uber-params :classpath cp-with-bb-edn))))) (uberjar/run uber-params))) @@ -970,7 +971,7 @@ Use bb run --help to show this help output. abs-path #(-> % io/file .getAbsolutePath) bb-edn-file (cond config (when (fs/exists? config) (abs-path config)) - jar (some-> jar cp/loader (cp/resource "bb.edn") .toString) + jar (some-> jar cp/loader (cp/resource "META-INF/bb.edn") .toString) :else (when (fs/exists? "bb.edn") (abs-path "bb.edn"))) bb-edn (when bb-edn-file (System/setProperty "babashka.config" bb-edn-file) diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index 4dd24d37..4476f45a 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -72,7 +72,7 @@ (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"}))}] (tu/with-config config (tu/bb nil "uberjar" path "-m" "my.main-pod") - (let [bb-edn-entry (get-entry tmp-file "bb.edn") + (let [bb-edn-entry (get-entry tmp-file "META-INF/bb.edn") bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) InputStreamReader. PushbackReader. edn/read)] (is (= #{:pods} (-> bb-edn keys set))) From 10638685549205926489ac325721261c301819d4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:11:03 +0200 Subject: [PATCH 06/11] fix #1211: return exit code 130 on sigint --- CHANGELOG.md | 1 + src/babashka/impl/sigint_handler.clj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f3619a5..eda6e86c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ A preview of the next release can be installed from - [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill - [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future +- [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint ## 0.7.9-SNAPSHOT diff --git a/src/babashka/impl/sigint_handler.clj b/src/babashka/impl/sigint_handler.clj index 508e01b2..49903518 100644 --- a/src/babashka/impl/sigint_handler.clj +++ b/src/babashka/impl/sigint_handler.clj @@ -12,4 +12,4 @@ (reify SignalHandler (handle [_ _] ;; This is needed to run shutdown hooks on interrupt, System/exit triggers those - (System/exit 0)))))) + (System/exit 130)))))) From 76a57500afb9e71d549807a4de72b2bb2eb6a7d9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:45:13 +0200 Subject: [PATCH 07/11] bb.curl: fix: last set-cookie headers on a page overwrites the ones before --- CHANGELOG.md | 4 +--- babashka.curl | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eda6e86c..b6c57f74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,10 +17,8 @@ A preview of the next release can be installed from - [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill - [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future - [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint - -## 0.7.9-SNAPSHOT - - [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. +- [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before ## 0.7.8 (2022-03-13) diff --git a/babashka.curl b/babashka.curl index 3d3d117e..8a27e606 160000 --- a/babashka.curl +++ b/babashka.curl @@ -1 +1 @@ -Subproject commit 3d3d117ea0f8a143a06e3cace92e4e8b6a5782df +Subproject commit 8a27e6060a739c7580cc89ba2bfddf48881e7178 From 7f7b66aeaf7aeccd5dc5fedede49131bb23919e6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:55:10 +0200 Subject: [PATCH 08/11] CHANGELOG [skip ci] --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6c57f74..c4aeee3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,17 @@ A preview of the next release can be installed from - [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint - [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. - [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before +- #1216: fix `core.async` alts example with polyfill +- SCI: support `let*` special form +- Add compatibility with GraalVM 22.1 +- Bump timbre +- Bump Clojure to 1.11.1 +- Pods: support Rosetta2 fallback +- Process: fix for pprint +- Fs: improvement for which: do not match on local paths +- Proxy support for PipedInputStream and PipedOutputStream +- Expose `java.util.Scanner` for interop +- Bump Selmer ## 0.7.8 (2022-03-13) From fabb945f8ccf3c604210b860536ca1a3f4df4383 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:58:32 +0200 Subject: [PATCH 09/11] Bump Clojure --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index d4e67e14..9d5e752b 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.0"}, + :deps {org.clojure/clojure {:mvn/version "1.11.1"}, borkdude/sci {:local/root "sci"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index cdc3c290..43ef8762 100644 --- a/project.clj +++ b/project.clj @@ -17,7 +17,7 @@ :resource-paths ["resources" "sci/resources"] :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} - :dependencies [[org.clojure/clojure "1.11.0"] + :dependencies [[org.clojure/clojure "1.11.1"] [borkdude/edamame "0.0.19"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] From f1adb99eff5b251174348656e3a5485edbf4add1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 15:06:22 +0200 Subject: [PATCH 10/11] Revert "Bump Clojure" This reverts commit fabb945f8ccf3c604210b860536ca1a3f4df4383. --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 9d5e752b..d4e67e14 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.1"}, + :deps {org.clojure/clojure {:mvn/version "1.11.0"}, borkdude/sci {:local/root "sci"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index 43ef8762..cdc3c290 100644 --- a/project.clj +++ b/project.clj @@ -17,7 +17,7 @@ :resource-paths ["resources" "sci/resources"] :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} - :dependencies [[org.clojure/clojure "1.11.1"] + :dependencies [[org.clojure/clojure "1.11.0"] [borkdude/edamame "0.0.19"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] From 5959ba99ecf55b8a4dae0335cbef36d85450e946 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 15:06:37 +0200 Subject: [PATCH 11/11] CHANGELOG [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4aeee3c..16f03588 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ A preview of the next release can be installed from - SCI: support `let*` special form - Add compatibility with GraalVM 22.1 - Bump timbre -- Bump Clojure to 1.11.1 +- Bump Clojure to 1.11.0 - Pods: support Rosetta2 fallback - Process: fix for pprint - Fs: improvement for which: do not match on local paths