--- /dev/null
+#! /usr/bin/env bb
+; -*- mode: clojure -*-
+
+(require '[cheshire.core :as json]
+ '[org.httpkit.client :as http]
+ '[babashka.fs :as fs]
+ '[clojure.java.io :as io]
+ '[lib :refer [download-binary expand-home run-cmd]])
+
+(defn babashka-latest-version
+ []
+ (-> @(http/get "https://api.github.com/repos/babashka/babashka/tags")
+ :body
+ (json/parse-string true)
+ first
+ :name
+ (subs 1)))
+
+(defn get-download-url
+ [version architecture]
+ (str "https://github.com/babashka/babashka/releases/download/v"
+ version
+ "/babashka-"
+ version
+ "-"
+ architecture
+ ".tar.gz"))
+
+(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)]
+ (download-binary url output)))
+
+(defn update-babashka
+ []
+ (let [architecture "linux-amd64" ;; TODO support other architectures
+ tarball "babashka.tar.gz"
+ destination (expand-home "~/bin")
+ version (babashka-latest-version)]
+ (println (str "Latest version is " version))
+ (check-latest version)
+ (println "Updating...")
+ (download-latest version architecture tarball)
+ (run-cmd ["tar" "-xzf" tarball "--directory" destination])
+ (fs/set-posix-file-permissions (str destination "/bb") "rwxr-xr-x")
+ (io/delete-file tarball)
+ (println "Done!")))
+
+(when (= *file* (System/getProperty "babashka.file")) (update-babashka))