(ns utils (: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" [] (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"]]))))) (defn run-seq "Run a sequence of shell commands on a sequence of arguments. Examples: 1. Play and delete each video from a folder 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))))