all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Herman Rimm via Guix-patches via <guix-patches@gnu.org>
To: 68935@debbugs.gnu.org
Cc: "Herman Rimm" <herman@rimm.ee>,
	"Christopher Baines" <guix@cbaines.net>,
	"Josselin Poiret" <dev@jpoiret.xyz>,
	"Ludovic Courtès" <ludo@gnu.org>,
	"Mathieu Othacehe" <othacehe@gnu.org>,
	"Ricardo Wurmus" <rekado@elephly.net>,
	"Simon Tournier" <zimon.toutoune@gmail.com>,
	"Tobias Geerinckx-Rice" <me@tobias.gr>
Subject: [bug#68935] [PATCH 3/3] guix: import: Put packages into modules in alphabetical order.
Date: Mon,  5 Feb 2024 16:07:14 +0100	[thread overview]
Message-ID: <a380fd9adc163c8b425397163956672f5cda70c5.1707144191.git.herman@rimm.ee> (raw)
In-Reply-To: <cover.1707144190.git.herman@rimm.ee>

* guix/scripts/import.scm (guix-import): Add 'put' option.
(try-import): Add variable.
* doc/guix.texi (Invoking guix import): Describe 'put' option.

Change-Id: Ied4fc95899c31fb2523a01139780fc9744aa63cb
---
 doc/guix.texi           |  14 +++++-
 guix/scripts/import.scm | 100 +++++++++++++++++++++++++++-------------
 2 files changed, 81 insertions(+), 33 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index b76df868f8..5ab4c0d2a8 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -124,6 +124,7 @@
 Copyright @copyright{} 2023 Saku Laesvuori@*
 Copyright @copyright{} 2023 Graham James Addis@*
 Copyright @copyright{} 2023 Tomas Volf@*
+Copyright @copyright{} 2024 Herman Rimm@*
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -14178,12 +14179,21 @@ Invoking guix import
 The general syntax is:
 
 @example
-guix import @var{importer} @var{options}@dots{}
+guix import @var{option} @var{importer} @var{options}@dots{}
 @end example
 
 @var{importer} specifies the source from which to import package
 metadata, and @var{options} specifies a package identifier and other
-options specific to @var{importer}.
+options specific to @var{importer}. @command{guix import} itself has the
+following options:
+
+@table @code
+@item --put=@var{file}
+@itemx -p @var{file}
+Insert the package definition(s) that the @var{importer} generated into the
+specified @var{file}, either in alphabetical order among existing package
+definitions, or at the end of the file otherwise.
+@end table
 
 Some of the importers rely on the ability to run the @command{gpgv} command.
 For these, GnuPG must be installed and in @code{$PATH}; run @code{guix install
diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm
index 80b1bec7fc..0d83483c4e 100644
--- a/guix/scripts/import.scm
+++ b/guix/scripts/import.scm
@@ -24,6 +24,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (guix scripts import)
+  #:use-module (guix build utils)
   #:use-module (guix import utils)
   #:use-module (guix ui)
   #:use-module (guix scripts)
@@ -67,10 +68,37 @@ (define (show-help)
   (display (G_ "
   -h, --help             display this help and exit"))
   (display (G_ "
+  -p, --put              put the import in a package module"))
+  (display (G_ "
   -V, --version          display version information and exit"))
   (newline)
   (show-bug-report-information))
 
+(define (try-import importer args finish)
+  (if (member importer importers)
+        (match (apply (resolve-importer importer) args)
+          ((and expr ('package _ ...))
+           (finish (package->definition expr)))
+          ((and expr (or ('let _ ...)
+                         ('define-public _ ...)))
+           (finish expr))
+          ((? list? expressions)
+           (for-each (lambda (expr)
+               (match expr
+                      ((and expr ('package _ ...))
+                       (finish (package->definition expr)))
+                      ((and expr (or ('let _ ...)
+                                     ('define-public _ ...)))
+                       (finish expr))))
+             expressions))
+          (x
+           (leave (G_ "'~a' import failed~%") importer)))
+      (let ((hint (string-closest importer importers #:threshold 3)))
+        (report-error (G_ "~a: invalid importer~%") importer)
+        (when hint
+          (display-hint (G_ "Did you mean @code{~a}?~%") hint))
+        (exit 1))))
+
 (define-command (guix-import . args)
   (category packaging)
   (synopsis "import a package definition from an external repository")
@@ -79,38 +107,48 @@ (define-command (guix-import . args)
     (()
      (format (current-error-port)
              (G_ "guix import: missing importer name~%")))
-    ((or ("-h") ("--help"))
+    ((or ("-h" _ ...) ("--help" _ ...))
      (leave-on-EPIPE (show-help))
      (exit 0))
-    ((or ("-V") ("--version"))
+    ((or ("-V" _ ...) ("--version" _ ...))
      (show-version-and-exit "guix import"))
+    ((or ("-p" module importer args ...)
+         ("--put" module importer args ...))
+     (let ((put (lambda (expr)
+                  (let ((line
+                    (call-with-input-file module
+                      (lambda (port)
+                        (do ((se (read-syntax port)
+                                 (read-syntax port)))
+                          ((match (syntax->datum se)
+                             (('define-public symbol _ ...)
+                              (string> (symbol->string symbol)
+                                       (symbol->string (cadr expr))))
+                             ((? eof-object?) #t)
+                             (_ #f))
+                           (if (eof-object? se)
+                             #f
+                             (car (string-split
+                                    (object->string*
+                                      (syntax->datum se) 0)
+                                    #\newline)))))))))
+                    (if line
+                        (substitute* module
+                          (((string-append "\\" line))
+                           (string-append
+                             (object->string* expr 0)
+                             "\n\n" line)))
+                        (let ((port (open-file module "a")))
+                          (pretty-print-with-comments port expr)
+                          (newline port)
+                          (close-port port)))))))
+       (try-import importer args put)))
     ((importer args ...)
-     (if (member importer importers)
-         (let ((print (lambda (expr)
-                        (leave-on-EPIPE
-                         (pretty-print-with-comments (current-output-port) expr)))))
-           (match (apply (resolve-importer importer) args)
-             ((and expr ('package _ ...))
-              (print (package->definition expr)))
-             ((and expr (or ('let _ ...)
-                            ('define-public _ ...)))
-              (print expr))
-             ((? list? expressions)
-              (for-each (lambda (expr)
-                  (match expr
-                         ((and expr ('package _ ...))
-                          (print (package->definition expr)))
-                         ((and expr (or ('let _ ...)
-                                        ('define-public _ ...)))
-                          (print expr)))
-                  ;; Two newlines: one after the closing paren, and
-                  ;; one to leave a blank line.
-                  (newline) (newline))
-                expressions))
-             (x
-              (leave (G_ "'~a' import failed~%") importer))))
-         (let ((hint (string-closest importer importers #:threshold 3)))
-           (report-error (G_ "~a: invalid importer~%") importer)
-           (when hint
-             (display-hint (G_ "Did you mean @code{~a}?~%") hint))
-           (exit 1))))))
+     (let ((print (lambda (expr)
+                    (leave-on-EPIPE
+                      (pretty-print-with-comments
+                        (current-output-port) expr)
+                      ;; Two newlines: one after the closing paren,
+                      ;; and one to leave a blank line.
+                      (newline) (newline)))))
+       (try-import importer args print)))))
-- 
2.41.0





  parent reply	other threads:[~2024-02-05 15:09 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-05 14:51 [bug#68935] [PATCH 0/3] Add 'put' option to guix import Herman Rimm via Guix-patches via
2024-02-05 15:07 ` [bug#68935] [PATCH 1/3] svn-fetch: Require svn-command argument Herman Rimm via Guix-patches via
2024-02-07 21:34   ` Ludovic Courtès
2024-02-05 15:07 ` [bug#68935] [PATCH 2/3] guix: import: Wrap package expressions with define-public Herman Rimm via Guix-patches via
2024-02-07 21:38   ` Ludovic Courtès
2024-02-05 15:07 ` Herman Rimm via Guix-patches via [this message]
2024-02-07 21:57   ` [bug#68935] [PATCH 3/3] guix: import: Put packages into modules in alphabetical order Ludovic Courtès
2024-02-09 19:25 ` [bug#68935] [PATCH v2 1/6] doc: Note SVN dependency of texlive importer Herman Rimm via Guix-patches via
2024-02-09 19:25   ` [bug#68935] [PATCH v2 2/6] import: Wrap package expressions with define-public Herman Rimm via Guix-patches via
2024-02-09 19:25   ` [bug#68935] [PATCH v2 3/6] utils: Add insert-expression procedure Herman Rimm via Guix-patches via
2024-02-19 21:31     ` Ludovic Courtès
2024-02-09 19:25   ` [bug#68935] [PATCH v2 4/6] utils: Add find-expression procedure Herman Rimm via Guix-patches via
2024-02-19 21:38     ` Ludovic Courtès
2024-02-09 19:25   ` [bug#68935] [PATCH v2 5/6] import: Insert packages into modules alphabetically Herman Rimm via Guix-patches via
2024-02-10 15:06     ` Herman Rimm via Guix-patches via
2024-02-16 16:06     ` Herman Rimm via Guix-patches via
2024-02-19 21:43     ` Ludovic Courtès
2024-02-09 19:25   ` [bug#68935] [PATCH v2 6/6] import: Discard args after --version and --help Herman Rimm via Guix-patches via
2024-02-20 20:45 ` [bug#68935] [PATCH v3 0/7] Add insert option to guix import Herman Rimm via Guix-patches via
2024-02-20 20:45   ` [bug#68935] [PATCH v3 1/7] doc: Note SVN dependency of texlive importer Herman Rimm via Guix-patches via
2024-02-20 20:45   ` [bug#68935] [PATCH v3 2/7] import: Wrap package expressions with define-public Herman Rimm via Guix-patches via
2024-02-20 20:45   ` [bug#68935] [PATCH v3 3/7] utils: Add insert-expression procedure Herman Rimm via Guix-patches via
2024-02-23 19:53     ` Ludovic Courtès
2024-02-20 20:45   ` [bug#68935] [PATCH v3 4/7] utils: Add find-definition-insertion-location procedure Herman Rimm via Guix-patches via
2024-02-20 20:45   ` [bug#68935] [PATCH v3 5/7] import: Insert packages into modules alphabetically Herman Rimm via Guix-patches via
2024-02-20 20:45   ` [bug#68935] [PATCH v3 6/7] import: Discard args after --version and --help Herman Rimm via Guix-patches via
2024-02-20 20:45   ` [bug#68935] [PATCH v3 7/7] import: Do not return package name with json importer Herman Rimm via Guix-patches via
2024-02-23 17:53   ` [bug#68935] [PATCH v3 0/7] Add insert option to guix import Ludovic Courtès
2024-02-23 19:52   ` bug#68935: " Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a380fd9adc163c8b425397163956672f5cda70c5.1707144191.git.herman@rimm.ee \
    --to=guix-patches@gnu.org \
    --cc=68935@debbugs.gnu.org \
    --cc=dev@jpoiret.xyz \
    --cc=guix@cbaines.net \
    --cc=herman@rimm.ee \
    --cc=ludo@gnu.org \
    --cc=me@tobias.gr \
    --cc=othacehe@gnu.org \
    --cc=rekado@elephly.net \
    --cc=zimon.toutoune@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.