X-Git-Url: https://njoseph.me/gitweb/babashka-scripts.git/blobdiff_plain/10c4979d3156b71a4e718e49966f555b15d73a1d..f2db2d8fea6278491e508ae4409c02658f03bec6:/utils.clj diff --git a/utils.clj b/utils.clj index c3cdf5a..a19a9aa 100644 --- a/utils.clj +++ b/utils.clj @@ -1,6 +1,9 @@ (ns utils - (:require [lib :refer [run-cmd]] - [clojure.string :as str])) + (:require [clojure.string :as str] + [clojure.java.io :as io] + [cheshire.core :as json] + [org.httpkit.client :as http] + [lib :refer [download-binary run-cmd]])) (defn git-pull-rebase-branch "Do git pull and rebase branch with master" @@ -8,12 +11,10 @@ (let [current-branch (str/trim (run-cmd ["git" "branch" "--show-current"]))] (print (run-cmd ["git" "pull" "--rebase"])) (when (not (contains? #{"master" "main"} current-branch)) - (run! print - (map run-cmd - '[["git" "checkout" "master"] - ["git" "pull" "--rebase"] - ["git" "checkout" "-"] - ["git" "rebase" "master"]]))))) + (run! print + (map run-cmd + '[["git" "checkout" "master"] ["git" "pull" "--rebase"] + ["git" "checkout" "-"] ["git" "rebase" "master"]]))))) (defn run-seq "Run a sequence of shell commands on a sequence of arguments. @@ -21,9 +22,51 @@ Examples: 1. Play and delete each video from a folder - ls | bb -i '(run-seq ["mpv" "rm"] *input*)' + ls | bb -i '(run-seq [\"mpv\" \"rm\"] *input*)' " [commands arguments] (doseq [argument arguments command commands] (println (run-cmd [command argument])))) + +(defn install-deb + "Install a Debian package given a direct URL to the .deb file." + [url] + (println "Downloading deb package...") + (download-binary url "package.deb") + (println "Installing...") + (println (run-cmd ["sudo" "apt" "install" "./package.deb"])) + (println "Cleaning up..") + (io/delete-file "package.deb") + (println "Done.")) + +(defn install-deb-from-GitHub + "Install a Debian package given a GitHub URL." + [url] + + (assert (.contains url "github.com")) + + (letfn [(extract-GitHub-author-project + ;; Extracts a string like author/project from URL. + [url] + (str/join "/" (subvec (str/split url #"/") 3))) + (make-api-url ;; just some string interpolation + [author-project] + (str "https://api.github.com/repos/" + author-project + "/releases/latest")) + (get-assets ;; Download list of assets from GitHub + [api-url] + (:assets (json/parse-string + (:body @(http/get api-url)) true))) + (find-url-to-deb ;; Find Debian package URL from assets + [assets] + (some #(if (str/ends-with? % "deb") %) + (map #(:browser_download_url %) assets)))] + + (let [author-project (extract-GitHub-author-project url) + api-url (make-api-url author-project) + assets (get-assets api-url) + deb-url (find-url-to-deb assets)] + ;; Download and install Debian package + (install-deb deb-url))))