]> njoseph.me Git - babashka-scripts.git/blob - scripts/debian.clj
Add .lsp/ folder to .gitignore
[babashka-scripts.git] / scripts / debian.clj
1 (ns debian
2 (:require [clojure.string :as str]
3 [clojure.java.io :as io]
4 [cheshire.core :as json]
5 [org.httpkit.client :as http]
6 [lib :refer [download-binary run-cmd]]))
7
8 (defn install-deb-from-url
9 "Install a Debian package given a direct URL to the .deb file."
10 [url]
11 (println "Downloading deb package...")
12 (download-binary url "package.deb")
13 (println "Installing...")
14 (println (run-cmd ["sudo" "apt" "install" "./package.deb"]))
15 (println "Cleaning up..")
16 (io/delete-file "package.deb")
17 (println "Done."))
18
19 (defn install-deb-from-GitHub
20 "Install a Debian package given a GitHub URL."
21 [url]
22
23 (assert (.contains url "github.com"))
24
25 (letfn [(extract-GitHub-author-project
26 ;; Extracts a string like author/project from URL.
27 [url]
28 (str/join "/" (subvec (str/split url #"/") 3)))
29 (make-api-url ;; just some string interpolation
30 [author-project]
31 (str "https://api.github.com/repos/"
32 author-project
33 "/releases/latest"))
34 (get-assets ;; Download list of assets from GitHub
35 [api-url]
36 (:assets (json/parse-string
37 (:body @(http/get api-url)) true)))
38 (find-url-to-deb ;; Find Debian package URL from assets
39 [assets]
40 (some #(if (str/ends-with? % "deb") %)
41 (map #(:browser_download_url %) assets)))]
42
43 (let [author-project (extract-GitHub-author-project url)
44 api-url (make-api-url author-project)
45 assets (get-assets api-url)
46 deb-url (find-url-to-deb assets)]
47 ;; Download and install Debian package
48 (install-deb-from-url deb-url))))