Package: guix-patches;
Reported by: Herman Rimm <herman <at> rimm.ee>
Date: Mon, 5 Feb 2024 14:52:02 UTC
Severity: normal
Tags: patch
Done: Ludovic Courtès <ludo <at> gnu.org>
Bug is archived. No further changes may be made.
Message #14 received at 68935 <at> debbugs.gnu.org (full text, mbox):
From: Herman Rimm <herman <at> rimm.ee> To: 68935 <at> debbugs.gnu.org Cc: Herman Rimm <herman <at> rimm.ee> Subject: [PATCH 3/3] guix: import: Put packages into modules in alphabetical order. Date: Mon, 5 Feb 2024 16:07:14 +0100
* 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
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.