diff options
author | Konrad Hinsen <konrad.hinsen@fastmail.net> | 2020-05-14 18:25:37 +0200 |
---|---|---|
committer | Guix Patches Tester <> | 2020-05-14 17:28:07 +0100 |
commit | edac3c3d24473e884546ffbad22e095a203c31c4 (patch) | |
tree | eb2560c8fca4c0f9ff2c056646575deecdf9c767 /guix/scripts/repl.scm | |
parent | febd1fcfa0b3cd34980ab5117172764fab56b853 (diff) | |
download | guix-patches-edac3c3d24473e884546ffbad22e095a203c31c4.tar guix-patches-edac3c3d24473e884546ffbad22e095a203c31c4.tar.gz |
guix repl: Add script execution.
* guix/scripts/repl.scm: Add filename options for script execution.
* doc/guix.texi (Invoking guix repl): Document it.
* tests/guix-repl.sh: Test it.
Diffstat (limited to 'guix/scripts/repl.scm')
-rw-r--r-- | guix/scripts/repl.scm | 80 |
1 files changed, 49 insertions, 31 deletions
diff --git a/guix/scripts/repl.scm b/guix/scripts/repl.scm index ff1f208894..f4cb744bbd 100644 --- a/guix/scripts/repl.scm +++ b/guix/scripts/repl.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2020 Simon Tournier <zimon.toutoune@gmail.com> +;;; Copyright © 2020 Konrad Hinsen <konrad.hinsen@fastmail.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,10 +33,12 @@ ;;; Commentary: ;;; -;;; This command provides a Guile REPL +;;; This command provides a Guile script runner and REPL in an environment +;;; that contains all the modules comprising Guix. (define %default-options - `((type . guile))) + `((scripts . ()) + (type . guile))) (define %options (list (option '(#\h "help") #f #f @@ -63,8 +66,9 @@ (define (show-help) - (display (G_ "Usage: guix repl [OPTIONS...] -Start a Guile REPL in the Guix execution environment.\n")) + (display (G_ "Usage: guix repl [OPTIONS...] [FILES...] +In the Guix execution environment, run FILES as Guile scripts, +or start a Guile REPL if no FILES are given,\n")) (display (G_ " -t, --type=TYPE start a REPL of the given TYPE")) (display (G_ " @@ -135,12 +139,13 @@ call THUNK." (define (guix-repl . args) (define opts - ;; Return the list of package names. (args-fold* args %options (lambda (opt name arg result) (leave (G_ "~A: unrecognized option~%") name)) (lambda (arg result) - (leave (G_ "~A: extraneous argument~%") arg)) + (alist-cons 'scripts + (cons arg (cdr (assq 'scripts result))) + result)) %default-options)) (define user-config @@ -148,29 +153,42 @@ call THUNK." (lambda (home) (string-append home "/.guile")))) + (define (set-user-module) + (set-current-module user-module) + (when (and (not (assoc-ref opts 'ignore-dot-guile?)) + user-config + (file-exists? user-config)) + (load user-config))) + (with-error-handling - (let ((type (assoc-ref opts 'type))) - (call-with-connection (assoc-ref opts 'listen) - (lambda () - (case type - ((guile) - (save-module-excursion - (lambda () - (set-current-module user-module) - (when (and (not (assoc-ref opts 'ignore-dot-guile?)) - user-config - (file-exists? user-config)) - (load user-config)) - - ;; Do not exit repl on SIGINT. - ((@@ (ice-9 top-repl) call-with-sigint) - (lambda () - (start-repl)))))) - ((machine) - (machine-repl)) - (else - (leave (G_ "~a: unknown type of REPL~%") type)))))))) - -;; Local Variables: -;; eval: (put 'call-with-connection 'scheme-indent-function 1) -;; End: + (let ((scripts (reverse (assoc-ref opts 'scripts)))) + + (for-each (lambda (script) + (save-module-excursion + (lambda () + (set-user-module) + (load script)))) + scripts) + + (when (null? scripts) + (let ((type (assoc-ref opts 'type))) + (call-with-connection (assoc-ref opts 'listen) + (lambda () + (case type + ((guile) + (save-module-excursion + (lambda () + (set-user-module) + ;; Do not exit repl on SIGINT. + ((@@ (ice-9 top-repl) call-with-sigint) + (lambda () + (start-repl)))))) + ((machine) + (machine-repl)) + (else + (leave (G_ "~a: unknown type of REPL~%") type))))))))) + + ;; Local Variables: + ;; eval: (put 'call-with-connection 'scheme-indent-function 1) + ;; End: + ) |