+++ /dev/null
-#! /usr/bin/env bb
-
-; Install a deb package from URL
-
-(require '[clojure.java.io :as io]
- '[lib :refer [download-binary run-cmd unixify]])
-
-(defn- install-deb
- [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."))
-
-(unixify install-deb)
(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"
(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.
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))))