From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark H Weaver Subject: Re: [PATCH] Improve shell script headers and pre-inst-env handling Date: Thu, 14 Feb 2013 03:28:34 -0500 Message-ID: <87wqubguz1.fsf@tines.lan> References: <87haliz4nt.fsf@tines.lan> <87fw11v83n.fsf@gnu.org> <87d2w5xtg5.fsf@tines.lan> <87y5etnqyj.fsf@gnu.org> <87k3qcilmu.fsf@tines.lan> <87ehgklyo6.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:53254) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U5uBZ-0005Xv-Hn for bug-guix@gnu.org; Thu, 14 Feb 2013 03:29:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U5uBW-0000pU-6W for bug-guix@gnu.org; Thu, 14 Feb 2013 03:28:53 -0500 In-Reply-To: <87ehgklyo6.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Wed, 13 Feb 2013 21:57:29 +0100") List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: bug-guix@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludovic, ludo@gnu.org (Ludovic Court=C3=A8s) writes: > Note that I think we=E2=80=99ll most likely have a single =E2=80=98guix= =E2=80=99 script in the > near future, so that =E2=80=98guix-pull=E2=80=99 can actually update ever= ything: Guix, > commands, and distro. Okay, I have another proposal. I've written a proposed 'guix' script that's pure Guile code. The idea is that "guix FOO ARGS ..." augments the load paths as needed, loads the module (guix scripts guix-FOO) and then applies the procedure 'guix-FOO' to (ARGS ...) It also supports "guix-FOO ARGS ..." simply by making 'guix-FOO' a symlink to 'guix'. Then we can move all the scripts into guix/scripts/, and remove the boilerplate shell code from the top of all them. They become pure guile modules. No more shell at all. What do you think? Mark --=-=-= Content-Type: text/plain; charset=utf-8 Content-Disposition: inline; filename=guix.in Content-Transfer-Encoding: quoted-printable Content-Description: guix.in #!@GUILE@ -s -*- scheme -*- !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2013 Mark H Weaver ;;; ;;; 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 . (use-modules (ice-9 regex)) (let () (define-syntax-rule (push! elt v) (set! v (cons elt v))) (define config-lookup (let ((config '(("prefix" . "@prefix@") ("datarootdir" . "@datarootdir@") ("guilemoduledir" . "@guilemoduledir@"))) (var-ref-regexp (make-regexp "\\$\\{([a-z]+)\\}"))) (define (expand-var-ref match) (lookup (match:substring match 1))) (define (expand str) (regexp-substitute/global #f var-ref-regexp str 'pre expand-var-ref 'post)) (define (lookup name) (expand (assoc-ref config name))) lookup)) (define (maybe-augment-load-paths!) (unless (getenv "GUIX_UNINSTALLED") (let ((module-dir (config-lookup "guilemoduledir"))) (push! module-dir %load-path) (push! module-dir %load-compiled-path)))) (define (run-script name args) (let* ((symbol (string->symbol name)) (module (resolve-interface `(guix scripts ,symbol))) (script (module-ref module symbol))) (apply script args))) (define (main arg0 . args) (setlocale LC_ALL "") ; XXX Is there a reason not to do this? (maybe-augment-load-paths!) (let ((cmd (basename arg0))) (cond ((string-prefix? "guix-" cmd) (run-script cmd args)) ((not (null? args)) (run-script (string-append "guix-" (car args)) (cdr args))) (else ;; TODO: Dynamically generate a summary of available commands. (format (current-error-port) "Usage: guix []~%") (exit 1))))) (apply main (command-line))) --=-=-=--