From b109df97f8079e58789a905f289e7918c9b62f53 Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sat, 28 Apr 2018 23:42:14 -0400 Subject: [PATCH] overrideable shell environment variables macro implemented --- bolt.rkt | 5 +++-- shell_env.rkt | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/bolt.rkt b/bolt.rkt index 52783b3..ad48000 100755 --- a/bolt.rkt +++ b/bolt.rkt @@ -56,8 +56,9 @@ (define (as-user cmd) (if (user) - (format "sudo -u ~a sh -c \"~a\"" + (format "sudo -u ~a ~a sh -c \"~a\"" (user) + (format-vars) cmd) cmd)) @@ -102,4 +103,4 @@ (define pwd (make-cmd "pwd")) (provide - (all-defined-out) remote compress shell-env set-vars format-vars) + (all-defined-out) remote compress shell-env set-vars format-vars with-shell-vars) diff --git a/shell_env.rkt b/shell_env.rkt index 4de2162..9f3dc40 100644 --- a/shell_env.rkt +++ b/shell_env.rkt @@ -1,12 +1,29 @@ #lang racket +(define default-shell-vars + #hash( + ("LANG" . "en_US.UTF-8"))) + (define shell-env - (make-parameter #hash())) + (make-parameter default-shell-vars)) + +(define (remove-dups xs ys) + (define dups + (set-intersect (map car xs) + (map car ys))) + (define new-xs + (filter-not + (compose1 + (lambda (x) (member x dups)) + car) + xs)) + new-xs) (define (merge-hash h1 h2) (define h1-vs (hash->list h1)) (define h2-vs (hash->list h2)) - (make-hash (append h1-vs h2-vs))) + (define new-h2-vs (remove-dups h2-vs h1-vs)) + (make-hash (append new-h2-vs h1-vs))) (define (merge-hashes . hs) (foldl merge-hash #hash() hs)) @@ -25,8 +42,29 @@ (lambda (k v) (format "~a=~a" k v))))) +(define-syntax join-shell-vars + (syntax-rules () + [(join-shell-vars (k v)) + (merge-hash + (make-hash + (list (cons k v))) + (shell-env))] + + [(join-shell-vars (k v) rest ...) + (merge-hash + (make-hash (list (cons k v))) + (join-shell-vars rest ...))])) + +(define-syntax with-shell-vars + (syntax-rules () + [(with-shell-vars (vars ...) expr ...) + (parameterize + [(shell-env (join-shell-vars vars ...))] + (begin expr ...))])) + (provide shell-env merge-hashes set-vars - format-vars) + format-vars + with-shell-vars)