diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 6f6674e4..bdc2f754 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -77,6 +77,12 @@ ;; with the java provided by GraalVM. (def version (str/trim (slurp (io/resource "BABASHKA_VERSION")))) +(defn parse-version [version] + (mapv #(Integer/parseInt %) + (-> version + (str/replace "-SNAPSHOT" "") + (str/split #"\.")))) +(def version-data (parse-version version)) (defn print-version [] (println (str "babashka v" version))) @@ -776,12 +782,29 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.") (throw (Exception. "The uberjar task needs a classpath.")))) exit-code)))) +(defn satisfies-min-version? [min-version] + (let [[major-current minor-current patch-current] version-data + [major-min minor-min patch-min] (parse-version min-version)] + (or (> major-current major-min) + (and (= major-current major-min) + (or (> minor-current minor-min) + (and (= minor-current minor-min) + (>= patch-current patch-min))))))) + (defn main [& args] (let [bb-edn-file (or (System/getenv "BABASHKA_EDN") - "bb.edn")] - (when (fs/exists? bb-edn-file) - (let [edn (edn/read-string (slurp bb-edn-file))] - (vreset! common/bb-edn edn)))) + "bb.edn") + bb-edn (or (when (fs/exists? bb-edn-file) + (let [edn (edn/read-string (slurp bb-edn-file))] + (vreset! common/bb-edn edn))) + ;; tests may have modified bb-edn + @common/bb-edn) + min-bb-version (:min-bb-version bb-edn)] + (when min-bb-version + (when-not (satisfies-min-version? min-bb-version) + (binding [*out* *err*] + (println (str "WARNING: this project requires babashka " + min-bb-version " or newer, but you have: " version)))))) (let [opts (parse-opts args)] (exec opts))) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index ad3e43e6..9fcd3a70 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -113,16 +113,23 @@ (when-not test-utils/native? (testing "FILE > TASK > SUBCOMMAND" (is (= "foo.jar" (:uberjar (main/parse-opts ["uberjar" "foo.jar"])))) - (test-utils/with-config '{:tasks {uberjar (+ 1 2 3)}} - (vreset! common/bb-edn (edn/read-string (slurp test-utils/*bb-edn-path*))) - (is (= "uberjar" (:run (main/parse-opts ["uberjar"]))))) + (vreset! common/bb-edn '{:tasks {uberjar (+ 1 2 3)}}) + (is (= "uberjar" (:run (main/parse-opts ["uberjar"])))) (try - (test-utils/with-config '{:tasks {uberjar (+ 1 2 3)}} - (spit "uberjar" "#!/usr/bin/env bb\n(+ 1 2 3)") - (vreset! common/bb-edn (edn/read-string (slurp test-utils/*bb-edn-path*))) - (is (= "uberjar" (:file (main/parse-opts ["uberjar"]))))) + (spit "uberjar" "#!/usr/bin/env bb\n(+ 1 2 3)") + (vreset! common/bb-edn '{:tasks {uberjar (+ 1 2 3)}}) + (is (= "uberjar" (:file (main/parse-opts ["uberjar"])))) (finally (fs/delete "uberjar")))))) +(deftest min-bb-version + (when-not test-utils/native? + (vreset! common/bb-edn '{:min-bb-version "300.0.0"}) + (let [sw (java.io.StringWriter.)] + (binding [*err* sw] + (main/main "-e" "nil")) + (is (str/includes? (str sw) + "WARNING: this project requires babashka 300.0.0 or newer, but you have: "))))) + ;; TODO: ;; Do we want to support the same parsing as the clj CLI? ;; Or do we want `--aliases :foo:bar`