From 4b6b717e88f9ee24d45d7cfdc66b01bf4a4951eb Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Tue, 23 Jun 2026 23:53:19 +0530 Subject: Refactor utils.sh to clojure --- autoload/repl/repl_modes.kak | 2 +- scripts/utils.clj | 43 +++++++++++++++++++++++++++++++++++++++++++ scripts/utils.sh | 38 -------------------------------------- 3 files changed, 44 insertions(+), 39 deletions(-) create mode 100755 scripts/utils.clj delete mode 100755 scripts/utils.sh diff --git a/autoload/repl/repl_modes.kak b/autoload/repl/repl_modes.kak index 6b7550b..5ad157d 100644 --- a/autoload/repl/repl_modes.kak +++ b/autoload/repl/repl_modes.kak @@ -38,7 +38,7 @@ hook global BufSetOption filetype=(?:javascript|typescript|jsx|tsx) %{ set global xrepl_current_cmd 'kcr shell' set global xrepl_current_transform 'cat > /dev/null cypress_config_files="cypress.config.json cypress.config.ts cypress.config.js" - project=$($kak_config/scripts/utils.sh find_closest "$kak_buffile" $cypress_config_files) + project=$($kak_config/scripts/utils.clj find-closest-or-dir "$kak_buffile" $cypress_config_files) echo "npx cypress run --headless --e2e -P" "''$project''" "--spec ''$kak_buffile'';" ' set global xrepl_current_clear_screen true diff --git a/scripts/utils.clj b/scripts/utils.clj new file mode 100755 index 0000000..ab1cf70 --- /dev/null +++ b/scripts/utils.clj @@ -0,0 +1,43 @@ +#!/usr/bin/env bb + +(require '[clojure.java.io :as io]) + +(defn dirname [path] (.getParent (io/file path))) + +(defn dir-has-file? [dir filenames] + (some + (fn [file] (.exists (io/file (str dir "/" file)))) + filenames)) + +(defn find-closest [dir filenames] + (cond + (= dir "/") nil + (= dir ".") nil + (= dir "") nil + (dir-has-file? dir filenames) dir + :else (find-closest (dirname dir) filenames))) + +(defn normalize-dir-path [dir] + (.getAbsolutePath (io/file (if (empty? dir) "." dir)))) + +(defn cmd-find-closest [[dir & filenames]] + (let [init-dir (normalize-dir-path dir)] + (when-let [found-dir (find-closest init-dir filenames)] + (println found-dir)))) + +(defn cmd-find-closest-or-dir [[dir & filenames]] + (let [init-dir (normalize-dir-path dir)] + (if-let [found-dir (find-closest init-dir filenames)] + (println found-dir) + (println init-dir)))) + +(def commands + {"find-closest" cmd-find-closest + "find-closest-or-dir" cmd-find-closest-or-dir}) + +(let [[cmd & args] *command-line-args*] + (if-let [command-fn (commands cmd)] + (command-fn args) + (binding [*out* *err*] + (println (str "invalid command: " (or cmd ""))) + (println (str "Valid commands: " (keys commands)))))) diff --git a/scripts/utils.sh b/scripts/utils.sh deleted file mode 100755 index 4c652c1..0000000 --- a/scripts/utils.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env sh - -set -e -o pipefail - -dir_has_file() { - dir="$1"; shift; - for arg in ${@}; do - if [ -e "$dir/$arg" ]; then - return 0; - fi - done - return 1; -} - -find_closest() { - init_dir="${1:-"$PWD"}"; shift; - dir="$init_dir"; - while [ "$dir" != "" ] && [ "$dir" != "." ]; do - if [ "$dir" == "/" ]; then - dir="$init_dir" - break; - fi - if dir_has_file "$dir" "$@"; then - break; - fi - dir=$(dirname "$dir"); - done - if [ -f "$dir" ]; then - dirname "$dir"; - else - echo "$dir"; - fi -} - -cmd="$1"; shift; -case "$cmd" in - find_closest) find_closest "$@" ;; -esac -- cgit v1.3.1