From 2618752e9b65b7dd2b03e498ff7f5a03eacc72b0 Mon Sep 17 00:00:00 2001
From: Gene Pasquet <dev@etenil.net>
Date: Wed, 4 Dec 2024 23:36:24 +0000
Subject: Fully working deepenv!

---
 deepenv.scm | 21 ++++++++++++++++++---
 dispenv.scm | 10 ++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)
 create mode 100644 dispenv.scm

diff --git a/deepenv.scm b/deepenv.scm
index ae0b3c3..e22d9d0 100644
--- a/deepenv.scm
+++ b/deepenv.scm
@@ -4,6 +4,7 @@
         (chicken file)
         (chicken io)
         (chicken string)
+        (chicken process)
         (chicken process-context)
         srfi-1
         srfi-13
@@ -58,7 +59,21 @@
   (lset-union (lambda (a b) (string=? (car a) (car b)))
               alist2 alist1))
 
-(let ((parents (path-parents (current-directory))))
-  (fold .env-union '()
-        (reverse (map load-dir-.env parents))))
+(define (resolve-program program)
+  (let* ((paths (map
+                     (lambda (path)
+                       (conc path "/" program))
+                     (string-split (get-environment-variable "PATH") ":")))
+         (executables (filter file-exists? paths)))
+    (if (> (length executables) 0)
+        (car executables)
+        program)))
+
+(let* ((parents (path-parents (current-directory)))
+       (environment (fold .env-union '() (cons (get-environment-variables) (reverse (map load-dir-.env parents)))))
+       (program (resolve-program (car (command-line-arguments))))
+       (arguments (cdr (command-line-arguments))))
+  (if program
+      (process-execute program arguments environment)
+      (display "Program not found\n")))
 
diff --git a/dispenv.scm b/dispenv.scm
new file mode 100644
index 0000000..fb6ed68
--- /dev/null
+++ b/dispenv.scm
@@ -0,0 +1,10 @@
+(import scheme
+        (chicken format)
+        (chicken process-context)
+        srfi-1)
+
+(define (print-env env-cons)
+  (printf "~a=~a~%" (car env-cons) (cdr env-cons)))
+
+(let ((env-vars (get-environment-variables)))
+  (for-each print-env env-vars))
-- 
cgit v1.2.3