From patchwork Tue May 6 07:42:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Maxim Cournoyer X-Patchwork-Id: 42343 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 7EE3027BC4B; Tue, 6 May 2025 08:43:21 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_CERTIFIED,RCVD_IN_VALIDITY_RPBL, RCVD_IN_VALIDITY_SAFE,SPF_HELO_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id C902D27BC49 for ; Tue, 6 May 2025 08:43:20 +0100 (BST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uCCxH-0000OD-GE; Tue, 06 May 2025 03:43:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uCCxF-0000O1-N6 for guix-patches@gnu.org; Tue, 06 May 2025 03:43:05 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uCCxF-0007JK-CB; Tue, 06 May 2025 03:43:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:Date:From:To:Subject; bh=nlCGfZZ8LgtWfXxSebXYnGZrqkK4+W1/l+V4S+sEa/M=; b=jgDxsSVJwwjK7G/sVlhDBQ9kh8yff6UhFeBpVD7XbsPz38ExX3qCKnT7Fm5gIJyQufEFG0BNvfXZZu/o19jmP2dKO8Q82ppCHGlIdz+SuOGEphCFSzDR0w9Tn5Vp6JlOYW11usrJHo1bgdqlXsEtjYcNr8F6sXV5idLGrBf4sl/w9p2Gc3vpm/alDxVyOSnglvt0FhYbXTP0MKpa9h+J7N+AuzO3SzYCbcMSlE9POAjZy8RnjEne+IrfY7G0YFidOSHSSUJOjBhJNICQp1JNCpeLTpHRGk/wd8kVITQLcO4vvekMGqaabI9SL2NX2O7VMMUuAKL6hpeK63LLKSGJ5w==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1uCCxC-00083Z-Hx; Tue, 06 May 2025 03:43:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#78277] [PATCH] ui: Allow evaluating multi-expressions strings with read/eval. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: guix@cbaines.net, dev@jpoiret.xyz, ludo@gnu.org, othacehe@gnu.org, zimon.toutoune@gmail.com, me@tobias.gr, guix-patches@gnu.org Resent-Date: Tue, 06 May 2025 07:43:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 78277 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 78277@debbugs.gnu.org Cc: Maxim Cournoyer , Christopher Baines , Josselin Poiret , Ludovic =?utf-8?q?Court=C3=A8s?= , Mathieu Othacehe , Simon Tournier , Tobias Geerinckx-Rice X-Debbugs-Original-To: guix-patches@gnu.org X-Debbugs-Original-Xcc: Christopher Baines , Josselin Poiret , Ludovic =?utf-8?q?Court=C3=A8s?= , Mathieu Othacehe , Simon Tournier , Tobias Geerinckx-Rice Received: via spool by submit@debbugs.gnu.org id=B.174651737830955 (code B ref -1); Tue, 06 May 2025 07:43:02 +0000 Received: (at submit) by debbugs.gnu.org; 6 May 2025 07:42:58 +0000 Received: from localhost ([127.0.0.1]:49317 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uCCx7-00083C-SX for submit@debbugs.gnu.org; Tue, 06 May 2025 03:42:58 -0400 Received: from lists.gnu.org ([2001:470:142::17]:38814) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uCCx2-00081w-3B for submit@debbugs.gnu.org; Tue, 06 May 2025 03:42:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uCCwl-0000LO-U1 for guix-patches@gnu.org; Tue, 06 May 2025 03:42:37 -0400 Received: from mail-pg1-x535.google.com ([2607:f8b0:4864:20::535]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uCCwk-0007Gm-5Z for guix-patches@gnu.org; Tue, 06 May 2025 03:42:35 -0400 Received: by mail-pg1-x535.google.com with SMTP id 41be03b00d2f7-b0b2d0b2843so4064840a12.2 for ; Tue, 06 May 2025 00:42:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746517352; x=1747122152; darn=gnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=nlCGfZZ8LgtWfXxSebXYnGZrqkK4+W1/l+V4S+sEa/M=; b=dGcop3HF4yTGioPrXvregoxt65C2PN16OJHUwAETyzkQJQZvF2dxm7RTgUfaaiRDcJ ck6VVywjKXSdxHRIDroIx5pQlsYsk8VPngG07RKfbiXASb3Si8rkeDLxF9B1PXsNzHWR 4Tr0/cGqhWu7qby1QhIiKCIUstEmEM9CnGH+XxwisDpOZ0EIWo6Qf9Somb1vYUScqobm Lgf5tgNdlyVRIvHxyjxpGpCUtnd7BcK7Zfr6jEXvNdNv9us+9kQwiEhHPhKv5LsPGDmh Y0qx3AACkit0u9lvf+6CMVK3Fp6oImAx7gsmsK6z3PjnezHPa2xAt7ozDgioXrJag9az JzZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746517352; x=1747122152; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=nlCGfZZ8LgtWfXxSebXYnGZrqkK4+W1/l+V4S+sEa/M=; b=VXXXzdByiPLHC1J/yL+PZ9Xh+Eccqv836/q5hovGuLkDaPyguoYarm2OlVYbzNBjeq 0e+bbvqOtxZnTDmnesr9DZWJagmA368OvXCHnzR0MR3k5whDjHHuYhWapUo9/LR/4Zcd Dubue9gnwp9vt/CCfD5PLs2361TiQhU91s2UPAgCRatM8/1O7ksrLBpSkCNnHyiRCLOT 0k9LXeIN1TjtWf8L1mfDt3kYU3YvWSmmXQx5OpuDgXwMx2677MWiRDZ3NgBu6DCisvPS X8Pqr53Ql2OvTbjyXDlr6KnkH7upESwpRuCInppEu/OWtXMnP+ZsdkKHZHSXRK+jMTkU rA9A== X-Gm-Message-State: AOJu0Yy2mnekdQ4xqY5QbqNA3iw2jf2t62znR8Dnt15N5RSOAuGcZEhx 3BigqEQZLiMAksFFkidGD2gtiPfSL0b3X1pthIrk05xq4y1UJO3M/yoS2Q== X-Gm-Gg: ASbGncvoMfb4OlMZpyQ8n9wU0YkU2nxZsyD/Z6xv/1NSoP9pQxkKEEjSHprHNDIRnxi /1OLWicEnS7ibhQQr65uU6iAo6uCpxeeV5c5T0Vf6fZ6mJVMIGX0WsAimMCfIo32MJc9/jHe6GF MJhlbnxuavM85Z6We0jhSmjUpb7F08lbOFx32I9vn8aA/8D/UsDzNqldpcwFznkUqRqTv1qZMcj oJiDVYdsDi7677pHv208aprPTiivW9zitY/vbpaBRguykAhpmar/7QFsczKJ9IE0n6JFenhAeQ0 /njxl4KTha/mYPz9ik+a7dZxzAu0zggPbKZM0N7uKpMpWToRWIL4dlrH8N7v X-Google-Smtp-Source: AGHT+IF9qDHqx17WP1ykRe2jis/XB2lInIrIUJQUOjGeDA0Lc5ZHXSpyn26AYLnA6QEVHI3LH1q5+Q== X-Received: by 2002:a17:90b:51cc:b0:2f6:d266:f462 with SMTP id 98e67ed59e1d1-30a4e698569mr24627183a91.35.1746517351605; Tue, 06 May 2025 00:42:31 -0700 (PDT) Received: from localhost.localdomain ([2405:6586:be0:0:83c8:d31d:2cec:f542]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-30a3480f0aasm14635860a91.35.2025.05.06.00.42.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 May 2025 00:42:31 -0700 (PDT) From: Maxim Cournoyer Date: Tue, 6 May 2025 16:42:23 +0900 Message-ID: <9a8eec38e544b343c74c287b6a59c0be83fa0409.1746517343.git.maxim.cournoyer@gmail.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::535; envelope-from=maxim.cournoyer@gmail.com; helo=mail-pg1-x535.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches This can be useful when evaluating a scheme->file store output for example, which has multiple top level expressions. * guix/ui.scm (read/eval): Also accept a port object as argument. Read and evaluate all expressions from input port or string. Change-Id: I0213706fa4824c3a8ffe5d93f44f263048cb62c2 --- guix/ui.scm | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) base-commit: a897159a7cdb521d64fd2a5034b6c895968a7f51 diff --git a/guix/ui.scm b/guix/ui.scm index d462f7133e0..cd9eb1013d0 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -15,7 +15,7 @@ ;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice ;;; Copyright © 2019, 2021 Simon Tournier ;;; Copyright © 2020 Arun Isaac -;;; Copyright © 2020 Maxim Cournoyer +;;; Copyright © 2020, 2025 Maxim Cournoyer ;;; Copyright © 2018 Steve Sprang ;;; Copyright © 2022 Taiju HIGASHI ;;; Copyright © 2022 Liliana Marie Prikler @@ -926,13 +926,18 @@ (define %guix-user-module module))) (define (read/eval str) - "Read and evaluate STR, raising an error if something goes wrong." - (let ((exp (catch #t - (lambda () - (call-with-input-string str read)) - (lambda args - (leave (G_ "failed to read expression ~s: ~s~%") - str args))))) + "Read and evaluate STR, which can also be a port, raising an error if +something goes wrong. STR may contain one or more expressions; the return +value is that of the last evaluated expression." + (define (read/safe port) + (catch #t + (lambda () + (read port)) + (lambda args + (leave (G_ "failed to read expression ~s: ~s~%") + str args)))) + + (define (eval/safe exp) (catch #t (lambda () (eval exp (force %guix-user-module))) @@ -956,7 +961,19 @@ (define (read/eval str) ((error args ...) (apply display-error #f (current-error-port) args)) (what? #f)) - (exit 1))))) + (exit 1)))) + + (let ((call-with-port-or-string (if (port? str) + call-with-port + call-with-input-string))) + (call-with-port-or-string + str + (lambda (port) + (let loop ((exp (read/safe port)) + (result #f)) + (if (eof-object? exp) + result + (loop (read/safe port) (eval/safe exp)))))))) (define (read/eval-package-expression str) "Read and evaluate STR and return the package it refers to, or exit an