]> njoseph.me Git - babashka-scripts.git/blobdiff - update-babashka.clj
Add babashka self-updater script
[babashka-scripts.git] / update-babashka.clj
diff --git a/update-babashka.clj b/update-babashka.clj
new file mode 100755 (executable)
index 0000000..56ece2d
--- /dev/null
@@ -0,0 +1,48 @@
+#! /usr/bin/env bb
+
+(require '[clojure.java.shell :refer [sh]]
+         '[cheshire.core :as json]
+         '[babashka.curl :as curl]
+         '[babashka.fs :as fs])
+
+(defn babashka-latest-version []
+  (-> (curl/get "https://api.github.com/repos/babashka/babashka/tags")
+      :body
+      (json/parse-string true)
+      first
+      :name
+      (subs 1)))
+
+(defn download-binary
+  [url destination]
+  (io/copy
+   (:body (curl/get url {:as :stream}))
+   (io/file destination)))
+
+(defn get-download-url
+  [version architecture]
+  (str "https://github.com/babashka/babashka/releases/download/v" version "/babashka-"
+        version "-" architecture ".zip"))
+
+(defn check-latest
+  [version]
+  (when (= (System/getProperty "babashka.version") version)
+    (println "Already using the latest version.")
+    (System/exit 0)))
+
+(defn download-latest
+  [version architecture output]
+  (let [url (get-download-url version architecture)]
+    (println (str "Latest version is " version))
+    (download-binary url output)))
+
+(= *file* (System/getProperty "babashka.file")
+   (let [architecture "linux-static-amd64"  ;; TODO support multiple architectures
+         zip-file "babashka.zip"
+         destination (expand-home "~/bin/bb")
+         version (babashka-latest-version)]
+     (check-latest version)
+     (download-latest version architecture zip-file)
+     (extract-file-from-zip zip-file "bb" destination)
+     (fs/set-posix-file-permissions "/home/joseph/bin/bb" "rwxr-xr-x")
+     (io/delete-file zip-file)))