aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/repl/repl_modes.kak2
-rwxr-xr-xscripts/utils.clj43
-rwxr-xr-xscripts/utils.sh38
3 files changed, 44 insertions, 39 deletions
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