From patchwork Wed Apr 1 14:09:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konrad Hinsen X-Patchwork-Id: 21033 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 B152827BBE4; Wed, 1 Apr 2020 15:10:15 +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 1CD7027BBE1 for ; Wed, 1 Apr 2020 15:10:15 +0100 (BST) Received: from localhost ([::1]:60830 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jJe4M-0006Ve-KR for patchwork@mira.cbaines.net; Wed, 01 Apr 2020 10:10:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48873) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jJe4C-0006Pq-N3 for guix-patches@gnu.org; Wed, 01 Apr 2020 10:10:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jJe4B-0005gK-1F for guix-patches@gnu.org; Wed, 01 Apr 2020 10:10:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:55211) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jJe4A-0005fw-Su for guix-patches@gnu.org; Wed, 01 Apr 2020 10:10:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jJe49-0003T4-OP for guix-patches@gnu.org; Wed, 01 Apr 2020 10:10: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: Wed, 01 Apr 2020 14:10:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 40373 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 40373@debbugs.gnu.org X-Debbugs-Original-To: guix-patches@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.158575016513190 (code B ref -1); Wed, 01 Apr 2020 14:10:01 +0000 Received: (at submit) by debbugs.gnu.org; 1 Apr 2020 14:09:25 +0000 Received: from localhost ([127.0.0.1]:38523 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jJe3V-0003QT-Lp for submit@debbugs.gnu.org; Wed, 01 Apr 2020 10:09:25 -0400 Received: from lists.gnu.org ([209.51.188.17]:52673) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jJe3T-0003QE-EI for submit@debbugs.gnu.org; Wed, 01 Apr 2020 10:09:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48592) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jJe3R-0005YX-Kt for guix-patches@gnu.org; Wed, 01 Apr 2020 10:09:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jJe3P-0004xb-Um for guix-patches@gnu.org; Wed, 01 Apr 2020 10:09:17 -0400 Received: from wout1-smtp.messagingengine.com ([64.147.123.24]:33547) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jJe3P-0004w3-GW for guix-patches@gnu.org; Wed, 01 Apr 2020 10:09:15 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.west.internal (Postfix) with ESMTP id 25943449; Wed, 1 Apr 2020 10:09:13 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Wed, 01 Apr 2020 10:09:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.net; h= from:to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=fm3; bh=/vw+qeGgxoW8OimTIRkryNk49Q Jmt4QHr6LqokyhAWo=; b=xJzU/4jKAKiPZV6sak6U5p89PoSgvzd4FCU3KH69s2 iZUjJkgXDglJgTHEzcMhXKkfpBYBNOyOIs21R3rsFQDQDEkjC22rrESykM/VlM38 sSOu2dkUV0qhM7qFGUhv90+dMG4LNXb0sQR1RXhGeNl7QoRqUbiTWDcA8rRCrgC0 WAa05bCbU6VnV4Ml/WYZstpz0f5p9pCOTh8ZtFYKrj7JmRSXD5Hr+M2Y1vRhm1Ua kDiuqr4c+MIV5iyN+IrWCBkwmoyQHPnOEdSRISqiBfDJJHx3INcfMeiq5wSlAT/o WsiQo877vH+DIGlrCH/oq+ZxCFrS5JdRNmSj93Ubevlw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=/vw+qe GgxoW8OimTIRkryNk49QJmt4QHr6LqokyhAWo=; b=z7uM2pPoU+BdkGoi2P7+dv WaTzF0YrdlR2stM9J9kxNGybCCvh9SAG0GxWDFXxYomxDosAItqXcibIuMvXX5Xl jsFLaiMliGsAhZMwvaXfzrfYMZXcOcyjLoqRJRaeE2Mb4olegBnCZDPRaviympSy P+zCQXC4k7jSB4casyW+1af5x8UKMaC8OVmXYDdZt9ul8SaDXQQ580TKLSJkD0Eq gJ3jue7G/U4UT5AaJPhibGfy/YkP2Ux2zdpSZ3cwzhnHeXstmB5XKyyUaBzoD/Nf Cqo58IgxrKe/dRvGb+vmsuj+SnLXGWoqTQhBs74XgFkMMhHP0AoB69bCA7KHaKGA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduhedrtddvgdejvdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhephffvufffkfggtgfgsehtqhertddttd ejnecuhfhrohhmpefmohhnrhgrugcujfhinhhsvghnuceokhhonhhrrggurdhhihhnshgv nhesfhgrshhtmhgrihhlrdhnvghtqeenucffohhmrghinhepghhnuhdrohhrghenucfkph epkeeirddvgeejrdduieegrddvgeehnecuvehluhhsthgvrhfuihiivgeptdenucfrrghr rghmpehmrghilhhfrhhomhepkhhonhhrrggurdhhihhnshgvnhesfhgrshhtmhgrihhlrd hnvght 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 0CEDB328005D; Wed, 1 Apr 2020 10:09:11 -0400 (EDT) From: Konrad Hinsen Date: Wed, 01 Apr 2020 16:09:11 +0200 Message-ID: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] 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 time-machine" --- Makefile.am | 1 + doc/guix.texi | 32 +++++++++++ guix/scripts/run-script.scm | 106 ++++++++++++++++++++++++++++++++++++ 3 files changed, 139 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..2e948da85f --- /dev/null +++ b/guix/scripts/run-script.scm @@ -0,0 +1,106 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2018, 2019, 2020 Ludovic Courtès +;;; 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)))))