-;
+; Common utility functions used by scripts
+; Unlike the functions in utils.clj, these are not directly useful
-(import '[java.nio.file Files FileSystems CopyOption StandardCopyOption])
+(ns lib
+ (:require [babashka.process :as p]
+ [org.httpkit.client :as http]
+ [clojure.java.io :as io]
+ [clojure.string :as str])
+ (:import [java.nio.file Files FileSystems CopyOption StandardCopyOption]))
+
+(defn run-cmd
+ [command]
+ (->> command
+ p/process
+ :out
+ slurp))
(defn extract-file-from-zip
[zip-file-name source destination]
(let [zip-file (io/file zip-file-name)
- src (io/file source)
dest (io/file destination)
fs (FileSystems/newFileSystem (.toPath zip-file) nil)
file-in-zip (.getPath fs source (into-array String []))]
- (Files/copy file-in-zip (.toPath dest)
+ (Files/copy file-in-zip
+ (.toPath dest)
(into-array CopyOption [StandardCopyOption/REPLACE_EXISTING]))))
-(defn expand-home [s]
+(defn expand-home
+ [s]
(if (.startsWith s "~")
- (clojure.string/replace-first s "~" (System/getProperty "user.home"))
+ (str/replace-first s "~" (System/getProperty "user.home"))
s))
+
+(defn download-binary
+ [url destination]
+ (io/copy (:body @(http/get url)) (io/file destination)))
+
+(defn unixify
+ "Make a function `f` behave like a UNIX shell command.
+
+ Examples:
+
+ # Multiple arguments
+ $ install-deb url1 url2 url3
+
+ # Read from file with one url on each line
+ $ install-deb `cat urls.txt`
+
+ # Piping from another process
+ $ ls | install-deb # Note: install-deb doesn't work with ls
+ "
+ [f]
+ (when (= *file* (System/getProperty "babashka.file"))
+ (if (> (.available System/in) 0)
+ (->> (slurp *in*)
+ (str/split-lines)
+ (filter seq)
+ (run! f))
+ (->> (vec *command-line-args*)
+ (map #(str/split % #" "))
+ (flatten)
+ (run! f)))))