aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2024-12-04 22:49:04 +0000
committerGene Pasquet <dev@etenil.net>2024-12-04 22:49:04 +0000
commitcea9bc395dd2fd7fe75a485a4781f7f3822e8144 (patch)
tree0ce3b5825602aca9b39e03e1abbbb96138d060d4
parent1645c47df5261187899c022e69b8ff788b2ddd25 (diff)
Working .env merger
-rw-r--r--deepenv.scm27
1 files changed, 22 insertions, 5 deletions
diff --git a/deepenv.scm b/deepenv.scm
index fb7bae2..ae0b3c3 100644
--- a/deepenv.scm
+++ b/deepenv.scm
@@ -5,6 +5,7 @@
(chicken io)
(chicken string)
(chicken process-context)
+ srfi-1
srfi-13
srfi-14)
@@ -27,10 +28,13 @@
(define (load-dir-.env dir)
"Load a .env file present in `.dir` and return its environment definitions as a alist"
- (with-input-from-file ".env"
- (lambda () (read-list (current-input-port) read-env-line))))
+ (let ((.env-file (conc dir "/.env")))
+ (if (file-exists? .env-file)
+ (with-input-from-file .env-file
+ (lambda () (read-list (current-input-port) read-env-line)))
+ '())))
-(define (path-parents path)
+(define (path-parts path)
(call-with-values
(lambda () (decompose-directory path))
(lambda (origin base elts)
@@ -40,8 +44,21 @@
(cons base elts)
elts)))))
+(define (path-parents path)
+ (fold (lambda (item acc)
+ (if (> (length acc) 0)
+ (if (string=? (car acc) "/")
+ (cons (conc "/" item) acc)
+ (cons (conc (car acc) "/" item) acc))
+ (list item)))
+ '()
+ (path-parts path)))
+(define (.env-union alist2 alist1)
+ (lset-union (lambda (a b) (string=? (car a) (car b)))
+ alist2 alist1))
-(let ((path-hierarchy (path-parents (current-directory))))
- path-hierarchy)
+(let ((parents (path-parents (current-directory))))
+ (fold .env-union '()
+ (reverse (map load-dir-.env parents))))