+#! /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)))