From patchwork Thu Apr 2 09:25:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konrad Hinsen X-Patchwork-Id: 21052 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id C847A27BBE1; Thu, 2 Apr 2020 10:27:12 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, FREEMAIL_FROM,MAILING_LIST_MULTI,T_DKIM_INVALID,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTP id 2645727BBE1 for ; Thu, 2 Apr 2020 10:27:12 +0100 (BST) Received: from localhost ([::1]:35938 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jJw7z-0000tC-L6 for patchwork@mira.cbaines.net; Thu, 02 Apr 2020 05:27:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53978) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jJw7r-0000t1-Vb for guix-patches@gnu.org; Thu, 02 Apr 2020 05:27:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jJw7q-00030S-74 for guix-patches@gnu.org; Thu, 02 Apr 2020 05:27:03 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:55890) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jJw7p-000300-SI for guix-patches@gnu.org; Thu, 02 Apr 2020 05:27:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jJw7p-0003YA-NR for guix-patches@gnu.org; Thu, 02 Apr 2020 05:27:01 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#40373] [PATCH] guix: new command "guix run-script" Resent-From: Konrad Hinsen Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 02 Apr 2020 09:27:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 40373 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 40373@debbugs.gnu.org Received: via spool by 40373-submit@debbugs.gnu.org id=B40373.158581956713485 (code B ref 40373); Thu, 02 Apr 2020 09:27:01 +0000 Received: (at 40373) by debbugs.gnu.org; 2 Apr 2020 09:26:07 +0000 Received: from localhost ([127.0.0.1]:39203 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jJw6w-0003VP-QT for submit@debbugs.gnu.org; Thu, 02 Apr 2020 05:26:07 -0400 Received: from out4-smtp.messagingengine.com ([66.111.4.28]:33307) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jJw6u-0003Uh-US for 40373@debbugs.gnu.org; Thu, 02 Apr 2020 05:26:05 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id A0B5E5C01A5; Thu, 2 Apr 2020 05:25:59 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Thu, 02 Apr 2020 05:25:59 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.net; h= from:to:subject:in-reply-to:references:date:message-id :mime-version:content-type:content-transfer-encoding; s=fm3; bh= bsQcCdvPflSXfDZhwlejprCsgBaItrEvCCB5qlgNM6o=; b=r3d6+EoVFELr7XoH 9lpbrDYxbL2ucbzJYyEfcEF+PVdGvbc4b4FeHa6TruTIgGTOrxg3yqntIm+NnQmH 8M7A3IUJOfwATduQXx6celkH3n2pxLtpqnSzIevL6aJ6gsBc3cmtsv0AqUVf3waY h0MPIaW9Vjw0pP/NwayrGOKDElEXQkLPV13+JM1IvDI6TRVIMV7aDhwGRrlkgBr3 GV6Rf6qiaITQAcSnIHrg8hw/wVIQidt+wHbGn/AVGqVsfE4U54JXbBHCFTZU5Qye 91DgGOwp5CPbfFE2wTmAdbQzKT1Y9/Zb5Q7KFrzKl+c9aBZa4226/tuduOQ8jhtU gshS7w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm2; bh=bsQcCdvPflSXfDZhwlejprCsgBaItrEvCCB5qlgNM 6o=; b=lZBs2vl4hKVeQFK0rWTXFStrVEvpl0vTgXcB/05Tl6ZBAcg5yFd0F/aZQ S/dg8sbAvbBmQ528S3/eFEUJMHwZFAMavgY1VdNmgHQJAzjVzZWKP14iNx6n7LG6 VxZEwxJLXQ/DSDZgh2L9f/79bnJPObpc606Zc9SEH5SRf/ynKPgfr4MxahNq1USe lmQTghXpgu4UtUK419cC0f1e37nriBhZEA1OIDtGOgV65fpom4U9zXMAg+y74aa/ t2iOYQA86IK6rYaY6WFpbH/tyjdFklk4vyYnvWLtQAUFlU7k7B6uBntvmLKdaVYH HQK5PzUvSPcaJr+xfJPY3eedEXobg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduhedrtdeggddutdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhephffvufgjfhffkfggtgfgsehtqhertd dttdejnecuhfhrohhmpefmohhnrhgrugcujfhinhhsvghnuceokhhonhhrrggurdhhihhn shgvnhesfhgrshhtmhgrihhlrdhnvghtqeenucffohhmrghinhepghhnuhdrohhrghenuc fkphepkeeirddvgeejrdduieegrddvgeehnecuvehluhhsthgvrhfuihiivgeptdenucfr rghrrghmpehmrghilhhfrhhomhepkhhonhhrrggurdhhihhnshgvnhesfhgrshhtmhgrih hlrdhnvght X-ME-Proxy: Received: from khs-macbook.home (lfbn-idf2-1-714-245.w86-247.abo.wanadoo.fr [86.247.164.245]) by mail.messagingengine.com (Postfix) with ESMTPA id E9EBE3280065; Thu, 2 Apr 2020 05:25:58 -0400 (EDT) From: Konrad Hinsen In-Reply-To: References: Date: Thu, 02 Apr 2020 11:25:44 +0200 Message-ID: MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches * guix/scripts/run-script.scm: New file. * Makefile.am: (MODULES): Add it. * doc/guix.texi: Document "guix run-script" --- Makefile.am | 1 + doc/guix.texi | 32 +++++++++++ guix/scripts/run-script.scm | 105 ++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 guix/scripts/run-script.scm diff --git a/Makefile.am b/Makefile.am index 344ecdbc42..28ac7344e8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -283,6 +283,7 @@ MODULES = \ guix/scripts/container/exec.scm \ guix/scripts/deploy.scm \ guix/scripts/time-machine.scm \ + guix/scripts/run-script.scm \ guix.scm \ $(GNU_SYSTEM_MODULES) diff --git a/doc/guix.texi b/doc/guix.texi index 8cb85fe62c..0a64af24dc 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -235,6 +235,7 @@ Programming Interface * The Store Monad:: Purely functional interface to the store. * G-Expressions:: Manipulating build expressions. * Invoking guix repl:: Fiddling with Guix interactively. +* Invoking guix run-script:: Running Guix scripts. Defining Packages @@ -5347,6 +5348,7 @@ package definitions. * The Store Monad:: Purely functional interface to the store. * G-Expressions:: Manipulating build expressions. * Invoking guix repl:: Fiddling with Guix interactively. +* Invoking guix run-script:: Running Guix scripts. @end menu @node Package Modules @@ -8121,6 +8123,36 @@ Inhibit loading of the @file{~/.guile} file. By default, that configuration file is loaded when spawning a @code{guile} REPL. @end table +@node Invoking guix run-script +@section Invoking @command{guix run-script} + +@cindex script + +The @command{guix run-script} command executes a Guile script +(@pxref{Running Guile Scripts,,, guile, GNU Guile Reference Manual}). +Compared to just launching the @command{guile} command, +@command{guix run-script} guarantees that all the Guix modules +and all its dependencies are available in the search path. + +The general syntax is: + +@example +guix run-script @var{options} @var{file} +@end example + +The available options are as follows: + +@table @code +@item --load-path=@var{directory} +@itemx -L @var{directory} +Add @var{directory} to the front of the package module search path +(@pxref{Package Modules}). + +@item -q +Inhibit loading of the @file{~/.guile} file. By default, that +configuration file is loaded before executing the script. +@end table + @c ********************************************************************* @node Utilities @chapter Utilities diff --git a/guix/scripts/run-script.scm b/guix/scripts/run-script.scm new file mode 100644 index 0000000000..2e0ef2aff3 --- /dev/null +++ b/guix/scripts/run-script.scm @@ -0,0 +1,105 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020 Konrad Hinsen +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix scripts run-script) + #:use-module (guix ui) + #:use-module (guix scripts) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-37) + #:use-module (ice-9 match) + #:export (guix-run-script)) + +;;; Commentary: +;;; +;;; This command allows to run Guile scripts in an environment +;;; that contains all the modules comprising Guix. + +(define %default-options + '()) + +(define %options + (list (option '(#\h "help") #f #f + (lambda args + (show-help) + (exit 0))) + (option '(#\V "version") #f #f + (lambda args + (show-version-and-exit "guix run-script"))) + (option '(#\q) #f #f + (lambda (opt name arg result) + (alist-cons 'ignore-dot-guile? #t result))) + (option '(#\L "load-path") #t #f + (lambda (opt name arg result) + ;; XXX: Imperatively modify the search paths. + (set! %load-path (cons arg %load-path)) + (set! %load-compiled-path (cons arg %load-compiled-path)) + result)))) + + +(define (show-help) + (display (G_ "Usage: guix run-script [OPTIONS...] FILE +Run FILE as a Guile script in the Guix execution environment.\n")) + (display (G_ " + -q inhibit loading of ~/.guile")) + (newline) + (display (G_ " + -L, --load-path=DIR prepend DIR to the package module search path")) + (newline) + (display (G_ " + -h, --help display this help and exit")) + (display (G_ " + -V, --version display version information and exit")) + (newline) + (show-bug-report-information)) + +(define user-module + ;; Module where we execute user code. + (let ((module (resolve-module '(guix-user) #f #f #:ensure #t))) + (beautify-user-module! module) + module)) + + +(define (guix-run-script . args) + (define opts + (args-fold* args %options + (lambda (opt name arg result) + (leave (G_ "~A: unrecognized option~%") name)) + (lambda (arg result) + (when (assq 'argument result) + (leave (G_ "~A: extraneous argument~%") arg)) + (alist-cons 'argument arg result)) + %default-options)) + + (define script + (or (assq-ref opts 'argument) + (leave (G_ "no script filename specified~%")))) + + (define user-config + (and=> (getenv "HOME") + (lambda (home) + (string-append home "/.guile")))) + + (with-error-handling + (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)) + (load script)))))